作者:bobyzhang,腾讯 IEG 运营开发工程师
0. 故事的开始
0.1 为什么和做什么
最近家里买了对音响,我需要一个数字播放器。一凡研究后我看上了 volumio(https://volumio.org/) 这是一个基于 Debian 二次开发的 HIFI 播放器系统,可以运行下 x86 和树莓派上。
我打算让 volumio 运行在我 2009 年购买的老爷机笔记本上,也让它发挥一点余温热。正常操作是将 volumio 的系统镜像刷到 U 盘上,连接电脑后使用 U 盘启动系统即可。但是家里没有找到合适的 U 盘(穷~~),加上前段时间听了同事关于 linux 内核的分享,感慨自己对系统的理解不够。因此我决定使用无盘启动 volumio 顺便研究一下 linux 启动原理。
目标:无盘启动 volumio 系统
0.2 方案
正常 Linux 启动流程大体如下:
BIOS 启动,完成自检,选择启动硬件
如果是磁盘系统读取 MBR
从 MBR 指示,找到 GRUB 所在分区,加载 GRUB 显示菜单
加载 Linux 内核到内存中
执行 INIT 程序
进入用户界面
![](https://i-blog.csdnimg.cn/blog_migrate/df2155766ca54af933952a4807328999.png)
由于我需要从网络启动,过程会变得复杂一些,主要变化如下
在 MBR 引导前,需要执行一系列的 PXE 流程,目的是挂载 iscsi 磁盘。
在加载 linux 内核后,由于之前 iPXE 固件已经退出,还需要再次挂载 iscsi 磁盘。
![](https://i-blog.csdnimg.cn/blog_migrate/03b0f5912fe5a0bef00aa043615cbf38.png)
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。
![](https://i-blog.csdnimg.cn/blog_migrate/3a4be2e39c79b5fc3281e530cd940bd5.png)
BIOS 程序首先检查,计算机硬件能否满足运行的基本条件,这叫做"硬件自检"(Power-On Self-Test),缩写为 POST。硬件自检完成后,BIOS 把控制权转交给下一阶段的启动程序。
这时,BIOS 需要知道,"下一阶段的启动程序"具体存放在哪一个设备。也就是说,BIOS 需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做"启动顺序"(Boot Sequence)。
![](https://i-blog.csdnimg.cn/blog_migrate/55332aa0e9bdad0fe35b4a99e9c3b657.png)
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 启动初期使用鼠标,甚至像苹果一样加载网络,实现联网下载并安装操作系统。
![](https://i-blog.csdnimg.cn/blog_migrate/757a97380edbdc42752fdd5db1052e9a.png)
UEFI 的启动流程和 BIOS 的启动流程不同,由于我 2009 年购买的老爷机还是 BIOS 结构,这里不详细展开,简单提一下。
系统开机 - 上电自检(Power On Self Test 或 POST)。
UEFI 固件被加载,并由它初始化启动要用的硬件。
固件读取其引导管理器以确定从何处(比如,从哪个硬盘及分区)加载哪个 UEFI 应用。
固件按照引导管理器中的启动项目,加载 UEFI 应用。
已启动的 UEFI 应用还可以启动其他应用(对应于 UEFI shell 或 rEFInd 之类的引导管理器的情况)或者启动内核及 initramfs(对应于 GRUB 之类引导器的情况),这取决于 UEFI 应用的配置
2. PXE
回到我的 BIOS 老爷机,上电自检完成后 BIOS 按照设置的启动顺序应该交棒磁盘,但是 但是 但是 这个机器没有硬盘,也没有插入 U 盘,找不到任何启动设备的 BIOS 将控制权交给了网卡,BIOS 光荣退场进入了 PXE 阶段。
预启动执行环境(Preboot eXecution Environment&#x