linux启动
1. BIOS
BIOS 代表基本输入/输出系统。简单来说,BIOS 会加载并执行主引导记录 (MBR) 引导加载程序。
首次打开计算机时,BIOS 首先对 HDD 或 SSD 执行一些完整性检查。
然后,BIOS 搜索、加载并执行引导加载程序,该程序可以在主引导记录 (MBR) 中找到。MBR 有时位于 USB 记忆棒或 CD-ROM 上,例如实时安装 Linux 时。
一旦检测到引导加载程序,它就会被加载到内存中,然后 BIOS 将系统的控制权交给它。
2. MBR
MBR 代表主引导记录,负责加载和执行 GRUB 引导加载程序。
MBR 位于可启动磁盘的第一个扇区,通常为/dev/hda
或/dev/sda
,具体取决于您的硬件。MBR 还包含有关 GRUB 或非常旧系统中的 LILO 的信息。
- MBR 代表主引导记录。
- 它位于可启动磁盘的第一个扇区。通常为 /dev/hda 或 /dev/sda
- MBR 的大小小于 512 字节。它包含三个部分:1) 前 446 字节中的主引导加载程序信息 2) 接下来 64 字节中的分区表信息 3) 最后 2 字节中的 mbr 验证检查。
- 它包含有关 GRUB(或旧系统中的 LILO)的信息。
- 因此,简单来说,MBR 加载并执行 GRUB 引导加载程序。
3. GRUB
有时称为 GNU GRUB,是 GNU GRand Unified Bootloader 的缩写,是大多数现代 Linux 系统的典型引导加载程序。
GRUB 启动画面通常是您启动计算机时看到的第一件事。它有一个简单的菜单,您可以在其中选择一些选项。如果您安装了多个内核映像,您可以使用键盘选择要用于系统启动的内核映像。默认情况下,会选择最新的内核映像。
启动画面会等待几秒钟,以便您选择选项。如果您不等待,它将加载默认内核映像。
/boot/grub/grub.conf
在许多系统中,您可以在或 处找到 GRUB 配置文件。这是一个简单文件/etc/grub.conf
的示例:grub.conf
#boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/boot/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18-194.el5PAE) root (hd0,0) kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ initrd /boot/initrd-2.6.18-194.el5PAE.img
4. 内核
内核通常被称为任何操作系统的核心,包括 Linux。它完全控制系统中的所有内容。
在启动过程的这个阶段,GRUB 选择的内核首先挂载文件中指定的根文件系统grub.conf
。然后它执行/sbin/init
程序,该程序始终是第一个要执行的程序。您可以通过其进程 ID (PID) 来确认这一点,该进程 ID 应始终为 1。
然后,内核使用初始 RAM 磁盘 (initrd) 建立一个临时根文件系统,直到挂载真实文件系统。
- 按照 grub.conf 中的“root=”指定的方式挂载根文件系统
- 内核执行/sbin/init程序
- 由于 init 是 Linux 内核执行的第一个程序,因此它的进程 ID (PID) 为 1。执行“ps -ef | grep init”并检查 pid。
- initrd 代表初始 RAM 磁盘。
- initrd 是内核用来作为临时根文件系统的,直到内核启动并挂载真正的根文件系统为止。它还包含在内部编译的必要驱动程序,可帮助内核访问硬盘分区和其他硬件。
5. 初始化
此时,您的系统将执行运行级别程序。系统会先查找 init 文件(通常在 处找到),以/etc/inittab
确定 Linux 运行级别。
现代 Linux 系统使用 systemd 来选择运行级别。根据TecMint 的说法,可用的运行级别如下:
运行级别 0由poweroff.target匹配(并且runlevel0.target是指向poweroff.target的符号链接)。
运行级别 1由rescue.target匹配(并且runlevel1.target是指向rescue.target的符号链接)。
运行级别3 由multi-user.target模拟(并且runlevel3.target是指向multi-user.target的符号链接)。
运行级别 5由graphic.target模拟(并且runlevel5.target是指向graphic.target的符号链接)。
运行级别 6由reboot.target模拟(并且runlevel6.target是指向reboot.target的符号链接)。
紧急情况由emergency.target匹配。
然后 systemd 将开始执行运行级别程序。
- 查看 /etc/inittab 文件来决定 Linux 运行级别。
- 以下是可用的运行级别
- 0 – 停止
- 1 – 单用户模式
- 2 – 多用户,无 NFS
- 3 – 完整的多用户模式
- 4 – 未使用
- 5 – X11
- 6 – 重启
- Init 从 /etc/inittab 中识别默认的 initlevel 并使用它来加载所有适当的程序。
- 在系统上执行“grep initdefault /etc/inittab”来识别默认运行级别
- 如果您想惹麻烦,您可以将默认运行级别设置为 0 或 6。既然您知道 0 和 6 的含义,那么您可能不会这样做。
- 通常,您会将默认运行级别设置为 3 或 5。
6. 运行级别程序
根据您安装的 Linux 发行版,您可能会看到不同的服务正在启动。例如,您可能会看到starting sendmail …. OK
。
这些被称为运行级别程序,并根据您的运行级别从不同的目录执行。上面描述的 6 个运行级别中的每一个都有自己的目录:
- 运行级别 0 –
/etc/rc0.d/
- 运行级别 1 –
/etc/rc1.d/
- 运行级别 2 –
/etc/rc2.d/
- 运行级别 3 –
/etc/rc3.d/
- 运行级别 4 –
/etc/rc4.d/
- 运行级别 5 –
/etc/rc5.d/
- 运行级别 6 –
/etc/rc6.d/
请注意,这些目录的确切位置因发行版而异。
如果您查看不同的运行级别目录,您会发现以“S”或“K”开头的程序,分别表示启动和终止。启动程序在系统启动期间执行,终止程序在关机期间执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了