万字详文干货:从无盘启动volumio看Linux启动原理

作者:bobyzhang , 腾讯 IEG 运营开发工程师
0. 故事的开始0.1 为什么和做什么最近家里买了对音响 , 我需要一个数字播放器 。 一凡研究后我看上了 volumio() 这是一个基于 Debian 二次开发的 HIFI 播放器系统 , 可以运行下 x86 和树莓派上 。
我打算让 volumio 运行在我 2009 年购买的老爷机笔记本上 , 也让它发挥一点余温热 。 正常操作是将 volumio 的系统镜像刷到 U 盘上 , 连接电脑后使用 U 盘启动系统即可 。 但是家里没有找到合适的 U 盘(穷~~) , 加上前段时间听了同事关于 linux 内核的分享 , 感慨自己对系统的理解不够 。 因此我决定使用无盘启动 volumio 顺便研究一下 linux 启动原理 。
目标:无盘启动 volumio 系统
0.2 方案正常 Linux 启动流程大体如下:

  1. BIOS 启动 , 完成自检 , 选择启动硬件
  2. 如果是磁盘系统读取 MBR
  3. 从 MBR 指示 , 找到 GRUB 所在分区 , 加载 GRUB 显示菜单
  4. 加载 Linux 内核到内存中
  5. 执行 INIT 程序
  6. 进入用户界面

万字详文干货:从无盘启动volumio看Linux启动原理文章插图
由于我需要从网络启动 , 过程会变得复杂一些 , 主要变化如下
  • 在 MBR 引导前 , 需要执行一系列的 PXE 流程 , 目的是挂载 iscsi 磁盘 。
  • 在加载 linux 内核后 , 由于之前 iPXE 固件已经退出 , 还需要再次挂载 iscsi 磁盘 。

万字详文干货:从无盘启动volumio看Linux启动原理文章插图
0.3 准备工作无盘启动并不是说完全没有磁盘 , 只是客户端本身没有磁盘 , 我们需要在远端给机器提供一种文件存储和磁盘共享的方案 。 我这里选择的是 iscsi 共享 , 相比于 NFS 和 samba 共享 , 它更底层 , 对系统的兼容性更好 。
iSCSI 利用了 TCP/IP 作为沟通的渠道 。 透过两部计算机之间利用 iSCSI 的协议来交换 SCSI 命令 , 让计算机可以透过高速的局域网集线来把 SAN 模拟成为本地的储存设备 。
关于 iscsi 的配置不是本文重点 , 这里就不详细描述了 , 要完成 iscsi 磁盘的挂载需要接信息 。
iscsi 服务器地址:我这里是 nas 服务的地址 192.168.3.5
target 名称:这个是服务端用来区分目标的 , 通常一个 target 服务一个客户端 , 并关联一块共享存储 , 例如:iqn.2005-10.org.freenas.ctl:yong-pc.volumio
initiator 名称:这个是客户端名称 , 用来告诉服务端谁来请求了 。
1 BIOS 和 UEFI准备工作做完 , 我们先来了解一下计算机的启动原理 , 这里就要说到 BIOS 和 UEFI , 他们是计算机按下电源后最先被执行的程序 。
1.1 BIOS (Basic Input/Output System)上个世纪 70 年代初 , "只读内存"(read-only memory , 缩写为 ROM)发明 , 开机程序被刷入 ROM 芯片 , 计算机通电后 , 第一件事就是读取它 。 这块芯片里的程序叫做"基本输入输出系统"(Basic Input/Output System) , 简称为 BIOS 。
万字详文干货:从无盘启动volumio看Linux启动原理文章插图
BIOS 程序首先检查 , 计算机硬件能否满足运行的基本条件 , 这叫做"硬件自检"(Power-On Self-Test) , 缩写为 POST 。 硬件自检完成后 , BIOS 把控制权转交给下一阶段的启动程序 。
这时 , BIOS 需要知道 , "下一阶段的启动程序"具体存放在哪一个设备 。 也就是说 , BIOS 需要有一个外部储存设备的排序 , 排在前面的设备就是优先转交控制权的设备 。 这种排序叫做"启动顺序"(Boot Sequence) 。
万字详文干货:从无盘启动volumio看Linux启动原理文章插图
1.2 UEFI (Unified Extensible Firmware Interface)不知道大家是否发现 , 这些年已经很难看到 BIOS 的身影了 。
ROM 的存储能力有限 , BIOS 能驱动的硬件类型和数量大大受限 。 导致大量新硬件无法在 PC 启动时被加载 。 最明显就是你无法在 BIOS 时使用鼠标 。 此外 BIOS 的代码历史悠久难以维护 。
在 2005 年年中时候 , 包括 BIOS 供应商、OS 供应商、系统制造商以及芯片生产公司在内的行业参与者统一建立了统一的 EFI 联盟(UEFI , Unified Extensible Firmware Interface)并在 2006 年一月发行了 UEFI 规范 2.0 。
从此你可以愉快地在 PC 启动初期使用鼠标 , 甚至像苹果一样加载网络 , 实现联网下载并安装操作系统 。
万字详文干货:从无盘启动volumio看Linux启动原理文章插图
UEFI 的启动流程和 BIOS 的启动流程不同 , 由于我 2009 年购买的老爷机还是 BIOS 结构 , 这里不详细展开 , 简单提一下 。