О блоге

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

01.08.2008

Заметки архивариуса: как сбэкапить много данных

22 октября 2002 г

Не шутите с данными -
эти шутки глупы и неприличны
Козьма Прутков-эникейщик

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

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

Года три назад я по случаю написал статью под названием вроде «О причинах, по коим CD-R должны стать стандартным компонентом компьютеров» (кажется, до сих пор лежит на http://www.kulichki.com/~anykey). И вот, кажется, такой момент наступил √ по крайней мере, приводы CD-R/RW с вышесредними (мягко говоря) характеристиками стали более чем доступны по цене (во всяком случае, дешевле, чем связка читающего CD и привода Zip, например). Так что же мешает нам ныне стать аккуратистами и завершать день сохранением созданной нетленки так же, как начинаем мы его умыванием?

Да уж больно велики нынче ставки. Диска объемом меньше 20 Гбайт найти трудно, а всякого рода мультимедия с легкостью заполняет его под завязку - не говоря уже о том, что мы ведь иногда и работаем. И для начала ведь придется сохранить всю эту гору нажитого непосильным трудом - о записи ее на CD, пусть даже суперскоростной, нельзя подумать без содрогания: ибо прежде нужно в некоем разумном порядке побить ее на части, кратные объему болванки.

Проблема эта озаботила меня после бесславного крушения двух подряд дисков, использовавшихся как резервные (от того производителя, изделиями коего нынче забиты все гарантийки Москвы и сопредельных стран). Это было не летально √ вся текущая работа сохранялась мной на века с появления первого доступного (не по цене - физически, это был внешний односкоростной SCSI Plextor стоимостью то ли 2, то ли 3 штуки ихних денег). Однако перелопатить всю эту груду дисков (суммарный объем сохраненной информации приближался к кубометру) - занятие, повторения которого не пожелаешь собаке классового врага. Результаты размышлений, как избежать этого в дальнейшем, я и предлагаю вашему вниманию.

Итак, стоит задача: в разумные сроки записать на CD около 10 Гбайт разнообразных данных, разместив там в разумном же порядке, дабы время восстановления архива не приняло астрономических масштабов. Имеется: Gentoo Linux, CD-R/RW ASUS 24x10x40, технологическая (100 шт.) упаковка болванок неопределенного генезиса. Ну и прочие мелочи, вроде компьютера с двумя жесткими дисками (один - в 40 Гбайт имени мадам Барракуды IV, и второй, 30-гигабайтный, - той самой фирмы, о которой в связи с винчестерами я больше не хочу говорить).

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

Гораздо важнее подготовить данные, подлежащие записи. Самое простое - тупо, в лоб сархивировать их командой tar. Причем, если мультимедия составляет больше половины объема (а обычно так оно и есть), лучше обойтись без сжатия (gzip'ом там или bzip2): поскольку всякие mpeg'и и avi'шки уже сжаты, выигрыш в объеме будет ничтожным, а вот потери времени…

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

$ split --split --bytes=635m filename.tar [PREFIX]

Почему именно 635 Мбайт? Чтобы не ломать голову - это примерно 72-минутный трек, что гарантированно влезет на любую болванку. Но знатным экономам не возбраняется и забить диск на всю катушку (только уж сами высчитывайте, сколько это будет). А в качестве префикса при желании можно указать какое-либо мнемоническое имя √ дату создания архива, например.

В результате этого мы получим кучу файлов (штук 15-16 на 10 Гбайт) вида [PREFIX]aa, [PREFIX]ab и далее по алфавиту, из которых следует наштамповать образов. Причем, поскольку процесс расщепления 10-гигабайтного файла весьма длителен, ничто не мешает перейти в другую виртуальную консоль и делать это параллельно.

Образы готовятся обычным образом (пардон за каламбур) - командой mkisofs. Единственно √ нет необходимости в опции -J (не под Windows мы все это будем разворачивать), а опция -R, напротив, необходима (по понятным причинам). Ну и никакой мультисессионности, разумеется, не требуется.

Наготовив несколько образов про запас, можно еще в одной консоли запустить и третий процесс - собственно записи. На достаточно мощной машине (и с современным приводом CD-R/RW) никаким опустошением буфера это не грозит, проверено на собственном опыте.

Так что запускаем cdrecord (с опцией -eject), указанием параметров SCSI-устройства и именем файла образа. Скорость записи (опция speed) можно смело выставлять максимально доступную для привода: если болванка ее не потянет, процесс записи замедлится автоматически. Так, мои беспородные болванки (судя по цене, не высшего качества) четко писались на скорости x16, каковая время от времени (когда параллельные процессы отъедали много ресурсов - ведь еще даже split не закончился, не говоря уже о создании образов) до x2-x3. Ну а наполнение буфера обычно держалось в диапазоне 70-100% (максимальное падение - 3%).

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

Возникает вопрос: как проверить результаты своей работы? Двояким образом. На этапе созданиям образа диска - его монтирования как loopback-устройства. А после записи - обычным образом:

$ mount /mnt/cdrom
$ tar tvf [PREFIX]??

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

$ cat [PREFIX]aa ... [PREFIX]?? > archive.tar

разворачиваем возрожденный тарбалл командой tar и сравниваем его с прародителем (например, через Midnight Commander). С благоприятным (надеюсь) результатом. Времени это также потребует не очень мало - ведь именно это нам придется проделать в случае, если придется восстанавливать данные после краха (от чего - Господь борони). Так что считаем это отработкой действий в аварийной ситуации…

Вот и все. А дальше жизнь становится прекрасной и удивительной. С должной периодичностью (в гармонии между ленью и необходимостью) командой find вытаскиваем из нашего дерева каталогов все новые или измененные файлы, командой tar отправляем их в новый архив (можно, при наличии места, дублировать их и в исходный тарбалл), который и записываем на CD по достижении нужного объема. И так - до тех пор, пока изменения не превысят некоего критического размера. После чего - дешевле сделать очередной слепок рабочих файлов, чем разбираться с изменениями…

29.07.2008

Linux: шпаргалка по записи CD/DVD

Citkit, 30 января 2007 г

Беллетристическое вступление

На протяжении долгого времени для "оболванивания" CD, а потом и DVD я пользовался утилитами командной строки - mkisofs плюс cdrecord в Linux'е и burncd - во FreeBSD. Преимущество последней перед утилитами пакета cdrtools, также работающем во FreeBSD - в отсутствии необходимости эмуляции SCSI (через модуль CAM) и в возможности при архивации данных обойтись без создания iso-образа.

С переходом на KDE я проникся величием ее штатного писала - программы k3b (каковая, конечно, просто графический фронт-энда над связкой из mkisofs и cdrecord). И если массированную запись дисков (например, при тотальных backup'ах) все равно делал из командной строки, то для "сболванивания" единичных дисков стал все чаще применять именно k3b. А поскольку с появлением всякого рода внешних винчестеров необходимость в массированном "оболванивании" возникала все реже, я со временем начал забывать, как вообще обращаются с инструментами пакета cdrtools. А когда пришлось вспомнить - оказалось, что кое-что в нем изменилось.

Однако недавно вынужденно пришлось предаться ностальгии - после установки на ноутбук Xubuntu Feisty и срочной потребности записать из него пару дисков.

В штатном комплекте Xubuntu CD/DVD-писало предусмотрено - это программа XFburn, составляющая часть интегрированной среды XFce (напомню, что именно этот десктоп и определяет специфику дистрибутива Xubuntu).

Программа XFburn выглядит непритязательно (рис. 1) - вы не увидите здесь функций создания аудио-компактов, кодирования видео, форматирования DVD (для использования с файловой системой UDF, допускающей обращение с DVD-болванкой как очень большой дискетой). Да что там UDF - не было даже возможности записать банальный DVD в ISO-формате...

Однако минимально необходимый набор функций - очистки CD-RW, копирования компакта и записи уже готового образа, - были доступны через кнопки инструментальной панели или через меню Actions (рис. 2).

Можно было и собрать свой диск из произвольного набора файлов - опять же посредством кнопки или через меню File. Как и в любой аналогичной программе, для этого достаточно было перетащить нужные файлы и каталоги из файлового древа в поле проекта и нажать кнопку Burn Composition (рис. 3). В появляющемся окне можно было полюбоваться на свой привод (если он опознался правильно), выставить желаемую скорость записи (опции автоматического определения таковой, правда, не имеется) и ее режим, задать некоторые дополнительные опции (рис. 4). Среди коих - возможность ограничиться только созданием образа диска, без его записи.

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

"Какой, к чертям собачьим, SCSI-драйвер" - подумал я. Ведь компакты в Linux уже давно болванятся напрямую, через ATA-интерфес, без всякой эмуляции SCSI-шины. И полез в настройки программы (через меню Edit -> Preferences).

Однако и это ничего не дало: ни на первой (рис. 5), ни на второй (рис. 6) странице настроечной панели я не нашел никакого подходящего переключателя. Оставалось только в очередной раз произнести сакраментальную фразу сибирских мужиков, впервые увидевших японскую мотопилу, вспомнить, что в любой ситуации у POSIX'ивиста один выход всегда остается.

В данном случае им был интерфейс командной строки для прямого создания диска через утилиты пакета cdrtools. Быстро сварганив iso-образ из нужных мне данных командой mkisofs, я набрал команду cdrecord для его записи - и тут-то и оказалось, что я напрочь забыл, что там следует вбивать далее. Точнее, кое-что я помнил. Например, что нужно указать опцию -v (от verbose), дабы наблюдать за ходом процесса, путь к файлу образа и его имя, а также имя файла устройства для записи в странной системе именования SCSI-устройств. Однако смутно припоминаемое устройство dev=ATAPI:0,0,0 работать отказалось, сославшись на отсутствие все того же режима эмуляции SCSI.

Это становилось интересным - возможно, я неправильно указал номер устройства? Для установления оного, как известно, служит опция --scanbus команды cdrecord. Разумеется, в форме

$ sudo cdrecord --scanbus

я не получил ничего, кроме сообщения об ошибке:

cdrecord: No such file or directory.
Cannot open SCSI driver!
For possible targets try 'wodim -scanbus'.
For possible transport specifiers try 'wodim dev=help'.
For IDE/ATAPI devices configuration, see the file README.ATAPI.setup
from the wodim documentation.

Но такое же сообщение последовало и на команду

sudo cdrecord -scanbus dev=ATAPI

Точнее, сообщение было другое -

cdrecord: No write mode specified.

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

$ cdrecord dev=help

Из ее вывода я узнал, что, помимо транспорта SCSI (sg) и ATAPI, существует также транспорт ATA, target которого записывается также, как и для "урожденного" SCSI: bus,target,lun, то есть без указания имени транспорта, как для ATAPI. Опробовав его командой

$ sudo cdrecord --scanbus dev=ATA

я получил имя для своего устройства.

scsibus1:
1,0,0 100) 'HL-DT-ST' 'DVD-RW GWA-4082N' 'CW02' Removable CD-ROM
1,1,0 101) *
1,2,0 102) *
1,3,0 103) *
1,4,0 104) *
1,5,0 105) *
1,6,0 106) *
1,7,0 107) *

