FreeBSD: ручная разметка диска



http://alv.me/?p=866
Автор: Алексей Федорчук

Эта статья была написана давно, лет пять назад. Разместил её в связи с опробованием последней (2.4) версии DragonFly BSD — её инсталлятор (так называемый BSD Installer, описанный здесь) позволяет установить систему или на весь диск целиком, или на уже существующий первичный раздел. Так что во втором случае его созданием надо озаботиться заблаговременно. И Делается это в DragonFlyBSD точно так же, как и во FreeBSD.

В этой статье речь пойдет о разметке жестких дисков, сиречь винчестеров, вручную, без помощи программы sysinstall. Необходимость в этом возникает не так уж и часто, однако все-таки возникает. Да и для общего образования полезно проделать такую операцию хотя бы раз в жизни.

Как известно, диски принято делить на разделы (partitions в терминах DOS/Windows и Linux). Но FreeBSD и тут отличается оригинальным подходом. Чтобы понять его, нужно для начала сказать
Немного о “геометрии”

Слово “геометрия” в заголовке рубрики взято в кавычки не случайно. Дело в том, что с тех пор, как объем дисков перевалил за 500 с небольшим мегабайт (ограничение старых BIOS персональных, ранее именовавшихся IBM-совместимыми, компьютеров), с реальной их геометрией пользователь никогда не сталкивается. Софт, прошитый в дисковой электронике (т.н. firmware) преобразует ее к виду, доступному восприятию BIOS - на деталях, как именно это делается, останавливаться не буду за некомпетентностью (да и вряд ли кто, кроме производителей дисков, эти детали знает хорошо).

А доступная BIOS геометрия диска описывается в терминах цилиндр/головка/сектор (cylinders/heads/sectors, C/H/S). Фигурально говоря (а, повторяю, все, относящееся к дисковой геометрии, ныне следует понимать исключительно фигурально, аллегорически или метафорически), головки считывают информацию с концентрических магнитных дорожек (tracks), на которые поделена каждая дисковая пластина. Вертикальная совокупность треков с одинаковыми номерами на всех пластинах, составляющих диск как физическое устройство, и образует цилиндр. А сектора нарезают пластину, вместе с ее треками, на радиальные фрагменты, именуемые блоками. То есть это можно представить себе таким образом, что блок лежит на пересечении (в пространстве) цилиндра, трека и сектора.

Число треков и секторов в современных дисках обычно фиксировано (вернее, предстает таковым в BIOS): 255 треков нарезается на 63 сектора каждый, что в совокупности дает 16065 блоков на цилиндр. А количество цилиндров определяется объемом диска (в арифметические вычисления вдаваться не буду). Важно здесь только то, что головки диска механически двигаются синхронно по поверхности всех пластин. То есть если на одной пластине информация считывается с 1-го трека, то и все прочие головки перемещаются на ту же дорожку - каждая на своей пластине.

Повторяю, все это условно - хотя бы потому, что понятие цилиндра в геометрическом смысле слова очень трудно применить к современным дискам, часто не то что однопластинным, а даже, если так можно выразиться, полупластинным (то есть только с одной задействованной стороной единственной пластины). Но разбираться с этой геометрией - дело firmware и BIOS, для нас же интересны именно цилиндры - совокупность треков, к которым осуществляется синхронный доступ, и блоки - минимальные кванты дискового пространства.

Образующие цилиндры треки создаются при первичной заводской разметке диска - т.н. низкоуровневом форматировании. Из сказанного выше очевидно, что доступ к данным в пределах одного цилиндра или группы соседних будет выполнен быстрее, чем к данным, записанным частично на первый и, скажем, на последний цилиндр диска. Этот случай не столь уж невероятен, как может показаться: в DOS’е, где пространство, занятое стертыми файлами, помечается как неиспользуемое, но реально перезаписывается только тогда, когда по настоящему свободное место на диске вообще исчерпано, такая ситуация вполне могла бы возникнуть.

Так вот, чтобы свести к минимуму вероятность разнесения данных по разобщенным цилиндрам, и придуманы были дисковые разделы (вернее, в том числе и для этого - выделение дисковых разделов преследует множество других целей). В единый раздел объединяется группа смежных цилиндров.

Где кончается один раздел и начинается другой? Резонные люди из Одессы сказали бы, что один раздел кончается именно там, где начинается второй. Однако для нас очевидно, что для каждого из разделов следует хранить сведения о его начале и конце (то есть номера первого и последнего из задействованных в нем цилиндров). Где их хранить? Для ответа на этот вопрос следует обратиться к понятию блока.

Как и треки, дисковые блоки (или физические - есть еще блоки логические, но это относится уже к файловым системам, о которых речь пойдет позднее) создаются при низкоуровневом форматировании, и пользователь влиять на них (почти) не может. Размер их также всегда одинаков и равен 512 байтам. Вернее, таким он видится BIOS’у персоналки - каков он на самом деле, одному Аллаху ведомо.

Однако то, что обмен данными с диском возможен минимум 512-байтными порциями - объективная реальность, как и то, что любой, сколь угодно маленький, объем информации, записанный на него, будет занимать целый блок - вне зависимости от реального своего размера. То есть мелкие текстовые файлики размером в пару символов (сиречь байт) все равно захватять под себя аж 512 байт, не меньше (на самом деле - еще больше, но об этом - в следующий раз). С другой стороны, считывание данных блоками по 512 байт будет происходить быстрее, чем если бы при каждом обращении головки к диску данные считывались бы побайтно. Однако и это относится уже к теме файловых систем.

Пока же нас интересен один-единственный блок, образованный первым сектором на первом треке первого цилиндра. Он резервируется под служебную область диска, именуемую главной загрузочной записью (MBR - Master Boot Recodr), которая и считывается BIOS’ом при старте машины. Очевидно, что по прямому назначению MBR используется только в том случае, если диск определен в Setup’е BIOS’а как загрузочный (или просто является единственным в системе). Однако поскольку использование каждого конкретного диска остается на усмотрение пользователя, место под него отводится всегда.

Внутри нулевого блока, помимо прочего (в частности, кода какого-либо начального загрузчика, который может быть туда записан), непременно присутствует один зарезервированный участок. Он предназначен для BIOS’овской таблицы разделов (Partition Table), под которую испокон веков (со времен самой первой IBM PC, кажется) отведено 64 байта. В эту таблицу записываются (или могут быть записаны) данные о разделе (разделах) в определенном, доступном пониманию BIOS’а, формате.

А формат этот предусматривает указание для каждого раздела его стартового блока, размера в байтах, идентификатора типа файловой системы (это, вопреки названию, совсем не то же самое, что файловая система, о которой речь пойдет в следующем разделе) и (только для одного из разделов) флага активности (то есть помечающего данный раздел как загрузочный). Последнее необходимо для некоторых операционок типа DOS, хотя FreeBSD или, например, Linux’у флаг этот глубоко безразличен.

Всего информации, необходимой для описания дискового раздела, набегает 16 байт. А поскольку, как мы помним, под всю таблицу разделов этих байт отведено лишь 64, без калькулятора можно подсчитать, что предельное количество разделов на диске - 4. Эти разделы называются первичными или, не совсем точно, физическими. Так как в большинстве случаев такие разделы могут быть также поделены на части - разделы логические (о чем речь впереди).

Повторю еще раз - это относится только к машинам с PC BIOS, то есть обычным персоналкам. На всякого рода PowerPC, Sparc’ах и тому подобных станциях все может быть совсем по другому (хотя как именно - честно говоря, не знаю).

Как можно заметить, в описание раздела входит идентификатор файловой системы. Это - некоторое число (во FreeBSD обычно в десятичном представлении, в Linux’е, например, - в шестнадцатеричном), которое ставится в соответствие с файловой системой операционки, планируемой к размещению на диске. Так, раздел, предназначенный для FreeBSD, имеет идентификатор 165 (десятичный) или A5, раздел для Linux (Linux native) - 131 (или 83), FAT16 - 6, расширенный раздел (т.н. DOS Extended) - 5, и так далее.

