在没有 vtoc 的情况下,Solaris 格式如何写入磁盘?

在没有 vtoc 的情况下,Solaris 格式如何写入磁盘?

事实:

  • 需要 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) 对其进行标记。

我相信不存在先有鸡还是先有蛋的问题,只是一些实用程序知道访问原始磁盘并写入所需内容,而其他实用程序则需要更多有关切片的指导。

相关内容