Новая демониада, или FreeBSD 5.
4. Диски, слайсы, партиции

Алексей Федорчук
[email protected]

Описание любого дистрибутива принято начинать с его установки. Однако установка FreeBSD стандартным способом столько раз описывалась, в том числе и автором этих строк, что возвращаться к этому вопросу было бы скучно. Тем более что в 5-й ветке отвечающая за это программа (/stand/sysinstall, она же - /usr/bin/sysuinstall, являющаяся, кроме того, и универсальным постинсталляционным конфигуратором) практически не изменилась по сравнению с версиями 4.X, приобретя лишь несколько мелких, но очень приятных усовершенствований, о которых я говорил в ознакомительной заметке.

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

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

Дискобольское введение

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

Для начала вспомним, что дисковые накопители во FreeBSD (как и любые другие устройства в любой Unix-подобной системе) предстают перед пользователем в виде файлов специального типа - файлов устройств, конкретнее - файлов блочных устройств (то есть тех, обмен данными с которыми осуществляется не побитно, как, скажем, с сериальными портами, а блоками некоего фиксированного размера). Файлы эти расположены в каталоге /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 - наиболее точным переводом будет "отрезки"), чтобы отличать их от партиций BSD-разметки. Слайсы в номенклатуре файлов устройств маркируются добавлением к имени файла диска литеры s и порядкового номера (в отличие от дисков, начиная с единицы): ad0s1, ad0s2, ad0s3, ad0s4 для мастер диска на первом IDE-канале. Если одному или нескольким из слайсов будет присвоен идентификатор BSD-системы (строго говоря, он называется BSD4.2 и свойственен также NetBSD), то в его начальный блок запишется собственно BSD-таблица разделов (BSD Label). В соответствие с ее форматом, каждый слайс с ID 165 абсолютно равноправен и может быть поделен на логические разделы (собственно partitions, в терминологии FreeBSD). Для партиций в BSD-таблице предусмотрено восемь полей. Соответствующие им разделы номенклатурно маркируются добавлением к имени файла слайса литеры - от a до h. То есть таких логических разделов, казалось бы, может быть создано восемь. Однако практически это не совсем так (вернее, совсем не так). Начать с того, что одно из полей (третье по счету, маркируемое буквой e) резервируется для описания всего слайса в целом - ad0s1e, необходимость чего станет ясной в дальнейшем. Далее, первое поле таблицы, соответствующий которому файл устройства маркируется как 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 непосредственно 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 (как точно - забыл, а под рукой фабрично размеченной нет, проверить не могу). Особым образом будут выглядеть разделы, объединенные в программный RAID-массив. Однако к этому мы вернемся после практических упражнений по просмотру и созданию слайсов и партиций.

Продолжение следует
К предыдущему