null

Басня о геометрии диска и Solaris

Когда компьютеры были большими, диски маленькими, использовалась адресация CHS (Cylinder-Sector-Head), а разработчики файловых систем уделяли огромное внимание геометрии диска, в частности файловая система FFS и построенная на ее основе UFS, широко используемая в Solaris, используют цилиндровые группы для организации данных на диске. Сейчас диски уже преодолели рубеж в 4 терабайта, и на смену геометрии CHS пришла геометрия LBA (Logic Block Address), в которой блок на диске адресуется по его непосредственному номеру, транслируемому контроллером диска в его непосредственное расположение на диске. Посмотрим, как на это реагирует Solaris.

Чтобы сообщить хосту о своей геометрии SCSI-диск имеет две страницы Mode Sense: 3 - Format Device (disk devices) и 4 - Rigid Disk Geometry, а чтобы получить его объем, нужно использовать SCSI-команду READ CAPACITY. Запустим утилиту format в режиме вывода расширенных диагностических сообщений и попробуем выполнить авто-конфигурация диска:

root@m5000:~# format -M
AVAILABLE DISK SELECTIONS:
       0. c0t600A0B80002A00600000126B519AE364d0 →
       <STK-FLEXLINE 380-0660 cyl 33342 alt 2 hd 512 sec 64>
          /scsi_vhci/ssd@g600a0b80002a00600000126b519ae364
<...>
format> ty

AVAILABLE DRIVE TYPES:
        0. Auto configure
<...>
        24. other
Specify disk type (enter its number)[19]: 0
Product id: FLEXLINE 380
blocks:  1092616480 (0x41200120)
blksize: 512
Inquiry:
<...>

Mode sense page 0x3 (current):
header: 23 00 10 08 00 00 00 00 00 00 02 00
data:   83 16 00 01 00 01 00 00 00 00 00 40 02 00 00 00
        00 00 00 00 40 00 00 00
Inquiry:
00 00 05 32 45 00 40 32 53 54 4b 20 20 20 20 20     ...2E.@2STK    
46 4c 45 58 4c 49 4e 45 20 33 38 30 20 20 20 20     FLEXLINE 380   
30 36 36 30 00 00 00 00 00 00 00 00 00 00 00 00     0660............
00 00 00 00 00 00 00 00 00 00 00 60 03 00 03 20     ...........`...
09 00 00 00 00 00 00 00 00                          .........

Mode sense page 0x4 (current):
header: 23 00 10 08 00 00 00 00 00 00 02 00
data:   84 16 04 12 00 40 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 1c 20 00 00
Geometry:
    pcyl:    266752
    ncyl:    266750
    heads:   64
    nsects:  64
    acyl:    2
    rpm:     7200
    nblocks:     1092616480
After adjusting geometry you lost 288 of 1092616480 blocks.

Geometry after adjusting for capacity:
    pcyl:    33344
    ncyl:    33342
    heads:   512
    nsects:  64
    acyl:    2
    rpm:     7200

Partition 0:   128.00MB        8 cylinders
Partition 1:   128.00MB        8 cylinders
Partition 2:   520.97GB    33342 cylinders
Partition 6:   520.72GB    33326 cylinders

c0t600A0B80002A00600000126B519AE364d0: configured with capacity of 520.97GB
<STK-FLEXLINE 380-0660 cyl 33342 alt 2 hd 512 sec 64>
selecting c0t600A0B80002A00600000126B519AE364d0
Inquiry:
<...>
[disk formatted]
Warning: Current Disk has mounted partitions.
format> ^C
root@m5000:~#

Как видим, кроме собственно получения геометрии диска, format меняет ее, выполняя "adjusting for capacity" и теряя при этом 288 блоков. Дело в том, что в VTOC-метках используются 16-битные числа для сохранения геометрии диска ( в этом можно убедиться здесь: dklabel.h#178 ) , поэтому нет никакой возможности сохранить значение в 266752 цилиндра в эту метку. Поэтому он изменяет значения heads и nsects так, чтобы потерять наименьшее количество блоков: auto_sense.c#1208 . После этого, новая геометрия сохраняется в метку. Отмечу, что данная особенность касается только Solaris на SPARC, на x86 используются VTOC-16 метки большего размера, и под количество цилиндров в них уже отводится 32 бита, кроме этого таких недостатков лишены EFI-метки.

Если геометрия все-таки "сломалась", в меню типа диска всегда можно выбрать последний вариант (24. other) и вручную ввести количество цилиндров, головок и секторов на дорожку.

Как же реагируют файловые системы на геометрию дисков? В исходниках mkfs_ufs можно найти любопытный комментарий:
mkfs.c#1085

    /*
     * With newer and much larger disks, the newfs(1M) and mkfs_ufs(1M)
     * commands had problems in correctly handling the "native" geometries
     * for various storage devices.
     *
     * To handle the new age disks, mkfs_ufs(1M) will use the EFI style
     * for non-EFI disks that are larger than the CHS addressing limit
     * ( > 8GB approx ) and ignore the disk geometry information for
     * these drives. This is what is currently done for multi-terrabyte
     * filesystems on EFI disks.

    <...>

    */

Таким образом, для файловых систем размером, превышающем 8 Гб геометрия диска никогда не будет учитываться. По умолчанию она использует 128 головок и 48 секторов, для много-терабайтных файловых систем (newfs -T) - 256 и 64 соответственно. Таким образом, цилиндровые группы UFS уже не такие уж и цилиндровые. Что же касается ZFS, она полностью независима от геометрии. На уровне блочных устройств при чтении или записи всегда используется абсолютный номер блока.
 

 

К списку статей

 

Интересуюсь по большей части системным анализом программного обеспечения: поиском багов и анализом неисправностей, а также системным программированием (и не оставляю надежд запилить свою операционку, хотя нехватка времени сказывается :) ). Программированием увлекаюсь с 12 лет, но так уж получилось, что стал я инженером.

Основная сфера моей деятельности связана с поддержкой Solaris и оборудования Sun/Oracle, хотя в последнее время к ним прибавились технологии виртуализации (линейка Citrix Xen) и всякое разное от IBM - от xSeries до Power. Учусь на кафедре Вычислительной Техники НИУ ИТМО.

See you...out there!

http://www.facebook.com/profile.php?id=100001947776045
https://twitter.com/AnnoyingBugs