如何在不存在vtoc的情况下将Solaris格式写入磁盘?

事实:

  • 需要VTOC(或EFI)才能访问磁盘设备的片
  • s2 slice用于访问整个磁盘(包括磁盘开始处的VTOC)
  • 新的磁盘设备没有VTOC
  • 系统:Solaris 10 OS,SPARC体系结构上

问题:如果没有VTOC,那么格式如何可以将VTOC写入磁盘呢?

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

分机1:如果我标记未标记的磁盘(c2t5006016041E076B0d8s2),会发生以下情况:

[...] 11157: open("/dev/rdsk/c2t5006016041E076B0d8s2", O_RDWR|O_NDELAY) = 3 [...] 11157/1: write(1, " D isknotlab".., 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 FORMATMEN".., 15) = 15 [...] 

那些ioctl()调用是什么? 他们干干净净地做这个工作,但是这些调用实际上是什么?

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

例如。

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

在原始级别,VTOC只是磁盘上的另一个块。 然而,它总是在相同的位置。 格式(1m)和fmthard(1m)通过原始磁盘设备( /dev/rdsk/c... )操纵磁盘,直接访问应该包含VTOC的扇区 – 如果不存在,它们只是覆盖现有的该部门的内容。

format(1M)不需要切片工作,它访问原始磁盘设备并对其进行标记。 在磁盘被标记之后,s2分片是对整个磁盘寻址的一种方式。

另一方面,fmthard不能将VTOC写入未标记的磁盘。 您必须先使用格式(1M)标记它。

我相信没有鸡和鸡蛋的问题,只是有些实用程序知道访问一个原始磁盘并写入需要的东西,其他的需要更多的指导。