После чего с помощью команды

$ sudo cdrecord -v dev=1,0,0 path2/imagename.iso

диск был наконец благополучно записан.

Интересно, что после выполнения этой процедуры и Xfburn начал записывать диски - видимо, он подхватил настройки от cdrtools.

В общем, можно видеть, что правила обращения с утилитой cdrecord время от времени меняются - собственно, об этом открытым текстом сказано в документации к cdrtools. И потому я сочинил очередную шпаргалку по записи компактов - для себя и для тех, кто начинает забывать, сколько склерозов они должны были купить в кондитерском отделе. И на случай, если использование графических фронт-эндов типа k3b почему-либо невозможно или нежелательно. Следует помнить только одно: шпаргалка эта действенна на текущий момент, в будущем, возможно, в пакете cdrtools опять чего-нибудь поменяется. Итак,

Собственно, шпаргалка

1. Создание образа диска - даже здесь кое-что изменилось:

$ mkisofs -R -J -o imagename.iso path2data

Здесь опция -R обеспечивает поддержку расширения Rock Ridge, позволяющего воспроизводить в файловой системе ISO9660 длинные имена файлов, множественные точки в них, а также сохранить на записанном CD атрибуты принадлежности и доступа, свойственные файловым системам Unix-типа, в первозданном виде. То есть вывод команды

ls -l mountpoint/
для содержимого такого диска будет иметь примерно следующий вид:
drwxr-xr-x  3 alv alv 2048 2007-01-09 22:05 boot_init
drwxr-xr-x 2 alv alv 2048 2007-01-09 22:02 crux

Вместо опции -R можно использовать опцию -r. Она также включает поддержку расширения Rock Ridge, но обнуляет атрибуты принадлежности юзеру и группе, а также устанавливает бит чтения для всех - пользователя, группы и прочих. В результате вывод команды

ls -l mountpoint/

примет следующий вид:

dr-xr-xr-x  3 root root 2048 2007-01-09 22:05 boot_init
dr-xr-xr-x 2 root root 2048 2007-01-09 22:02 crux

Из этого можно видеть, что в полях пользователя и группы фигурируют имена не хозяев оригинальных файлов, а того пользователя, который смонтировал CD или его образ (если в файле /etc/fstab не прописано иное, и то, и другое может сделать только суперпользователь).

Кстати, смонтировать образ диска для проверки его содержимого можно командой

$ sudo mount -o loop path2/imagename.iso mountpoint

Опция -J обеспечивает поддержку так называемого расширения Joliet, позволяющего видеть в Windows длинные имена файлов - чистый стандарт ISO9660 предусматривает только имена файлов в DOS-формате 8.3. Если среди них, к тому же, имеются и имена в национальных кодировках, то следует использовать опцию -joliet-long, она позволяет сохранять имен длиной до 103 символов в Unicode. Монтировать образы, созданные с этой опцией (как и записанные с них диски), следует с опцией uft8:

$ sudo mount -o loop -o uft8 path2/imagename.iso mountpoint

Насколько мне помнится, опций -r и -joliet-long команда mkisofs ранее не имела. Или я просто не обращал на них внимания? Первая представляется очень удобной, если требуется тиражирование собственных данных. Полезность второй оценят, наверное, те, кто дает файлам кириллические имена (автор этих строк к их числу не принадлежит).

2. Определение имени записывающего устройства:

$ sudo cdrecord --scanbus dev=ATA

