别人的Linux私房菜(20)启动流程、模块管理与Loader

系统启动时,首先加载BIOS,通过BOIS读取COMS的硬件信息,进行自我检测,取得第一个可启动的设备(多个根据设置有关)。

读取并执行设备内的MBR启动引导程序,引导程序调用boot sector中的boot loader,通过boot loader加载Kernel调用systemd程序,并以default.target流程启动。

BOIS通过INT13中断功能读取MBR记录的引导程序,BootLoader可以让用户选择不同的启动选项,指向内核,或转交其它的loader。

在Windows安装完毕后安装的Linux使用Linux的MBR引导程序(grub2)。之后通过grub2引导到不同的BootLoader。

通过boot loader加载Kernel后,将内核文件解压到内存中,重新检测硬件设备信息。

内核文件在/boot/vmlinuz中,可以通过动态加载内核模块。内核模块存放在/lib/modules/目录下。启动过程中跟目录为只读方式挂载。

虚拟文件系统(Initial RAM Disk)一般使用的文件名为:/boot/initrd或/boot/initramfs。它加载到内存中,解压模拟成根目录,内核借此加载适当的驱动程序,最终释放虚拟文件系统。

通过lsinitrd命令显示initramfs的内容。initramfs这个小型的根目录,内核检测到后,使用initrd.target来启动,最后读入一批*.target,让系统顺利运行。

最终,卸载initramfs文件系统,挂载实际根目录,完成内核的完整加载,主机开始正确运行,之后内核调用程序systemd(PID:1)。

systemd默认启动的服务集合为default.target。可以作为default.target的项目有图形.target,命令行.target等,和SystemV对应。

取得了/etc/systemd/system/default.target后,链接到/usr/lib/systemd/system下的multi-user.targetgraphical.target之一,然后在

/etc/systemd/system/对应的.target.wants/加载用户设置的unit(service),在/usr/lib/systemd/system/对应的.target.wants/加载系统默认的unit。

systemctl list-dependencies sysinit.target,可以看到sysinit.target阶段的工作让系统可以读写,而basic.target让系统成为操作系统的基础。

之后的multi-user.target可以提供主机服务,网络服务等,在相应的两个文件夹的want中存在对应的unit功能。

新版的Linux执行自定义的额外程序写入到/etc/systemd/system下面,但保留了旧版/etc/rc.d/rc.local写入到该文件的自定义功能。

但需要启动该服务,并加入执行权限,可以在defaul.target下找到对应的依赖关系。

通过ll /usr/lib/systemd/system/runlevel*.target,可以找到运行级别的对应关系,调用过程使用init命令或systemctl isolate命令。

通过cat multi-user.target类命令查看相应的依赖项等。通过systemctl list-dependencies graphical.target查看对应的依赖关系。

猜你喜欢

转载自www.cnblogs.com/bai2018/p/10780904.html