一点一滴,成材之基!Linux系统启动流程详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一点一滴,成材之基!Linux系统启动流程详解相关的知识,希望对你有一定的参考价值。
目录:
(一)了解系统启动流程
(二)了解GRUB的作用
(三)重置root密码
(四)当GRUB丢失的时候如何修复系统
(五)当/boot里缺失文件时如何修复
(一)了解系统启动流程
(1.1)①在我们按下开机键以后,最先工作的是我们硬件Bios芯片,其中BIOS芯片主要是监测主机的各项硬件包括键盘、鼠标、显示屏、硬盘等等是否都是正常工作的状态;②如果BIOS芯片检测是正常的,则会将系统的引导权交给系统的MBR(主引导记录),在MBR中其中前446B的字节主要是BootLoader引导加载器,64B的字节是分区表的信息,最后2B的字节是用来标识硬盘是否是有效的标志;③接着就是加载内核镜像到内存中,内核镜像并不是一个可执行的内核,而是一个压缩过的内核镜像,它是提前使用zlib压缩过的,在这个内核镜像前面是一个例程,它实现少量硬件设置,并对内核镜像中包含的内核进行解压缩,然后将其放入高端内存中;④init进程是系统所有进程的起点,内核在完成核内引导后,即在本进程空间内加载init程序,它的进程是1。Init进程是所有进程的发起者和控制者。因为在任何基于Linux的系统中,它都是第一个运行的进程,所以inti进程的编号(PID)永远是1;⑤最后init的工作是根据/etc/inittab来执行相应的脚本,进行系统初始化,设置键盘,字体,装载模块,设置网路等。
注意:加载BIOS->读取MBR->Boot Loader->加载内核->用户层init依据inittab文件来设定系统运行的等级(一般3或者5,3是多用户命令行,5是界面)->init进程执行rc.syninit->启动内核模块->执行不同级别运行的脚本程序->执行/etc/rc.d/rc.local(本地运行服务)->执行/bin/login,就可以登录了。
(1.2)我们知道系统的内核是放在sda1分区的,不同的内核识别不同的文件系统,换言之就是没有内核就无法识别文件系统。在开机之前sda1是有文件系统的,而内核是放在sda1中的,我们在开机前一般是需要先将内核引导起来,然后才可以识别sda1的文件系统的;但是引导内核是需要先有文件系统的情况下才能够加载内核的;但是文件系统的识别是需要先有内核运行的,这样就陷入了一个死循环当中了。此时我们就引出了BootLoader了,大家都听说过grub,它是系统的引导程序,同样级别的引导程序还有lilo,不过是属于非常古老的程序了,我们所说的BootLoader是属于grub当中的一段代码。
(1.3)在系统中我们发现sda1分区的起点是从2048号扇区开始的,硬盘是从0磁道0扇区开始的,而0磁道0扇区是包含有512字节的,这512字节中的前446字节是BootLoader。而BootLoader实际上是从grub里stage1这段代码反汇编出来的,作用就是用来加载第二个扇区。第二个扇区是由grub里stage1.5反汇编出来的一段代码,作用是加载第3个到第n个扇区(其中n < 2048)。而在第3到第n个扇区之间存放的是一个及其精简版的文件系统,经过如上过程的引导此时我们的硬件就可以识别文件系统了,进而可以在sda1分区中加载真正的系统内核了。
(二)了解GRUB的作用
(2.1)现在我们可能会有疑问系统内核在哪里,找到内核之后,以什么样的参数来初始化内核呢?而这一切都是需要它的配置文件来设定的,这个配置文件主要是存放在/boot/grub2/目录下的grub.cfg配置文件中的,这个配置文件是由内核自动加载的,配置文件的路径是写入到代码中的不能够更改的。
# cat /boot/grub2/grub.cfg
(2.2)由于/boot/grub2/目录下的grub.cfg配置文件的内容非常的多,而且在系统启动时都会加载这个文件,所以这个文件也注明了“DO NOT EDIT THIS FILE”(不要修改这个文件),如果我们想要将修改/boot/grub2/grub.cfg配置文件中的参数,则可以先在/etc/default/grub文件中进行修改,然后使用“grub2-mkconfig”命令将/etc/default/grub文件中修改后的内容同步到/boot/grub2/grub.cfg配置文件中。而我们知道“grub2-mkconfig”只是一个程序,它是需要去调用/etc/grub.d/目录下脚本程序执行的,以此来修改/boot/grub2/grub.cfg配置文件中的内容。
(2.3)注意:经验总结,所以我们如果想要修改网卡名,将网卡名设置为必将常见的eth0、eth1的格式,我们可以使用如下的方式进行修改,然后再执行“grub2-mkconfig”这个命令将修改的配置信息应用到配置文件/boot/grub2/grub.cfg当中。
# grub2-mkconfig -o /boot/grub2/grub.cfg---将/etc/default/grub配置文件中的信息重新加载到/boot/grub2/grub.cfg系统配置文件中
(2.4)我们说尽量不要修改“/boot/grub2/grub.cfg”配置文件中的内容,并不是说不能修改,其实是可以修改这个配置文件中的内容的。但是站在安全性、易用性角度来看,这个/boot/grub2/grub.cfg配置文件是属于系统加载的文件,经常会加载读取,很容易就被修改,例如我们升级内核,此时系统升级完毕后也会一同升级/boot/grub2/grub.cfg配置文件中的内容,那么我们之前在其中配置的参数就都被覆盖了。而如果我们通过执行“grub2-mkconfig”命令,加载/etc/default/grub配置文件来进行修改则高效了很多,首先这个/etc/default/grub配置文件并不属于系统文件,基本不会被其他的进程加载,因此这个文件的存在系统中的安全性比较高,文件内容基本不会改变。所以我们在修改系统的参数的时候一般是建议修改/etc/default/grub配置文件。
(2.5)现在我们开启vms001主机上主机名为station的KVM虚拟机,我们现在想要实现进入启动界面后系统有50秒的等待用户选择时间,同时系统默认是从第二个选择条进入。首先我们从vms001主机远程登录到KVM虚拟机station上,然后进入/etc/default/grub配置文件将GRUB_TIMEOUT参数修改为50秒,GRUB_DEFAULT参数修改为1(图2-7),然后执行“grub2-mkconfig”这个命令将修改的配置信息应用到配置文件/boot/grub2/grub.cfg当中(图2-8),此时我们发现station虚拟机开机后已经是第二行作为默认系统,并且默认倒计时的时间也已经修改为50秒了(图2-9)。因此通过/etc/default/grub配置文件修改系统启动时的参数时可靠且有效的。
(三)重置root密码
(3.1)接着我们可以通过上下键选择自己所需要的内核,然后通过按键“e”进入到编辑对应内核的界面(图3-1),我们进入到第一个内核的编辑的界面,然后在linux16这一行的最后添加一个参数“xx=test”,然后按Ctrl+x继续后面的执行内容(图3-1),我们在station虚拟机上登录系统后发现,在内核参数/proc/cmdline中已经生效了我们刚刚添加的参数(图3-3)。
(3.2)我们启动系统的时候都可以插入一些我们想指定的参数,然后按Ctrl+x执行,当然这里修改参数只是本次启动生效,一般我们在维护或者修复系统的时候,才会在这里修改内核的参数。其中登录系统或有多种模式,第一种是rescue模式(救援模式),假设系统正常启动需要20个必须服务,如果某个必须服务出问题了,就会导致系统没法启动,假设救援模式只有10个必须服务,现在我们的系统服务异常没有办法正常的进入系统,此时我们可以选择进入到救援模式,出问题的服务不在救援模式的必须服务之内,那么此时系统便可以启动起来。我们在station虚拟机中按“e”键进入到内核编辑状态,然后在linux16一行的末尾删除“rhgb quiet”,然后添加“single”,也可以添加“s”或者添加数字“1”(图3-4),按Ctrl+x继续执行。此时我们通过输入root用户的密码便可以正常的登录救援模式下的系统了(图3-5),此时我们便可以使用常规的检查系统日志的方式进行系统排错了。
(3.3)第二种是emergency模式,假设系统正常启动需要20个必须服务,如果某个必须服务出问题了就会导致系统没法启动,假设emergency模式只有6个必须服务,我们进入到emergency模式的时候,如果出问题的服务不在emergency模式之内,则此时我们便可以在该模式下将系统启动起来。我们在station虚拟机进行操作,我们可以删除“rhgb quiet”也可以不删除,然后需要加上emergency表示进入该模式,接着按ctrl+x继续执行(图3-6)。进入到登录界面后,我们只需要填写root用户的密码,便可以在emergency模式下登录系统了(图3-7),然后我们便可以使用常规的检查系统日志的方式进行系统排错了。
(3.4)如果我们忘记了root用户的密码,我们想要先修改root用户的密码,然后再登录系统,此时我们可以使用如下编辑内核的方式操作,我们先将“rhgb quiet”删除,然后添加“init=/bin/sh”,再按Ctrl+x继续执行(图3-8)。由于vda1硬盘是以只读的形式挂载的,所以我们需要将其修改为可读可写的形式挂载,然后重置root用户的密码,并在根目录下创建.autorelabel文件,然后执行“exec /sbin/init”命令启动系统(图3-9),此时我们便可以正常的登录系统了。重置root密码流程如下
# mount -o remount,rw /
# echo redhat | passwd --stdin root
# touch /.autorelabel
# exec /sbin/init
(3.5)如果我们希望提高系统的安全性,也可以对grub进行加密的,我们可以进入到/etc/grub.d目录下,找到00_header文件(图3-11),并在文件中设置如下的信息,对tom用户进入grub进行加密控制(图3-12),修改完00_header配置文件后执行“grub2-mkconfig”命令,将配置的信息同步到/boot/grub2/目录下的grub.cfg文件中(图3-13),此时我们再按“e”进入grub的时候,并不会直接进入到修改内核的界面,而是出现了让我们输入用户名密码的信息。此时我们便实现了对grub加密的需求。加密grub
(3.6)当然以上我们对grub进行加密使用的是明文的密码,如果我们希望提高安全性使用密文的密码,则可以使用pbkdf2格式的加密工具对密码进行加密(图3-15),然后将加密的结果填写到/etc/grub.d/00_header文件中(图3-16),并执行“grub2-mkconfig”命令,将配置的信息同步到/boot/grub2/目录下的grub.cfg文件中(图3-17),此时我们想要进入grub对内核进行参数设置时,需要填写正确的用户名和密码信息才能正常的进入。
# grub2-mkpasswd-pbkdf2---使用pbkdf2格式加密工具对我们设置的密码进行加密
(3.7)第三种是使用光盘镜像登录系统的救援模式。如果我们忘记了系统登陆的密码,同时也忘记了进入grub修改内核的超级用户的密码,此时我们就需要去使用光盘镜像登录系统的救援模式。我们在VMware环境的vms002主机上来进行实验,假设我们现在忘记了登录vms002主机root用户的密码,我们重启机器后,立刻按Esc键进入到Boot Menu界面,然后选择第三项“CD-ROM Drive”,接着依次选择“Troubleshooting”-->“Rescue a Red Hat Enterprise Linux system”进入到了Rescue界面,此时我们进入的系统并非是我们原来硬盘里的系统,我们现在所在的位置是光盘里的系统,而我们硬盘中的系统是处于光盘系统的/mnt/sysimage的位置。
(3.8)此时我们vms002主机通过光盘镜像便进入到了光盘镜像的系统中了,我们当前vms002主机的硬盘文件在/mnt/sysimage目录下,如果我们想切换到硬盘文件的系统中进行操作,则应该使用chroot命令进行切根操作,当前我们虽然在光盘镜像的/mnt/sysimage/目录下,但是我们因为经过了切根操作,所以显示当前我们在根目录下(实际是在硬盘的根目录下)。
# ls /mnt/sysimage/
# chroot /mnt/sysimage/
(3.9)接着我们便可以在系统中重置root用户的密码了,也可以编辑00_header文件中关于超级用户登录grub的密码信息。这样我们就实现了当发生无法进入系统的情况,使用光盘镜像仍然可以进入救援模式更改密码、登录系统的需求了。然后我们使用“exit”退出两次,就可以正常的进入系统启动界面了。
(四)当GRUB丢失的时候如何修复系统
(4.1)我们知道grub作为系统的引导程序很重要,如果grub出现了丢失或者损坏的情况,那么系统便会出现一直重启或者从其他设备例如光盘或者网络重启的状态,例如我们的硬盘MBR的前446个字节出现了损坏,则代表系统的BootLoader程序没有了,即使我们尝试选择“Troubleshooting”-->“Boot from local drive”也仍然无法正常的进入系统(图4-2和图4-3)。
# dd if=/dev/zero of=/dev/sda bs=1 count=446---我们使用zero填充了sda硬盘的前446字节的内容
(4.2)此时我们应该想办法进入系统中修复BootLoader,我们重启系统后选择“Troubleshooting”-->“Rescue a Red Hat Enterprise Linux system”进入到Rescue救援模式的界面,然后执行切根到系统的根目录下,并重新安装grub程序,此时我们便可以正常的启动系统了(图4-6)。
# chroot /mnt/sysimages/---切换根
# grub2-install /dev/sda---安装grub程序,重装grub程序
(五)当/boot里缺失文件时如何修复
(5.1)在vms002主机上我们将/boot/目录中的相关启动文件删除,此时我们发现重启电脑后系统就无法正常的引导起来了,此时启动系统后我们可以看到安装grub的界面,只是系统在加载时加载不到而已(图5-2)。这个时候我们应该重启系统进入到救援模式中,我们在vms002主机上重启机器后按Esc键进入到Boot Menu界面,然后选择CD-ROM进入,接着选择“Troubleshooting”-->“Rescue a Red Hat Enterprise Linux system”便通过光盘引导进入到了救援模式当中了(图5-4),接着我们使用chroot命令实现从光盘系统切根到硬盘系统当中,此时我们发现在/boot目录下没有任何系统启动的相关文件。
(5.2)此时我们需要将启动文件安装起来,我们将/mnt目录挂载到/dev/cdrom光盘镜像内容中,然后将kernel-3.10.0的内核文件强制重新安装起来。此时我们发现/boot目录中已经生成了对应的文件信息。
# mount /dev/cdrom /mnt---首先将/mnt目录挂载到/dev/cdrom光盘镜像内容中
# rpm -ivh /mnt/Packages/kernel-3.10.0-229.el7.x86_64.rpm --force---强制重新安装kernel-3.10.0的内核文件
(5.3)虽然/boot目录中已经生成了对应的文件信息,但是我们发现还是缺少相关的内容,例如/boot/grub2/grub.cfg文件没有生成,此时我们需要使用“grub2-mkconfig”命令生成grub.cfg系统加载的配置文件(图5-7)。同时我们还需要将“grub2-install”重新安装一次,这样系统除了将grub重新安装也会生成其他系统所需的配置文件(图5-8),接着我们连续两次“exit”就可以正常进入系统了。
# mkdir /boot/grub2---创建一个/boot/grub2目录
# grub2-mkconfig -o /boot/grub2/grub.cfg---将/etc/default/grub配置文件中的信息同步到/boot/grub2/目录下的grub.cfg文件中
# grub2-install /dev/sda---重新安装grub程序,并且将安装的程序放到/dev/sda硬盘分区中
(5.4)经验总结,故障排错,有时候我们在启动iSCSI服务的主机的时候,如果忘记在/etc/fstab文件中添加“_netdev”选项,则我们的系统可能会出现无法启动的情况,此时我们应该在系统中直接输入root的用户的密码,可以临时进入系统,然后对配置文件/etc/fstab进行修改,然后重启系统即可正常登录系统。
(5.5)经验总结,有时候如果我们希望自己的系统开机后能够执行一些脚本、或者加载一些模块,此时我们可以在/etc/rc.d/rc.local里添加一些脚本文件,当然同时还需要给/etc/rc.d/rc.local文件添加可执行权限。系统提示符字符,路由器交换机
# vim /etc/rc.d/rc.local
# chmod +x /etc/rc.d/rc.local
(5.6)一般我们在系统启动的过程中也需要关注两个配置文件,第一个是/etc/motd文件,这个文件一般是在我们远程登录系统的过程中起作用(图5-16)。系统提示符字符,路由器交换机
# vim /etc/motd
(5.7)第二个是/etc/issue文件,这个文件主要是配置在字符界面登录系统的时候登录界面的提示符信息,当我们使用字符界面登录vms002主机的时候,系统显示了我们在/etc/issue配置文件中添加的信息(图5-18)。系统提示符字符,路由器交换机
# vim /etc/issue
—————— 本文至此结束,感谢阅读 ——————
以上是关于一点一滴,成材之基!Linux系统启动流程详解的主要内容,如果未能解决你的问题,请参考以下文章