Присвоение разделу какого-либо идентификатора не значит, что тем самым на нем волшебным образом возникает соответствующая файловая система. Нет, он просто предопределяет, какого рода вторичная таблица разделов может быть на нем записана (хотя и это не совсем так - а в некоторых случаях совсем не так). Но тут мы переходим к разговору
Собственно о слайсах

Итак, следствием установлено, что на одном физическом диске может быть создано до 4 (включительно) разделов, каждый их которых может быть приписан к отдельной операционной системе. А что дальше? А дальше следует изучить вопрос стилей разметки разделов.

Стили разметки разделов именуются Disk Label, что не следует путать с метками дисков (disk label) - произвольными именами, которые в DOS (и не только) можно присвоить дисковому разделу. Стили же разметки - это формат вторичной таблицы разделов, записываемой в первый блок раздела первичного. Эта таблица и определяет характер доступных действий над данным первичным разделом.

Пользователи Windows (да в большинстве случаев и Linux) обычно не имеют причин задумываться над проблемой стилей разметки. Однако стилей таких существует немало - чтобы убедиться в этом, достаточно зайти в меню конфигурации ядра Linux, в подраздел Partition Types раздела File systems. Однако из всего этого изобилия нас будут интересовать только два стиля - DOS и BSD.

В DOS/Windows используется (как ни удивительно) DOS-стиль разметки разделов. Он основывается на BIOS-таблице, задействованной лишь частично. А именно - из четырех доступных записей Partitions Table заполняются только две (вернее, только два раздела можно создать средствами стандартного FDISK из DOS/Windows9X/ME; как обстоит дело в NT/2000/XP - просто не знаю).

В записи для первого раздела можно указать идентификатор типа файловой системы (например, FAT16 или FAT32), второму же разделу автоматически присваивается идентификатор типа Extended DOS. А уж Extended-раздел может быть далее поделен на логические разделы. Впрочем, нам сейчас это не интересно, да и устройство расширенного раздела и логических разделов в нем многократно описывалось.

В Linux также используется DOS-стиль разметки. Только тут уж BIOS-таблица задействуется по полной программе - стандартными средствами этой операционки (например, fdisk или cfdisk) можно создать все четыре первичных раздела и пользовать их в свое удовольствие. правда, опять же лишь один из них можно объявить расширенным и, соответственно, поделить на разделы логические.

Совершенно иначе выглядит BSD-стиль разметки (BSD Label), используемый во FreeBSD, DragonFlyBSD, Net- и OpenBSD, а также в BSD/OS. Здесь также может быть использована BIOS-таблица, заполнение которой создаст четыре первичных раздела. В терминологии FreeBSD они именуются слайсами (slices - наиболее точным переводом будет “отрезки”), чтобы отличать их от разделов (partitions) BSD-разметки. Слайсы в номенклатуре файлов устройств маркируются добавлением к имени файла диска литеры s и порядкового номера (в отличие от дисков, начиная с единицы), например: ad0s1, ad0s2, ad0s3, ad0s4 для мастер-диска на первом IDE-канале.

Если одному или нескольким из слайсов будет присвоен идентификатор BSD-системы - 165 в десятичном исчислении (строго говоря, он называется 4.2BSD и свойственен также DragonFlyBSD и NetBSD - хотя теоретически последняя, как и OpenBSD, имеет и собственный номер идентификатора раздела), то в его начальный блок запишется собственно BSD-таблица разделов (BSD Label). В соответствие с ее форматом, каждый слайс с ID 165 абсолютно равноправен и может быть поделен на логические разделы (собственно partitions, в терминологии FreeBSD).

Для разделов в BSD-таблице предусмотрено восемь записей. Соответствующие им разделы номенклатурно маркируются добавлением к имени файла слайса литеры - от a до h. Правда, в DragonFlyBSD это ограничение обходится, и там слайс может содержать до 16 логических разделов.

Реально не все разделы слайса могут быть использованы для размещения файловых систем. Начать с того, что одна из записей (третья по счету, маркируемая литерой c) резервируется для описания всего слайса в целом - например, ad0s1c, необходимость чего станет ясной в дальнейшем. Далее, первая запись таблицы, соответствующий которому файл устройства маркируется как ad#s#a, отводится для описания корневого раздела файловой системы. А очевидно, что на конкретной локальной машине корневой раздел может быть только один, вне зависимости от количества слайсов и физических дисков.

