Тема: диски, слайсы, партиции

FreeBSD: диски, слайсы, партиции

Разумеется, обойтись без sysinstall при установке FreeBSD все равно не удастся (да и не нужно). Однако для понимания ее внутренней сущности (а sysinstall — это своего рода интегрирующая надстройка, front-end, над серией низкоуровневых утилит) требуются некоторые предварительные знания, в частности, о дисковых накопителях, дисковых разделах и файловых системах FreeBSD. Тем более, что именно в этом отношении FreeBSD разительно отличается не только от DOS/Windows, но и от Linux, причем как терминологически, так и по существу.

Так что практическое знакомство с FreeBSD целесообразно начать именно с круга вопросов, вынесенных в заглавие этой заметки, в которой будут рассмотрены диски и дисковые разделы.
Дискобольское введение

Чтобы более не повторяться, оговорюсь сразу: большая часть того, о чем будет говориться в этой заметке, относится к дискам с интерфейсом IDE (ATA). SCSI-диски имеют свою специфику, но я с ними дела не имел и собственных впечатлений на сей предмет у меня нет. Да и в контексте настольного использования FreeBSD это становится все менее актуальным. Хотя и тему SCSI устройств придется затронуть — но не в отношении дисков, а накопителей иного типа.

Для начала вспомним, что дисковые накопители во FreeBSD (как и любые другие устройства в любой POSIX-совместимой системе) предстают перед пользователем в виде файлов специального типа — файлов устройств, конкретнее — файлов блочных устройств (то есть тех, обмен данными с которыми осуществляется не побитно, как, скажем, с сериальными портами, а блоками некоего фиксированного размера). Файлы эти расположены в каталоге /dev, и номенклатура их подчиняется строгим правилам.

Во FreeBSD 5-й ветки используется т.н. файловая система система устройств — devfs. Подробный разговор о ней впереди, пока лишь минимум практических сведений.

Раньше (в ветке 4 и ниже) файлы устройств создавались с помощью специальной утилиты (при установке системы — автоматически) как бы впрок, для (почти) всех теоретически возможных устройств. В результате в каталоге /dev обнаруживалось немерянное количество файлов для дисков и их разделов, терминалов и псевдотерминалов, и многого, многого другого. Большая часть которого оказывалась лишней. В то же время вполне могло не оказаться чего-то необходимого лично вам, но не предусмотренного стандартным сценарием создания файлов устройств.

Эту проблему (на самом деле не только эту, но и многие другие) сняла devfs. Теперь файлы каталога /dev создаются при загрузке системы только для устройств, реально существующих — раз, и поддерживаемых ядром системы (конкретным, лично сконфигурированным, или типовым ядром GENERIC). Более того, при «горячем» подключении устройств, таковое допускающих, соответствующие им файлы создаются «на лету».

Так вот, файлы устройств ATA-дисков именуются ad#. Как нетрудно догадаться, аббревиатура ad происходит от ATA Disk, а # — соответствует номеру конкретного накопителя в порядке его подключения к IDE-разъемам. То есть

/dev/ad0    Master на 1-м IDE-канале
/dev/ad1    Slave на 1-м IDE-канале
/dev/ad2    Master на 2-м IDE-канале
/dev/ad3    Slave на 2-м IDE-канале

Во FreeBSD по умолчанию принята статичная нумерация файлов дисковых устройств. То есть, например: файл диска Slave на 2-м IDE-канале всегда будет носить имя /dev/ad3, даже если он является единственным в системе. Случай, конечно, гипотетический — реально вряд ли кому понадобиться подключать диск таким образом. Однако важно, что при этом в каталоге /dev установленной FreeBSD 5-й ветки будет присутствовать только один файл устройства — /dev/ad3. Тогда как в более старых ветвях мы увидели бы также созданные «про запас» файлы /dev/ad0, /dev/ad1 и /dev/ad2, хотя попытка обращения к ним ничего, кроме сообщения об ошибке, и не дала бы.

В старых (но не обязательно устаревших) документах о FreeBSD можно встретить имена дисковых устройств вида /dev/wd0 и так далее. Такая номенклатура для IDE-дисков применялась в версиях ветки 3 и ранее. Начиная с ветки 4, за ними закрепились имена ad#.

