О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

29.07.2008

Linux: диски и дисковые разделы

2003 г

Содержание

Преамбула общего характера

Первый этап при установке Linux в любой его форме - подготовка диска, то есть создание на нем раздела (разделов), на который эта ОС может быть установлена.

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

"Потом пришли другие времена" - времена графических инсталляторов и специализированных утилит для управления разделами, начиная с Disk Druid из Red Hat и заканчивая дисковыми менеджерами Caldera, Mandrake, ASPLinux. Казалось бы, пользователю Linux, особенно начинающему, "жить стало лучше, жить стало веселей" (почти этими словами был переведен соответствующий комментарий из инсталлятора Mandrake). И проблема дисковых разделов уже не выглядит столь пугающей. Так почему же возникает необходимость снова и снова к ней обращаться?

Во-первых, времена действительно изменились. Эпоха, когда Linux можно было без проблем установить на диск в 300-500 Мбайт, канула в Лету: ныне ни один уважающий себя дистрибутив не запросит для себя менее полутора-двух гигабайт по умолчанию. Иными стали и требования к структуре разделов, мало кого удовлетворит элементарная схема из root- и swap-партиций. Да и файловые системы стали иными - к единственной еще недавно Linux native (ext2fs) добавились и разнообразные журналируемые системы, и программные RAID-массивы, и системы управления логическими томами (LVM). Они стали для Linux столь же родными (native) и их особенности необходимо учитывать уже на стадии разбиения диска. Так что рекомендации по сему предмету в руководствах даже годичной давности, хотя и не потеряли своего значения, но уже не всегда адекватны современным реалиям.

Во-вторых же, и это - главное, никакие менеджеры дисков не заменят понимания логики создания разделов. Которое только и может если не гарантировать от ошибок, то свести к минимуму их вероятность. А цена ошибки в этом процессе всегда одна - потеря времени, нервов, данных...

При установке же дистрибутивов Source Based именно ручное разбиение диска - первый шаг в этом длинном маршруте. И потому здесь тема эта оказывается особенно актуальной. Ее можно свести к двум аспектам - чем разбивать и как разбивать. Но сначала - несколько вводных замечаний.

Введение в дисковую тему

Как известно, в любой операционной системе диски положено делить на разделы - так повелось в веках, и в обоснование причин этого я вдаваться не буду. Столь же общеизвестно что диски бывают физические и логические. Физические, или первичные, разделы (Primary Partitions) описываются в таблице разделов (Partition Table) начального (его обычно нумеруют нулевым) сектора каждого диска. Таблица эта (ее можно назвать таблицей разделов BIOS) содержит всего четыре записи, и потому большее их число создать невозможно. Это - объективная реальность, данная нам в ощущениях разработчиков архитектуры PC (на других платформах все, возможно, иначе, но как - за незнанием говорить не буду).

Однако в любом (не совсем в любом - но в общем случае это так) из первичных разделов можно задать свою, дополнительную, таблицу разделов, что позволяет разделить его на некоторое количество разделов логических (Logical Partitions). В терминологии DOS/Windows они именуются логическими томами (Logical Volume). Однако мы зарезервируем этот термин для системы LVM (Logical Volumes Manager), о которой будет говориться к последней части этого мемуара.

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

Так, таблица разделов в BSD-стиле (т.н. BSD Labels) позволяет на каждом из первичных разделов - во FreeBSD, например, где связанная с дисками терминология наиболее логична, они называются слайсами (slices), - иметь до 8 логических разделов, именуемых BSD Partitions, или partitions просто (на самом деле - меньше, но это - из FreeBSD-оперы).

Таблица разбиения в стиле DOS/Windows позволяет создавать логические разделы только в одном из первичных. Для этого он объявляется расширенным (extended), выступая в качестве контейнера, в который последовательно, как в матрешку, вкладываются один логический и один расширенный раздел - и так до бесконечности. Правда, аналогия с матрешкой - не совсем строгая, потому что для пользователя все эти вложенные разделы видятся как равноправные части "головного" extended-раздела. Да и на счет бесконечности - тоже несколько преувеличено - на самом деле больше 63 (кажется) логических разделов создать не удается.

В Linux принят DOS-стиль таблицы разбиения. Это не значит, что разделы Linux имеют хоть что-то общее с FAT-разделами, а просто накладывает ограничение на создание логических разделов: они доступны системе только в одном из разделов физических, предварительно объявленном как расширенный. Теоретически, пересобрав ядро с опцией поддержки BSD Labels, можно было бы получить возможность доступа к логическим разделам на всех первичных партициях, однако как это выглядит на практике - не знаю, не пробовал.

