Contents
Linux Boot Process
Refer:
- An introduction to the Linux boot and startup processes | Opensource.com
- Inside the Linux boot process – IBM Developer
Linux系统的启动流程分为几个阶段
- BIOS(这里是指从按开机键开始,至系统开始执行至BIOS阶段),这里一般是由硬件决定的。BIOS开始读取磁盘扇区
MBR
,引导bootloader(grub,grub2,LILO…)(stage 1) -
grub自引导,加载
core.img
(stage 1.5) -
grub加载kernel,kernel完成自解压,并启动
systemd
,老系统(非systemd启动)为init
(stage 2) -
kernel将
initrd
解压并加载至内存,initrd
的任务是完成平时使用的real rootfs
系统的挂载real rootfs
:我们平时所使用的Linux,在上完成编码等内容的环境 -
switch_root real rootfs
并unmount initrd
,完成real rootfs
中的系统加载
initrd
在前面,我们提到了initrd
,内核加载initrd
并完成real rootfs
地挂载。
那么现在的问题是
initrd
具体是什么- 它如何完成
real rootfs
的挂载
initrd是什么?
一般情况下,我们不用了解initrd
,甚至在使用Linux开发这么久后,相信很多人和我一样根本不知道它的存在。
initrd
其实是一个完整的操作系统,包含完整的文件系统,以及系统运行所需的基础依赖。也即我们可以在initrd
中完成任何在real rootfs
环境中可进行的操作。
initrd可以干什么?
因为它是一个完整的Linux系统,所以大部分Linux系统基础命令都可以执行。
这里提一个实用的操作,如果我们忘记了系统的root登陆密码,那么我们可以通过此种方式重置密码。
在grub未设置的密码的情况下(默认不设置密码),我们可以通过在grub2.cfg中内核启动项添加命令行参数,直接进入initrd
中,并对real rootfs
挂载,通过chroot
切换至real rootfs
完成密码修改,具体可参考[这篇文章](rhel – How can we change root password? – Unix & Linux Stack Exchange)和[这一篇](How to Reset Forgotten Root Password in Ubuntu (tecmint.com))
initrd与real_rootfs的区别
initrd和real_rootfs都是完整的Linux系统,但initrd的空间特别小,大概就200M左右(仅包含kernel和系统基础命令),而real_rootfs
的大小由我们的使用而定,它包含了我们的开发环境,业务环境等。
现在的疑问是,既然都是完整的Linux系统,为何不直接使用real_rootfs
,反而需要initrd
这一步而多此一举。
这里,需要说明一些被忽视的内容。
- initrd被kernel加载至内存中,(内存的大小肯定比
real_rootfs
的空间更小) -
内核中的驱动仅能启动大部分硬件,如果我们需要启动其他硬件,则需要留出一个阶段,允许我们进行操作。
假设:我们是以
NFS
的方式启动Linux,那么我们需要保证network
是通畅的,这里需要做一些准备工作。
initrd和initramfs
initrd其实分为两种:initrd
和initramfs
。
https://stackoverflow.com/questions/10603104/the-difference-between-initrd-and-initramfs
如何制作initrd
系统的进程管理有两种方式init
和systemd
,systemd
是目前大多数的Linux发行版所采用的进程管理方式。因为之前的系统大多采用init
的方式,故systemd
做了向下兼容,可将init
中控制脚本的rc*.d
转为systemd
的方式运行,当然,经过太多前人踩坑后,基本能够顺利执行了,具体可参看链接:
systemd
与init
间还有些轶闻,可以参看:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=727708
systemd与init的区别
如何启动initrd
initrd的启动流程
Linux 的启动流程 – 阮一峰的网络日志 (ruanyifeng.com)
- About initramfs (linuxfromscratch.org)
- dracut 054 (kernel.org)
- Using the initial RAM disk (initrd) — The Linux Kernel documentation
- https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt