Logo Спонсор сайта — Хостинг Fornex.com Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Тарифы от 59 руб в месяц за 512MB RAM и 5Gb NVMe SSD!

Hi-CPU тарифы с повышенной частотой процессора 3.8 – 4.2 GHz, автоматическая установка Windows

Дата-центры на выбор, защита от DDoS-атак

Сверхбыстрый хостинг от 69 р./мес., VPS от 299 р./мес.

Бесплатно: администрирование + ISPmanager + DDoS защита + SSL + 7 дней тестовый период

Скидка 50% на первый месяц VPS и хостинга по промокоду CITFORUM

хостинг сайтов ГиперХост — хостинг сайтов который Вы искали.

Виртуальный хостинг, Аренда VPS серверов, рация доменных имен, SSL сертификаты

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

Назад Содержание Вперед

Введение в POSIX'ивизм

(C) Алексей Федорчук, 2005
Опубликовано на сайте LinuxCenter

Интермедия: инструменты дисковой разметки, форматирования и монтирования

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

Содержание

Разметка диска

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

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

  • низкоуровневую утилиту командной строки sfdisk - инструмент очень гибкий, но сложный в обращении и требующий очень большой аккуратности - все изменения дисковой разметки совершаются там в реальном времени;
  • интерактивную диалоговую программу fdisk - почти столь же гибкую, как и sfdisk, но более простую и, главное, более безопасную в обращении - изменения дисковой разметки происходят тут только после соответствующего подтверждения пользователем правильности своих действий;
  • интерактивную меню-ориентированную программу cfdisk, которая считается еще более простой в использовании, чем fdisk (для которого она служит оболочкой, т.н. front-end) и столь же безопасна с точки зрения сохранности данных;
  • универсальную (в теории) утилиту parted, которая может использоваться как в режиме командной строки, так и в интерактивном; она позволяет создавать не только дисковые разделы, но и файловые системы на них;
  • графические фронт-энды последней - qparted и gparted.

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

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

$ fdisk /dev/hd?

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

$ fdisk /dev/discs/disc0/disc

или к указанию полного имени файла устройства для IDE-диска это будет выглядеть так:

$ fdisk /dev/ide/host0/bus0/target0/lun0/disc
Да и дальше - не сложнее: мы получаем в свое распоряжение некий интерфейс, требующий ввода определенной команды, исполнение которой сводится к ответу на несколько вопросов. С полным списком доступных команд можно ознакомиться благодаря прекрасной системе помощи, вызываемой командой m. Так, команда p выведет текущий список дисковых разделов с указанием их типа и размера. Далее, разделы можно создавать (командой n) или удалять (командой d), однако до команды записи изменений (w) никаких необратимых действий, могущих разрушить ранее существующие файловые системы, не последует: неудачно созданные разделы можно удалить и на их месте создать новые. И в любой момент командой q можно без всяких последствий выйти из программы.

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

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

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

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).

Теоретически 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). Хотя cfdisk несколько менее гибок: например, раздел в середине неразбитого дискового пространства создать нельзя.

И, наконец, 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, Ext2fs, ReiserFS и FAT16/FAT32, поддержка прочих (пока?) не реализована.

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

(parted) select /dev/hd?

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

(parted) print

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

(parted) mkpart type_part type_fs start end

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

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

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

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

(parted) mkfs # type_fs

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

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

(parted) mkpartfs type_part type_fs start end

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

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

Слайсы и разделы в BSD

В отличие от Linux'а, разбиение диска в BSD-системах осуществляется в два этапа и двумя отдельными программами. Сначала диск нарезается на слайсы (или создается один слайс, в режиме ли совместимости, или для эксклюзивного использования). А затем уже слайс, отведенный для BSD, разбивается на партиции. Далее речь пойдет о практике дискодробительства во FreeBSD и DragonFlyBSD, однако и в Net- или OpenBSD принципиальных отличий не будет.

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

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

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

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

$ fdisk /dev/ar0

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

$ fdisk -s /dev/ad#

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

/dev/ad0: 155061 cyl 16 hd 63 sec
Part        Start        Size Type Flags
   1:           0   156301488 0xa5 0x80

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

$ fdisk -I /dev/ar0

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

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

$ fdisk -i /dev/ar0

она перво-наперво напомнит нам, а какой, собственно, диск подвергается надругательству и сообщит его параметры (как записанные в Disk Label, так и считанные из BIOS - в общем случае они совпадать не обязаны):