Характер информации, которая может быть записана во вторичные таблицы разделов, как физических, так и логических, определяется идентификатором типа файловой системы. Это - уникальное шестнадцатеричное число от 0 до ff, определяющее ту ОС, файловая система которой может быть создана на этом разделе. Так, родной тип файловой системы Linux (Linux native) имеет шестнадцатеричный идентификатор 83, раздел типа FAT16 - 6, FAT32 - b, расширенный раздел (DOS extended) - 5, слайс FreeBSD - a5 (к слову, а в конфигурационной программе FreeBSD - sysinstall, - принята десятичная система исчисления идентификаторов, и там он для нее - 165). Номер 82 идентифицирует раздел подкачки (Linux swap), на котором никаких файловых систем разместить нельзя - он используется для выгрузки страниц оперативной памяти (составляя с ней единое логическое целое - виртуальную память).

Важно понимать, что в данном случае тип файловой системы раздела имеет весьма косвенное отношение к тем файловым системам, которые будут на нем размещены (типа ext2fs, XFS или FAT) хотя и может совпадать с ней по названию (тот же FAT чему примером). Он просто показывает, какого рода таблица (DOS, BSD или иная - имя им легион) может быть записана в начальном секторе данного раздела. И, соответственно, что дальше с этим разделом можно сделать. Так, если раздел помечен как слайс FreeBSD, его можно поделить на BSD-партиции, DOS Extended - на логический раздел и еще один расширенный, а вот с FAT или Linux native ничего уже сделать нельзя - кроме как использовать по прямому назначению, сиречь для хранения данных. Впрочем, для раздела, идентифицируемого как Linux swap, не удастся и этого.

Сама ОС Linux традиционно cпособна размещаться на разделах типа Linux native (ну еще бы), DOS Extended (подчеркну, что это тот же самый расширенный раздел DOS, который можно создать DOS'овской командой FORMAT) и FAT различного рода (что, впрочем, представляется занятием крайне нездоровым). И загружаться с них, используя тип Linux Swap в своих целях. Кроме того, современные версии ее ядра готовы работать, как с родными, с разделами типа Autodetect RAID (Linux raid auto - идентификатор f0) и Linux LVM (8e). Обмен же на уровне данных возможен и с разделами, созданными OS/2 (HPFS), WindowsNT (NTFS), FreeBSD, возможно, и с какими-то другими - не знаю. Правда, в отношении первых двух типов возможности Linux ограничиваются только чтением, а режим записи на FreeBSD-раздел характеризуется как dangerous. Впрочем, это определяется уже особенностями не типов разделов, а файловых систем соответствующих операционок.

Номенклатурный вопрос

Разговор о дисковых разделах в Linux традиционно начинается с номенклатуры накопителей. Всякий, кто хоть раз устанавливал эту систему (или хотя бы помышлял об этом) знает, что ATA-диски (а я буду говорить только о них - SCSI-накопители суть тема особая и для большинства пользователей все менее актуальная) в Linux маркируются в соответствии с порядком подключения к IDE-контроллеру: первый диск на первом канале всегда будет именоваться /dev/hda, второй - /dev/hdb, третий - /dev/hdc, четвертый - /dev/hdd. Эти имена дисков (собственно, не дисков, а файлов соответствующих им устройств, но об этом - в другой раз) всегда будут неизменны - даже если в системе присутствуют только мастер на первом канале и слейв на втором.

Разделы на дисках маркируются дополнительными цифрами: с hd?1 по hd?4 для первичных разделов (а более четырех их, как сказано выше, на диске не бывает), и начиная с hd?5 - для логических разделов раздела расширенного. В виду особенностей принятой в Linux таблицы разделов, последний может присутствовать только в единственном экземпляре, отнимая одну запись в таблице у разделов первичных. То есть на физическом диске теоретически могут сосуществовать три первичных раздела и некоторое количество логических томов, например, hda1-hda3 и hda5-hda8.

Сказанное - общеизвестно, и до недавнего времени было абсолютно верно, однако ныне нуждается в коррективах. Большинство современных дистрибутивов Linux, основанных на ядре 2.4.xx, более или менее активно задействуют поддерживаемую последним файловую систему устройств - devfs. Она предоставляет массу дополнительных возможностей (в частности, избавляет от резервирования имен для устройств, в системе отсутствующих, проблем со старшими номерами устройств и многого другого). Однако в ней по умолчанию применяется совершенно иная номенклатура и предусмотрены иные каталоги для размещения файлов устройств.

Так, для файлов любых ATA-накопителей предназначен каталог /dev/ide (в некоторых дистрибутивах файловая система устройств монтируется в каталог /devices, а каталог /dev сохраняется для совместимости). Файлы накопителей на встроенном основном IDE-контроллере локализуются в подкаталоге /dev/ide/host0 (если используется еще и дополнительный IDE-контроллер, встроенный или внешний, можно увидеть и каталог /dev/ide/host1). А внутри него есть два подкаталога, соответствующие IDE-каналам - /dev/ide/host{/bus0,/bus1}), каждый из которых опять же может делиться надвое - на каталоги target0 и target1, по количеству подключенных устройств. Внутри каталога target0(1) имеется минимум еще один подкаталог lun0. А уж в нем размещаются непосредственно файлы устройств - disc для всего накопителя, part1, ... part4 для физических разделов и part5, ... part# - для логических.

Таким образом, полное обозначение дискового раздела будет выглядеть как

/dev/ide/host0/bus0/target0/lun0/part1

для первого первичного раздела на первом диске первого канала основного IDE-контроллера. Предусмотрен и более краткий способ обращения к файлам устройств - через жесткие ссылки (то есть иные имена для тех же наборов данных). Для файлов дисковых накопителей (независимо от интерфейса - IDE или SCSI) они собраны в каталоге /dev/discs (для файлов CD-приводов, например, - в каталоге /dev/cdrom) с подкаталогами disc0, ... , disc#. И потому к приведенному в качестве примера разделу можно обратиться и так:

/dev/discs/disc0/part1

В том, что имя файла в первом и втором случае соответствует одному и тому же набору данных, легко убедиться командой ls с опцией -i, выводящей файловые дескрипторы области метаданных (т.н. inode). В системе, на которой пишутся эти строки, в ответ на нее:

$ ls -i /dev/discs/disc0/part1
/dev/ide/host0/bus0/target0/lun0/part1

мы получим:

369 /dev/discs/disc0/part1
369 /dev/ide/host0/bus0/target0/lun0/part1

Наконец, для совместимости со старыми временами (и старыми привычками) в большинстве (но не во всех) дистрибутивов поддерживается и номенклатура, принятая до внедрения devfs. То есть все тот же дисковый раздел из примера можно обозвать просто - /dev/hda1. В отличие от первого случая, это будет уже другой файл - символическая ссылка на истинный файл устройства, /dev/ide/host0/bus0/target0/lun0/part1. И на команду

$ ls -i /dev/hda1

мы получим совершенно другой дескриптор inode:

98416 /dev/hda1

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

Подчеркну, что при использовании файловой системы devfs имена файлов создаются только для реально существующих в системе устройств (в том числе, для устройств "горячего" подключения, типа PC-карт, - и "на лету"). Поэтому, если в системе имеется только единственное IDE-устройство, скажем, жесткий диск как мастер на первом канале, бесполезно было бы искать файлы устройств с именами, отличными от приведенного в примере. Что удобно, но в некоторых реализациях devfs может создавать сложности. Так, мне встречались дистрибутивы, в которых IDE-Zip удавалось смонтировать только в том случае, если он находился в приводе в момент старта системы. Впрочем, как сказал бы Киса Воробьянинов, к теме, которую я в данный момент представляю, это не относится...

Чем разбивать

Разобравшись с номенклатурой разделов, перейдем к методам их создания. На настоящий момент мне известно три программы разбиения диска: традиционный fdisk, его собрат cfdisk, считающийся более дружелюбным к пользователю, и относительно новая GNU-утилита parted. Это не считая "продвинутых" дисковых менеджеров типа Disk Druid или HardDrake - о них здесь речи не будет. Как и о коммерческих программах типа Partition Magic или Acronis OS Selector - не смотря на свои многочисленные достоинства, к миру свободного софта они отношения не имеют.

Именно fdisk'ом больше всего пугали в старые времена начинающих пользователей Unix. Однако она столько раз описана в толстых руководствах, что говорить о ней подробно я не буду. Замечу лишь, что, на мой взгляд, ничего устрашающего в ней нет. Запускается просто:

fdisk /dev/hd?

где в качестве имени устройства фигурирует физический диск, например для мастера на первом канале это будет /dev/hda. При использовании devfs (и отказе от опознания файла устройства в старой номенклатуре) можно прибегнуть к форме

fdisk /dev/discs/disc#/disc

или к указанию полного имени файла устройства. Да и дальше - не сложнее: благодаря прекрасной системе помощи (вызываемой командой m) в любой момент можно получить полный список доступных команд, а команда p выведет текущее состояние разделов на диске. Разделы эти можно создавать (командой n) или удалять (командой d), однако до команды записи изменений (w) никаких необратимых действий, могущих разрушить ранее существующие файловые системы (например, FATxx) не последует: неудачно созданные разделы можно удалить и на их месте создать новые. И в любой момент командой q можно без последствий выйти из программы.

При создании раздела средствами fdisk сначала определяется, будет он первичным (primary) или расширенным (extended). Рассмотрим сначала первый случай. При нем далее просто указывается номер раздела (от 1 до 4). В этих пределах номер может быть любым - можно сначала создать раздел 2, а потом 1, или даже весь диск отвести под раздел 4 (именно так размечены фабричным способом zip-диски, почему соответствующие им файлы устройств в старой нотации выглядят как /dev/hd?4). Номер раздела останется на века: именно он будет идентифицировать файл устройства, соответствующий созданному разделу (например, /dev/hda2, или /dev/discs/disc1/part2).

Далее задается начальный цилиндр создаваемого раздела (по умолчанию - первый свободный, для пустого диска - просто первый. Однако никто не мешает указать любой другой цилиндр в качестве стартового (на неразбитом пространстве, разумеется). А потом - конечный цилиндр (по умолчанию - последний физический на диске), или просто размер раздела в мегабайтах, например, +300M (и +, и M - обязательны, иначе будет создан раздел ровно в 300 цилиндров). При задании размера в единицах, отличных от цилиндров, он всегда будет округляться до ближайшего числа, кратного целому количеству последних. Так что не следует удивляться, если вместо искомого раздела в 20 Мбайт возникнет 16-мегабайтный, а вместо 22-мегабайтного - раздел в 24 Мбайт.

При создании расширенного раздела все происходит точно также - задание номера (очевидно, что в том же диапазоне 1-4), указание начального цилиндра и конечного (или - объема в мегабайтах). Однако это - еще полдела, нужно поделить расширенный раздел на логические. И потому при следующей команде на создание раздела - n нам будет предложен уже выбор между первичным (если число последних еще не исчерпано) и логическим (ведь второй extended-раздел создать нельзя):

Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)

Дальше же логический раздел создается аналогично первичному.

Для каждого вновь создаваемого средствами fdisk первичного раздела по умолчанию устанавливается тип файловой системы Linux native (идентификатор 83), как, впрочем, и для раздела логического. Расширенный раздел также автоматически получает правильный идентификатор своего типа - 5. Однако типы эти не есть нечто неизменное. Более того, по крайней мере в одном случае изменение типа раздела - необходимость. Это потребуется также и для использования таких современных технологий, как Software RAID или LVM, о которых будет говориться в заключительных разделах.

Делается это командой t, после чего запрашивается номер раздела, тип которого должен быть изменен, а затем - идентификатор желаемого типа. Полный список поддерживаемых типов файловых систем (и их идентификаторов) можно вывести командой l. Напомню, что идентификатор типа файловой системы раздела - отнюдь не файловая система, которая на нем размещается. И на разделе Linux native, как это подчеркивает название, можно создать любую файловую систему из числа тех, которые поддерживаются Linux как родные (ext2fs, ext3fs, XFS, ReiserFS, JFS). Как, впрочем, можно создать их и на разделах типов Linux raid autodetect и Linux LVM (правда, после некоторых предварительных манипуляций, но к этому разговору я еще вернусь).

Теоретически fdisk позволяет присвоить созданному разделу идентификатор типа почти любой из мыслимых файловых систем - от FAT12 до Free-, Open- и NetBSD. Однако сами по себе файловые системы средствами fdisk не создаются, и потому для разделов чуждого типа в дальнейшем потребуется их форматирование (в терминах DOS) в родной среде (например, DOS-командой FORMAT для FAT-раздела). Тем не менее, смысл в такой операции есть - резервирование места под ОС, которые будут установлены позже.

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