Диски, подключенные к дополнительному простому IDE-контроллеру (например, реализованному на отдельной плате расширения), получают следующие по порядку номера — /dev/ad4, /dev/ad5, /dev/ad6, /dev/ad7. А вот с дисками на контроллере ATA RAID (а ныне они стали почти стандартным компонентом материнских плат) получается интереснее. Они существуют как бы в двух ипостасях — то есть одному и тому же физическому устройству соответствует два файла — /dev/ad# (где # будет начинаться с 8 для Master'а на 1-м RAID-канале) и /dev/ar# (где ar, как можно понять по аналогии, означает ATA RAID, а нумерация будет начинаться с единицы). До выполнения процедуры разбиения диска оба имени будут абсолютно равноправны, и любое из них можно будет выбрать как объект для создания разделов. Однако после того, как разбиение закончится, файлы устройств разделов будут образованы только на основе имени выбранного диска.

Некоторые контроллеры ATA RAID позволяют переключать их в режим работы обычного IDE-контроллера. В этом случае подключенные к ним диски будут именоваться обычным для ATA-накопителей образом — /dev/ad4 и так далее.

Номенклатура и нумерация других ATA-накопителей (например, внутренних Zip-драйвов) подчиняется тем же правилам, по которым обозначаются винчестеры. За исключением ATAPI CD ROM и CD-R/RW — файлы этих устройств по традиции именуются /dev/acd0 и /dev/acd1 (от ATAPI CD ROM — а кто видел в системе больше двух таких приводов?). Причем, в отличие от дисков, — вне зависимости от канала, на котором они сидят, просто в порядке подключения.

Файлы устройств SCSI-дисков именуются /dev/da# (как я предполагаю, от direct access — устройства прямого доступа), с нумерацией в порядке подключения к SCSI-шине. Сами по себе SCSI-диски нас не интересуют. Однако такие накопители, как USB flash (которые имеют все шансы стать стандартными сменными носителями взамен флоппи-дисков), также предстают перед системой как SCSI-диски. И соответственно первая же подключенная к машине флэшка (вне зависимости от того, к какому USB-разъему) получит имя /dev/da0. Причем это тот самый случай, когда файловая система устройств создаст для нее файл «на лету», в чем легко убедиться командой

$ ls /dev/

до и после подключения USB-накопителя.

Последнее устройство дискового типа, с которым приходится иметь дело пользователю настольной машины — это флоппи-дисководы. Файлы их именуются незамысловато — /dev/fd#, где для # с большой долей вероятности можно предполагать значение 0.

Конечно, FreeBSD поддерживает и все прочие известные типы накопителей — старые CD ROM с фирменными интерфейсами типа псевдо-SCSI, стриммеры с разными интерфейсами, SCSI RAID и так далее. Однако на настольной пользовательской машине обнаружить их нелегко, да и мне иметь дело с ними не приходилось.

Единственное, что может быть актуально для пользователя десктопа — это внешние диски с интерфейсом FireWire. Однако я таковых не только не пользовал, но и не видел, и потому ничего за них не скажу. Могу только предположить, что и они предстанут в каталоге /dev в качестве SCSI-дисков — если кто поделится сведениями по сему поводу, буду признателен.