******* Working on device /dev/da0 *******
parameters extracted from in-core disklabel are:
cylinders=124 heads=64 sectors/track=32 (2048 blks/cyl)

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

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

В большинстве случаев расхождения между "геомертрией" BIOS и Disk Label не страшно. Однако, если все же потребуется приведение их в соответствие, после положительного ответа на предложенный вопрос придется вручную задать "правильные" значения числа цилиндров, треков и секторов.

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

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

sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 0, size 260000 (126 Meg), flag 0
    beg: cyl 0/ head 0/ sector 1;
    end: cyl 126/ head 60/ sector 32

Подтвердив свои действия положительным ответом на вопрос

Are we happy with this entry? [n] y

можно при желании перейти к созданию второго раздела

The data for partition 2 is:

Do you want to change it? [n]

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

Do you want to change the active partition? [n]

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

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

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

$ fdisk -f configfile /dev/ad#

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

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

$ dd if=/dev/zero of=/dev/ad# bs=1k count=1

или

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

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

Созданный при помощи fdisk слайс, вне зависимости от того, "эксклюзивный" он или "совместимый", еще не пригоден к какому-либо иному использованию. Предварительно его еще нужно разбить на разделы - или хотя бы создать один раздел, ad#s1c, описывающую слайс целиком. Этой цели служит утилита disklabel (в DragonFlyBSD), или, во FreeBSD ветки 5.X, bsdlabel (с более дружественным, как говорят оптимисты, интерфейсом). Впрочем, обращение в обоими практически идентично.

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

$ bsdlabel /dev/ad0s1

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

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

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

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

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

$ bsdlabel -e /dev/ad0s1

В ответ на что будет вызван редактор, определенный в переменной EDITOR профильного файла суперпользователя (излишне напоминать, что все операции с дисками, слайсами и разделами выполняются только от лица root'а), при отсутствии оной таким редактором будет /usr/bin/vi. И в этом редакторе мы увидим следующее:

# /dev/da0:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  c:   254787        0    unused        0     0
  # "raw" part, don't edit

Если под файловую систему планируется отвести весь слайс целиком - достаточно в поле fstype заменить значение unused на 4.2BSD. Для создания нескольких разделов нам опять же потребуется некоторая арифметика, аналогичная примененной в интерактивном режиме программы fdisk.

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

Некоторая сложность использования fdisk, disklabel и bsdlabel обуславливает то, что во FreeBSD для подготовки носителей широко применяется (а для начинающих пользователей - рекомендуется) универсальная утилита sysinstall; в DragonFlyBSD с этой ролью более-менее справляется программа BSD Installer.

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

RAID и LVM

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

Как и средства разметки, инструменты слияния дисков в массивы существенно различны в Linux и BSD-системах. А технология LVM вообще свойственна только первой ОС.

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

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

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

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

$ make menuconfig

А именно:

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

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

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

Первый многократно описан. Существует фундаментальный The Software-RAID HOWTO (hThe Software-RAID HOWTO), написанный Якобом Остергардом (Jakob Ostergaard) и переведенный на русский языкрусский язык Максимом Дзюманенко. Немало внимания RAID-массивам уделил в своей серии публикаций на сайте IBM-Linux Дэниэл Роббинс (часть 1 - http://www-106.ibm.com/developerworks/linux/library/l-raid1/index.html, часть 2 - http://www-106.ibm.com/developerworks/linux/library/l-raid2/index.html). И все эти документы посвящены исключительно использованию инструментария raidtools. Котрый, кстати, имеет своим местопребыванием сайт Red Hat: http://people.redhat.com/mingo/raidtools).

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

Итак, mdadm. Далеко не факт, что он имеет место быть в вашем дистрибутиве. Не беда - его всегда можно скачать - либо с автоского сайта (http://www.cse.unsw.edu.au/%7Eneilb/source/mdadm/, либо с канонического сайта Linux (http://www.kernel.org/pub/linux/utils/raid/mdadm/) в виде тарбалла исходников. Обращение с которым, после обычной распаковки, столь же своеобычно - последовательность команд make и make install (обратим внимание - программа столь проста, что в предварительном конфигурировании посредством ./configure не нуждается).

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

Нетрудно догадаться, что раз из всего пакета в итоге образовался только один бинарник, именно его и следует запустить для создания массива. Для образования 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 Кбайт.

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

$ less /proc/mdstat

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

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

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

Справедливости ради следует сказать пару слов и об инструментарии raidtools и способах обращения с ним. В отличие от mdadm, он требует обязательного наличия конфигурационного файла - /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 в деталях расписан в перечисленных выше документах.

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

В BSD-системах также имеется два разных механизма создания программных RAID-массивов - классический ccd (Concanetade Disk driver) и более новый vinum. Это - не два разных набора инструментов, а именно две различные технологии, обладающие разными возможностями. В частности, vinum позволяет разместить на дисковом массиве корневую файловую систему, на что ccd не способен. Впрочем, с задаче размещения всех остальных ветвей последний справляется успешно, и к тому же проще в использовании, поэтому ниже чеь пойдет только о нем (заинтересованным в механизме vinum предлагается обратиться к FreeBSD Handbook в русском переводе или DragonFly Handbook - в оригинале).

Итак, ccd - драйвер слияния дисков. Средство, как я уже сказал, весьма древнее - man-страница датирована 1995 г., - а значит, проверенное временем. Позволяет создавать программные RAID-массивы типа нулевого (stripping) и первого (mirroring) уровней.

Как уже было сказано, ccd не позволяет разместить на массиве корневую файловую систему. Поэтому перед его использованием необходимо установить нашу операционку на первый из наличных дисков, задействовав только раздел /dev/ad0s1a и оставив остальное пространство неразмеченным. После чего выполнить на обоих дисках разметку разделовдля конкатенации, что может быть выполнено двумя способами. Согласно первому, в соответствие с заветом дедушки Ленина, прежде чем объединиться, следует решительно размежеваться, согласно второму - как раз наоборот.

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

Итак, на каждом диске требуется создать по слайсу на всем свободном пространстве (объем их должен быть примерно равным), а уж эти слайсы побить на попарные (и равновеликие) разделы, которые после конкатенации составят ветви /var, /usr, /home и все, которые еще планируется (например, /usr/ports и /usr/ports/distfiles).

Разметку слайсов можно выполнить двумя способами - через sysinstall (BSD Installer в DragonFlyBSD) или вручную. С первым способом все понятно - однако он не всегда желателен (а иногда и не проходит). И потому впору вспомнить о наших упражнениях по ручной разметке диска в предыдущем параграфе - именно здесь гибкость fdisk и disklabel оказываются востребованными.

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

$ fdisk -i /dev/ad0

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

$ fdisk -I /dev/ad2

Далее, вооружившись bsdlabel (или disklabel), запускаемой с опцией -e, калькулятором командной строки bc и, конечно же, man (8) bsdlabel, на первом (/dev/ad0s1) диске, в дополнение к имевшимся

  a:   524288        0    4.2BSD     2048 16384 32776
  b:  2074624   524288      swap
  c: 156301488        0    unused        0     0         

дописываем строки, определяющие полуразделы под будущие файловые системы, например, /var, /usr и /home. В результате получаем:

  d:   524288  2598912    4.2BSD        0     0     0
  e: 10240000  3123200    4.2BSD        0     0     0
  f: 142938288 13363200   4.2BSD        0     0     0

После этого обращаемся ко второму диску (/dev/ad2s1), на котором создаем парные к первому разделы под swap, /var, /usr и /home (того же размера, что и на первом диске), что в итоге дает:

  b:  2074624        0      swap
  c: 156301312        0    unused	0	0
  # "raw" part, don't edit
  d:   524288  2074624    4.2BSD	0	0	0
  e: 10240000  2598912    4.2BSD	0	0	0
  f: 142938112 12838912    4.2BSD	0	0	0

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

Первый способ - последовательный запуск ccdconfig для каждой пары сливаемых партиций примерно таким образом:

$ ccdconfig ccd0 128 none /dev/ad0s1d /dev/ad2s1d
$ ccdconfig ccd1 128 none /dev/ad0s1e /dev/ad2s1e
$ ccdconfig ccd1 128 none /dev/ad0s1f /dev/ad2s1f

Где ccd# - имя создаваемого RAID-устройства, 128 (для примера - это умолчальное значение) - размер (в Кбайт) chunk'ов, флаг none отменяет зеркалирование (то есть создает именно sripped-массив; чтобы сделать массив уровня 1, потребовалось бы указать флаг CCDF_MIRROR или его шестнадцатеричное значение - 004). Ну а аргументы понятны - это имена файлов партиций, которые подвергаются конкатенации.

В результате в каталоге /dev будут автоматически созданы новые устройства - /dev/ccd0, /dev/ccd1, /dev/ccd2 (речь идет о FreeBSD веnrи 5.X, использующей файловую систему устройств; в 4-й ее ветке и в DragonFlyBSD эти устройства потребовалось бы предварительно создать скриптом /dev/MAKEDEV или командой mknod), а в каталоге /etc возникнет конфигурационный файл ccd.config.

Второй способ - создать предварительно конфигурационный файл /etc/ccd.conf (которому на самом деле можно дать произвольное имя и поместить где угодно) в текстовом редакторе, и описать в нем объединяемые примерно таким образом:

# ccd   ileave  flags   component devices
ccd0    128     none    /dev/ad0s1d /dev/ad2s1d
ccd1    128     none    /dev/ad0s1e /dev/ad2s1e
ccd2    128     none    /dev/ad0s1f /dev/ad2s1f

После чего запустить ту же утилиту конфигурации следующим образом:

$ ccdconfig -C

в результате чего все необходимые сведения будут взяты из /etc/ccd.conf (если конфигу дали другое имя - следует явно указать его как аргумент с полным путем), устройства благополучно созданы.

Сбросить уже имеющиеся настройки ccd (если они почему-либо не устраивают) можно командой

$ ccdconfig -U

после чего они безболезненно переконфигурируются заново.

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

Итак, для начала размечаем созданные массивы:

$ bsdlabel -w /dev/ccd0 auto
$ bsdlabel -w /dev/ccd1 auto
$ bsdlabel -w /dev/ccd2 auto

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

$ bsdlabel -e /dev/ccd#

что, как мы помним, вызовет текстовый редактор для прямой модификации дисковой разметки. Копируем строку, описывающую партицию c, изменяем маркирующую ее литеру (например, на d) и тип раздела (с unused на 4.2BSD). Необходимости указывать размеры блока, фрагмента и прочего - нет, эти значения будут определены при создании файловой системы (о чем - в следующих параграфах).

После создания файловых систем их остается только смонтировать - сначала во временные каталоги типа /mnt/var, mnt/usr и /mnt/home, затем переместить в них содержимое одноименных кталогов из корня, и, наконец, прописать прописать монтирование конкатенированных разделов в /etc/fstab примерно таким образом:

/dev/ccd0e      /var	ufs	rw,noatime
/dev/ccd1e      /usr	ufs	rw,noatime
/dev/ccd2e      /home	ufs	rw,noatime

После чего следует перезагрузка и радость от обретенных RAID'ов. Причем с точки зрения быстродействия радость эта будет вполне обоснованной: измерения показали прирост скорости на типичных файловых операциях для ccd-RAID составляет от 10 до 50% против одиночного диска.

Теперь остается сказать несколько слов об инструментарии для реализации технологии LVM, имеющей место быть только в Linux (пока?).

Для использования LVM требуется поддержка ядром системы. Это достигается включением двух опций. При использовании make menuconfig в секции Multi-device support нужно включить, во-первых, поддержку Multiple devices, во-вторых - Device Mapping (это в ядре 2.6.X, в ядрах 2.4.X это называлось Logical volume manager (LVM) support).

Далее, дисковое пространство (на одном или нескольких накопителях) следует разметить в виде разделов с идентификатором Linux LVM (8e в шестнадцатеричном исчилении).

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

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

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

$ vgscan

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

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

$ pvcreate /dev/hda5

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

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

А полную информацию о вновь созданной группе мы получим командой 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 [значение] задаст размер чередующих блоков (в килобайтах). Однако это имеет смысл только при наличии двух физических дисков (да еще, как неоднократно подчеркивалось ранее, на отдельных IDE-каналах).

Теперь выполним проверку: командой 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

Остается пятый, последний, шаг: создание на каждом логическом томе файловой системы и ее монтирование - но тут уж никакой специфики нет.

Выше был описан пример для случая организации логических томов на одном диске. На двух и более - ничуть не сложнее. Придется только повторить команду pvcreate должное число раз - для создания на каждом физических томов (Physical Volume):

$ pvcreate /dev/hda5
$ pvcreate /dev/hdc5
...

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

$ vgcreate имя_группы /dev/hda5 /dev/hdc5

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

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

создаст схему соответствия stripped между физическими и логическими extent'ами, то есть иллюзию чередования записи на два физических диска блоками (chunks) по 8 Кбайт.

Создание файловых систем

Linux поддерживает в качестве нативных несколько файловых систем, и потому для работы с каждой из них существует собственный набор инструментов: Ext2fsprogs - для файловых систем Ext2fs и Ext3fs, reiserfsprogs, xfsprogs и jfsutils - для файловых систем ReiserFS, XFS и JFS, соответственно. Каждая из этих файловых систем может быть создана командой mkfs с опцией -t, значением которой выступает желаемый тип файловой системы, и аргументом - именем файла устройства (дискового раздела).

Однако сама по себе команда mkfs - лишь оболочка, служащая для вызова специфичной команды, создающей файловую систему определенного типа: mk2efs или mkfs.ext2 - Ext2fs или Ext3fs (в последнем случае обе они требуют опции -j, предписывающей создать журнал), mkreiserfs - ReiserFS, mkfs.xfs - XFS, mkfs.jfs - JFS. Выглядит это примерно так. Команда

$ mke2fs /dev/hda1

создаст файловую систему Ext2fs на первичном разделе /dev/hda1. Команда

$ mke2fs -j /dev/hda3

создаст файловую систему Ext3fs на первичном разделе /dev/hda3. Опция -j предписывает добавление журнала) - в этом случае новая файловая система получит некоторые "умолчальные" параметры журналирования. Определить их вручную позволяет следующая форма этой команды:

$ /sbin/mke2fs -J опции_журналирования /dev/hd?#

Возможные значения опций журналирования: - size=размер, задающая объем журнального файла в мегабайтах, device=внешний_журнал для подключения новой файловой системы к журналу, ранее созданному на другом дисковом разделе, и data=режим. определяющая режим журналирования. Значения последней опции могут быть такими: journal (полное журналирование, при котором фиксируются операции не только с метаданными файлов, но и их данными), ordered (по умолчанию), при которой данные и метаданные группируются в единый блок транзакции, и writeback, в котором никакого журналирования данных не осуществляется.

Можно использовать и специальную команду /sbin/mkfs.ext3 - возможности ее идентичны таковым /sbin/mke2fs (ибо она ни что иное, как символическая на нее ссылка). Но самое интересное - возможность преобразования существующей Ext2fs в Ext3fs простым добавлением журнала, не только без потери данных, но и без перезапуска системы (и даже без размонтирования соответствующего устройства). Делается это командой

$ tune2fs -j /dev/hd?#

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

Файловая система ReiserFS создается специально предназначенной для этого командой - /sbin/mkreiserfs из пакета reiserfsprogs. Для нее доступны многочисленные опции (-s для задания размера журнала, -f для принудительного переформатирования ранее существовавшей файловой системы иного типа, и т.д.), с которыми можно ознакомиться посредством man (8) mkreiserfs.

Для создания XFS также существует собственная команда mkfs.xfs (из пакета xfsprogs). В ней предусмотрено несколько опций, каждая из которых имеет ряд субопций, принимающих численные значения. Важнейшие из них:

  • -b, которая посредством субопции size=## позволяет задать размер блока данных в байтах, который должен быть кратен размеру страницы оперативной памяти (для платформы i386 - 4 Кбайт) и может варьировать в диапазоне от 512 до 65536 (по умолчанию - 4096); -d, определяющая параметры области данных файловой системы, такие, как количество самостоятельных областей раздела (Allocation groups, субопция agcount), или, напротив, их размер (субопция agsize); -l, специфицирующая параметры журнального файла, например, его размер (субопция size).

При использовании mkfs.xfs для достижения максимальной производительности рекомендуется в явном виде задать количество allocation groups - иначе оно будет определяться автоматически, что ведет к непроизводительным расходам ресурсов. Это делается, исходя из эмпирического расчета - одна allocation group на 4 Гбайт дискового пространства. Далее можно установить размер файла журнала - здесь рекомендованное значение составляет 32 Мбайт. То есть для дискового раздела объемом в 20 Гбайт команда приобретет вид

$ mkfs.xfs -d agcount=5 -l size=32m /dev/hda1

Кроме всех перечисленных, команда mkfs.xfs имеет опцию -f - принудительное создание файловой системы XFS поверх любой существующей. Ее достаточно, если последняя была Ext2fs или Ext3fs. Если же XFS создается поверх ReiserFS - после этого возможны ошибки при монтировании новой файловой системы. Впрочем, то же относится и к обратной процедуре (замене XFS на ReiserFS). Это связано с тем, что команда монтирования может распознать новосозданную XFS как дефектную ReiserFS, и наоборот.

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

$ dd if=/dev/zero of=/dev/hd?#

Ждать заполнения нулями всего устройства не обязательно - достаточно дать этой команде поработать секунд 10-20, после чего прервать ее комбинацией клавиш Control+D и перейти к созданию новых файловых систем.

Наконец, и JFS имеет специфическую команду для собственного создания, которая выглялит примерно так:

$ mkfs.jfs /dev/hda7

Впрочем, тут за подробностями милости просим к страницам документации - опыта работы с JFS у меня нет.

Процесс создания файловой системы в BSD сводится к а) выделению суперблока и записи общих параметров файловой системы, б) созданию таблицы inodes (в UFS и UFS2, в отличие от некоторых современных файловых систем для Linux, все inodes создаются раз и навсегда, а не выделяются динамически, по мере надобности), и в) разметке блоков в области данных. Из за все это отвечает одна-единственная, подобно незабвенной Катерине Матвевне, программа, именуемая незамысловато - newfs.

Команда newfs требует единственного аргумента - имени файла форматируемой партиции, например,

$ newfs /dev/ad0s1a

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

Опция -b определяет размер логического блока файловой системы. Минимальный размер его - 4096 байт, максимальный - 65536. Однако, как говорят, при максимально возможном размере возможны всякие неприятности, и потому надежным считается верхнее ограничение в 32768 байта. А с точки зрения здравого смысла, "умолчальное" значение в 16384 байт представляется в большинстве случаев разумным.

Опция -f устанавливает размер фрагмента блока. Рекомендуется определить его в 1/8 размера блока, что по умолчанию и составит 2048 байта. Значения в 1/4 или 1/2 блока также допустимы, но очень не рекомендуются в документации.

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

Еще одна интересная опция - это -m, значение которой указывается в процентах от суммарного объема дискового пространства отведенного на партицию. И представляет собой объем, резервируемый от записи обычными пользователями (но не root'ом - тот всегда имеет возможность записать свои действия на диск при наличии физически свободного пространства). Он определяется потому, что быстродействие файловых операций в UFS просто катастрофически падает, когда количество свободных блоков в области данных близко к исчерпанию (проверено на практике). И потому некий объем файловой системы резервируется принудительно (по умолчанию - 8%).

С этой опцией связана еще одна, -o, которая определяет алгоритм выделения свободных блоков данных при создании новых файлов. Дело в том, что UFS в состоянии размещать их двумя способами. Первый - методом плотнейшей упаковки с целью минимизации внутренней фрагментации и экономии дискового пространства. И называется он оптимизацией по объему (опция -o принимает значение space). Второй же метод (-o time) обеспечивает быстрейшее выделение свободных блоков с целью увеличения скорости создания файлов (то есть вопреки принципу Леонида Ильича Брежнева - "экономика должна быть экономной"). Так вот, умолчальное значение -o коррелирует со значением -m: если оно больше или равно 8%, применяется оптимизация по времени, если меньше - по объему. Хотя явным образом можно указать прямо противоположные значения.

Вообще-то, все приведенные выше опции очень важны, интересны и полезны для общего образования, однако пользователю вряд ли придется к ним прибегать: их значения по умолчанию, как и почти все в BSD-системах, разумны и приемлемы в подавляющем большинстве случаев. А вот опция -U при запуске newfs по умолчанию не задействуется. Обеспечивает же она поддержку того самого механизма Soft Updates, который (парадоксально, но - правда) способствует как повышению быстродействия файловых операций, так и устойчивости файловой системы.

Монтирование

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

$ mount /dev/hda1 /boot

смонтирует ранее созданную файловую систему в каталог /boot.

Утилита mount, как правило, безошибочно распознает поддерживаемые ею типы файловых систем (а в их числе - все нативные файловые системы Linux, все вариации на тему FAT и файловые системы CD и DVD-дисков). Если же по каким-то причинам она делать это отказывается, тип файловой системы нужно задать в явном виде с помощью опции -t, например:

$ mount -t vfat /dev/sda /mnt/usb

для монтирования USB-накопителя с файловой системой VFAT (вариант FAT, поддерживающий длинные имена и принятый в Windows, начиная с версии 95).

Команда mount в Linux - очень гибка и имеет много опций. Она позволяет смонтировать одну и ту же файловую систему в разные каталоги с помощью опции --bind. Например, tmpfs таким образом может быть смонтирована не только в каталог /dev/shm (штатное ее место с точки зрения стандарта POSIX), но и в каталог /tmp:

$ mount --bind tmpfs -t tmpfs /dev/shm ;
$ mount --bind tmpfs -t tmpfs /tmp

Как уже говорилось, файловая система tmpfs не нуждается в создании: для ее использования достаточно поддержки в ядре и самого факта монтирования.

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

Наконец, в качестве файловой системы можно смонтировать и отдельный файл, например, ISO-образ CD-диска, для чего служит опция --loop.

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

Отдельно стоит предостеречь от монтирования tmpfs в каталог /tmp в ходе рабочего сеанса: это вызовет мгновенный крах некоторых программ, в частности - оконной системы Икс. Как же быть, если нужно задействовать tmpfs именно в этом качестве? - спросите вы меня. На это я отвечу под занавес.

BSD-инструментарий для монтирования файловых систем отличается от Linux'ового тем, что здесь отсутствует универсальная команда mount. Вернее, она есть - но не носит универсального характера, предназначаясь только для монтирования родных файловых систем - UFS и UFS2. Умолчальная ее форма:

$ mount /dev/ad#s#? /mount_point

только их и в состоянии смонтировать. Для монтирования чуждых файловых систем из числа поддерживаемых предназначены специальные команды: mount_msdos - для FAT-разделов, mount_ext2 - для файловых систем Linux (только для Ext2fs и Ext3fs, причем в последней журналирование просто игнорируется), mount_cd9660 - для CD-дисков с файловой системой ISO9660 (и ее вариаций с расширениями RockRidge и Joliet). Тот же результат может быть достгнут и командой mount -t type_fs - но это лишь опосредованный вызов специальной команды для данного типа файловой системы.

Все варианты команды mount в BSD существенно беднее своей Linux-коллеги по возможностям. Здесь не допускается ни раздельное монтирование одной и той же файловой системы в разные точки, ни монтирование ветвей файловой системы. А монтирование файла как устройства требует некоторых дополнительных телодвижений.

Выше был описан процесс ручного монтирования файловых систем и в Linux, и в BSD. И действительно, к ручному монтированию подчас прибегать приходится. Однако постоянно используемые файловые системы (такие, как /usr, /home и так далее, не говоря уже о корне) целесообразно монтировать автоматически в ходе загрузки машины. За этот процесс отвечают соответствующие системы инициализации. А вот то, что должно монтироваться, описывается в конфигурационном файле /etc/fstab.

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

  • имя файла устройства (в Linux с использованием devfs его лучше указывать соответственно номенклатуре файловой системы устройств);
  • точка монтирования;
  • тип файловой системы;
  • опции монтирования (их много, по умолчанию в большинстве случаев стоит значение default);
  • dump и pass - разрешают/запрещают резервноет копирование (дамп) файловой системы и ее проверку; реальное значение нынче почти потеряли.

Указания в поле опций монтирования значения default подразумевает, в том числе, и то, что файловая система будет смонтирована автоматически при старте системы. Однако это не подходит для сменных носителей, каковых в момент загрузки может не быть в приводе. И потому в строках, описывающих CD ROM, USB-драйвы и тому подобные дивайсы, значение этого поля должно указываться как noauto. А сама по себе запись в /etc/fstab для них призвана в дальнейшем упростить процедуру монтирования: в качестве аргумента команда mount потребует только имя каталога - точки монтирования.

Для пояснения всего сказанного приведу свой файл /etc/fstab для системы Archlinux:

/dev/discs/disc0/part1 / reiserfs notail,noatime,nodiratime 0 0
/dev/discs/disc0/part3 /var reiserfs notail,noatime,nodiratime 0 0
/dev/discs/disc0/part4 /home reiserfs notail,noatime,nodiratime 0 0

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

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

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

$ umount /mnt/cd

или

$ umount /dev/cdroms/cdrom0

одинаково успешно размонтирует файловую систему на диске в CD-приводе, без чего извлечь его оттуда можно только с помощью скрепки.

По умолчанию монтирование и размонтирование файловых систем - прероготива исключительно root'а. Однако часто целесообразно разрешить эту операцию и обычному пользователю - по крайней мере, в отношении сменных носителей. В Linux это достигается просто - указанием значения user в поле опций монтирования соответствующей строки файла /etc/fstab, например, для CD:

/dev/cdroms/cdrom0 /mnt/cd iso9660 ro,user,noauto,unhide 0 0

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

$ sysctl vfs.usermount=1

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

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

mkswap /dev/hda2

Здесь нужно быть внимательным: применение этой команды к разделу со всамделишней файловой системой приведет к уничтожению последней (и, соответственно, всех ее данных).

В монтировании своп-раздел также не нуждается, вместо этого его нужно активизировать:

$ swapon /dev/hda3

При старте машины активация свопа происходит автоматически, при наличии в файле /etc/fstab строки вида:

/dev/discs/disc0/part2 swap swap defaults 0 0

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

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

Здесь важна опция pri, значением которой выступает приоритет swap-раздела. Причем сама по себе цифра роли не играет - лишь бы приоритеты для swap-разделов обоих дисков были равны.

Обратной процедуре - дезактивации области своппинга, - служит команда

$ swapoff /dev/hda3

Она также выполняется автоматически при перезагрузке или подготовке к выключению.

Дополнительные утилиты

В заключение этой интермедии стоит сказать несколько слов об утилитах, имеющих некоторое отношение к теме дисковой разметки и файловых систем. А именно - о командах df и du, позволяющих получить информацию о свободном и используемом дисковом пространстве. Обе они - универсальны для всех POSIX-совместимых операционок, в базовый комплекто которых входят всегда (начиная с Version 1 AT&T UNIX).

Начнем с df (от disk free). Данная без опций и аргументов, она выведет информацию о использовании всех смонтированных в данный момент файловых системах в такой форме:

$ df
Filesystem  512-blocks     Used    Avail Capacity  Mounted on
/dev/ad0s1a     508126    92666   374810    20%    /
/dev/mfs71       15806     2692    11850    19%    /tmp
/dev/ad0s1d     508126    34788   432688     7%    /var
/dev/ad0s1e   21553172  4542548 15286372    23%    /usr
/dev/ad0s2c   51936140 24257440 23523812    51%    /home
procfs               8        8        0   100%    /proc

Форма вывода достаточно прозрачна: сначала идет имя файла смонтированного устройства (дискового раздела - в примере для DragonFlyBSD), далее - их размер в 512-байтных (то есть физических) блоках, затем - объем использованного и доступного дискового пространства, процент "занятости" и, наконец, точка монтирования.

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

А вот форма вывода определяется опциями команды df. Так, в качестве единиц измерения дискового пространства могут быть представлены не только физические блоки, но также килобайты, мегабайты или гигабайты: для этого потребуется указание опций -k, -m или -g, соответственно. Опция -h предписывает "человеческий" вывод в тех единицах, которые подходят по смыслу (то есть для 10-гигабайтного раздела это будет G, для 50-ме6габайтного - M, и так далее). Причем это будут именно "истинные" килобайты, мегабайты и гигабайты, равные 1024, 1048576 и 1073741824. Однако, если заменить -h на опцию -H, вывод будет осуществлен в "супер-человеческом" формате, то есть в "деястичных килобайтах", "мегабайтах" и так далее; примерно так, как лукаво исчисляют объемы производители винчестеров.

Добавление опции -i, даст при выводе, плюс к объему еще и информацию о количестве занятых и свободных inodes, то есть числе теоретически возможных на данной файловой системе файлов. Опция -l ограничит вывод только локальными файловыми системами (без учета смонтированных по сети). А опция -t, значением которой выступает тип файловой системы, выведе только сведения о "заказанных ФС".

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

$ du ~/soft/
1010    soft/boot
679622  soft/

Не возбраняется в качестве аргумента и указание единичного файла:

$ du soft/pkgsrc.tar.gz
26608   soft/pkgsrc.tar.gz

По умолчанию du выводит результаты своей работы в физических блоках (512 байт). Однако, как и в случае с df, это легко изменить с помощью опции -h, которая подберет подходящие единицы измерения (в виде "истинных" *байт):

$ du -h soft/
1010K   soft/boot
664M    soft/

А опция -k обеспечит просто вывод в килобайтах.

Есть у команды du и другие опции. Так, опция -d ограничит подсчет уровнем вложенности подкаталогов, указанным в качестве ее значения, опция -I исключит из подсчета объема файл или каталог, выступающий ее значением.

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

Команда df, как ей и положено по имени, подсчитывает суммарный объем блоков, помеченных в суперблоке файловых систем как свободные, du же, напротив, считает объем, занятый каждым файлом, исходя из описания в его метаданных. А поскольку файловые операции в той или иной форме всегда кэшируются, легко представить себе ситуацию, когда после удаления файлов (то есть исключения их имен из записей в каталогах) соответствующего освобождения в "таблице занятости" еще не произошло, и блоки данных удаленных файлов окажутся учтены при подсчете df, но в вывод du уже не попадут.

Назад Содержание Вперед

VPS/VDS за 1 евро!

vCore x1, 1 GB RAM ECC, 15 GB SSD (RAID 10), Port 1 Gbps, Трафик ∞, Виртуализатор KVM.

Выбор стран: Нидерланды, Молдова и Россия!

Новости мира IT:

Архив новостей

Последние комментарии:

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 985 1945361
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2015 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...