Программа cfdisk описывается в литературе гораздо реже, хотя во многих дистрибутивах она пропагандируется как более удобная, чем fdisk (на мой взгляд, все как раз наоборот, но это - дело вкуса). Запустить ее можно одноименной командой, без всякого аргумента (хотя таковой в виде имени файла устройства, как в fdisk, и не возбраняется).

После запуска программы выводится информация о диске (имя файла устройства, размер, число головок, секторов, цилиндров), таблица существующих разделов (если, кончено, они действительно существуют) и меню из следующих пунктов: Bootable, Delete, Help, Maximize, Print, Quit, Type, Units, Write. Это - для диска с существующими разделами. Если же диск не разбит (или в таблице разделов курсор зафиксирован на неразбитом пространстве), меню ограничивается пунктами Help, New, Print, Quit, Units, Write.

Смысл пунктов (и вообще возможности программы), думаю, понятен из их названий. Замечу лишь, что здесь, как и в fdisk, до выбора пункта Write (в котором будет запрошено подтверждение действия) никаких необратимых изменений не происходит: через Quit всегда можно покинуть программу без боязни за существующие разделы и данные на них. И еще: по умолчанию размеры разделов в таблице указаны в мегабайтах. Однако через пункт Units (сиречь единицы измерения) можно переключиться на показ его в секторах или цилиндрах.

Для создания раздела выбирается пункт New, выводящий подменю: Primary, Logical, Cansel. После выбора типа раздела просто задается желаемый его размер (в мегабайтах) - и запрашивается, приписать ли раздел к началу диска или его концу. А потом остается только сохранить разбиение в таблице разделов выбором пункта Write (повторяю, с запросом подтверждения, и не просто как y, а вводом полного слова yes - дабы дать дополнительные мгновения на раздумье). То есть - все почти как в fdisk. Хотя несколько менее гибко - раздел в середине неразбитого дискового пространства создать нельзя. Это и неудивительно: cfdisk по сути лишь интерфейсная для fdisk оболочка (т.н. front-end).

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

Использоваться parted может двояким образом - в интерактивном и в командном режиме. Начнем с первого, то есть просто запустим программу одноименной командой, без опций и аргументов. В ответ она выдаст нам предупреждение об отсутствии гарантии, информацию о первом физическом диске системы - имя устройства в полной нотации devfs, данные о геометрии (цилиндры/сектора/головки), предупреждение о том, где кончается 1024 цилиндр, - и выведет приглашение командной строки в виде

(parted)

Интерфейс программы построен по принципу sh-совместимых оболочек, и весьма сходен с таковым, например, загрузчика GRUB. Поддерживаются, в частности, редактирование командной строки (обычными управляющими последовательностями, например, Control+D - удаление символа в позиции курсора, Control+H - перед оной), просмотр истории команд, автодополнение (клавишей Tab). Действия по организации диска выполняется с помощью мнемонически прозрачных команд (print - просмотр, mkpart - создание раздела, rm - его удаление, и т.д.). Синтаксис команд - также shell-подобный: обычно требуется указание аргумента - номера устройства (Minor, в терминологии программы) и некоторых дополнительных опций (в зависимости от команды). Выход из программы - командой exit или комбинацией Control+D.

Полный список доступных команд с возможными опциями и аргументами, а также краткими, но внятными комментариями (в правильно локализованной системе - на языке локали, например, русском) можно получить, введя в командной строке

(parted) help

или просто нажав Enter в ответ на приглашение. Список этот включает команды для:

  • выбора устройства для редактирования (select /dev/hd?);
  • действий с существующими разделами (print - просмотр таблицы разбиения, chech - проверка целостности файловой системы раздела, rm - удаление раздела, cp - копирование файловой системы в другой раздел, resize - изменение размера раздела, move - перемещение раздела в пределах диска);
  • манипуляций по разбиению диска (mkpart - создание раздела, mkpartfs - создание раздела с файловой системой заданного типа, mkfs - создание файловой системы на существующем разделе).

Подробную справку по каждой команде можно получить, введя

(parted) help имя_команды

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

В отличие от fdisk или cfdisk, в parted не предусмотрено специальной команды для записи изменений, все действия выполняются в реальном времени, без откладывания. То есть, например, команда

(parted) rm #

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

Чтобы оценить возможности parted, рассмотрим для примера процесс разбиения вновь приобретенного диска. Для чего после запуска программы сначала выбираем соответствующее устройство:

