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

  • 网络启动镜像:这是对客户端下发的启动文件名称 。 (不同 CPU 架构 , 不同平台的文件名不同)
  • 拷贝之前编译好的 ipxe.pxe 和 menu.ipxe 文件到/www/pxe/目录下 , 并设置网络启动镜像为:ipxe.pxe
    配置正确 , 启动后就可以看到如下选择界面了:
    万字详文干货:从无盘启动volumio看Linux启动原理文章插图
    3. 分区:MBR 和 GPTipxe 完成使命后 , 正式交棒给磁盘 , 如果你是硬盘启动 , 可以直接跳过第 2 部分 , 直接到这一步 。 这一阶段系统需要从磁盘上找到启动文件并加载 。 在说如何找到启动文件前 , 先要说说硬盘是如何划分区块的 , 主要有两大方式 MBR 和 GPT 。 我们先来聊一下机械硬盘的工作原理 。
    机械硬盘由坚硬金属材料制成的涂以磁性介质的盘片 , 盘片两面称为盘面或扇面 。
    假设磁头不动 , 硬盘旋转 , 那么磁头就会在磁盘表面画出一个圆形轨迹并将之磁化 , 数据就保存在这些磁化区中 , 称之为磁道 , 将每个磁道分段 , 一个弧段就是一个扇区 。 一个硬盘可以包含多个扇面 , 扇面同轴重叠放置 , 每个盘面磁道数相同 , 具有相同周长的磁道所形成的圆柱称之为柱面 , 柱面数与磁道数相等 。 如下图:
    万字详文干货:从无盘启动volumio看Linux启动原理文章插图
    最初的寻址方式称为 CHS , 所谓 CHS 即柱面(cylinder) , 磁头(header) , 扇区(sector) , 通过这三个变量描述磁盘地址 。
    3.1 MBR说了这么多还是没说明白到底计算机怎么从磁盘上找到引导程序 。 答案是:它被固定写死在了 0 柱面 , 0 磁头 , 1 扇区的位置通常是 512byte , 这个位置被称为主扇区(Master Boot Record ,MBR) 。
    MBR 主要包含如下数据:
    • 主引导记录(bootloader) , 负责从活动分区加载并运行系统引导程序 。 446 字节
    • 硬盘分区表项(DPT——disk partition table) , 由四个分区表项组成 , 负责记录磁盘的分区情况 。 64 字节 。
    • 硬盘有效标志(magic number) , 代表引导扇区结束 , 占用 2 字节 。

    万字详文干货:从无盘启动volumio看Linux启动原理文章插图
    Bootloader:这部分记录了一段较小引导代码 , 用于去启动硬盘其他分区位置上更大的引导文件 , 例如 linux 操作系统的 grub 目录 。
    万字详文干货:从无盘启动volumio看Linux启动原理文章插图
    我们知道一个硬盘的每个分区的第一个扇区叫做 boot sector , 这个扇区存放的就是操作系统的 loader 。 如上图 , 第一个分区的 boot sector 存放着 windows 的 loader , 第二个分区放着 Linux 的 loader , 第三个第四个由于没有安装操作系统所以空着 。 至于 MBR 的 bootloader 是干嘛呢 ,bootloader 有三个功能:
    • 提供选单:让用户选择进入哪个系统 。
    • 读取内核文件:默认启动的 loader 会被拷贝一份到 MBR 中 , 这样就可以直接读取内核了 , 图中 1 部分
    • 转交给其他 loader:图中 2,3 部分
    Disk Partition table:这一部分 64 字节大小被均分为 4 份 , 每份大小 16 字节 , 每当我们在硬盘上创建出一个新的主分区或者扩展分区时 , 便会占用 1 个 16 字节的大小用于记录这个分区的相关信息(例如起始和截止柱面位置、分区文件系统类型等等) 。 这就是为什么 mbr 分区模式最多只能有 4 个主分区的原因 。
    MBR 的局限:
    • 最多只支持 4 个主分区 , 超过 4 个就需要使用扩展分区 。
    • 磁盘的最大容量只能到 2.2TB
    如今我家的硬盘都 4T 了 , MBR 早就不能满足需求了 。 你也不能怪 MBR , 毕竟人家 1983 年就提出了 , 比我的年纪还大 。
    3.2 GPT为了解决 MBR 的问题 , GPT 分区诞生 , GPT 全称 Globally Unique Identifier Partition Table , 也叫 GUID 分区表 , 它是 UEFI 规范的一部分(但这并不是说它只支持 UEFI , 它也支持 BIOS 方式的引导) 。
    万字详文干货:从无盘启动volumio看Linux启动原理文章插图
    GPT 分区结构如下: