【运维基础】Linux 系统启动原理
Linux 系统启动原理
系统 target
系统 target 一般可理解为系统目标,指一个系统在设计、运行或优化过程中期望达成的具体结果、指标或目的。它是系统存在和运作的核心导向,为系统的开发、维护和评估提供明确的方向。
而systemd使用类型为target的单元来分组不同单元,例如multi-user.target包涵chronyd.service、crond.service、firewalld.service等服务。
target还可以包涵其他target,例如graphical.target包涵multi-user.target,multi-user.target包涵basic.target,basic.target包涵sysinit.target。
使用以下命令查看target之间依赖关系:
[root@server ~ 21:26:47]# systemctl list-dependencies graphical.target
graphical.target
● ├─display-manager.service
● ├─network.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
● ├─auditd.service
● ├─chronyd.service
● ├─crond.service
● ├─dbus.service
● ├─irqbalance.service
● ├─mdmonitor.service
● ├─network.service
● ├─NetworkManager.service
● ├─plymouth-quit-wait.service
● ├─plymouth-quit.service
● ├─postfix.service
.........# 查看反向依赖
[root@server ~ 21:27:15]# systemctl list-dependencies sshd.service --reverse
sshd.service
● └─multi-user.target
● └─graphical.target
系统启动级别
CentOS 6 之前使用启动级别控制系统开机激活哪些服务。CentOS 7 使用target控制系统开机激活哪些服务。
runlevel | target | 作用 |
---|---|---|
0 | 关机,init 0 同 poweroff 和systemctl poweroff | |
1 | emergency.target rescue.target | 单用户模式、救援模式和紧急模式用于修复系统 |
2 | 多用户文本界面,不具备NFS功能 | |
3 | multi-user.target | 多用户文本界面 |
4 | 未使用 | |
5 | graphical.target | 多用户图形界面 |
6 | 重启,init 6 同 reboot 和systemctl reboot |
设置系统运行目标
/etc/inittab文件是CentOS 6之前版本初始化系统使用的配置文件。
# 部分内容如下 # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # # 设置运行级别为5,也就是图形化方式启动。 id:5:initdefault:
设置系统当前运行 target
# 设置系统当前运行target为multi-user.target
[root@server ~ 21:29:38]# systemctl isolate multi-user.target# 设置系统当前运行target为graphical.target
[root@server ~ 21:29:55]# systemctl isolate graphical.target
设置系统开机默认运行 target
# 查看系统开机默认运行target
[[root@server ~ 21:30:35]# systemctl get-default
graphical.target# 设置系统开机默认运行target
[root@server ~ 21:30:48]# systemctl set-default multi-user.target
# 重启验证
[root@server ~ 21:31:04]# reboot
在系统启动时选择其它目标
要在启动时选择其他目标,将 systemd.unit=target.target 参数附加到内核命令行。该配置是临时生效的,经常用于系统启动过程中故障排除。
要使用这种选择其他目标的方法,请执行以下步骤:
- 启动或重新启动系统。
- 按任意键中断启动加载器菜单倒计时(Enter除外,它用于执行正常启动)。
- 将光标移至第一个内核条目,按e编辑当前条目。
- 将光标移至以linux16开头的行,末尾附加systemd.unit=target.target。例如,systemd.unit=multi-user.target。按 Ctrl+x 使用这些更改进行启动。
重置 ROOT 密码
以下几种方法可用于设置新的root密码。例如:
- 系统管理员可以使用Live CD启动系统,挂载根文件系统,然后编辑/etc/shadow:
- 删除root账户密码字段
- 使用已知密码字段替换root密码字段
- 在CentOS 7之后版本中,可以让initramfs运行的脚本在某些点暂停,以提供root身份的shell,然后在该shell中重置root密码。
方法1:rd.break
-
重新启动系统。
-
按任意键(Enter除外)中断启动加载器倒计时。
-
将光标移至第一个内核条目,按e编辑当前条目。
- 将光标移至以 linux16 开头的行,末尾附加 rd.break。利用该选项,在系统从initramfs向实际系统移交控制权前,系统将会中断。按Ctrl+x进行启动。
- 此时,系统会显示root shell,且磁盘上的实际根文件系统以只读方式挂载在/sysroot。
以读/写形式重新挂载/sysroot。
switch_root:/# mount -o remount,rw /sysroot
- 切换root位置,把/sysroot做为文件系统树的根。
switch_root:/# chroot /sysroot
- 设置新root密码。
sh-4.2# echo password | passwd --stdin root
提示:password 是用户自定义密码。
- 如果系统开启了 SELinux 功能,则需要确保所有未标记的文件(包括此时的/etc/shadow)在启动过程中都会重新获得标记。
sh-4.2# touch /.autorelabel
- 执行以下命令,系统将继续启动。如果系统开启了SELinux功能,还需要执行完整的 SELinux 重新标记,然后再次重新启动。
sh-4.2# exit
switch_root:/# exit
- 登录验证。
/etc/fstab 引起的系统启动问题
环境准备
# 设置磁盘分区管理方案
[root@server ~ 09:48:40]# parted /dev/sdb mklabel msdos
信息: You may need to update /etc/fstab.# 创建分区
[root@server ~ 09:58:00]# parted /dev/sdb unit MiB mkpart primary 1 10241
信息: You may need to update /etc/fstab.# 格式化为xfs文件系统
[root@server ~ 09:58:35]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=655360 blks= sectsz=512 attr=2, projid32bit=1= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2621440, imaxpct=25= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0# 创建挂载点
[root@server ~ 09:58:59]# mkdir /data01# 设置持久化挂载
[root@server ~ 09:59:07]# echo '/dev/sdb1 /data01 xfs defaults 0 0' >> /etc/fstab # 挂载并验证
[root@server ~ 10:00:05]# mount -a
[root@server ~ 10:00:11]# df -h /data01
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 10G 33M 10G 1% /data01
故障1:挂载点不存在
环境准备
[root@server ~ 10:00:22]# umount /data01
[root@server ~ 10:11:11]# rmdir /data01
重启系统验证
# 可以正常进入系统,挂载点会被自动创建
[root@server ~ 10:12:17]# df -h /data01
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 10G 33M 10G 1% /data01
故障2:设备名称写错或者找不到设备
环境准备
[root@server ~ 10:12:19]# vim /etc/fstab
# 将原先的sdb1修改为sdb2
/dev/sdb2 /data01 xfs defaults 0 0
重启系统验证
-
启动过程中找不到该设备。
-
1分30秒超时后,进入emergency模式,进行修复。(或用rd.break来处理)
修改为正确的值或者注释该条目,确保系统正常启动。
-
然后输入exit,继续启动。
演示:
故障3:破坏文件系统
环境准备
[root@server ~ 13:36:13]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1
记录了1+0 的读入
记录了1+0 的写出
1048576字节(1.0 MB)已复制,0.00152174 秒,689 MB/秒
[root@server ~ 13:36:27]# reboot
重启系统验证
-
系统启动过程中尝试修复文件系统,修复失败后提示进入 emergency 模式修复。
-
进入emergency 模式修复。
# 执行以下命令修复
[root@centos7 ~]# xfs_repair /dev/sdb1
修复完成后,输入exit继续启动系统,并可以正常启动系统。
演示:
grub2 配置
grub2 配置文件
grub2 的主要配置文件如下:
-
/boot/grub2,grub2的主要配置文件所在目录,例如grub.cfg、grubenv、user.cfg。
-
/etc/grub2.cfg
-
/etc/grub2.cfg 是指向 /boot/grub2/grub.cfg的软连接。
-
不要直接修改/etc/grub2.cfg文件,该文件由系统自动生成。如果需要自定义这个文件,可以通过修改/etc/grub.d/中脚本和/etc/default/grub文件,然后通过grub2-mkconfig命令生成。
使用efi启动方式的grub2配置文件是/etc/grub2-efi.cfg。
-
-
/etc/grub.d/,该目录下存放多个数字开头的脚本,按照从小到大的顺序执行。例如00_header会调用/etc/default/grub配置文件来实现最基本的开机界面配置。
-
/etc/default/grub,定义grub启动部分变量信息,例如grub启动菜单选择条目的超时时间,内核参数等。
-
/boot/grub2/grubenv,设定默认启动条目。
grub 菜单超时时间
[root@server ~ 19:31:24]# vim /etc/default/grub
# 修改GRUB_TIMEOUT为10
GRUB_TIMEOUT=10# 生效grub2.cfg配置文件
[root@server ~ 19:34:45]# grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-1299648f359e4a80b5d4d319d510ea97
Found initrd image: /boot/initramfs-0-rescue-1299648f359e4a80b5d4d319d510ea97.img
done# 重启
[root@server ~ 19:36:00]# reboot
kernel 启动参数
[root@server ~ 19:40:23]# vim /etc/default/grub
# 修改GRUB_CMDLINE_LINUX,例如在最后添加参数console=ttyS0,导致不显示启动过程
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet console=ttyS0"# 生成grub2.cfg配置文件,重启验证
[root@server ~ 19:42:08]# grub2-mkconfig -o /etc/grub2.cfg
[root@server ~ 19:42:21]# reboot
效果如下:
grub 菜单加密
# 查看/etc/grub.d/01_users脚本
[root@server ~ 19:44:21]# cat /etc/grub.d/01_users
#!/bin/sh -e
cat << EOF
if [ -f \${prefix}/user.cfg ]; thensource \${prefix}/user.cfgif [ -n "\${GRUB2_PASSWORD}" ]; thenset superusers="root"export superuserspassword_pbkdf2 root \${GRUB2_PASSWORD}fi
fi
EOF# 生成grub2密码
[root@server ~ 19:44:23]# grub2-mkpasswd-pbkdf2
输入口令:123
Reenter password: 123
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.3066B665D88E8C3DFEF0765D89CA7C67E3E81080207CA682812C68C152F467564A625EDF1B91A100B6C11A3E29BE0938DC6F382C206DCF9AA869F4149D311B65.F76B641F962A9B7E1B1D6841E010F8BE3D736EED9BDA20F464C3467D8083E260FA0787AC9498969257DEEC9AE96448969BF64DAE2C1ECA9BCBF04520AEA25A6B# 创建文件
[root@server ~ 19:45:33]# vim /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.3066B665D88E8C3DFEF0765D89CA7C67E3E81080207CA682812C68C152F467564A625EDF1B91A100B6C11A3E29BE0938DC6F382C206DCF9AA869F4149D311B65.F76B641F962A9B7E1B1D6841E010F8BE3D736EED9BDA20F464C3467D8083E260FA0787AC9498969257DEEC9AE96448969BF64DAE2C1ECA9BCBF04520AEA25A6B# 生成grub2.cfg配置文件,重启验证
[root@server ~ 19:49:16]# reboot
效果如下:
-
启动菜单界面,按e编辑。
-
输入用户名root,密码redhat。
- 弹出如下菜单,可以编辑了。
grub2 故障处理
MBR 组成回顾
主引导扇区由三个部分组成:
- 引导程序(占446个字节),硬盘启动时将系统控制权转给分区表中的某个操作系统。
- 磁盘分区表项(DPT,Disk Partition Table),由四个分区表项构成(每个16个字节)。
- 结束标志(占2个字节),其值为AA55(十六进制)。
故障:grub 引导程序故障
环境准备
[root@server ~ 21:14:38]# dd if=/dev/zero of=/dev/sda bs=1 count=446
记录了446+0 的读入
记录了446+0 的写出
446字节(446 B)已复制,0.00121374 秒,367 kB/秒
**效果如下:**系统无法从硬盘启动,则会尝试使用其他设备启动。
**解决思路:**使用光盘启动,并重新安装引导程序。
解决过程:
- 开机从光盘启动,并选择
Troubleshooting
。
- 选择
Rescue a CentOS system
- 稍等片刻,进入选择界面,选择
1
。搜索到系统后,提示系统已经挂载在/mnt/sysimage,按回车继续。
- 切换root目录,并确保root文件系统是读写挂载。
sh-4.2# chroot /mnt/sysimage
bash-4.2# mount | grep root
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota )
- 确认系统启动分区所在磁盘。
- 安装引导程序。
bash-4.2# grub2-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
- 输入
exit
两次重启系统:第一次exit,退出chroot环境;第二次exit,退出系统。
bash-4.2# exit
sh-4.2# exit
文件系统是读写挂载。
sh-4.2# chroot /mnt/sysimage
bash-4.2# mount | grep root
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota )
- 确认系统启动分区所在磁盘。
[外链图片转存中…(img-YlgPNk0y-1754401071484)]
- 安装引导程序。
bash-4.2# grub2-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
- 输入
exit
两次重启系统:第一次exit,退出chroot环境;第二次exit,退出系统。
bash-4.2# exit
sh-4.2# exit