Факты:
Вопрос: Как такое может быть, что этот формат может записывать VTOC на диск, если у него нет VTOC?
Вопрос по деталям: Для создания VTOC формат нужно писать 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
[...]
что это за вызовы ioctl ()? Они работают чисто, но что это за звонки на самом деле?
ОС не использует вызовы чтения / записи для чтения или записи vtoc. Просто нужно иметь возможность успешно открыть устройство s2 (которое является просто символической ссылкой на реальное устройство), чтобы узнать, есть ли там диск. Мы надеемся, что для успешного открытия на диске нет необходимости в s2-срезе. Затем команда форматирования использует функции низкого уровня, реализованные в драйвере устройства, для доступа и записи vtoc. Наблюдаемые вами ioctl являются именно этими вызовами.
например.
На исходном уровне VTOC - это просто еще один блок на диске. Однако он всегда находится в одном и том же месте. format (1m) и fmthard (1m) управляют диском через raw disk device (/dev/rdsk/c...
) и напрямую обращаться к секторам, которые должны содержать VTOC - если он не существует, они просто перезаписывают существующее содержимое этого сектора.
format (1M) для работы не нужны срезы, он обращается к необработанному диску и маркирует его. После того, как диск помечен, срез s2 является одним из способов адресации всего диска.
С другой стороны, fmthard не может записать VTOC на диск без маркировки. Вы должны сначала пометить его форматом (1M).
Я считаю, что здесь нет проблем с курицей и яйцом, просто некоторые утилиты знают, как получить доступ к необработанному диску и записать то, что необходимо, а другим нужно больше рекомендаций с помощью срезов.