Утилиты разметки. fdisk

Алексей Федорчук

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

Происхождение fdisk  теряется во мраке веков, уходя во времена первых UNIX для PC-архитектуры — насколько я понимаю, раньше необходимости в ней не было, а главными инструментами дисковой разметки были утилиты типа disklabel или bsdlabel. Мне не удалось также выяснить, когда эта утилита появилась в Linux. Могу только предполагать, что на самых ранних стадиях создания утилит обрамления для его ядра — т.н. linux-utils. Ныне fdisk входит в состав пакета linux-utils-ng.

Для начала следует запомнить, что запуск команды fdisk в любом качестве, даже просто для получения информации о диске, возможно только с правами суперпользователя, каковые и надо обеспечить себе любым образом, например, через su или sudo.

Если команду fdisk дать без опций и аргументов, она выведет краткую справку об её использовании:

# fdisk

Usage: fdisk [-l] [-b SSZ] [-u] device
E.g.: fdisk /dev/hda  (for the first IDE disk)
  or: fdisk /dev/sdc  (for the third SCSI disk)
  or: fdisk /dev/eda  (for the first PS/2 ESDI drive)
  or: fdisk /dev/rd/c0d0  or: fdisk /dev/ida/c0d0  (for RAID devices)

В качестве аргумента команды фигурирует имя файла устройства — физического диска целиком. Поскольку в современных версиях ядра Linux все диски, вне зависимости от их интерфейсов (PATA, SATA, SCSI, SAS, USB) определяются единой подсистемой ATA-SCSI, на самом деле имена эти будут иметь вид /dev/sda, /dev/sdb и так далее.

Смысл опций команды fdisk следующий:

  • l не предписывает выполнения каких-либо действий, а лишь выводит информацию о диске и его разделах, если таковые имеются;
  • b задаёт размер блока — единицы измерения дискового пространства; по умолчанию, без указание этой опции, он равен физическому блоку (512 байт), прочие возможные значения кратны его размеру — 1024, 2048 или 4096 байт;
  • u запускает fdisk, являясь опцией по умолчанию.

Перво-наперво посмотрим на информационную функцию fdisk, для чего запустим её следующим образом:

# fdisk -l /dev/sd?

где в

Ответом будет вывод примерно такого вида:

Диск /dev/sda: 160.0 ГБ, 160041885696 байт
255 heads, 63 sectors/track, 19457 cylinders
Units = цилиндры of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0008e008

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sda1               1          14      112423+  83  Linux
/dev/sda2              15       15680   125837145    5  Расширенный
/dev/sda5              15        2626    20980858+  83  Linux
/dev/sda6            2627        4585    15735636   83  Linux

Если опустить аргумент команды, то аналогичные сведения будут выведены для всех физических дисков данной машины: сначала — общая информация о диске, включающая его размер, число головок, секторов и цилиндров, а затем для каждого существующего на диске раздела указываются его первый и последний цилиндры (символом + маркируются разделы, не занимающие последний цилиндр полностью), размер в блоках (физических или заданных опцией b), идентификатор типа файловой системы и его название.

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

# fdisk /dev/sdb

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

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

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

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

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

При создании расширенного раздела сначала все происходит точно также — задание номера (очевидно, что в том же диапазоне 1-4), указание начального цилиндра и конечного (или — объема в мегабайтах). Однако это еще полдела, нужно поделить расширенный раздел на разделы логические. И потому при следующей команде на создание раздела нам будет предложен уже выбор между первичным (если число последних еще не исчерпано) и логическим (ведь второй 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 в качестве родных (ext2/ext3, ext4, XFS, ReiserFS, JFS, btrfs, NILFS2).

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

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

3 комментария к “Утилиты разметки. fdisk

  1. линупсовый fdisk довольно прост и интуитивно понятен. другое дело freebsd’шный, там сам чёрт ногу сломит.

  2. Мне кажется, что вполне избежать представлений об организации HDD можно только в одном случае: используя одну ОС/инсталляцию и «положившись» на инсталлятор. Причём, это вне зависимости от ОС. Во всех остальных случаях желательно знать, что за разделы и чем они друг от друга отличаются (а потом ещё (при наличии нескольких ОС/инсталляций) и что за загрузчики и как они работают :-)).

    При наличии же таких представлений, в общем-то, с любым *fdisk-ом можно разобраться. Не согласен? Уж сколько все писали об этом (мы, в том числе :-)), а для кого-то «воз и ныне там». Просто win-довый подход (найти утилиту, нажать в ней заветную кнопку и «будет вам счастье») здесь не работает в принципе: всё многообразие нынешних ОС/разделов/ФС (а, тем более, будущих) никогда не будет охвачено ни одним инсталлятором/редактором разделов. Сужу, в основном, по переписке с читателями GRUB-овых заметок: кто-то захотел понять — и удовлетворён, кто-то продолжает требовать решение для его конкретного случая (не обладая знаниями даже для его описания) — и ничего не получает.

    Что впрочем, не делает излишними твои комментарии в рамках проекта представления Fedora. В этом смысле: успехов ;-)

  3. 2 popov.v.n
    > Не согласен?
    ____
    Ну как я могу быть несогласен?
    Разумеется, согласен :)
    Собственно, главная сложность fdisk’а проявляется только при чересполосной разметке, если надо оставить неразмеченные области среди разделов. И связана исключительно с необходимостью пересчёта блоков/цилиндров в мега/гигабайты.
    Из!за этого BSD’шный fdisk кажется ещё более сложным, хотя на самом деле унутре он гораздо проще.
    Интересно, а ведь с широким распространением SSD всякие там цилиндры и головки потеряют те остатки физического смысла, которые для них можно нафантазировать нынче. Не будет ли это поводом переписать все низкоуровневые дисковые утилиты?
    Или наоборот — поводом нагородить над ними новых фронт-эндов для окончательного запутывания трудящихся масс?

Оставить комментарий