拆解 NetBSD 的磁盘标签
来源: movq.de — 2026-09-25
概述
来自 DOS 和 Linux 世界的作者第一次认真研究 BSD 的 disklabel,以 x86_64 上的 NetBSD 11 为例逐字节解读格式。他写了个 C 程序确认 disklabel 位于 1 号扇区(字节偏移 512),再对照 /usr/include/sys/disklabel.h 与 disklabel(5) 手册,把 d_magic、d_type、d_secsize、d_nsectors、d_rpm、d_checksum、d_npartitions 等字段与十六进制转储一一核对,最后还演示了在十六进制编辑器里手工造一个随机分区并验证校验和。
核心要点
- disklabel 存放在 1 号扇区,可用 getlabelsector() 与 getlabeloffset() 查询,以此避开 MBR 系统。
- 文档在 disklabel(5) 手册页与 /usr/include/sys/disklabel.h 里,作者更多直接看头文件。
- 结构先是磁盘元数据,随后才是分区表,x86 上全部按小端存放。
- d_magic 与 d_magic2 都是 0x82564557,充当首尾两道魔术数校验。
- 元数据包含扇区大小、每磁道扇区数、磁头数、柱面数、转速、交错因子等历史遗留字段。
- 手工十六进制编辑并修正校验和后,结果与 disklabel 工具输出一致。
金句
我并不确定所有 BSD 用的都是完全相同的格式,所以这里说清楚:我看的是 x86_64 上的 NetBSD 11。
👍 0
👎 0
← 返回 Lobsters 首页