Наконец, вторая запись (файл устройства - ad#s#b) предназначена исключительно для описания раздела подкачки (swap-раздела), который, во-первых, не может содержать данные, и во-вторых, является единственным на весь диск (ясно, что создавать по свап-разделу в каждом слайсе бессмысленно, хотя при наличии двух физических дисков поделить между ними пространство подкачки - идея вполне здоровая).

Обычно создание слайсов преследует своей целью разместить на диске более чем одну операционку и сохранить возможность обмена данными между ними (теоретически к BSD-разделам можно обращаться из Linux’а, если пересобрать его ядро должным образом; хотя обратная процедура - обращение к ext2fs разделу из FreeBSD, - гораздо проще).

Если же весь наличествующий диск планируется отдать на растерзание FreeBSD, то обычно создается один-единственный слайс на (почти) весь его объем, оставив записи в BIOS-таблице для остальных неиспользованными. Семи позиций BSD-таблицы достаточно для обособления таких ветвей файловой системы, как /usr, /tmp, /var и /home - примерно такой способ разбиения диска предлагается по умолчанию программой sysinstall.

Конечно, в ряде случаев умолчального количества разделов, которые можно создать в одном слайсе, оказывается недостаточно. в частности, существует мнение, не лишенное резонов, что выделению в отдельные ветви подлежат еще и такие части файловой системы, как /usr/src, /usr/ports, /usr/ports/distfiles. возможно, /usr/local. В этом случае придется создавать два BSD-слайса (хотя есть сведения, что для дробного членения файловой системы можно задействовать и Extended Partition, однако сам я этого не пробовал ни разу).

Разметка диска, использующая записи в BIOS-таблице первого блока, называется разметкой в режиме совместимости. Вне зависимости от того, создается ли один слайс для FreeBSD или несколько отдельных - для каждой операционки, в режиме совместимости в начале диска резервируется пространство в размере 63 блоков (всего около 30 Кбайт), в котором не только сохраняется в неприкосновенности “умолчальный” MBR, но и остается место для записи кода какого-либо стороннего загрузчика. В итоге диск остается доступным для других операционных систем, по крайней мере теоретически.

Однако использование режима совместимости и BIOS-таблицы разделов во FreeBSD не является обязательным. Вполне допустимо записать в MBR, вместо таблицы BIOS, непосредственно BSD-таблицу разделов. В этом случае понятно, что слайсов как таковых не создается, а все дисковое пространство представляет собой как бы единый слайс, и может быть разбито на BSD-партиции по тем же правилам, что и отдельный слайс. И тут становится ясной необходимость резервирования третьего поля BSD-таблицы - именно в ней и описывается весь наш диск, целиком отведенный под FreeBSD.

Такое обращение с диском именуется режимом эксклюзивного использования, или Dangerously Dedicated. Вопреки названию, в нем не таится никакой опасности ни для данных пользователя, ни для его здоровья. А единственная подстерегающая его опасность - это то, что диск в эксклюзивном режиме не будет опознан никакой другой операционной системой, установленной на данном компьютере (обращению к диску по сети он препятствий не составит). Однако это - чисто теоретическое неудобство, потому что ни одна из известных мне операционок все равно не умеет толком работать с BSD-разделами и файловой системой FreeBSD (особенно современной - UFS2). А, скажем, при наличии на другом физическом диске мультизагрузчика GRUB, FreeBSD с “эксклюзивного” диска вполне может быть им загружена.

В документации по FreeBSD встречаются указания, что “эксклюзивные” диски иногда не могут быть загрузочными, вероятно, потому, что BIOS не сможет опознать нестандартные записи в MBR. Однако, видимо, это относится к каким-либо старым версиям BIOS - мне с таким сталкиваться не приходилось, хотя я часто прибегал к эксклюзивному режиму при возможности отдать под FreeBSD целый физический диск.

Тем не менее, в документах проекта FreeBSD всегда подчеркивается, что эксклюзивный режим - в частности, из-за грошовой экономии дискового пространства, - следует использовать лишь в исключительных случаях. Один из резонов к такому использованию - несоответствие “геометрии” диска, видимой из BIOS, и того представления о ней, которое складывается у FreeBSD (подробнее на эту тему можно прочитать в официальном FreeBSD FAQ).
Разметка слайсов

При начальной установке FreeBSD для создания слайсов и разделов на них обычно используется программа sysinstall - универсальный установщик и настройщик этой операционки. Однако следует помнить, что это - не более чем front-end к серии специализированных утилит, в том числе и утилит дисковой разметки. И потому знакомство с ними будет не вредным в любом случае. С одной стороны, оно даст понимание того, что же все-таки делает sysinstall. С другой - некоторые действия по разбиению диска с их помощью оказывается выполнить проще. Так, я затратил в sysinstall немало времени на создание разделов для подготовки программных RAID-массивов, пока не понял, что сделать это вручную - гораздо легче.

Есть и третья сторона - утилиты дисковой разметки, помимо выполнения своей прямой функции, служат незаменимым источником информации о физическом диске вообще и о том, что по его поводу думает FreeBSD. И потом - с их помощью можно получить такие сведения о дисковых разделах, каких не найти больше нигде.

В отличие от Linux’а, разбиение диска во FreeBSD осуществляется в два этапа и двумя отдельными программами. Сначала диск нарезается на слайсы (или создается один слайс, в режиме ли совместимости, или для эксклюзивного использования). А затем уже слайс, отведенный для FreeBSD, разбивается на разделы.

Выполнению первой задачи служит утилита fdisk. Это - еще более мощное средство работы с дисками, чем одноименная программа из Linux’а. Однако ее нельзя назвать легкой в использовании. Даже в man (8) fdisk среди BUG’ов отмечено, что интерфейс ее мог бы быть и подружественней. Однако на самом деле пользоваться ей совсем не страшно.

Запущенная без опций и аргументов, команда fdisk просто выдает информацию о первом физическом диске машины (вернее, о том диске, на котором размещается корневая файловая система FreeBSD). И информацию богатую: здесь мы увидим и имя файла текущего дискового устройства (например, /dev/ad0), и сведения о его геометрии (количество цилиндров, головок, секторов на трек, блоков на цилиндр - другое дело, что к реальной геометрии они отношения не имеют, но об этом мы уже говорили), и размер физического блока.

А дальше последует информация о слайсе или слайсах, на этом диске проживающих. И тут для каждого слайса мы увидим идентификатор типа файловой системы, его размер (в блоках и мегабайтах), флаг активности (если таковой имеет место быть), данные о начале и конце (номер цилиндра/головки/сектора). Если на диске существует менее четырех слайсов, несуществующие (то есть соответствующие незаполненным записям таблицы разделов) будут помечены как UNUSED. Та же пометка будет на слайсах 2-4 при диске, размеченном в эксклюзивном режиме.

Тем не менее, даже при единственном слайсе на диске, размеченном в режиме совместимости, отличить его от “эксклюзивного” диска по выводу команды fdisk очень легко: стартовый блок первого будет 63, и начальный трек его будет носить первый номер. Тогда как слайс “эксклюзивного” диска будет начинаться с нулевого блока и нулевого же трека.

Как уже сказано, вся эта информация относится к диску с корневой файловой системой. Чтобы получить аналогичные сведения о других накопителях, имя файла соответствующего устройства нужно указать в явном виде в качестве аргумента команды fdisk. Например,
$ fdisk /dev/ar0

предоставит их для диска, подключенного к разъему IDE-RAID контроллера. Сведения эти могут показаться избыточными. Однако с помощью fdisk можно вывести и более краткую (и при этом только существенную) информацию. Чему послужит опция -s. В ответ на команду
$ fdisk -s /dev/ad#

мы получим только самое главное: имя файла устройства, количество цилиндров, головок и секторов, а также краткие сведения только о существующих (то есть не помеченных как UNUSED) слайсах - стартовый сектор, размер слайса, идентификатор типа файловой системы и флаг активности. То есть - примерно в следующем виде:
/dev/ad0: 155061 cyl 16 hd 63 sec
Part Start Size Type Flags
1: 0 156301488 0xa5 0x80

Все сказанное преследовало своей целью только получение информации. Чтобы с помощью fdisk осуществить какие-либо активные действия по разметке диска, необходимо ознакомиться с другими ее опциями. Их не так много, и важнейшей, пожалуй, является опция -I. Включенная в команду
$ fdisk -I /dev/ar0

она создаст на диске первый и единственный слайс, однако - в режиме совместимости, то есть - начиная с 63 сектора. Очевидно, что если диск перед этим был как-то разбит и содержал какие-либо данные, и прежняя разметка диска, и его содержимое будут безвозвратно уничтожены. Впрочем, такое поведение типично для всех утилит дисковой разметки в любой ОС. Правда, в отличие от одноименной утилиты из Linux, Free’шный fdisk выполняет переразметку диска немедленно. И к тому же, тут нас даже не спросят о подтверждении своих действий, так что следует быть внимательным.

Зато много вопросов последует при использовании опции -i, которая позволяет выполнить разметку диска в интерактивном режиме. Данная с именем файла устройства в качестве аргумента, то есть в форме
$ fdisk -i /dev/ar0

она перво-наперво напомнит нам, а какой, собственно, диск подвергается надругательству и сообщит его параметры (как записанные в Disk Label, так и считанные из BIOS - в общем случае они совпадать не обязаны):
******* Working on device /dev/da0 *******
parameters extracted from in-core disklabel are:
cylinders=124 heads=64 sectors/track=32 (2048 blks/cyl)

parameters to be used for BIOS calculations are:
cylinders=124 heads=64 sectors/track=32 (2048 blks/cyl)

И сразу же спросит, а нет ли у нас желания скорректировать BIOS’ную геометрию диска. Ответ по умолчанию (no) очевиден, если нет сообщения о “плохой” BIOS’ной геометрии, которая к тому же совпадает с геометрией, описанной в Disk Label. А вот если факт “плохой” геометрии имеет место быть - стоит задуматься.

Проще всего оставить как есть - вряд ли от этого образуются какие-либо проблемы. Однако можно и порядку ради исправить ситуацию руками. Для чего сначала следует ответить положительно на указанный выше вопрос, после чего будет предложено ввести последовательно все указанные параметры - число цилиндров, треков и секторов. Подтверждение правомерности этих действий можно будет получить позднее - при сверке с таковыми из sysinstall.

Первейшее развлечение после исправления геометрии (или вместо нее) в команде
$ fdisk -i /dev/ar0

- это ручное создание слайсов (при существующей уже разметке сначала будет вопрошаемо, а хотим ли мы этого - с отрицательным ответом по умолчанию). Для этого сначала запрашивается идентификатор типа файловой системы (по умолчанию стоит существующий, если диск был размечен, или 0 - для диска нового) - следует указать его десятичное значение (165 для FreeBSD-слайса). Затем - стартовый сектор (0 - при “эксклюзивной” разметке, 63 - при разметке в режиме совместимости), и размер слайса в блоках (при использовании всего диска, очевидно, он будет равен полному их числу, в противном случае - потребуются некоторые арифметические вычисления).

После этого будет предложено точно специфицировать начало и конец слайса. Если отказаться - они будут взяты из предыдущих определений, если согласиться - нужно будет указать первые и последние цилиндр, головку, сектор. Каковые и будут выведены в виде
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
start 0, size 260000 (126 Meg), flag 0
beg: cyl 0/ head 0/ sector 1;
end: cyl 126/ head 60/ sector 32

Подтвердив свои действия положительным ответом на вопрос
Are we happy with this entry? [n] y

можно перейти к созданию второго раздела
The data for partition 2 is:
Do you want to change it? [n]

- по той же схеме, что и первого. Ясно, что если создается всего один слайс, следует отказаться от изменений остальных потенциальных записей таблицы разделов - в этом случае они останутся помеченными как неиспользуемые. В любом случае будет задан последний вопрос - подтверждение на выполнение:
Do you want to change the active partition? [n]

При положительном ответе на который все сделанные изменения вступят в силу (и на ранее размеченном диске можно будет распроститься с его содержимым). Так что следует предварительно просмотреть все ранее введенное (благо, во FreeBSD это легко сделать пролистыванием буфера истории виртуальной консоли) и при обнаружении ошибки отказаться от изменений и запустить команду fdisk по новой. Впрочем, из нее можно в любой момент выйти без последствий и стандартным образом - комбинацией клавиш Control+C.

В общем, интерактивное создание с помощью fdisk единственного “эксклюзивного” слайса (а единственный “совместимый” слайс проще создать с помощью опции -I) не так уж и страшно. Если же слайсов потребуется несколько - придется вооружиться калькулятором (во FreeBSD есть такой - bc, запускается из командной строки, очень прост и удобен в обращении).

Хотя есть и еще один способ создания слайсов - предварительным описанием их параметров, а заодно и дисковой геометрии, в файле (в обычном текстовом, посредством любого привычного редактора). После чего программа fdisk запускается в форме
$ fdisk -f configfile /dev/ad#

А добавив в ней еще и опцию -t, можно предварительно протестировать правильность своей разметки, не записывая изменений на диск. Впрочем, сам я этого не проделывал, оставляя желающим для самостоятельных упражнений: все необходимые сведения, в том числе и формат config-файла, можно почерпнуть в man (8) fdisk.

Наконец, для разметки диска в эксклюзивном режиме можно обойтись без команды fdisk вообще: достаточно обнулить начальные его блоки с помощью команды dd, которая осуществляет т.н. копирование с преобразованием. Она требует двух аргументов - имени копируемого (if - input file) файла и имени файла устройства, на которое он копируется (of - output file). Можно задать также размер блока копируемых данных и количество оных. То есть в нашем случае это будет выглядеть так:
$ dd if=/dev/zero of=/dev/ad# bs=1k count=1

или
$ dd if=/dev/zero of=/dev/ad# count=2

В обоих случаях под /dev/zero понимается т.н. “нулевое” устройство, а в качестве /dev/ad# выступает размечаемый диск, дополнительные же опции показывают, что нулями должны быть заполнены первые два физических его блока.
Разметка разделов

Созданный при помощи fdisk слайс, вне зависимости от того, “эксклюзивный” он или “совместимый”, уже пригоден к использованию - файловую систему можно создать непосредственно на нем. Однако обычно он предварительно разбивается на логические разделы (или создается хотя бы один раздел, ad#s1c, описывающий слайс целиком). Ранее этой цели служила утилита disklabel, однако в версии 5.1 она заменена на заимствованную из NetBSD программу bsdlabel (с более дружественным, как говорят оптимисты, интерфейсом). Хотя и disklabel можно обнаружить в каталоге /sbin, но это - лишь жесткая ссылка на тот же исполнимый файл, что и bsdlabel. В чем легко убедиться, посмотрев на идентификаторы обоих файлов:
$ ls -l /sbin/bsdlabel /sbin/disklabel
-r-xr-xr-x 2 root wheel 27348 23 фев 22:42 /sbin/bsdlabel*
-r-xr-xr-x 2 root wheel 27348 23 фев 22:42 /sbin/disklabel*

имеющие равные (27348) значения.

Опять же, запущенная без опций (однако с обязательным аргументом в виде имени файла устройства - слайса), bsdlabel служит исключительно целям информирования о положении вещей, выводя для размеченного под FreeBSD слайса нечто вроде следующего:
$ bsdlabel /dev/ad0

# /dev/ad0:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 524288 0 4.2BSD 2048 16384 32776
b: 2074624 524288 swap
c: 156301488 0 unused 0 0 0
# "raw" part, don't edit
d: 524288 2598912 4.2BSD 0 0 0
e: 10240000 3123200 4.2BSD 0 0 0
f: 142938288 13363200 4.2BSD 0 0 0

Для приведенного вывода не лишними будут некоторые комментарии. Литеры слева - это буквенные обозначения существующих разделов, для каждого из которых приведены: размер (size) в блоках, смещение первого блока от начала диска, то есть нулевого сектора (offset), тип файловой системы и ее параметры: размер фрагмента, блока, плотность записей - обо всем этом пойдет речь в разделе про файловую систему FreeBSD; пока же необходимо отметить, что блок файловой системы - логический, и это совсем не то же самое, что физический блок диска. Не будем пока обращать внимание и на то, что в соответствующих колонках для всех партиций, кроме a, стоят нули.

Среди разделов обращает на себя внимание тот, что помечен литерой c: это тот самый “контейнер” для остальных разделов (дальняя аналогия - extended partition DOS). Ясно, что оффсет для него - нулевой, а размер равен полному количеству физических блоков диска. Для прочих разделов смещение легко (например, с помощью калькулятора bc) вычисляется суммированием оффсета предыдущего раздела с его размером.

Приведенный пример относится к “эксклюзивному” диску - именно поэтому мы наблюдаем нулевой оффсет и первой партиции, и “слайса” c. Для диска, размеченного в режиме совместимости, картина окажется примерно следующей:
# /dev/ad0s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 524288 63 4.2BSD 2048 16384 32776
c: 16771797 63 unused 0 0
# "raw" part, don't edit
d: 524288 524351 4.2BSD 2048 16384 32776
e: 524288 1048639 4.2BSD 2048 16384 32776
f: 1048576 1572927 4.2BSD 2048 16384 8
g: 14150357 2621503 4.2BSD 2048 16384 28552

То есть можно видеть, что первая партиция “нормально” размеченного диска смещена относительно его начала на 63 зарезервированных блока.

В поле fstype раздела c не случайно стоит значение unused - ни для какого хранения данных она использоваться не может. Однако только и она имеется в наличии на свежеразмеченном с помощью fdisk носителе. Как же создать остальные необходимые партиции?

Как ни странно, один из способов - предельно прост: посредством обычного текстового редактора. Для этого bsdlabel запускается с опцией -e и аргументом - именем файла размечаемого слайса:
$ bsdlabel -e /dev/ad0s1

В ответ на что будет вызван редактор, определенный в переменной EDITOR профильного файла суперпользователя (излишне напоминать, что все операции с дисками, слайсами и разделами выполняются только от лица root’а), при отсутствии оной таким редактором будет /usr/bin/vi. И в этом редакторе мы увидим следующее:
# /dev/da0:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 254787 0 unused 0 0
# "raw" part, don't edit

Если на этом слайсе не планируется размещать корневую файловую систему, для создания единственной партиции достаточно будет дописать (самыми обычными редакторскими средствами) строку вида
d: 254787 0 4.2BSD

в случае “эксклюзивного” диска, или
d: 254787 63 4.2BSD

для диска, размеченного в режиме совместимости.

И - выйти из редактора его штатной командой с сохранением изменений (в случае с vi - :wq), в ответ на что мы будем проинформированы, что
File /tmp/EdDk.KvEGsqRNsh saved.

При следующем вызове bsdlabel для того же слайса, но без опций картина окажется следующей:
# /dev/da0:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 254787 0 unused 0 0
# "raw" part, don't edit
d: 254787 0 4.2BSD 0 0 0

То есть можно видеть, что “рабочий” раздел успешно создан.

Для создания нескольких разделов, в том числе корневой и для swap’а нам опять же потребуется некоторая арифметика, аналогичная примененной в интерактивном режиме программы fdisk. То есть каждый раздел, начиная с a, должен получить значение начального оффсета (первый - соответствующий начальному блоку всего слайса, остальные - сумме оффсета и размера предыдущего), размера (опять же в блоках), типа файловой системы (для “рабочих” партиций - 4.2BSD, для раздела подкачки - swap).Поля параметров файловой системы можно не заполнять - в этом случае параметры файловой системы будут определяться при ее создании (то есть при “форматировании”, в терминах DOS, раздела).

На этом вопрос слайсов и раздела в первом приближении можно считать закрытым. Конечно, созданные партиции все еще не пригодны к использованию - предварительно на них нужно создать файловые системы. Или, как выражаются “подоконники”, отформатировать их. Чем мы и займемся в самое ближайшее время. Но уже - в следующем разделе…

Обновлено: 12.03.2015