FreeBSD‎ > ‎

Создание "правильной" геометрии диска

На сегодняшний день при приобретении жесткого диска обязательно нужно обращать внимание на дополнительные и неочевидные моменты, например, такие как реальный размер сектора.
 
Многие годы "стандартные" накопители создавались производителями с сектором 512 байт. Но шло время, технический прогресс не стоит на месте и ёмкость винчестеров перешла отметку 1ТБ, дальше - больше... Вот тут и возникли проблемы с адресацией к областям данных за границей 2ТБ. А еще, кроме самих данных, на диске (сразу после каждого сектора) размещается область с записанными контрольными суммами сектора - так винчестер при операциях чтения-записи проверяет безошибочно ли произведена операция. Вывод напрашивался сам собой, обсуждения производителями о пререходе на сектора размером более 512 байт велись уже несколько лет. Дело еще и в том, что чем больше размер сектора, тем меньше затрачивается места на носителе под системную информацию (контрольные суммы) - имеется ввиду увеличение соотношения данные/системная область. Таким образом, производителю выгодно переходить на сектора большего размера, поскольку на одной и тойже поверхности можно получить больший объем "полезных" данных.
 
Итак, многие производители начали производство новых дисков с размером сектора 4КБ, в том числе и с емкостью менее 2ТБ.
Но, некоторые системы (в основном речь идет о операционках от M$) умеют работать только с сектором 512 байт. Выход производителями был найден следующий: конвернтирование контроллером устройства 512-байтный сектор в 4КБ и обратно. Что имеется ввиду? Контроллер винчестера сообщает что у него сектор 512 байт (на самом же деле, физически, 4КБ). При записи сектора, файловая система передает контроллеру блок данных размером 512 байт и адрес места диска, куда необходимо записать блок. Контроллер винчестера, в свою очередь, вычисляет в каком именно физическом 4КБ-секторе находится нужный блок, затем считывает эти физические 4КБ, производит частичную замену данных и записывает в то же самое место целиком обновленный 4КБ-сектор... При операции чтения контроллер вычисляет в каком именно физическом секторе находится нужный блок данных, считывает с диска целый блок в 4КБ, но отдает файловой системе только запрошенные 512 байт.
 
Вот такой велосипед из-за поддержки обратной совместимости дисков со старыми операционными системами!!! Остается только надеяться, что вскоре будут все больше появлятся диски с "правдивым" 4КБ-сектором, без подобных преобразований...
 
Почему так пристально описываю проблему? Да потому, что если диск разбить "стандартным" образом, без так называемого выравнивания, мы получим падение скорости (особенно записи). Ведь при разметке диска могут быть заданы смещения разделов относительно физического начала носителя не учитывая кратность 4КБ. В этом случае при считывании или записи, "виртуальный" сектор размером в 512 байт окажется в двух разных (соседних) физических 4КБ-секторах. Вот тут и начинаются реальные "тормоза" - скорость чтения ощутимо снизится, а скорость записи может упасть в разы!!!
 
Итак, главное условие для максимальной "производительности" диска - создание разделов со смещением кратным 4К (8 блоков по 512 байт), т.е. первый раздел должен начинаться не с 34-го блока (как это происходит "по умолчанию"), а с 40-го. И размер создаваемого раздела тоже должен быть кратен 8 блокам.
 
Далее на практике...
Имеем диск WD20EARS (Green-серия с пониженным энергопотреблением, скоростью вращения шпиндела 5400об./мин. и физическим сектором 4КБ).
Контроллер диска сообщает нам что размер сектора у него 512Б.
Приступим к разметке. Я использую для этого формат размещения таблицы разделов GUID Partition Table (GPT). Главное отличие от устаревшего формата MBR - использование системы адресации логических блоков (LBA) вместо применявшейся в MBR адресации Цилиндр-Головка-Сектор (CHS).
Для разметки с использованием GPT применяется утилита gpart.
 
Создадим схему GPT на диске: 
# gpart create -s gpt ad4
 
Если необходимо удалить существующую таблицу разделов (не только созданную в GPT):
# gpart destroy -F ad4
Дополнительный ключ -F позволяет удалить разметку, если например, Вы получили в ответ на команду (без ключа)
сообщение типа 'device is busy'...
 
Просматривать результат производимых действий можно в любой момент командой: 
# gpart show ad4
 
Здесь я буду описывать разметку диска под использование файловой системы ZFS, но уловив суть, Вы сможете правильно "разбить" диск и под свои конкретные задачи.
Итак, мне необходим раздел под загрузчик, swap (я решил все-таки сделать его отдельным разделом, хотя на ZFS это необязательное условие - можно разместить swap и в пуле файловой системы), и, собственно раздел под ZFS-пул. В случае размещения swap в пуле, единственным недостатком будет невозможность коре-дампа ядра...

# gpart add -b 40 -s 1024 -t freebsd-boot ad4

# gpart add -b 2048 -s 4G -t freebsd-swap -l swap0 ad4

# gpart add -s 3898636000 -t freebsd-zfs -l data0 ad4

# gpart show /dev/ad4
=>            34        3907026988    ad4    GPT (1.8T)
                34                                   - free -  (3.0K)
                40                 1024    1       freebsd-boot  (512K)
             1064                  984              - free -  (492K)
             2048            8388608    2       freebsd-swap  (4.0K)
        8390656       3898636000    3       freebsd-zfs  (1.8T)
   3907026656                   366             - free -  (183K)

 
В данном случае, при создании каждого раздела, задается смещение приходящееся на начало физического 4К-сектора, а так же размер самого раздела кратен физическим 4К-секторам, т.е. кратен 8 псевдо-секторам по 512 байт (512Б * 8 = 4КБ). Например, загрузочный раздел имеет смещение 40 секторов от начала диска. Т.е. смещение в физических секторах составляет 40/8= 5. Если бы при создании раздела мы не указали явно смещение (ключ -b 40), то начальным сектором был бы 34-й, а как мы уже понимаем он не является началом физического!
 
Обратите внимание на некоторые моменты:
- размер раздела можно задавать как в секторах, так и K/M/G/T -байтах;
- разделам удобно давать метки (ключ '-l' и после него название метки) - потом по ним можно обратиться к разделу, а не вспоминать какой порядковый номер в этой схеме занимает тот или иной раздел (например swap будет представлен в системе как /dev/gpt/swap0);
- gpart использует символические имена для основных типов разделов для разных файловых систем. Поэтому важно указывать после ключа -t соответствующее имя типа раздела (обратитесь пожалуйста к 'man gpart' - там описаны все допустимые символические идентификаторы для GPT);
- раздел для загрузчика ZFS я сделал 512К потому как этого в настоящее время достаточно с головой, но в то же время, встречал информацию о том, что увеличение размера ведет даже к невозможности загрузки системы...
- 492К свободного места после загрузочного раздела - страховка на будущие обновления файловой системы, которые соответственно могут вызвать увеличение размера загрузочной программы...
 
 
 
Comments