Linux 系统引导过程及引导修复

  • 1. Linux 中如何从光盘启动主机
  • 2. Linux 中从硬盘启动
  • 1. 通电
  • 2. bios初始化
  • 3. 磁盘引导
  • 4. grub2文件引导
  • 5. 内核加载
  • 6. 系统初始化镜像
  • 7. 系统启动级别
  • 8. 超级用户密码忘记


1. Linux 中如何从光盘启动主机

一般我们的系统都是默认从硬盘中启动,但是在特定的时候当硬盘启动失败时,就需要用到从光盘中启动。此实验以 linux 系统中的虚拟机为例来说明。
在超级用户下用图形的方式或者命令的方式打开虚拟机控制器;

图形的方式:

linux服务器bios设置光盘启动 linux设置从光盘启动_运维


命令的方式:输入命令 nm-connection-editor ;打开虚拟机控制界面;

选择要做设置的虚拟机,双击进入管理界面;点击灯泡标志之后,便可以对硬件信息进行更改;

linux服务器bios设置光盘启动 linux设置从光盘启动_运维_02

点击Add Hardware ,添加一个光盘,设置如图所示;找到镜像的位置,选择设备类型,选择磁盘类型;最后点击 Apply ;完成之后便可以看到添加的光盘;

linux服务器bios设置光盘启动 linux设置从光盘启动_加载_03

添加光驱完成之后点击 Boot Options ,在右边选中光盘,然后用右边的上下键来调整光盘到第一行,此设置完成之后,在开启系统的时候便会默认从光盘中启动。

linux服务器bios设置光盘启动 linux设置从光盘启动_初始化_04


用光盘启动的界面如下图所示:

linux服务器bios设置光盘启动 linux设置从光盘启动_运维_05


如果不需要从光盘启动,就将硬盘调至第一行再次启动时就会默认从硬盘中启动。

2. Linux 中从硬盘启动

1. 通电

开启主机

2. bios初始化

对硬件检测
初始化硬件时钟

3. 磁盘引导

mbr=主引导记录=0磁道1扇区446
作用:
记录grub2引导文件的位置

当mbr数据丢失系统会因为找不到启动分区而停止启动

输入命令 fdisk -l 查看所有设备;

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_06


此系统中的设备为 /dev/vda , /dev/vda1 为设备分区, * 为设备上 mbr 的记录 。也就是系统在启动时,从硬盘上指定位置读取数据。

输入命令 dd if=/dev/zero of=/dev/vda bs=446 count=1,命令表示从系统的无限0字节中截取数据放到 vda 硬盘中,截取一块大小为446 byte ,一共截取一块。这样就将 mbr 中的记录清空。

linux服务器bios设置光盘启动 linux设置从光盘启动_初始化_07

当系统引导程序被破坏之后,在从硬盘中启动时系统无法识别从什么位置读取信息;

linux服务器bios设置光盘启动 linux设置从光盘启动_初始化_08

此时关闭该系统,选择从光盘启动;启动之后如图所示,用上下键选择第3行;

linux服务器bios设置光盘启动 linux设置从光盘启动_运维_09


在选择第3行之后,会进入到当前页面;此时选择第2行,进入系统的挽救模式;

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_10

进入挽救模式后 ,会显示如图所示的信息;

1.继续进入挽救模式
2.只读进入挽救模式
3.直接开启shell
4.退出

linux服务器bios设置光盘启动 linux设置从光盘启动_运维_11

此处选择第一个继续进入挽救模式;

linux服务器bios设置光盘启动 linux设置从光盘启动_加载_12

继续进入挽救模式之后,会有一个命令如图中所示 chroot /mnt/sysimage 表示转换系统从光驱到真实系统的磁盘;

此处我们直接回车,得到一个shell ;
然后输入 chroot /mnt/sysimage,切换到真实的系统;
输入 grub2-install /dev/vda 命令,安装 mbr引导文件; /dev/vda 为有引导分区的设备名称 ;
安装完成之后,看到 no error 表示安装成功;
然后输入两次 exit exit 就会自动重启系统;

linux服务器bios设置光盘启动 linux设置从光盘启动_运维_13


但此时还是从光驱中启动,应该先关闭系统,调整启动方式为硬盘启动,再启动系统查看设定是否成功;

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_14

如图,从硬盘启动时会自动进入并无报错,则说明设定成功。

linux服务器bios设置光盘启动 linux设置从光盘启动_linux_15

4. grub2文件引导

从硬盘启动之后,看到的两行标题是系统引导文件中的内容。

linux服务器bios设置光盘启动 linux设置从光盘启动_linux_15

在 rhel8 中

  • /boot/grub2/grub.cfg 为主引导文件
  • /boot/loader/entries/xxxxxxxxx.conf 为子引导文件

在引导文件 /boot/loader/entries/ 目录中有两个文件,查看其内容和开机界面中的两行分别对应;

linux服务器bios设置光盘启动 linux设置从光盘启动_linux_17


当系统中的引导文件丢失时:

1.当主引导文件丢失 (一般不会丢失)

只需输入命令 grub2-mkconfig > /boot/grub2/grub.cfg ,便可将主引导文件恢复。

linux服务器bios设置光盘启动 linux设置从光盘启动_初始化_18

2.当子引导文件丢失,在开启系统的时候会无法自动引导,
此时需要手动引导,需要知道 / 分区所在的设备名称是谁。

如图所示,/分区所在的系统设备是 /dev/vda3;
/boot 分区所在的系统设备,这是启动份分区所在系统设备;

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_19


我们通过手动的方式让文件丢失,来看其丢失之后的效果以及恢复的办法;

linux服务器bios设置光盘启动 linux设置从光盘启动_加载_20

在引导文件丢失的情况下,此时 reboot 重启系统,会出现如图所示的情况;表示引导文件丢失,无法自动引导,需要手动填写引导信息;

linux服务器bios设置光盘启动 linux设置从光盘启动_linux_21


手动引导过程

  1. set root=‘hd0,msdos1’ 表示指定系统引导分区的位置,root 表示指定引导设备; hd0 指定引导分区的位置为第一块硬盘;msdos1 表示指定引导分区在第一块硬盘的第一个分区中。
  2. linux16 /vmlinuz-4.18.0-193.e18.x86_64 ro root=/dev/vda3 启动内核只读挂载分区。/vmlinuz-4.18.0-193.e18.x86_64 为内核文件,ro 表示只读挂载, root=/dev/vda3 表示根分区设备。
  3. initrd16 /initramfs-4.18.0-80.el8.x86_64.img 表示加载系统初始化镜像。
  4. boot 引导完成启动系统

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_22


以上并不表示系统的问题解决,在 /boot/loader/entries/ 中并没有恢复引导文件,在以后的开机中每次都要做此设置.

如果要恢复引导文件,需要安装内核完成以下操作:
输入命令 kernal-install --help 查看安装帮助;
在帮助中可以看到需要知道当前系统的内核版本,可以用命令 uname -r 查看系统的内核版本;

linux服务器bios设置光盘启动 linux设置从光盘启动_加载_23

知道内核版本之后,按照版帮助的信息提示,输入命令 kernel-install add 4.18.0-193.el8.x86_64 /boot/vmlinuz-4.18.0-193.el8.x86_64 安装内核;
此时会有报错,提示文件缺失;

输入命令 cp /usr/lib/modules/4.18.0-193.el8.x86_64/bls.conf /boot/ 解决报错的问题;

然后在输入命令 kernel-install add 4.18.0-193.el8.x86_64 /boot/vmlinuz-4.18.0-193.el8.x86_64 安装内核,此时不再会有报错,说明安装成功;

此时可以看到引导文件已经恢复,再次启动系统时便可以直接进入。

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_24


系统的引导文件都是在系统的 boot 分区中,内核初始化镜像等。

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_25

5. 内核加载

加载内核作用:
读取的是 /boot/vmlinuz-$(为用 uname -r 查看到的内核版本号)
系统初始化硬件设备
只读挂载设备

我们手动删除系统中的内核,来模拟内核丢失时的情况;

linux服务器bios设置光盘启动 linux设置从光盘启动_初始化_26


当内核丢失时,在开启系统的时候会出现如下的情况;此时应该进入挽救模式来开启。

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_27


在挽救模式下,直接回车,得到一个shell ;

然后输入 chroot /mnt/sysimage,切换到真实的系统;

输入命令 mount /dev/cdrom /media/ 将设备挂载在 media 目录上;

输入命令 cp kernel-core-4.18.0-193.el8.x86_64.rpm /mnt/ 将内核文件复制到 /mnt/ 中;

找到内核后输入命令 cp /mnt/lib/modules/4.18.0-193.el8.x86_64.rpm/vmlinuz /boor/vmlinuz-4.18.0-193.el8.x86_64 将内核文件复制的 /boot/ 中去;

然后输入两次 exit ,即可自动进入系统。

linux服务器bios设置光盘启动 linux设置从光盘启动_初始化_28


linux服务器bios设置光盘启动 linux设置从光盘启动_初始化_29

此时默认开启系统的方式还是为从光盘启动,调整开启主机的方式为从硬盘启动,再次打开系统的时候就可以正常启动。在启动系统之后,可以看到 /boot/ 中的内核文件已经恢复。

6. 系统初始化镜像

加载内核完成后,就要加载的文件是系统初始化镜像。

初始化镜像所在位置 /boot/initramfs-4.18.0-80.el8.x86_64.img
作用:
加载系统时钟
加载 selinux
加载系统主机信息
加载 /etc/fstab 文件中磁盘挂在策略
加载磁盘配额
初始化系统程序开启开机启动服务
开启虚拟控制台
开启图形

手动删除系统中的初始化镜像,来模拟初始化镜像丢失时的情况;

linux服务器bios设置光盘启动 linux设置从光盘启动_运维_30


当初始化镜像丢失时,在开启系统的时候会出现如下的情况;此时应该进入挽救模式来开启系统。

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_31

在挽救模式下,直接回车,得到一个shell ;
然后输入 chroot /mnt/sysimage,切换到真实的系统;
输入命令 cd /root/ 进入此目录中;用 ls 查看此目录中的内容;
输入命令 mkinitrd --help 查看帮助,帮助提示的例子直接照抄;
输入命令 mkinitrd /boot/initramfs-4.18.0-80.el8.x86_64.img 4.18.0-80.el8.x86_64;
用 ls 查看 /boot/ 目录中的内容,此时目录中已经生成了初始化镜像文件;
输入两次 exit 即可自动进入系统。

linux服务器bios设置光盘启动 linux设置从光盘启动_linux_32


此时默认开启系统的方式还是为从光盘启动,调整开启主机的方式为从硬盘启动,再次打开系统的时候就可以正常启动。在启动系统之后,可以看到 /boot/ 中的内核文件已经恢复。

7. 系统启动级别

当系统初始化完成之后,就会加载系统的启动级别,以及系统所用到的脚本。加载目录为 /etc/systemd/system/;在此目录中 default.target 为系统启动级别的脚本链接;multi-user.target.wants为系统所有服务的启动脚本链接。

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_33


当我们关闭系统中的 sshd 服务时,multi-user.target.wants 中的 sshd.service ;

linux服务器bios设置光盘启动 linux设置从光盘启动_运维_34


当我们再次重启 dhcp 服务时,在 multi-user.target.wants 中又会生成 sshd.service 的文件;

当我们在设定服务开机启动或开机不启动时,系统会在 /etc/systemd/system/multi-user.target.wants/ 中新建或者删除链接。

linux服务器bios设置光盘启动 linux设置从光盘启动_加载_35

以上便是系统服务开机启动原理。

输入命令 ll default.target 可以显示其链接地址;
输入命令 ls /lib/systemd/system/*.target ,显示 /lib/systemd/system/ 目录中所有以 .target结尾的文件;

linux服务器bios设置光盘启动 linux设置从光盘启动_加载_36

其中启动级别有如下所示的含义:

0 关机
1 单用户
2 无图形网络模式
3 无图形网络模式
4 无图形网络模式
5 有图形网络模式
6 重启

如果在系统中输入 systemctl set-default reboot.target,系统在开启时会进入无限重启模式;

linux服务器bios设置光盘启动 linux设置从光盘启动_linux_37

解决办法:

在开机选择界面用上下键选中第一个,按进入到引导文件编辑模式;

linux服务器bios设置光盘启动 linux设置从光盘启动_加载_38


在编辑模式中,会有如下图所示的情况;上面为五行,在第四行内核加载选项最后加入 5 指定启动级别为有图形网络模式;

然后按 ctrl+x 开启系统; 此种方法是手动进入启动级别5。

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_39


以上设定是手动方式进入启动级别5;在手动设定完成之后,再次开启系统的时候还是会无限重启,需要做如下设置:

输入命令 systemctl set-default graphical.target

linux服务器bios设置光盘启动 linux设置从光盘启动_运维_40

设定完成之后,再次开启时便正常进入。

8. 超级用户密码忘记

当超级用户在忘记密码的时候,在开机选择界面用上下键选中第一个,按进入到引导文件编辑模式;

linux服务器bios设置光盘启动 linux设置从光盘启动_加载_38


在编辑模式中,会有如下图所示的情况;上面为五行,在第四行内核加载选项中,删除到 ro ,写入 rw 和 rd.break ;更改ro---->rw, 加入 rd.break 参数终止系统启动进入单用户模式,在系统内核完成之后,终止系统启动;

然后按 ctrl+x 开启系统。

linux服务器bios设置光盘启动 linux设置从光盘启动_加载_42

进入到系统单用户模式,当前模式下默认使用root 用户登陆;

linux服务器bios设置光盘启动 linux设置从光盘启动_linux服务器bios设置光盘启动_43


然后输入命令 chroot /sysroot/;

然后输入命令 echo lee| passwd --stdin root 给超级用户设定密码;

输入命令 .touch /.autorelabel ;当 /.autorelabel 文件存在 时,selinux 会重新初始化cp kernel-

core-4.18.0-80.el8.x86_64.rpm /mnt/ ;让系统中内核型加强型火墙(selinux)重新初始化,如果更改密码后 selinux 未被重新初始化会阻止新密码生效,此操作只有在 selinux 开启时需要;

linux服务器bios设置光盘启动 linux设置从光盘启动_linux_44


然后按两次 exit 退出,再次登陆时按照设定的密码即可登陆。