一、Linux操作系统引导过程
1、引导过程总览
开机自检
检查硬件设备,检测出第一个能够引导系统的设备,比如硬盘或者光驱
MBR 引导
运行MBR扇区里的主引导程序GRUB
启动GRUB菜单
统读取GRUB配置文件(/boot/grub2/grub.cfg)获取内核的设置和位置,并在屏幕显示GRUB菜单页面 。
加载Linux内核
把内核加载到内存,将系统控制权交接给内核
init进程初始化
内核将init进程加载到内存中运行,并把init进程作为系统的第一个进程
系统初始化
启动内核模块,执行运行级别的启动脚本,执行/etc/rc.d/rc.local文件里的命令等
2、系统初始化进程
init进程
- init进程文件位于 /sbin/init -> /lib/systemd/systemd
- init进程PID号固定为 1 ,是系统中其它所有进程的父进程
- init 进程负责完成整个系统的初始化,最后等待用户进行登录
Systemd
- Systemd是Linux操作系统的一种init软件
- CentOS7中采用全新的Systemd启动方式,取代传统的SysVinit
- CentOS7中运行的第一个init进程是/lib/systemd/systemd
进程启动方式
- centos7开始的版本默认的启动方式是 systemd,开机服务程序为并行启动,启动效率较快
- centos6及以前版本的启动方式是 sysVinit,开机服务程序是通过串行执行/etc/init.d/目录下的shell脚本启动的,容易阻塞,启动效率较慢
System单元类型
Linux的运行级别
运行级别 | 说明 | 对应的Systemd的target |
0 | 关机 | poweroff.target |
1 | 单用户模式 | rescue.target |
2 | 字符界面的多用户模式(无网络) | multi-user.target |
3 | 字符界面的多用户模式(有网络) | multi-user.target |
4 | 字符界面的多用户模式(保留) | multi-user.target |
5 | 图形界面的多用户模式 | graphical.target |
6 | 重启 | reboot.target |
二、系统故障修复
1、修复MBR扇区故障
MBR 主引导程序 1~446字节 硬盘分区表 447~510字节
如果是 MBR 整个扇区数据被破坏了,需要进入到急救模式将备份的MBR数据导入还原
备份命令:dd if=/dev/sda of=备份文件 bs=512 count=1
还原命令:dd if=备份文件 of=/dev/sda
解决思路:
- 应提前作好备份文件
- 以安装光盘引导进入急救模式
- 从备份文件中恢复
实例:修复MBR扇区故障
步骤一:增加一块硬盘,用于存放数据
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x2d7e90b8 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-104857599,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-104857599,默认为 104857599):+2G
分区 1 已设置为 Linux 类型,大小设为 2 GiB
命令(输入 m 获取帮助):w^H
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# mkfs -t xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=524288, 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@localhost ~]# cd /opt
[root@localhost opt]# mkdir mbr-bak
[root@localhost opt]# mount /dev/sdb1 /opt/mbr-bak/
[root@localhost opt]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 13M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 26G 4.4G 22G 17% /
/dev/sda1 xfs 1014M 187M 828M 19% /boot
tmpfs tmpfs 378M 8.0K 378M 1% /run/user/42
tmpfs tmpfs 378M 0 378M 0% /run/user/1000
/dev/sdb1 xfs 2.0G 33M 2.0G 2% /opt/mbr-bak
[root@localhost opt]# dd if=/dev/sda of=/opt/mbr-bak/mbr.bak bs=512 count=1
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.00112141 秒,457 kB/秒
[root@localhost opt]# ll -h
总用量 0
drwxr-xr-x. 2 root root 21 4月 18 03:12 mbr-bak
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
步骤二:备份MBR扇区数据到其他磁盘(/dev/sdb1)
if指定从何处提取数据,of表示备份到何处,bs指定提取的大小,count指定次数
步骤三:模拟破坏MBR引导扇区
步骤四:进行恢复操作
实例:修复GRUB引导故障
方法:
- 尝试手动输入引导命令
- 进入急救模式,重写或者从备份中恢复grub.conf
- 向MBR扇区中重建grub程序
实例:
步骤一:删除grub.cfg文件并重启
方法一:手动输入引导命令(笨拙繁琐,不建议使用)
grub> insmod xfs #加载指定的模块到内核
grub> linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=UUID=8fd74986-ae66-4ffd-b7d8-a19f2eca7b6f ro rhgb quiet LANG=zh_CN.UTF-8 #内核的名字及位置等信息
grub> initrd16 /initramfs-3.10.0-693.el7.x86_64.img #镜像系统文件
grub> boot #引导boot
方法二:
重启后,文件已恢复,如图:
实例:MBR 的GRUB主引导程序被破坏
进入急救页面。重建MBR数据
总结:
启动类故障恢复
MBR 主引导程序 1~446字节 硬盘分区表 447~510字节
如果是 MBR 整个扇区数据被破坏了,需要进入到急救模式将备份的MBR数据导入还原
备份命令:dd if=/dev/sda of=备份文件 bs=512 count=1
还原命令:dd if=备份文件 of=/dev/sda
如果是 MBR 的GRUB主引导程序被破坏了
(1)在急救模式下使用备份文件恢复 dd if=备份文件 of=/dev/sda bs=446 count=1
(2)在急救模式下重建MBR的GRUB主引导程序 chroot /mnt/sysimage -> grub2-install /dev/sda
如果是GRUB配置文件被删了
在急救模式下重建GRUB配置文件 chroot /mnt/sysimage -> grub2-mkconfig -o /boot/grub2/grub.cfg