Linux 启动过程

安装了Arch,顺便梳理一下linux启动流程。

【BIOS(MBR)】

  1. 开机自检,通过通过BIOS加载CMOS,获取各种硬件信息。
  2. 按照BIOS 的boot sequeuece顺序读取每一个存储设备的最前面512个字节,如果发现最后两个字节是0x55, oxAA,那么就找到了主引导扇区MBR。
  3. MBR结构如下:
HDD 上的位置 代码用意
001-440 bytes 由 BIOS 启动的 MBR 启动代码
441-446 bytes MBR 硬盘签名
447-510 bytes 分区表 (主分区和扩展分区,而非逻辑分区)
511-512 bytes MBR 启动签名 0xAA55

【GRUB】

  1. 通过引导器(GNU/Linux 引导器包括 GRUB 和 Syslinux)读取分区表。
  2. “传统” Windows/DOS MBR:引导器代码会在整个分区表里搜寻一个也是唯一的一个”活动”分区,读取该分区的X扇区,并把控制权交给操作系统。Windows/DOS 引导器不能启动 Arch Linux 分区因为它不是设计来加载 Linux 内核的,而且它只适应活动分区,主分区 (GRUB 会完全无视). 这也是为什么先装linux,再装windows会无法找到linux启动项。
  3. grub:linux下一般使用grub启动root loader,让用户选择启动哪个操作系统, grub可以从任何分区启动,无论它是主分区还是逻辑分区。
  4. 分区表:每个分区表的长度只有64个字节,里面又分成四项,每项16个字节(第1个字节:如果为0x80,就表示该主分区是”活动”分区)所以,一个硬盘最多只能分四个一级分区,又叫做”主分区”。 随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成”扩展分区”(Extended partition)也就逻辑分区。 逻辑分区,以链式存放,可以无限拓展。

【载入内核】

  1. 操作系统接管硬件以后,首先将系统内核载入RAM,执行内核代码设置自己的虚拟内存子系统和根文件系统,对硬件进行检测并进行设备驱动程序初始化。
  2. 驱动程序初始化后,会挂载一个只读的根文件系统(rootfs),执行/sbin/init, 释放内存。

【初始化】

  1. 执行/sbin/init 生成第一个进程,接管系统控制权,它首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。
  2. 系统初始化脚本(/etc/rc.d/rc.sysinit)对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,读取各种系统配置,如分区挂载/etc/fstab, 网络配置/etc/sysconfig/network。
  3. 执行/etc/rc.d/rc脚本。该文件定义了服务启动的先后顺序,而具体的每个运行级别的服务状态是放在/etc/rc.d/rc*.d(=0~6)目录下,所有的文件均是指向/etc/init.d下相应文件的符号链接。rc.sysinit通过分析/etc/inittab文件来确定系统的启动级别,然后才去执行/etc/rc.d/rc.d下的文件。

【用户登录】

  1. 命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。

【桌面载入】

  1. 如果有配置图形界面自动启动,则登录成功后,会读取当前用户的~/.xinitrc 文件,启动对应的X窗口系统。
文章目录
  1. 1. 【BIOS(MBR)】
  2. 2. 【GRUB】
  3. 3. 【载入内核】
  4. 4. 【初始化】
  5. 5. 【用户登录】
  6. 6. 【桌面载入】
,