磁盘驱动 — 创建磁盘与分区操作

tags: 操作系统, 磁盘
@烩面 21/01/2026

《操作系统真相还原》学习笔记:使用 bximage 创建磁盘镜像、fdisk 进行分区操作,以及主分区、扩展分区、逻辑分区的概念。

创建磁盘镜像

使用 bochs 自带的 bximage 工具创建磁盘:

bin/bximage

按提示依次输入:1hdflat80hd80M.img

bochsrc.disk 中配置:

ata0-slave: type=disk, path="hd80M.img", mode=flat, cylinders=162, heads=16, spt=63

这样 bochs 虚拟机启动时就会识别并自动挂载这个磁盘。

分区操作

使用 fdisk 工具对磁盘进行分区:

fdisk ./hd80M.img

分区类型

类型说明
主分区最多 4 个,可直接存储数据
扩展分区最多 1 个,作为逻辑分区的容器
逻辑分区在扩展分区内创建,突破 4 个分区限制

分区的本质,就是将多个连续的柱面划分为一个区域。最初磁盘只支持最多分 4 个区。后来由于需求增加,磁盘需要支持能分更多区,同时又为了能够兼容旧有的最多支持 4 个分区,就发明了扩展分区。扩展分区并不直接用于存储数据,而是作为一个容器,可以在其中创建多个逻辑分区。一个磁盘,最多一个扩展分区。

CHS 与扇区计算

磁盘参数 CHS = Cylinders(柱面)/ Heads(磁头)/ Sectors(每磁道扇区数)。

创建 hd80M.img 时会提示 Creating hard disk image 'hd80M.img' with CHS=162/16/63,意思是柱面 162 个,磁头 16 个,每个磁道 63 个扇区。

扇区号计算公式:结束扇区 = (结束柱面 + 1) × 磁头数 × 每道扇区数 - 1(-1 是因为扇区从 0 开始编号)。

fdisk 完整分区流程

fdisk ./hd80M.img 进入交互模式后,依次输入以下内容(输入一个,按一次回车):

m           # 显示菜单
x           # 使用额外功能
m           # 显示菜单
c           # 设定柱面
162
h           # 设定磁头数
16
r           # 返回上一级菜单

# --- 创建主分区 1 ---
n           # 新增一个分区
p           # 分区是个主分区
1           # 分区号设定为 1
2048        # 起始扇区
33263       # 结束扇区

# --- 创建扩展分区 4 ---
n           # 新增一个分区
e           # 分区是个扩展分区
4           # 分区号码设定为 4
33264       # 起始扇区 = 分区 1 结束扇区下一个扇区
163295      # 结束扇区 = 整个磁盘最后一个扇区

p           # 查看现有分区

# --- 创建逻辑分区 5 ---
n           # 创建逻辑分区(磁盘已被两个分区占满,只能建逻辑分区)
35312       # 工具允许的逻辑分区起始最小扇区
51407       # 结束柱面 50,结束扇区 = (50+1)*16*63 - 1

# --- 创建逻辑分区 6 ---
n
53456
76607       # 结束柱面 75,结束扇区 = (75+1)*16*63 - 1

# --- 创建逻辑分区 7 ---
n
78656
91727       # 结束柱面 90,结束扇区 = (90+1)*16*63 - 1

# --- 创建逻辑分区 8 ---
n
93776
121967      # 结束柱面 120,结束扇区 = (120+1)*16*63 - 1

# --- 创建逻辑分区 9 ---
n
124016
163295      # 设定最后一个可用扇区为逻辑分区 9 的结束扇区

p           # 显示分区

# --- 修改逻辑分区类型 ID 为 0x66 ---
t           # 设定分区类型 id
5           # 改变逻辑分区 5 的类型 id
66          # 设定类型 id 为 0x66
t
6
66
t
7
66
t
8
66
t
9
66

p           # 显示分区
w           # 将分区表写入磁盘,并退出 fdisk

最后用 fdisk -l hd80M.img 查看分区信息。

关键扇区计算说明

  • 主分区 1 起始扇区 2048:作者的 1 分区起始柱面是 1,计算得起始扇区应该是 63 × 16 = 1008。但由于 fdisk 工具指定第一个分区最小起始扇区为 2048,所以只能设定 1 分区起始扇区为 2048。
  • 主分区 1 结束扇区 33263:作者指定 1 分区结束柱面为 32,计算得结束扇区为 (32 + 1) × 16 × 63 - 1 = 33263
  • 逻辑分区 5~9 的结束扇区同理,分别对应结束柱面 50、75、90、120,最后一个逻辑分区 9 直接延伸到磁盘末尾。

分区类型 ID

使用 fdisk 的 t 命令修改分区类型 ID,例如 0x66 表示自定义文件系统类型。