что должно дать на выводе нечто вроде этого:

scsibus1:
1,0,0 100) 'HL-DT-ST' 'DVD-RW GWA-4082N' 'CW02' Removable CD-ROM
1,1,0 101) *

и так далее.

3. Собственно запись:

$ sudo cdrecord -v dev=1,0,0 path2/imagename.iso

Здесь дополнительно возможны следующие опции:

  • speed=## - задает принудительно скорость записи; при ее отсутствии запись происходит на скорости, максимально возможной для данного привода и болванки, и потому ее имеет смысл задавать только с целью понижения, если запись на высоких скоростях почему-либо не проходит;
  • -eject - выдвижение лотка (или выталкивание болванки из приводов щелевого типа) по окончании записи.

4. Очистка перезаписываемых дисков:

$ sudo cdrecord -v blank=fast dev=0,0,0

для "быстрой" очистки (удаляется только оглавление диска),

$ sudo cdrecord -v blank=all dev=0,0,0

выполняет полную его очистку,

$ sudo cdrecord -v blank=session dev=0,0,0

стирает только последнюю сессию (при мультисессионной записи),

$ sudo cdrecord -v blank=unclose dev=0,0,0

"отрывает" закрытую сессию, позволяя производить дозапись на "закрытый" ранее диск. Кстати, таких возможностей (стирания сессии и "открытия диска") я в прежние времена тоже не припоминаю.

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

На записи DVD я здесь останавливаться не буду: в промышленных масштабах я этим еще не занимался, а единичные диски проще писать через фронт-энды.

Linux: программные RAID-массивы

Зачем нужен программный RAID на пользовательской машине? Резонный человек ответит - потому что нет RAID'а аппаратного. И даже если он есть - не факт, что, например, Linux с произвольным ядром будет исправно работать со столь же произвольным контроллером ATA RAID - мой опыт общения с ними показал, что поддержка их даже современными ядрами, мягко говоря, далека от идеала (в отличие от FreeBSD, где все попадавшиеся мне дивайсы этого рода опознавались системой 5-й ветки безошибочно). Так что если есть уж очень большое желание использовать RAID, возможно, что программная его реализация (т.н. Soft RAID) окажется единственно возможной.

Кое-что о RAID вообще

Вне зависимости от того, реализован он аппаратно или программно, RAID-массив предназначен для представления нескольких физических дисков (или, при программном подходе, также и их разделов) в виде единого устройства. Различают RAID массивы с избыточностью и без оной. К первым относятся RAID level 0 и программный линейный режим. Цель таких массивов - повышение быстродействия дисковых операций или просто соображения удобства.

Массивы с избыточностью призваны в первую очередь повышать надежность хранения данных. А если при этом еще и возрастает быстродейтствие дисковых операций - это можно рассматривать как бесплатный бонус.

На практике в Linux (да и FreeBSD) используются два уровня избыточных RAID'ов - 1-й и 5-й (в The Software-RAID HOWTO описана и конфигурация программного level 4, но это не более чем догадка автора, по его собственному признанию).

RAID level 1 (называемый также режимом зеркалирования, mirroring) - это простое зеркало из двух дисков, то есть массив этот обладает 100-процентной избыточностью: при выходе из строя одного диска вся информация сохраняется на диске-дублере (хотя в процессе работы они выступают как равноправные). Разумеется, ни о каком росте производительности тут речи идти не может. Однако на сей предмет level 1 можно комбинировать с level 0 (это называют level 0+1 или, иногда, level 10), когда одна пара дисков в параллельном режиме зеркалируются второй парой. Правда, как нетрудно подсчитать, для этого желательно иметь 4 отдельных IDE-контроллера.

В RAID level 5 данные распределяются по всем составляющим массив дискам и дополняются контрольными суммами. По последним и осуществляется восстановление их в случае отказа одного устройства. Мнимальное количество дисков в таком массиве - три, и общий его объем равен произведению объема наименьшего на их число минус единица, так как для хранения контрольных используется часть пространства от каждого диска, в сумме равное объему единичного устройства. Массивы 5-го уровня считаются весьма надежными и теоретически даже обещают прирост быстродействия.

Пара слов об аппаратном ATA RAID

До недавнего времени аппаратные контроллеры ATA RAID, реализованные на отдельных PCI платах или "размазанные по маме", основывались на чипах производства трех фирм: Promise, HighPoint и Silicon Image. Теоретически все три поддерживаются каноническим ядром Linux. Для чего при его конфигурировании (в меню ATA/IDE/MFM/RLL support) следует включить общую поддержку ATA RAID (Support for IDE Raid controllers) и поддержку соответствующего чипа.

Поддержка ATA RAID может быть модульной или, если предполагается загрузка с аппаратного массива, встроенной в ядро. Последний случай потребует и еще одной опции - загрузки с устройств на внешнем контроллере (Boot off-board chipsets first support). А также некоторых ухищрений, если в качестве системного загрузчика выступает GRUB.

Однако на практике все оказывается не так здорово, и работу с ATA RAID нельзя отнести к сильным сторонам Linux. Из трех прошедших через мои руки материнских плат с встроенными RAID-контроллерами на двух RAID-контроллеры не виделись системой ни под каким соусом. Вернее, при соответствующей настройке ядра сами контроллеры-то опознавались, но вот подключенных к ним винчестеров как бы и не было. Более того, обнаружился парадоксальный факт: в качестве RAID-массива подчас представал обычный Master на первом канале обычного IDE-контроллера.

В некоторых случаях могут помочь драйверы от производителя чипа. Однако тут следует помнить: драйверы эти (в сущности, подключаемые модули ядра) доступны исключительно в бинарном виде и скомпилированы не только под определенную версию ядра, но и под конкретный дистрибутив (мне обычно попадались под Red Hat и Suse) конкретной (как правило, не самой юной) версии. Так что гарантировать их работосопособность в произвольной Linux-системе я бы не стал.

До сих пор такое положение можно было бы если не оправдать, то хотя бы объяснить тем, что ATA RAID воспринимался как устройство не то чтобы экзотическое, но, если угодно, опциональное (хотя, по моим наблюдениям, минимум треть материнок последних двух лет издания комплектовались RAID-контроллерами той или иной фирмы). Ныне такой отмазки нет: с появлением чипсетов i875/865 и их южных мостов в варианте ICH5R аппаратные RAID-контроллеры становятся стандартной фичей современных машин. Будем надеяться, что это поспособствует исправлению ситуации с поддержкой таких устройств ядром Linux. Тем более, что пример FreeBSD, в 5-й ветке которой никаких проблем с ними не обнаруживается - что называется, перед глазами.

Нужен ли RAID народу?

Остается все-таки определиться, для чего вообще RAID на десктопе. Тот же резонный человек скажет, что либо а) для повышения производительности (RAID level 0), либо б) для увеличения надежности (RAID level 1), либо в) для счастливого сочетания того и другого (RAID level 5, прочие уровни для десктопа действительно практического значения не имеют).

На все эти ответы можно привести не менее резонные возражения, как-то:

  • производительность дисковой подсистемы настольной машины (господа админы, не бейте меня ногами, - не о серверах речь!) ни во FreeBSD, ни, особенно, в Linux обычно не критична;
  • RAID 1-го уровня для большинства пользователей экономически не оправдан;
  • RAID 5-го уровня гарантирует от потери данных только при условии, что вышедший из строя диск можно заменить таким же, лежащим в ящике стола (а любой пользователь нашел бы ему более интересное применение);
  • любой RAID с избыточностью (то есть от 1-го уровня и выше) ни в малейшей степени не страхует от ошибок пользователя - причины, по которой данных было потеряно больше, чем из-за всех аппаратных сбоев, вместе взятых; и, замечу в скобках, ни в коей мере не отменяет резервного копирования.

Таким образом, чуть ли не единственная причина использовать RAID - просто соображения удобства: разделы на двух (или более) физических дисках сливаются воедино и на них создается единая файловая система, например, под каталог /home со всеми пользовательскими данными (конечно, теоретически RAID можно создать из разделов на одном диске, однако это не более осмысленно, чем чесать правое ухо мизинцем левой ноги).

Конечно, есть и другой способ конкатенации разделов на разных носителях - технология LVM (Linux Volume Manager), подробно описанная ранее. Которая, помимо этого, предоставляет такие полезные возможности, как изменение размера файловой системы, подключение к ней "на лету" дополнительных разделов и т.д. Только нужно ли это на десктопе? Мое мнение (а я использовал LVM в течении длительного времени именно на своей БНМ (боевой настольной машине) - нет, не очень. За год у меня ни разу не появилось потребности в перераспределении дискового пространства. А если вдруг образовывались новые диски - то необходимости аккумулировать их в существующие файловые системы также не возникало. Тем более, что нынче мне и диски-то пихать уже некуда...

Так что если программный RAID - более простой способ конкатенации дискового пространства, чем LVM, почему бы им не воспользоваться. Вот я и решил изучить этот вопрос при очередном переконфигурировании машины на примере Linux. Благо, перед этим появился опыт создания программного RAID'а под FreeBSD (где LVM не поддерживается).

Договоримся сразу - наш программный RAID будет использоваться только под файловую систему, монтируемую в каталог /home - ни о корневой файловой системе, ни о загрузке с RAID'а речи не идет. А потому имеет смысл рассматривать только две RAID-разновидности - т.н. линейный режим и RAID level 0. При обоих дисковые разделы просто как бы механически соединяются воедино и выглядт для операционки (и ее пользователя) как одна партиция. Разница - в том, что при линейном режиме данные физически пишутся на сначала на один диск, потом - на второй. То есть, кроме собственно удобства в обращении с двумя дисками, он ничего не обеспечивает.

В массиве нулевого уровня (именуемый также режимом striple, что в данном случае можно трактовать как параллельный), напротив, каждая порция записываемых данных расслаивается на две равные части, одна из которых в одну и ту же единицу времени записывается на первый диск раздела, другая - на второй. Что теоретически должно способствовать быстродействию дисковых операций. И - способствует практически, но только при условии, что диски массива разнесены на разные IDE-каналы (о SCSI-дисках у нас тоже речи не будет). В противном случае выигрыша в производительности не только не будет, но весьма вероятно даже ее падение (в случае с LVM, где общение с дисками идет по сходному механизму, оно оказалось просто катастрофическим, сужу по собственному опыту).

Кроме того, RAID нулевого уровня не способствует надежности хранения данных - при отказе хотя бы одного диска пропадут они все (тогда как в линейном режиме информация на исправном диске в первом приближении сохранится). Тем не менее, применение праллельного режима может быть оправданным: сколько бы я ни говорил о некритичности дискового быцстродействия в настольных условиях, все же приятно, когда пара-тройка гигабайт копируется пусть не вдвое, но хотя бы в полтора раза быстрее (правда, за точность количественной оценки не ручаюсь).

Подготовительный этап

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

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

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

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

Да, если разбиение диска осуществляется посредством cfdisk, в списке доступных идентификаторов RAID Auto detection там не обнаружится. Что отнюдь не значит, что его нельзя присвоить с помощью этой программой: следует просто после выбора пункта смены типа раздела нагло ввести fd - и все будет в порядке.

Теперь - ядро системы: для использования программного RAID'а в его конфигурации должны быть включены соответствующие опции в пункте Multi-device support (RAID and LVM) главного меню, генерируемого по команде

$ make menuconfig

А именно:

  • общая поддержка "многочленных" устройств (Multiple devices driver support (RAID and LVM));
  • общая поддержка RAID;
  • поддержка предполагаемого режима - линейного (Linear (append) mode) или параллельного (RAID-0 (striping) mode).

Общая поддержка "многочленных" устройств может быть только встроена в ядро, прочие же опции либо встраиваются, либо подключаются в качестве модулей (последнее имеет место быть по умолчанию в большинстве известных пакетных дистрибутивов типа Red Hat сотоварищи). В рассматриваемом нами случае это безразлично. Встраивание поддержки RAID в ядро обязательно только в том случае, если на массиве располагается корневая файловая система и (или) он выступает в качестве загрузочного устройства - ни того, ни другого мы договорились не делать. Да и то, при должном конфигурировании виртуального загрузочного диска (initrd) даже в этих случаях можно обойтись модулями. Тем не менее, я всегда встраиваю поддержку нужным мне устройств - пусть ядро становится больше, зато меньше возни с настройкой подключения модулей (да и интегрально так, мне кажется, выходит быстрее - а кого нынче волнует размер ядра?).

Из опций конфигурации ядра, прямо не связанных с RAID'ами, полезно иметь включенной также поддержку файловой системы процессов (procfs) - это позволит в дальнейшем иметь информацию о текущем состоянии массива. Делается это в пункте File systems главного меню (/proc file system support). Разумеется, эта файловая система должна быть прописана в файле /etc/fstab соответствующей строкой:

proc /proc proc defaults 0 0

для автоматического монтирования при старте системы. Впрочем, поддержка procfs не вредна в любом случае...

В процессе созидания

Теперь можно приступать к созданию RAID-массива. Для чего потребуется соответствующий программный инструментарий. И тут возникает та самая альтернатива, о которой я упоминал ранее: существует два набора подходящих для этого инструментов - традиционный raidtools и более новый mdadm. По крайней мере, один из них в любом полнофункциональном дистрибутиве найдется (и что-то подсказывает мне, то этот один окажется raidtools'ом).

Тем не менее, именно о raidtools я говорить бы здесь не хотел. Во-первых, он многократно описан. Существует фундаментальный The Software-RAID HOWTO, написанный Якобом Остергардом (Jakob Ostergaard) и переведенный на русский язык Максимом Дзюманенко. Немало внимания RAID-массивам уделил в своей серии публикаций на сайте IBM-Linux Дэниэл Роббинс, создатель Gentoo Linux (часть 1, часть 2). И все эти документы посвящены исключительно использованию инструментария raidtools (каковой, кстати, имеет своим местопребыванием http://people.redhat.com/mingo/raidtools).

А вот о mdadm сведения можно почерпнуть только из его штатной документации. Русскоязычных его описаний мне не встречалось. Главное же, mdadm много превосходит raidtools с точки зрения удобства употребления (в очередной раз вынужден подчеркнуть - я рассуждаю с позиций пользователя, а не админа крутого сервера).

Итак, mdadm. Далеко не факт, что он имеет место быть в вашем дистрибутиве. Не беда - его всегда можно скачать - либо с авторского сайта, либо с канонической Linux-локации в виде тарбалла исходников (для текущей версии - mdadm-1.3.0.tgz). Обращение с которым, после обычной (tar xzvf mdadm-1.X.X.tgz) распаковки, столь же своеобычно - последовательность команд make и make install (обратим внимание - программа столь проста, что в предварительном конфигурировании посредством ./configure не нуждается).

По завершении установки мы обнаруживаем единственный исполняемый бинарник /sbin/mdadm (изменить каталог для него можно, залезши руками в ~/mdadm_src_dir/Makefile, но - нужно ли? в каталоге /sbin программе такого рода самое место) и пару относящихся к нему man-страниц (/usr/share/man/man5/mdadm.conf.5 и /usr/share/man/man8/mdadm.8). Содержащих вполне достаточно информации для того, чтобы приступить к делу создания собственного RAID'а. Приступим к этому и мы.

Нетрудно догадаться, что раз из всего пакета в итоге образовался только один бинарник, именно его и следует запустить для создания массива. Как - узнаем из man -8 mdadm (кое-какие сведения можно почерпнуть и из mdadm --help). И тот, и другой источник показывают, что для образования RAID'а команда mdadm требует одной из двух опций: -C (эквивалент --create) или -B (сиречь --build) - в обоих случаях обратите внимание на регистр краткой формы. В чем разница между ними?

Опция -B создает массив без собственного суперблока. Что, как будет ясно из дальнейшего, для пользователя снимает ряд преимуществ инструмента mdadm - и потому к этой опции мы возвращаться не будем. А вот опция -C этот суперблок учреждает - и ею определяется вся сила программы mdadm.

Итак, опция -C. Элементарная логика подсказывает, что она, будучи основной, требует аргумента - имени файла устройства, соответствующего создаваемому массиву (например, /dev/md0 или, при задействованной файловой системе устройств, /dev/md/0), а также указания некоторых дополнительных данных, как то: его уровня (режима), количества устройств в нем и, наконец, имен файлов устройств, массив составляющих. Что и достигается указанием опций --level=# (или, сокращенно, -l #) и --raid-devices=## (в краткой форме -n ##), после которой перечисляются имена файлов, вроде /dev/hda3, /dev/hdb3). В итоге простейший случай создания RAID'а параллельного режима выглядит следующим образом:

$ mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/hd[a,b]3

Для массива нулевого уровня допустимые значения опции --level также raid0 или stripe. А для массива линейного режима она примет значение linear (то есть -l linear).

Для параллельного режима дополнительно можно задать еще один параметр - размер блока "распараллеливаемых" данных, т.н. chunk, в виде одноименной опции --chunk=значение_в_килобайтах (в краткой форме -c ##). Теоретически рассуждая, чем больше величина chunk'а (давайте не будем подбирать к нему русского эквивалента), тем выше должно быть быстродействие массива. Однако практические измерения этого не подтверждают. И потому вполне можно опустить данную опцию - при этом умолчальное значение составит 64 Кбайт. Впрочем, если кто путем количественного тестирования опровергнет мое утверждение - буду признателен за информацию. Очевидно, что для массива в линейном режиме опция -c физического смысла не имеет.

В любом случае после указанной выше команды RAID создан, в чем легко убедиться командой

$ less /proc/mdstat

Более того, он сразу же готов к использованию - командой типа mkefs (или, в зависимости от предпочтений, mkreiserfs, mkxfs и т.д.) на нем можно создать ту или иную файловую систему. Хотя, с другой стороны, никто не запрещает поделить его программой fdisk на разделы (по моим наблюдениям, cfdisk на это не способен). Однако повторяю, если мы создавали RAID под единственную файловую систему типа /home, в каких либо действиях по организации раздела необходимости нет.

Создав файловую систему на новообразованном массиве, ее нужно смонтировать в желаемый каталог, увековечив это в файле /etc/fstab строкой типа

/dev/md/0 /home reiserfs noatime,notail 0 0

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

Внимательный читатель, особенно знакомый с документацией по raidtools, спросит: пардон, а где же тут конфиг, описывающий RAID-массив. Отвечаю: при использовании mdadm, установке соответствующих идентификаторов на составляющих массив разделах (вспомним добрым словом RAID Auto detection), и, наконец, создании массива с собственным суперблоком необходимости ни в каком конфиге не возникает. Так, файл данной статьи пишется в данный момент в каталог /home/alv, распооженный на RAID'е нулевого уровня, не описанном ни в каком файле каталога /etc.

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

$ mdadm --detail --scan

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

Дополнительные замечания

Из того, что я продолжаю свое сочинение, вы можете убедиться, что перезагрузка прошла успешно. Так что самое время вспомнить о других опциях команды mdadm. С одной из них мы познакомились раньше - это --help для получения подсказки. Каковую, кстати, можно конкретизировать, указав эту опцию совместно с какой либо из других основных опций. Например, команда

$ mdadm --create --help

распишет нам процесс создания массива в деталях.

С другой опцией (--detail, или -D - все опции, отнесенные к числу основных, в сокращенной форме даются в верхнем регистре) мы столкнулись в предыдущем разделе: она призвана выводить информацию о существующих массивах. Близкий смысл имеют и опции --query и --examine (в сокращенной форме, соответственно, -Q и -E) - за деталями можно обратиться к man-странице.

А вот опции --assemble (-A) и --monitor, или --follow (-F) предназначены для управления существующим массивом. В частности, они позволяют добавить к нему новое устройство или удалить существующее. Правда, при выполнении некоторых условий. Впрочем, и об этом подробно расскажет тетя Маня, если попросить ее должным образом.

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

Альтернатива

Справедливости ради следует сказать пару слов и об инструментарии raidtools и способах обращения с ним. В отличие от maadm, он требует обязательного наличия конфигурационного файла - /etc/raidtab. Причем создать его нужно (вручную, в текстовом редакторе) до запуска каких-либо команд по созданию RAID'а.

Впрочем, структура /etc/raidtab очень проста. Стоит только помнить, что каждый из перечисленных ниже пунктов выступает в отдельной строке, значения в которой отделяются пробелами или табулятором - все же база данных (хотя и простая), а не хвост собачий... Итак:

  • сначала указывается имя файла RAID-устройства - raiddev /dev/md0, например;
  • затем - уровень массива или его режим - raid-level 0 для параллельного режима или raid-level linear для линейного;
  • далее - количество устройств в массиве - nr-raid-disks 2,
  • потом - размер chunk'а в килобайтах, например, chunk-size 32; очевидно, что для линейного режима эта величина бессысленна, поэтому здесь можно поставить любое значение;
  • вслед за этим можно (а скорее, нужно) указать также, что массив должен нести собственный суперблок - persistent-superblock 1.

Наконец, последовательно перечисляются имена всех объединяемых устройствс их порядковыми номерами, начиная с нуля:

device /dev/hda3 raid-disk 0 device /dev/hdb3 raid-disk 1

Закончив редактирование /etc/raidtab (рискну повториться, это - простой текстовый файл, создаваемый в текстовом же редакторе), активизируем RAID командой mkraid /dev/md0 и просмотром файла proc/mdstat убеждаемся, что все произошло так, как и задумывалось.

Сложнее, конечно, чем использование mdadm, но не намного, не так ли? Тем более, что весь процесс создания RAID именно применительно к инструментарию raidtools в деталях расписан в соответствующем HOWTO и ряде специальных статей.

Комментарии Владимира Холманова

О взаимодействии программного RAID и LVM

По моим наблюдениям, взаимодействие возможно только между soft-RAID 1 и LVM (другие уровни недоступны, но это не более чем "практическое" наблюдение). Собственно для этого и требуется опция -B команды mdadm. Иначе, в начале создается raid - зеркало "старого стиля", то есть без дескриптора (а не суперблока, как в статье) - дескриптор потребуется для LVM. Суперблок присутствует независимо от стиля и хранится где-то в последних 4 Kb раздела, а место дескриптора - среди первых 512 b. В качестве основы берутся два раздела, только не типа 83 (как для "классического старого стиля"), а дисковые разделы типа 8e. Разумеется, конфигурационный файл в каталоге /etc становится обязательным (впрочем, я предпочитаю пользоваться raidtools, но это не должно оказывать влияния). После таких манипуляций md становится возможным передать под управление логики.

О надежности raid

У меня "застучал" один из дисков raid зеркала. Заметил это не сразу. Результат - некоторые бады переползли на исправный диск. Но использовать raid можно и под надежный backup. Если где-то в "хвосте" дисков создать отдельный райд, "демонтированный и дезактивированный" в процессе работы и монтируемый только для backup - это будет весьма надежно.

Mdadm vs raidtools

Пакет mdadm содержит один большой универсальный бинарник, что удобно для интерактивной работы с RAID. Пакет raidtools содержит несколько специализированных небольших бинарников, а размер файла - важный параметр при использовании загрузочного initrd (в случае, если поддержка soft RAID подключается как модуль - А.Ф.).

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

Linux: технология LVM

2003 г

Содержание

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

Преамбула

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

Можно создать на диске физический раздел, на нем - новую файловую систему и смонтировать ее к файловой системе корневой в заранее созданный каталог, например, $HOME/newhome. Это проще всего, но не всегда - лучше всего. Ведь в итоге единый пользовательский каталог будет состоять из двух физически различных файловых систем, что накладывает некоторые ограничения на манипулирование данными (например, невозможно создать жесткие ссылки на наборы данных другой файловой системы).

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

Второй пример, не менее жизненный. Послушавшись совета резонных людей, мы делим диск на разделы (без разницы, физические или логические) для всех возможных файловых систем - под каталоги /usr, /usr/local, /opt, /var, /tmp, /home. И очень быстро убеждаемся, что под /usr/local отвели слишком много места - весь новый софт по умолчанию желает собираться в каталоге /opt (с объемом которого мы явно пожадничали - никто не ожидал, что темпы стандартизации файловой системы будут столь стремительны). А каталог /usr, вследствие изобилия Иксовых приложений, напротив, заполняется через чур уж стремительно, что отнюдь не есть хорошо: производительность дисковых операций в любом Unix'е стремительно падает по достижении определенного предела заполненности файловой системы. Ну а каталог /tmp просто бездействует - роль хранителя временных файлов, как оказалось, с успехом исполняет файловая система в оперативной памяти - tmpfs. И что, спрашивается, делать? Вариант тотальной архивации и переразбиения дисков - просьба не предлагать.

Обеих ситуаций можно избежать, если озаботиться этим на стадии разбиения диска. И - прибегнуть к технологии LVM (Logical Volume Manager), то есть управления логическими томами.

Теоретическое введение

Вводное замечание, касаемое терминологии. Пользователи DOS/Windows знают, что логическими томами (logical volumes) называются те части, на которые бьется расширенный (extended) раздел DOS. Однако в случае LVM в понятие логического тома вкладывается, как станет ясно очень скоро, совершенно иной смысл. И потому впредь (здесь и во всех грядущих статьях) части расширенного DOS-раздела будут именоваться незамысловато - логическими разделами (впрочем, примерно такая терминология принята в Linux-программах разбиения диска), а звание логического тома сохранится только за элементом структуры LVM.

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

Теперь можно перейти к сути дела. Основа технологии LVM - в выделении двух уровней организации дискового пространства, физического и логического. Единица физической организации - физический том (Physical Volume). Это - не что иное, как самый обычный дисковый раздел с определенным идентификатором типа файловой системы - 8e (тем самым шестнадцатеричным номером, который присваивается разделу при его создании, например, программой fdisk). Физический том делится на физические же блоки (physical extents) - кванты дискового пространства, на которые может изменяться размер логических ресурсов (своего рода отдаленный аналог обычного физического блока винчестера).

Единицей организации логической в LVM выступает группа томов (Volume Group). Она сливает воедино физические тома так, что для ОС они выглядят как единый носитель, и, следовательно, может представляться как нечто вроде логического аналога винчестера. Как и винчестер, группа томов может делиться на разделы (или, напротив, представлять собой единый раздел). Один такой раздел и есть логический том, на котором создаются обычные файловые системы и к которому непосредственно обращается пользователь, например, при монтировании. Он образован последовательностью логических блоков (logical extents), которые можно сопоставить с блоками обычного раздела, размечаемыми при создании файловой системы. А уж эти логические extent'ы (во избежание путаницы оставляю этот термин без перевода) по определенным правилам связываются с extent'ами физическими.

В LVM-HOWTO взаимосвязь элементов LVM иллюстрируется следующим образом:

    hda1   hdc1      (PV:s on partitions or whole disks)
/
/
diskvg (VG)
/ |
/ |
usrlv rootlv varlv (LV:s)
| | |
ext2 reiserfs xfs (filesystems)

Взаимосвязь физических и логических extent'ов обозначается термином mapping. Причем возможны два варианта такой взаимосвязи - линейный (linear mapping) и "чередующийся" (striped mapping). В первом случае непрерывной последовательности физических extent'ов просто ставится в соответствие столь же непрерывная последовательность extent'ов логических. Во втором же - непрерывная последовательность логических extent'ов соотнесена с физическими extent'ами, чередующимися между физическими носителями:

   .+-- Volume Group --------------------------------+
| |
| +----------------------------------------+ |
| PV | PE | PE | PE | PE | PE | PE | PE | PE | |
| +----------------------------------------+ |
| . . . . |
| . . . . |
| +----------------------------------------+ |
| LV | LE | LE | LE | LE | LE | LE | LE | LE | |
| +----------------------------------------+ |
| . . . . |
| . . . . |
| +----------------------------------------+ |
| PV | PE | PE | PE | PE | PE | PE | PE | PE | |
| +----------------------------------------+ |
| |
+------------------------------------------------+

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

Подготовка к практике

Для начала технология LVM требует поддержки ядром системы. Это достигается его перекомпиляцией с включением двух опций. При использовании make menuconfig в секции Multi-device support (RAID and LVM) нужно включить, во-первых, поддержку Multiple devices, во-вторых - собственно менеджера логических томов (Logical volume manager (LVM) support). А в make config следует положительно ответить на соответствующие вопросы, после чего соответствующий раздел файла /usr/src/linux-*/.config должен приобрести следующий вид:

#
# Multi-device support (RAID and LVM)
#
CONFIG_MD=y
# CONFIG_BLK_DEV_MD is not set
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
# CONFIG_MD_RAID1 is not set
# CONFIG_MD_RAID5 is not set
# CONFIG_MD_MULTIPATH is not set
CONFIG_BLK_DEV_LVM=y

Далее, потребуется софт для работы с LVM. Он входит в пакет lvm, который нынче включается в штатный комплект любого уважающего себя дистрибутива. В составе пакета - три группы утилит, предназначенных для работы с физическими томами (pv*), логическими группами (lg*) и логическими томами (lv*). Так, команда pvcreate создает физические тома, команда pvscan - сообщает об наличествующих, а команда pvdisplay выводит о них полную информацию. А тройки команд vgcreate, vgscan, vgdisplay и lvcreate, lvscan, lvdisplay проделывают то же для групп томов и логических томов, соответственно.

Как и положено уважающим себя Unix-программам, все компоненты пакета хорошо документированы, и с их опциями можно ознакомиться на стандартных man- и info-страницах. Вышеупомянутый LVM-HOWTO содержит много информации по практическому применению этих команд (в том числе и душераздирающую историю о глупом Джо, не использовавшем LVM, и умной Джейн, без нее жизни себе не мыслившей). Так что описывать команды в подробностях я не буду - необходимые опции будут приведены при описании практических упражнений.

Упражнение первое: случай одного диска

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

Условия задачи: машина с винчестером Seagate Barracuda ATA IV на 80 Мбайт (прочие компоненты несущественны). Требуется: разбить диск так, чтобы максимально разгрузить корневую файловую систему, вынеся за ее пределы все, что можно (и нужно). И при этом не сожалеть потом о бесцельно растраченном дисковом пространстве.

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

Для начала определяемся, что же следует оторвать от корней. В первую очередь, разумеется, /boot - его, как и swap-раздел, помещаем на отдельные (причем первичные) разделы. Далее, разумеется, /home, /usr, /opt - эти обязательно. При желании - /var и /tmp. Может быть - /usr/local, если планируется ставить много внедистрибутивного софта. После чего убеждаемся, что под корневую файловую систему потребуется совсем немного места. И начинаем разбиение. Лучше всего для этой цели подойдет старый добрый fdisk - его собрат cfdisk почему-то не способен присвоить разделу требуемый идентификатор типа файловой системы.

Итак, /dev/hda1 на 20-50 Мбайт - под /boot (из расчета по 2 Мбайт на ядро, и с хорошим запасом). Под swap-раздел, /dev/hda2 - удвоенный объем ОЗУ, как советуют резонные люди. А вот под корень на /dev/hda3 потребуется всего-навсего сотня-другая мегабайт - и это тоже с избытком. У меня (дистрибутив Gentoo) на / занято около 30 Мбайт. В любом случае, объем этот можно рассчитать очень точно, исходя из особенностей конкретного дистрибутива. И накинуть сотенку для страховки - переполнение корневой файловой системы, как говорят, - вещь крайне неприятная.

Все же остальное пространство, конечно, можно объявить расширенной DOS-партицией и поделить на логические разделы в количестве, как нетрудно подсчитать, пяти-шести штук. Но мы пойдем иным путем. И, действительно создав extended-раздел остаточного объема (/dev/hda4), создаем в нем всего один логический раздел. И меняем его тип с Linux native на Linux LVM (шестнадцатеричный идентификатор типа файловой системы - 8e). Сохраняем изменения и покидаем fdisk. После чего посредством, например,

$ sfdisk -l /dev/hda

созерцаем картину вроде следующей:

Disk /dev/hda: 9729 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

Device Boot Start End #cyls #blocks Id System
/dev/hda1 * 0+ 5 6- 48163+ 83 Linux
/dev/hda2 6 129 124 996030 82 Linux swap
/dev/hda3 130 191 62 498015 83 Linux
/dev/hda4 192 9728 9537 76605952+ 5 Extended
/dev/hda5 192+ 9728 9537- 76605921 8e Linux LVM

Далее все требуемые действия могут быть расписаны по шагам. Первый из них - запуск команды

$ vgscan

которая отыщет все имеющиеся в наличии потенциальные физические тома, то есть разделы типа 8e (в нашем случае такой будет только один) и создаст необходимые файлы конфигурации - /etc/lvmtab и /etc/lvmtab.d, о чем любезно нас проинформирует:

vgscan -- reading all physical volumes (this may take a while...)
vgscan -- "/etc/lvmtab" and "/etc/lvmtab.d" successfully created

Второй шаг - собственно превращение дискового раздела Linux LVM в физический том командой

$ pvcreate /dev/hda5

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

$ pvscan
pvscan -- reading all physical volumes (this may take a while...)
pvscan -- inactive PV "/dev/ide/host0/bus0/target0/lun0/part5" is in no VG [73
pvscan -- total: 1 [73.06 GB] / in use: 0 [0] / in no VG: 1 [73.06 GB]

Третий шаг - создание из физических томов логической группы (Volume Group). Для этого потребуется команда vgcreate с именем группы в качестве первого аргумента и имени файла устройства раздела - как аргумента второго.

Имя группы - произвольно, в путях к файлам устройств физических томов при использовании devfs должна применяться полная нотация (как это вывела команда pvscan). По умолчанию тома нарезаются на физические блоки extent'ы размером 4 Мбайт. При желании иметь другой размер блока - это можно явно задать опцией -s ##m. Резонные люди рекомендует использовать extent'ы в 32 Мбайт. То есть требуемая команда будет иметь вид вроде

$ vgcreate -s 32m all /dev/ide/host0/bus0/target0/part5

В этом случае максимальный размер любого из будущих логических томов ограничивается фантастической (пока) величиной 2 терабайта. Если же остановиться на умолчальном extent'е, предел тома составил бы всего-навсего 256 Гбайт. Именно всего-навсего - согласитесь, ныне эта величина не кажется недостижимой.

Теперь можно выполнить команду pvscan, дабы убедиться в результате. Она, плюс к прежней информации, сообщит нам, что физические тома активированы и включены в группу имя рек (конкретно в примере - all):

$ pvscan
pvscan -- reading all physical volumes (this may take a while...)
pvscan -- ACTIVE PV "/dev/ide/host0/bus0/target0/lun0/part5" of VG "all" [73
pvscan -- total: 1 [73.06 GB] / in use: 1 [73.06 GB] / in no VG: 0 [0]

А полную информацию о вновь созданной группе мы получим командой vgdisplay, которая, в числе прочего, сообщит нам имя группы, режим доступа к ней и ряд других данных:

--- Volume group ---
VG Name all
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
...
MAX LV Size 2 TB
Max PV 256
Cur PV 1
Act PV 1
VG Size 73 GB
PE Size 32 MB
Total PE 2336
...
VG UUID TiYr9D-5Ub5-ordV-Zcv6-A7Eg-AIqD-1ALFe6

Четвертый шаг - собственно создание логического тома или томов, по желанию. Это - некий аналог нарезания на разделы физического жесткого диска. И осуществляется он командой lvcreate, для которой в качестве опций нужно указать размер тома и его имя (-L и -n, соответственно), а аргументом - имя ранее созданной группы. Размер тома можно указывать в гигабайтах или в любых других *байтах. И очевидно из названия, что под логический том можно отвести как весь объем группы, так и ее часть - в последнем случае у нас останется место и для других томов.

Собственно, именно последнее и было нашей целью. И потому - последовательность команд:

$ lvcreate -L 10G -n lvusr all &&
> lvcreate -L 2G -n lvar all &&
> lvcreate -L 2G -n lvopt all &&
> lvcreate -L 55G -n lvhome all &&
> lvcreate -L 2G -n lvtmp all

создаст нам тома под все намеченные к использованию файловые системы. Имена томов, разумеется, произвольны и даны просто в мнемонически удобном виде.

Замечу, что приведенной последовательностью команд создаются логические тома с линейным соответствием физических и логических extent'ов. Предписать использование схемы чередования (striped) можно было бы дополнительной опцией -i. А опция -I [значение] задаст размер чередующих блоков (в килобайтах). Однако в случае единственного диска (и единственного физического тома) это не имеет физического смысла.

Как и ранее, выполним некоторую проверку: командой lvscan отыскиваем все новообразованные логические тома, узнаем пути к файлам соответствующих им устройств, их размеры и убеждаемся в том, что тома (прекрасный каламбур, господа?) активированы

lvscan -- ACTIVE            "/dev/all/lvusr" [10 GB]
lvscan -- ACTIVE "/dev/all/lvar" [2 GB]
lvscan -- ACTIVE "/dev/all/lvopt" [2 GB]
lvscan -- ACTIVE "/dev/all/lvhome" [55 GB]
lvscan -- ACTIVE "/dev/all/lvtmp" [2 GB]
lvscan -- 5 logical volumes with 71 GB total in 1 volume group
lvscan -- 5 active logical volumes
.

А командой

$ lvdisplay /dev/all/lv*

получаем о каждом томе всю информацию, которую в силах предоставить нам система, например:

$ lvdisplay /dev/all/lvhome
--- Logical volume ---
LV Name /dev/all/lvhome
VG Name all
LV Write Access read/write
LV Status available
LV # 4
# open 1
LV Size 55 GB
Current LE 1760
Allocated LE 1760
Allocation next free
Read ahead sectors 1024
Block device 58:3

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

Завершающие действия (не шаги даже, а шажки) не несут ничего специфичного для логических томов: новообразованные файловые системы нужно смонтировать в соответствующие каталоги (которые, разумеется, должны существовать заранее), проверить ее работоспособность (какими-либо простыми операциями чтения-записи) и, при благоприятном исходе (сомневаться в оном у нас оснований нет) внести изменения в файл /etc/fstab на предмет их увековечивания. Который в итоге приобретет вид вроде следующего:

$ less /etc/fstab
#


# NOTE: If your BOOT partition is ReiserFS, add the notail option to opts.
/dev/discs/disc0/part1 /boot ext2 noauto,noatime 1 1
/dev/discs/disc0/part3 / ext3 noatime 0 0
/dev/discs/disc0/part2 none swap sw 0 0
/dev/all/lvusr /usr reiserfs noatime,notail 0 0
/dev/all/lvar /var reiserfs noatime,notail 0 0
/dev/all/lvopt /opt reiserfs noatime,notail 0 0
/dev/all/lvtmp /tmp ext2 noatime 0 0
/dev/all/lvhome /home reiserfs noatime,notail 0 0

Ну и, конечно, не худо перезагрузиться (или реинициализировать систему иным образом). Дабы лицезреть и пощупать все проделанное вживе...

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

Упражнение второе: диск хорошо, а два лучше

Концепция LVM построена в прямом противоречии с заветами товарища Ленина: для ее реализации, прежде чем размежеваться, необходимо решительно объединиться - в группу логических томов. Что особенно наглядно видно при ее приложению к системе с двумя (и более) дисками. Что, опять-таки, рассмотрим на конкретном примере.

Условия новой задачи: два одинаковых жестких диска по 40 Гбайт каждый. На первом - существующие разделы: корневой (/dev/hda3) - 12 Гбайт, загрузочный с GRUB (/dev/hda1, по умолчанию не монтируется при загрузке) - 50 Мбайт, раздел подкачки (/dev/hda2) - 1024 Мбайт, прочее пространство - /dev/hda4 под каталог /home. А второй физический диск - такой же, но свежевынутый из пластиковой коробки и свежевкрученный в корпус, ничего, по определению, на себе не несущий. Требуется: создать единое дисковое пространство из второго диска и раздела под домашний каталог первого на предмет монтирования как /home.

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

Далее, опять-таки, пошаговое описание. Первый шаг, как и ранее, - создание расширенных разделов на дисках (для первого диска, понятно, из прежнего /dev/hda4), внутри каждого - по логическому разделу на весь объем. Логическим разделам присваивается все тот же идентификатор файловой системы за шестнадцатеричным номером 8e. Наиболее прозрачно и контролируемо этот процесс осуществляется классически fdisk.

К слову сказать: наличие второго диска можно попутно использовать для повышения производительности своппинга. Для чего предварительно (то есть перед созданием логического раздела, в начальных цилиндрах диска) создаем первичный раздел с идентификатором 82, командой mkswap определяем его как раздел подкачки и добавляем строку в файл /etc/fstab, после чего соответствующая его часть приобретает вид

/dev/discs/disc0/part2  none    swap    sw,pri=1  0 0
/dev/discs/disc1/part1 none swap sw,pri=1 0 0

Второй шаг: двукратным повторением команды pvcreate на вышупомянутых логических разделах создаются физические тома (Physical Volume):

$ pvcreate /dev/hda5
$ pvcreate /dev/hdb5

Теперь - собственно объединение, предшествующее размежеванию:

$ vgcreate имя_группы /dev/discs/disc0/part5 /dev/discs/disc1/part5

опять же с использованием полной нотации по правилам devfs. И наконец - размежевание:

$ lvcreate -L 60G -n lvhome имя_группы

Легко видеть, что при этом никакого размежевания не происходит - образуется логический том под каталог /home. Но никто не в силах запретить нам и поделить группу томов на логические тома, например, для каждого пользователя системы.

Тут не лишне напомнить, что с помощью опций -i и -I можно попытаться повысить производительность дисковых операций: команда вроде

$ lvcreate -i 2 -I 8 -L 60G -n lvhome имя_группы

создаст схему соответствия stripped между физическими и логическими extent'ами, то есть иллюзию чередования записи на два физических диска блоками (chunks) по 8 Кбайт. Что, однако, сработает только при разнесении дисков с физическими томами на разные IDE-линии. Мне этого проверить не удалось. Но в случае нахождения дисков на одном IDE-канале результат неизменно скверный: скорость тяжелых дисковых операций падает в 4-8 раз (впрочем, для констатации этого и экспериментов не нужно - очевидно из общих соображений).

И вообще, для IDE-дисков следует всегда (по возможности) размещать физические тома не просто на разных носителях, но и на разных каналах встроенного контроллера, причем - в качестве master-устройств. Конечно, для типичной настольной, особенно домашней, машины этого добиться трудно - редко какой десктоп этого класса не несет на втором IDE-канале пару дивайсов типа CD ROM, CD-R/RW, DVD, Zip. И потому использование LVM практически неизбежно ведет к деградации производительности при мало-мальски тяжелых дисковых операциях.

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

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

Так что технология LVM являет собой достижение если и не вполне классической, с точки зрения старика Аристотеля, но все же - логики. И потому заслуживает рекомендации к всенародному применению.

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 станет таковым только после его монтирования в файловую систему. Однако к этому вопросу придется вернуться в следующей статье - после рассмотрения файловых систем вообще.