事实:
- 需要 VTOC(或 EFI)才能访问磁盘设备的切片
- s2 切片用于访问整个磁盘(包括磁盘开头的 VTOC)
- 新的磁盘设备没有 VTOC
- 系统:Solaris 10 OS,基于 SPARC 架构
问题:如果磁盘没有 VTOC,那么该格式怎么能够将 VTOC 写入磁盘?
详细问题:要创建 VTOC,格式需要写入 s2。要写入 s2,VTOC 需要存在。简化:要创建 VTOC,VTOC 需要存在。格式如何避免这个先有鸡还是先有蛋的问题?
分机#1:如果我标记一个未标记的磁盘(c2t5006016041E076B0d8s2),则会发生以下情况:
[...]
11157: open("/dev/rdsk/c2t5006016041E076B0d8s2", O_RDWR|O_NDELAY) = 3
[...]
11157/1: write(1, " D i s k n o t l a b".., 33) = 33
11157/1: read(0, 0xFF2B9CD0, 1024) (sleeping...)
11157/1: read(0, " y\n", 1024) = 2
11157/1: open("/dev/rdsk/c3t5006016141E076B0d8s0", O_RDONLY|O_NDELAY) = 4
11157/1: ioctl(4, 0x0417, 0xFFBFED80) Err#22 EINVAL
11157/1: close(4) = 0
11157/1: ioctl(3, 0x04C9, 0xFFBFF52C) = 0
11157/1: ioctl(3, 0x0402, 0xFFBFF644) = 0
11157/1: ioctl(3, 0x0418, 0xFFBFF670) = 0
11157/1: ioctl(3, 0x04C9, 0xFFBFF5B4) = 0
11157/1: ioctl(3, 0x04C9, 0xFFBFF5B4) = 0
11157/1: ioctl(3, 0x04C9, 0xFFBFF5B4) = 0
11157/1: ioctl(3, 0x04C9, 0xFFBFF5B4) = 0
11157/1: ioctl(3, 0x04C9, 0xFFBFF5B4) = 0
11157/1: write(1, "\n\n F O R M A T M E N".., 15) = 15
[...]
这些 ioctl() 调用是什么?它们干净利落地完成了工作,但这些调用实际上是什么?
答案1
操作系统不使用读/写调用来读取或写入 vtoc。它只需要能够成功打开 s2 设备(这只是真实设备的符号链接)即可知道磁盘是否存在。希望此打开操作成功时不需要磁盘上存在 s2 切片。然后,format 命令使用设备驱动程序中实现的低级函数来访问和写入 vtoc。您观察到的 ioctl 正是这些调用。
例如。
- 0x0417 = DKIOCGEXTVTOC(获取扩展 vtoc)
- 0x0402 = DKIOCSGEOM(设置几何)
- 0x0418 = DKIOCSEXTVTOC(将扩展的vtoc写入磁盘)
答案2
在原始级别,VTOC 只是磁盘上的另一个块。但是,它始终位于同一位置。format(1m) 和 fmthard(1m) 通过原始磁盘设备 ( /dev/rdsk/c...
) 操作磁盘并直接访问应包含 VTOC 的扇区 - 如果不存在,它们只会覆盖该扇区的现有内容。
答案3
format(1M) 不需要切片即可工作,它访问原始磁盘设备并对其进行标记。标记磁盘后,s2 切片是寻址整个磁盘的一种方法。
另一方面,fmthard 无法将 VTOC 写入未标记的磁盘。您必须先使用 format(1M) 对其进行标记。
我相信不存在先有鸡还是先有蛋的问题,只是一些实用程序知道访问原始磁盘并写入所需内容,而其他实用程序则需要更多有关切片的指导。