(parted) select /dev/hd?

затем командой

(parted) print

убеждаемся, что устройство это разбиению не подвергнуто, и даем команду для создания раздела:

(parted) mkpart type_part type_fs start end

Под типом раздела здесь могут выступать значения primary (для первичного раздела), extended (для расширенного) или logical (для логического тома в последнем). Возможные значения для типа файловой системы - ext2, linux-swap или FAT. Можно указать также и иные поддерживаемые Linux файловые системы - ext3, reiserfs, xfs или jfs. Или даже hp-ufs и sun-ufs - версии файловой системы проприетарных Unix (UFS) - для платформ HP-PA и Sun Sparc, соответственно. Однако само по себе создание файловых систем при этом выполнено командой part не будет, о чем я скажу чуть ниже.

Начало (start) и конец (end) раздела указываются в мегабайтах, например, 0 и 3000 при создании раздела в 3 Гбайт от начала диска. И начало, и конец можно задать дробными (с точностью до третьего знака и разделителем - десятичной точкой) числами, что обеспечивает необходимую точность разбиения (при наличии калькулятора или способности к счету в уме).

Как легко понять из формата команды, раздел заданного размера может быть создан в любом месте диска (не обязательно в начале его или в конце). И раздел, созданный первым по времени (вне зависимости от положения на диске), получит номер (Minor) 1, созданный вторым (пусть и в начале диска) - Minor 2, и так далее. То есть по гибкости команда mkpart из parted ничуть не уступает программе fdisk.

Далее на дисковых разделах должны быть созданы файловые системы. Вообще-то, это тема отдельного разговора. Однако поскольку именно эта возможность делает программу parted столь универсальной, затрону ее здесь вскользь. Создание файловой системы осуществляется командой

(parted) mkfs # type_fs

где под # выступает тот самый номер (Minor) раздела, который был присвоен ему при создании. А доступные для создания файловые системы ограничиваются ext2, linux-swap и FAT - на попытку приписать разделу, скажем, XFS, последует сообщение о невозможности сего действа. Можно надеяться, что это - явление временное, и поддержка журналируемых файловых систем для Linux будет включена в грядущие версии parted.

Дисковый раздел и файловая система на нем могут быть созданы также одной командой:

(parted) mkpartfs type_part type_fs start end

К опциям ее относится все то, что было сказано чуть выше об командах mkpart и mkfs.

Таким образом, создание разделов (и, добавлю, файловых систем) средствами программы parted в интерактивном режиме весьма просто и удобно (при должной, естественно, аккуратности). Однако основные ее преимущества проявляются при использовании в командном режиме. Чтобы прибегнуть к нему, программу parted следует запустить с указанием аргумента (имени файла дискового устройства), встроенной команды parted и необходимых последней опций. В итоге одной строкой типа

$ parted /dev/hda mkpartfs primary ext2 0 100 &&
parted /dev/hda mkpartfs primary linux-swap 101 1124 &&
parted /dev/hda mkpartfs primary ext2 1125 ###

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

Как разбивать

Надеюсь, сказанного достаточно для выбора инструмента разбиения диска. Теперь пора посмотреть - а какие же разделы потребуются для установки Linux?

Теоретически обязательным для этого считается требование двух разделов - корневого (/) и раздела подкачки (linux swap). Однако практически их может потребоваться больше - в зависимости от дистрибутива, задач, размера диска, используемых файловых систем.

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

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

К слову сказать - размер swap-раздела для современных ядер имеет ограничение с обеих сторон: 128 Мбайт снизу (меньший раздел просто не может быть смонтирован) и 2 Гбайт сверху (больший объем просто не может быть адресован на 32-разрядных машинах). А рекомендуемый объем раздела подкачки равен удвоенному объему оперативной памяти. Хотя эффективно использоваться он будет только в том случае, если задействовать временную файловую систему в оперативной памяти (tmpfs).

Кроме того, ядро Linux не всегда может быть загружено с разделов с журналируемыми файловыми системами, например, ReiserFS, о причинах чего будет говориться в соответствующем мемуаре (а пока - см. библиографию вопроса). И если предполагается использование последней для корневого раздела, выделение раздела под каталог /boot становится необходимым.

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

