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

asd*_*min 2 solaris hard-drive

事实:

  • 访问磁盘设备的分片需要 VTOC(或 EFI)
  • s2 slice用于访问整个磁盘(包括磁盘开头的VTOC)
  • 新的磁盘设备没有 VTOC
  • 系统:Solaris 10 OS,SPARC 架构

问题:如果没有VTOC,该格式怎么能将VTOC写入磁盘?

详细问题:创建VTOC,format需要写s2。要写s2,需要VTOC存在。简化:要创建VTOC,VTOC需要存在。如何通过格式避免这种鸡和蛋的问题?

ext #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
[...]
Run Code Online (Sandbox Code Playgroud)

那些 ioctl() 调用是什么?他们干干净净地完成了这项工作,但这些电话实际上是什么?

jll*_*gre 5

操作系统不使用读/写调用来读取或写入 vtoc。它只需要能够成功打开 s2 设备(这只是到真实设备的符号链接)即可知道是否有磁盘。希望磁盘上不需要存在 s2 切片,以便此打开成功。然后 format 命令使用在设备驱动程序中实现的低级函数来访问和写入 vtoc。您观察到的 ioctl 正是这些调用。

例如。

  • 0x0417 = DKIOCGEXTVTOC(获得扩展的 vtoc)
  • 0x0402 = DKIOCSGEOM(设置几何)
  • 0x0418 = DKIOCSEXTVTOC(将扩展 vtoc 写入磁盘)