[TOC]
第1章 Linux系统启动流程
1.CentOS7启动流程说明
讲解启动流程意义:
笔试
systemd
运行级别
单用户模式
文字简化说明:
1.BIOS开机自检
2.读取可引导分区里的MBR信息选择启动设备
3.加载grub菜单,选择操作系统
4.加载内核及驱动程序
5.启动systemd程序加载必要文件,以下操作并行执行
1) 执行initrd.target (/usr/lib/systemd/system/initrd.target)
包含挂载/etc/fstab文件中的文件系统。
2) systemd执行默认的target配置。
3) systemd执行sysinit.target, 初始化系统及加载basic.target准备启动系统。
4) systemd启动multi-user.target (生产工作模式)下的服务程序,即开机自启动的程序,程序目录.为/etc/systemd/system和/usr/lib/systemd/system。
5) systemd执行multi-user.target下的/etc/rc.d/rc.local内容。
6) systemd执行multi-user.target下的gtty.target及登录服务。
7) systemd执行graphical所需要的服务(如果安装了图形桌面功能)。
第1步:BIOS开机自检
简单来说,BIOS是主板上的一块芯片,负责主板通电后各部件的自检,设置和保存,一切正常后才能启动操作系统。其记录了电脑最基本的信息,是软件与硬件打交道的最基础的桥梁,没有他,电脑就不能正常工作。
第2步:读取MBR信息
当正确检查完所有硬件信息后,计算机就会根据BIOS里的设置去读取相应的启动系统里的硬件设备。
如果预先设定了从硬盘启动加载系统,那么BIOS就会读取硬盘的MBR (即0磁道0柱面1扇区的前446字节)。
计算机读取BIOS所指定的磁盘MBR信息之后,就会将其读入到内存中。被读入到内存中执行的其实就是Boot Loader (引导加载程序),对应于Linux系统,就是加载Grub信息。
MBR包含的内容:
0磁道0扇区:512bytes
446 bytes: boot loader启动相关
64 bytes: 分区表
2 bytes: 55AA
查看MBR分区:
hexdump -C -n 512 /dev/sda
第3步:加载Grub菜单
引导加载程序(Boot Loader)是计算机在加载操作系统内核之前运行的一段小程序。这段小程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境加载到一一个适合的状态,以便为最终调用操作系统内核做好准备。Linux主流使用Grub做为引导菜单。CentOS7使用Grub2作为引导程序。
提示:
grub.conf的知识其实在企业Linux运维中用途不是很大,这里讲解Grub的目的是为了解Linux系统的整个启动流程做铺垫,因为在运维工作中,极少会在线处理问题,出了问题也是直接切换服务了,之后再来慢慢研究是修复还是重装。
第4步:加载Kernel内核及驱动程序
根据Grub设定的内核映像所在的路径,系统会读取内存映像,并进行解压缩操作。完成解压缩内核之后,屏幕会输出“OK,booting the kermel"的信息。其实就是根据grub.conf中的如下设置加载内核及相关参数
xfs的驱动程序:
df -T
modinfo xfs
ll -h /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/xfs/xfs.ko.xz
可引导的内核在哪里?
[root@linux ~]# ll /boot/
总用量 94132
-rw-r--r--. 1 root root 151918 11月 9 2018 config-3.10.0-957.el7.x86_64
drwxr-xr-x. 5 root root 79 4月 6 19:42 grub2
-rw-------. 1 root root 57270580 4月 6 19:41 initramfs-0-rescue-3c29b9dc81a34220b666aff272f3851c.img
-rw-------. 1 root root 21810980 4月 6 19:40 initramfs-3.10.0-957.el7.x86_64.img
-rw-r--r--. 1 root root 314036 11月 9 2018 symvers-3.10.0-957.el7.x86_64.gz
-rw-------. 1 root root 3543471 11月 9 2018 System.map-3.10.0-957.el7.x86_64
-rwxr-xr-x. 1 root root 6639904 4月 6 19:41 vmlinuz-0-rescue-3c29b9dc81a34220b666aff272f3851c
-rwxr-xr-x. 1 root root 6639904 11月 9 2018 vmlinuz-3.10.0-957.el7.x86_64
vmlinuz和initramfs作用:
vmlinuz:VM=Virtual Memory z=gzip
vmlinuz是可引导可压缩的内核,主要作用是用来管理进程,内存,文件,驱动,网络等。
initrd.img:initial ramdisk,
主要作用是用于加载驱动模块,通常步骤是先启动内核,然后内核挂载initrd.img,并挂载各种模块和驱动,最重要的是文件系统的驱动模块,有了它才能挂载根文件系统,最后可以运行Linux第一个应用程序init或systemd。
第5步:启动systemd程序加载必要文件
CentOS7和CentOS6的启动流程绝大部分还是相同的,但也有一些小区别,例如,CentOS6下第一个启动的init进程被改为了systemd(并行启动模式),下面重点说一下CentOS7加载systemd进程后的启动流程,即从CentOS6启动流程的第五步开始讲起,前四步与CentOS6启动流程的描述一致。
1) 执行initrd.target (/usr/lib/systemd/system/initrd.target)
包含挂载/etc/fstab文件中的文件系统。
2) systemd执行默认的target配置。
3) systemd执行sysinit.target, 初始化系统及加载basic.target准备启动系统。
4) systemd启动multi-user.target (生产工作模式)下的服务程序,即开机自启动的程序,程序目录为/etc/systemd/system和/usr/lib/systemd/system。
5) systemd执行multi-user.target下的/etc/rc.d/rc.local内容。
6) systemd执行multi-user.target下的gtty.target及登录服务。
7) systemd执行graphical所需要的服务(如果安装了图形桌面功能)。
2.CentOS6以及CentOS7启动流程图对比
CentOS6启动流程:
CentOS7启动流程:
3.分析启动流程耗时
运行systemd-analyze blame命令可以打印出启动过程的详细流程
[root@linux ~]# systemd-analyze blame
5.043s network.service
2.609s dev-mapper-centos\x2droot.device
1.694s lvm2-pvscan@8:2.service
1.669s lvm2-monitor.service
1.059s mysqld.service
843ms tuned.service
204ms auditd.service
171ms polkit.service
164ms rsyslog.service
128ms chronyd.service
102ms systemd-logind.service
94ms rhel-dmesg.service
93ms systemd-vconsole-setup.service
77ms sysstat.service
77ms systemd-user-sessions.service
62ms boot.mount
61ms systemd-udev-trigger.service
58ms rhel-import-state.service
50ms rhel-readonly.service
36ms plymouth-quit-wait.service
35ms plymouth-start.service
34ms systemd-udevd.service
27ms plymouth-read-write.service
26ms systemd-tmpfiles-setup-dev.service
25ms systemd-journald.service
24ms sshd.service
23ms plymouth-quit.service
22ms systemd-tmpfiles-setup.service
19ms systemd-journal-flush.service
17ms rhel-domainname.service
17ms systemd-sysctl.service
16ms systemd-remount-fs.service
15ms systemd-rfkill@rfkill0.service
13ms systemd-fsck-root.service
13ms kmod-static-nodes.service
12ms sys-kernel-debug.mount
12ms dev-mqueue.mount
12ms dev-hugepages.mount
10ms systemd-update-utmp.service
10ms systemd-random-seed.service
9ms systemd-tmpfiles-clean.service
5ms systemd-update-utmp-runlevel.service
5ms sys-kernel-config.mount
我们也可以将其生成网页查看
systemd-analyze plot > linux.html
第2章 Linux运行级别
1.什么是系统运行级别
不同的运行级别就是指系统运行在不同功能的级别。
比如打游戏有新手模式,高级模式,炼狱模式一样,不同级别分别对应不同的使用场景。
2.系统运行级别分类
启动级别 systemd名称 功能说明
0 poweroff.target 关机操作
1 rescue.target 单用户模式,救援模式
2 multi-user.target
3 multi-user.target 多用户模式,文本界面
4 multi-user.target
5 graphical.target 多用户模式,图形界面
6 reboot.target 重启操作
上面的运行级别名称从哪里得来的呢?通过查看系统命令可以得出结论
[root@linux ~]# ll /usr/lib/systemd/system/runlevel[0-9].target
lrwxrwxrwx. 1 root root 15 12月 13 11:01 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 12月 13 11:01 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 12月 13 11:01 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 12月 13 11:01 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 12月 13 11:01 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 12月 13 11:01 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 12月 13 11:01 /usr/lib/systemd/system/runlevel6.target -> reboot.target
3.运行级别常用命令
运行级别的说明文件路径:
cat /etc/inittab
查看当前运行级别:
systemctl get-default
切换运行级别:
init N
设置默认启动级别:最常用的两个级别是3和5
systemctl set-default TARGET.target
4.练习
自己试试如何将图形化的Linux切换到命令行级别以及更改默认启动运行级别为命令行界面
第3章 Linux Systemd
1.什么是systemd
CentOS7之前的系统都是使用init进程作为系统启动后的第一个进程,但是init有两个缺点:
1.启动时间长,因为init的进程是串行的,只有前一个启动完毕后一个进程才启动。
2.启动脚本复杂,以前的系统初始化需要加载很多脚本,依赖关系复杂,靠脚本自己处理。
而systemd的启动则是并行运行的,而且服务的启动配置文件统一语法,所以管理起来更方便。
2.systemd的优势
1.较新的系统都已经使用systemd来管理服务,例如Debian9,Centos7,Ubunut16等
2.系统引导时实现服务的并行启动,效率更高,启动更快
3.自动解决依赖关系
4.服务的启动配置文件统一语法,管理起来更方便
3.systemd常用管理命令
管理服务运行相关命令:
systemctl start nginx #启动服务
systemctl stop nginx #停止服务
systemctl restart nginx #重启服务
systemctl reload nginx #重新加载服务配置文件
systemctl status nginx #查看服务的运行状态
systemctl is-active nginx #查看服务是否正在运行
服务运行状态说明:
#当我们使用system status查看一个服务的运行状态时,有以下几种情况
loaded #配置文件已经被加载
active (running) #服务正在运行
inactive (dead) #服务没有在运行
enabled #服务被设定为开机自启动
disabled #服务被设定为开机不自启动
static #服务开机不自启动,但是可以被其他服务调用启动
管理服务开机启动相关命令:
systemctl enable nginx #设置服务开机自启动
systemctl disable nginx #设置服务开机不自启动
systemctl is-enabled nginx #查看服务是否开机自启动
systemctl list-unit-files #查看所有服务的开机自启动状态
systemctl daemon-reload #重新载入更改的systemd配置文件
4.systemd文件格式
systemd文件路径说明:
/etc/systemd/system/ #系统自带的启动文件
/usr/lib/systemd/system/ #一般使用软件包安装的软件的启动配置文件在这个目录下
systemd文件格式说明:
systemd unit文件通常是由三部分组成的
[Unit] #一般定义的是通用选项,比如描述信息,依赖关系等
[Service] #特定服务的类型,具体的启动关闭重启选项都在此部分配置
[Install] #定义由开机自启和不开机自启命令时实现的选项
Unit段常用说明:
Description #描述信息
Documentation #说明文档的在线地址
After #定义启动顺序,表示当前配置的服务应该晚与哪些服务之后启动
Wants #依赖其他的服务
Service段常用说明:
Type #定义服务类型
forking #需要父进程启动子进程的服务类型为forking
PIDFile #定义PID文件路径
ExecStart #指定启动服务命令绝对路径
ExecReload #指定重新加载服务的配置文件的命令绝对路径
ExecStop #指定停止服务命令绝对路径
ExecStartPre #在启动之前运行的命令
ExecStartPost #在启动之后运行的命令
Install段常用说明:
WantedBy #哪些服务需要被依赖
举例:nginx的systemd文件解释:
[Unit]
Description=nginx - high performance web server #说明信息
Documentation=http://nginx.org/en/docs/ #帮助说明
After=network-online.target remote-fs.target nss-lookup.target #需要依赖这些服务,在这些服务启动后启动
Wants=network-online.target #需要依赖的服务
[Service]
Type=forking #启动类型为forking
PIDFile=/var/run/nginx.pid #pid文件的绝对路径
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf #启动命令的绝对路径
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)" #重新加载配置的绝对路径
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)" #停止服务命令的绝对路径
[Install]
WantedBy=multi-user.target #需要依赖的服务
5.自定义nginx的systemd启动文件
编译安装nginx过程略。
#1.修改nginx配置文件的pid为自定义路径
[root@linux ~]# grep pid /opt/nginx/conf/nginx.conf
pid /opt/nginx/pid/nginx.pid;
#2.写入自定义systemd配置
cat > /usr/lib/systemd/system/linux6.service << 'EOF'
[Unit]
Description=DIY nginx
Documentation=https://www.cnblogs.com/alaska/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/opt/nginx/pid/nginx.pid
ExecStart=/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /opt/nginx/pid/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /opt/nginx/pid/nginx.pid)"
ExecStartPre=/bin/sh -c "/usr/bin/chown -R www:www /opt/nginx/"
[Install]
WantedBy=multi-user.target
EOF
#3.重新加载systemd配置
systemctl daemon-reload
#4.启动我们自定义的服务
systemctl start linux6
systemctl status linux6
第4章 Linux单用户模式
1.什么是Linux单用户模式
单用户模式的最主要应用场景就是当我们忘记系统root密码的时候,就可以使用单用户模式找回。
如果谁都能随随便便的进入单用户模式修改root密码,那就风险太大了,所有单用户模式有前提条件:
1.进入单用户模式必须重启服务器,所以需要有重启服务器的权限
2.单用户模式是启动服务进程之前,所以需要有能实际接触服务器的条件才行,如果是物理机那就表示人必须在机器旁边,接键盘显示器才能操作。
2.实战:找回忘记的Linux密码
方法1: 添加rw init=/bin/bash
1.开机启动时在启动菜单界面选择按e进入grup编辑模式
2.在linux开头的行最后添加以下内容
enforcing=0 init=/bin/bash
3.保存启动
ctrl + x
3.启动后重新挂载
mount -o rw,remount /
4.重新修改root密码
passwd root
5.重启进入系统
exec /sbin/init
详细步骤:
https://mp.weixin.qq.com/s/1f-zCq8j4gL3xiB3AV9K3A
方法2: 添加rd.break
操作步骤如下:
1.开机启动时在启动菜单界面选择按e进入grup编辑模式
2.在linux开头的行最后添加
enforcing=0 rd.break
3.按ctrl+x保存退出重启
4.进入单用户模式后输入以下命令
mount -o remount,rw /sysroot/
chroot /sysroot/
passwd root
exit
reboot
遇到的坑: selinux没关导致修改不成功
临时关闭:
[root@centos7-100 ~]# getenforce
Enforcing
[root@centos7-100 ~]# setenforce 0
[root@centos7-100 ~]# getenforce
Permissive
永久关闭:
[root@centos7-100 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
第5章 Linux救援模式
1.什么是Linux救援模式
救援模式就是当我们的系统出现故障启动失败后,使用系统光盘镜像重新加载然后进入系统进行修复的一种模式。
2.实战Linux启动故障修复
注意:做启动修复实验前建议先快照一下
模拟场景1: 误删除/boot所有文件
rm -rf /boot/*
reboot
恢复步骤:
第1步:选择光盘启动
第2步:选择救援模式
第3步:输入1继续救援模式
第4步:修复启动文件
#1.切换到
chroot /mnt/sysimage
#2.将光盘镜像挂在到临时目录
mount /dev/sr0 /opt
#3.安装grub2到指定磁盘
grub2-install /dev/sda
#4.从挂载的光盘镜像上安装Linux内核
#这一步会卡一会
rpm –ivh /opt/Packages/kernel-3.10.0-1062.el7.x86_64.rpm --force
#5.重新生成grub2的配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
#6.退出救援模式
exit
exit