Далее в этом разделе речь пойдет исключительно о жестких дисках, сиречь винчестерах. Как известно, диски принято делить на разделы (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'е, где пространство, занятое стертыми файлами, помечается как неиспользуемое, но реально перезаписывается только тогда, когда по настоящему свободное место на диске вообще исчерпано, такая ситуация вполне могла бы возникнуть.

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

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

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

Внутри нулевого блока, помимо прочего (в частности, кода какого-либо начального загрузчика, который может быть туда записан) есть еще один зарезервированный участок. Он предназначен для BIOS'овской таблицы разделов (Partition Table), под которую испокон веков отведено 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/Windows; как обстоит дело в NT/2000/XP — просто не знаю). В записи для первого раздела можно указать идентификатор типа файловой системы (например, FAT16 или FAT32), второму же разделу автоматически присваивается идентификатор типа Extended DOS. А уж Extended-раздел может быть далее поделен на логические разделы. Впрочем, это не интересно, да и многократно описывалось.

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

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

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

Начать с того, что одна из записей (третья по счету, маркируемая литерой c) резервируется для описания всего слайса в целом — ad0s1c, необходимость чего станет ясной в дальнейшем. Далее, первая запись таблицы, соответствующий которому файл устройства маркируется как ad0s1a, отводится для описания корневого раздела файловой системы. А очевидно, что на конкретной локальной машине корневой раздел может быть только один, вне зависимости от количества дисковых разделов и даже физических дисков. И наконец, вторая запись (файл устройства — ad0s1b) предназначена для описания раздела подкачки (swap-раздела), который, во-первых, не может содержать данные, и во-вторых, является единственным на весь диск (ясно, что создавать по свап-разделу в каждом слайсе бессмысленно, хотя при наличии двух физических дисков поделить между ними пространство подкачки — идея вполне здоровая). В итоге на четырех слайсах физического диска может быть создано 22 раздела — 1 корневой, один раздел подкачки и 20 разделов для хранения данных.

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

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

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

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

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

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

В заключение суммируем все, что ранее было сказано о номенклатуре накопителей, слайсов и BSD-партиций, в виде простенькой таблицы:

Дивайс    Назначение
ad0    Master-диск на 1-м IDE-канале
ad0s1    Первый слайс на нем (в режиме совместимости)
ad0s1a    Корневой раздел первого слайса
ad0s1b    Раздел подкачки
ad0s1с    Unused, предназначен для описания слайса в целом (как и ad0s1)
ad0s1d
...    Разделы для отдельных ветвей файловой системы
ad0s1h

ad0a    Корневой раздел Master-диска (в эксклюзивном режиме)
ad0b    Раздел подкачки на нем
ad0c    Unused, описывает весь «эксклюзивный» диск
ad0d
...     Разделы для отдельных ветвей файловой системы
ad0h

Для диска, подсоединенного к контроллеру IDE-RAID, файлы разделов будут иметь вид ar0s1a — ar0s1h. Zip-диску из коробки, отформатированному фабричным способом, будет соответствовать файл вида ad2s4 (в случае подключения Master'ом на 2-й канал). Фабрично же размеченная флэшка будет выглядеть вроде da0s4 (как точно — забыл, а под рукой фабрично размеченной нет, проверить не могу).

Добавлено: 03-11-2009 11:04:04

Особым образом будут выглядеть разделы, объединенные в программный RAID-массив. Однако к этому мы вернемся после практических упражнений по просмотру и созданию слайсов и партиций.
FreeBSD: практика дискодробительства

При начальной установке 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 сектора. Очевидно, что если диск перед этим был как-то разбит и содержал какие-либо данные, и разметка диска, и его содержимое будут безвозвратно уничтожены. Впрочем, такое поведение типично для всех утилит дисковой разметки в любой ОС. Правда, тут нас даже не спросят о подтверждении своих действий, так что следует быть внимательным.

Зато много вопросов последует при использовании опции -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. А вот если факт «плохой» геометрии имеет место быть — стоит задуматься.

Я с такой ситуацией столкнулся на примере двух идентичных дисков — Seagate Barracuda IV объемом 80 Гбайт, которые показали абсолютно разную геометрию, причем один — количество цилиндров, треков и секторов, не имеющее ничего общего с реальностью. В результате на дисках оказалось не только разное количество блоков на цилиндр, но и объем их различался на 3 Мбайта (мелочь, а неприятно).

И я принял решение исправить ситуацию руками. Для чего сначала ответил положительно на указанный выше вопрос, после чего мне было предложено ввести последовательно все указанные параметры. Что я проделал, указав правильные, на мой взгляд, значения числа цилиндров, треков и секторов. Подтверждение правомерности этих действий было получено позднее — при сверке с таковыми из 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:
<UNUSED>
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 слайс, вне зависимости от того, «эксклюзивный» он или совместимый, еще не пригоден к установке на него FreeBSD (или какому-либо иному использованию). Предварительно его еще нужно разбить на партиции (или хотя бы создать одну партицию, ad#s1c, описывающую слайс целиком). Ранее этой цели служила утилита disklabel, однако в версии 5.1 она заменена на заимствованную из NetBSD программу bsdlabel (с более дружественным, как говорят оптимисты, интерфейсом). Хотя и disklabel можно обнаружить в каталоге /sbin, но это — лишь жесткая ссылка на ту же бинарную программу.

Опять же, запущенная без опций (однако с обязательным аргументом в виде имени устройства), 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). Ясно, что оффсет для него — нулевой (приведенный пример относится к «эксклюзивному» диску, в режиме совместимости в этом поле стояло бы 63), а размер равен полному количеству физических блоков диска. Для прочих партиций смещение легко (с помощью калькулятора bc) вычисляется суммированием оффсета предыдущего раздела с его размером.

В поле 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

И — выйти из редактора его штатной командой с сохранением изменений (в случае с vi — :wq), в ответ на ч