linux 系统引导过程及引导修复
系统引导过程:
第一步:通电
第二步:bios初始化
1.对硬件检测
2.初始化硬件时钟
第三步:磁盘引导
1. mbr=主引导记录=0磁道1扇区446字节(磁道:磁头转一周的轨迹)
2.作用: 记录grub2文件的位置,当mbr数据丢失系统会因为找不到启动分区而停止启动。
3.问题模拟:
(1)使用 fdisk -l 指令查看硬盘以及分区信息
系统磁盘:/dev/nvme0n1(*所在的分区对应的设备上有mbr)
(2)使用 dd if=/dev/zero of=/dev/nvme0n1 bs=446 count=1 指令清空/dev/nvme0n1上的mbr数据。注意446字节后面的64个字节是分区表,分区表一经损坏后,你就要知道设备开始的块和结束的块,所以一般分区表是备份的。
(3)重启
注意要从硬盘启动,不要使用镜像。
重新开机,发现启动失败。
4.恢复:
(1)设置使用光盘,并首先从光盘启动。
(2)选择Troubleshooting
选择第二个选项,进入系统挽救模式。
注意这个挽救模式使用的是光盘里的资源,而不是磁盘里的数据,它可以将磁盘里的系统挂载到光盘里的挽救环境中的/mnt/sysimage。1)表示继续,2)表示只读打开我们的系统,3)表示不挂载系统,直接进入挽救的shell,4)表示重启。
选择1)
(3)使用 chroot /mnt/sysimage 指令,发现分区挂载正常了。
(4)使用 grub2-install /dev/nvme0n1 指令重新安装grub2到系统硬盘上(重新给硬盘写mbr),发现没有产生错误。
(5)两次exit后重启
(6)由光盘启动再调回硬盘启动
(7)恢复成功
第四步:grub2文件引导
1.文件位置:
rehl7:/boot/grub2/grub.cfg
rehl8:/boot/grub2/grub.cfg 及 /boot/loader/entries/xxxx.conf
在rehl8中,标题和要加载的文件已经从grub.cfg分离出去了,放在/boot/loader/entries/下。
2.作用: 指定/boot位置,指定系统启动时加载文件名称。
3.问题模拟:
rehl7:rm -fr /boot/grub2/grub.cfg
rehl8:rm -fr /boot/loader/entries/xxxx.conf 两个都要删掉
如果删掉一个,留下rescue文件,系统还是可以起来的。
我们接下来删掉rescue文件试试
发现系统暂停在了grub引导的位置
4.修复:
只是删除文件,但还没有重启时修复:
rehl7:grub2-mkconfig > /boot/grub2/grub.cfg
rehl8:kernel-install add 内核版本号 内核镜像
kernel-install add $ (uname -r) /lib/modules/$ (uname -r)/vmlinuz
注意:uname -r命令可以得到linux版本号 ,$表示执行这个命令。
已经重启时修复,要进行手动引导:
(1)set root=“hd0,msdos1”(root是boot分区的挂载点,hd0表示第一块硬盘,msdos1表示第一块硬盘的第一个分区,使用df查看/boot分区在第几块硬盘就写什么)
(2)linux16 /vmlinuz-3.10.0-957.el7.x86_64 ro root=/dev/nvme0n1p3(指定内核镜像文件和根分区文件所在的位置,内核加载时权限为只读,并通过“root=”来指定根分区设备文件的位置,/root在第二块硬盘,同样使用df查看/root分区位置)
(3)initrd16 /initramfs-4.18.0-80.el8.x86_64.img(指定系统初始化镜像)
(4)boot,注意不是reboot。
修复成功!
(5)为了下次可以正常启动系统,我们要进行以下操作,这样就会恢复原来的两个文件。
(6)重启电脑,发现可以正常启动。
第五步:内核加载
1.文件位置: /boot/vmlinuz- $( uname -r)
2.加载内核作用:
(1)系统初始化硬件设备
(2)只读挂载/根设备
3.问题模拟:
rm -fr /boot/vmlinuz- $(uname -r),删除文件并重启。
发现系统进不去了
4.修复:
重装内核
(1)进入到挽救模式
在开机时迅速按键,以光盘方式启动,进入挽救模式。
(2)chroot /mnt/sysimage(得到真实的跟挂载)
(3)mount /dev/cdrom /mnt
(4)cd /mnt/BaseOS/Packages
(5)rpm -ivh kernel-core-xxx.rpm --force
(6)两次退出将系统关闭后,重新启动发现启动成功。
第六步:系统初始化镜像
1.位置: /boot/initramfs-4.18.0-80.el8.x86_64.img
2.作用:
(1)加载系统时钟
(2)加载selinux
(3)加载系统主机信息
(4)加载/etc/fstab文件中磁盘挂载策略
(5)加载磁盘配额
(6)初始化系统程序开启开机启动服务
(7)开启虚拟控制台
(8)开启图形
比如开机启动服务脚本文件在哪里呢?
在目录/etc/systemd/system/multi-user.targer.wants内
比如说,我们让sshd服务开机不启动,查看一下效果。
发现sshd.service从/etc/systemd/system/multi-user.target.wants目录下移出了。
再比如开启图形:
如果开机开启图形,default.target就会指向开启图形的脚本。
3.问题模拟:
rm -fr /boot/initramfs-xxxx.img
4.恢复:
(1)如果系统没重启: 直接执行
mkinitrd /boot/initramfs-$ (uname -r).img $ (uname -r)
(2)如果系统重启了: 在挽救模式下执行
mkinitrd /boot/initramfs-$ (uname -r).img $ (uname -r)
在这里演示第二种情况
启动失败
进入挽救模式
发现initramfs文件成功生成了
两次退出关闭系统,并重新启动,发现启动成功。
第七步:系统启动级别
1.级别:
0: 关机
1: 单用户
2: 无图形网络模式
3: 无图形网络模式
4: 无图形网络模式
5: 有图形网络模式
6: 重启
2.模拟问题: systemctl set-default reboot.target
补充几个命令含义:
(1)systemctl set-default graphical.target:图形模式
(2)systemctl set-default multi-user.target:无图形模式
(3)systemctl set-default reboot.target:无限重启
(4)systemctl set-default poweroff.target:每次读取default文件时就会关机
比如:使用命令(3),default文件就链接到了reboot文件上。
关闭电脑,再重新启动。
发现不断回到这个界面
3.修复:
(1)在开机选择界面先按上下键停到此界面,然后按进入到引导文件编辑模式。
(2)在内核加载选项最后加入启动级别5
(3)使用 ctrl+x 指令
恢复成功
(3)systemctl set-default graphical.target
为避免下一次启动出现问题,将文件永久更改回来,并重启测试。
启动成功!
第八步:超级用户密码忘记
恢复:
1.在开机选择界面先按上下键停到此界面,然后按进入到引导文件编辑模式。
2.在内核加载选项最后删除到ro选项
3.更改ro为rw(这样才能写)
4.加入rd.break参数(将内核启动打断)终止系统启动,进入单用户模式。
5. 使用 ctrl+x 指令启动
6.使用 chroot /sysroot 指令切换到我们真实的shell(此时已经是超级用户身份)
7.使用 echo 123 | passwd --stdin root 指令更改超级用户密码
8.当selinux开启时,必须使用 touch /.autorelabel 指令重新初始化selinux。(selinux关闭时,不用做这步操作)
9.两次退出,重新启动。
发现使用刚才设置的超级用户密码可以成功登录🌈