Расчет здесь прост - современные полнофункциональные ядра Linux после компиляции занимают 1-1,5 Мбайт. Объем прочих файлов каталога (включая даже графические заставки для Lilo или GRUB) пренебрежимо мал (у меня, например, весь каталог /boot/grub занимает меньше 200 Кбайт). И потому если ядер потребуется несколько (а минимум одно - образ предыдущего ядра, - практически обязательно), на каждое достаточно отвести с запасом по 2 Мбайт.

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

А дискового пространства под это дело нужно немало. Современные пакетные дистрибутивы при установке по умолчанию стремятся занять от полутора (например, ASPLinux) до трех (Altlinux, последние версии Mandrake) гигабайт.

В дистрибутивах Source Based объем установленных компонентов может быть высчитан весьма прецизионно. Но зато в них возникает необходимость большого свободного пространства для временного хранения архивов исходников, результатов их распаковки и промежуточных продуктов компиляции. Так, для полного развертывания дистрибутива SourceMage рекомендуется (скорее, даже требуется) раздел в 8 Гбайт. Это, конечно, может показаться крайностью, но задействовать под корневой раздел 4-5 Гбайт не лишне в любом случае.

Есть, конечно, и другое решение - выделить из корня в самостоятельные разделы каталоги /usr (для штатных пользовательских программ дистрибутива), /usr/local (для программ, самостоятельно собираемых из исходников), /usr/X11 (для программ графического режима - легко догадаться, что они занимают больше всего места на диске), /opt (каталог, в соответствие со стандартами, продвигаемыми Linux Standard Base, призванный заменить /usr/local в деле помещения программ, не входящих штатно в данный дистрибутив).

В некоторых случаях создаются разделы для каталогов /tmp и /var, предназначенных для временных и часто изменяемых файлов. Правда, это касается в основном серверов - на настольной машине их выделение нецелесообразно. Да и оценить заранее их объем - задача нетривиальная. Так, в дистрибутивах Source Based каталог /var задействуется не только под базу данных установленных программ (это свойственно пакетным дистрибутивам), но и под полученные из Сети исходники и продукты их обработки). Кроме того, я сталкивался с системами, в которых программа ImageMagik при пакетной обработке изображений по умолчанию использовала каталог /var под свои временные файлы. И потому к столь дробному разбиению следует прибегать только при железной уверенности в правоте своих действий. Или - при возможности гибкого управления созданными разделами, которую обеспечивает, скажем, технология LVM.

Так что если вынести за пределы коневого раздела все, что можно - /usr, /usr/local и (или) /opt, /var, /tmp и, конечно же, /home, для него потребуется совсем немного места - 100-200 Мбайт.

Какие создавать разделы, первичные или логические, вопрос спорный. Установщики многих дистрибутивов по умолчанию отдают предпочтение разделам логическим. Мое же глубокое убеждение (хотя дать ему рациональное объяснение затрудняюсь) - если четырех первичных разделов хватает для жизни (под корневой каталог, каталоги /boot, /swap и /home, к примеру), то ими лучше и ограничиться. К логическим разделам следует обращаться, только если их требуется больше (например, если уже установлена Windows и хочется оставить место под FreeBSD). И в любом случае - корневой раздел (и загрузочный, - в общем, раздел, с которого загружается ядро системы) должен быть первичным.

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

Все высказанные выше соображения относились к ситуации с единственным физическим диском. Если их в машине больше - возможны варианты. Первый из них - вынесение на второй диск некоторых разделов, например, под каталог /home или его часть, предназначенную для резервного хранения данных. Кроме того, в этом случае рекомендуется разнесение на разные диски области подкачки - путем создания на каждом самостоятельного swap-раздела половинного размера. Это способствует повышению производительности за счет распараллеливания обращений к виртуальной памяти.

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

Третья возможность - обратиться к менеджеру логических томов (Logical Volumes Manager), который даст возможность не только представить разделы на разных жестких дисках как единое пространство, но и гибко управлять размером существующих разделов. При этом на одном из дисков достаточно будет выделить два первичных раздела (под каталоги / и /boot), по разделу подкачки на каждом диске, а все остальное пространство отвести под логические разделы, которым должно присвоить идентификатор 8e (тип файловой системы - Linux LVM).

И в заключение - напомню, что на стадии создания дисковых разделов мы отнюдь не предопределяем их назначение: так, раздел под каталог /boot станет таковым только после его монтирования в файловую систему. Однако к этому вопросу придется вернуться в следующей статье - после рассмотрения файловых систем вообще.