Команда fdisk

Команда fdisk позволяет задействовать одноименную утилиту для модификации таблиц разделов жестких дисков формата MSDOS. Для модификации таблиц разделов жестких дисков формата GPT используется утилита gdisk.

Таблица разделов формата MSDOS находится в нулевом секторе жесткого диска и может содержать описание четырех разделов (называемых основными), причем один из этих разделов (расширенный) может содержать описания дополнительных разделов (логических). Четыре основных раздела имеют номера от 1 до 4, после чего идут номера логических разделов.

Данная утилита не рекомендуется к использованию начинающим пользователям, так как с помощью нее пользователь может уничтожить все хранящиеся на жестком диски данные и вообще нарушить работоспособность системы. Также стоит иметь в виду, что таблицы разделов формата MSDOS не могут эффективно использоваться на жестких дисках большого объема (более 2 Тб), поэтому в последнее время их заменяют таблицы разделов формата GPT.

Примечание: в составе ОС DOS и Windows также поставляется утилита fdisk, которая предназначена для выполнения аналогичных операций.

Базовый синтаксис команды выглядит следующим образом:

# fdisk [параметры] устройство

Утилита должна запускаться от лица пользователя root и в большинстве случаев принимает путь к файлу устройства жесткого диска в качестве последнего аргумента (в формате /dev/sdX, где X- буквенное обозначение диска, например, /dev/sdc). Заслуживающими внимания параметрами утилиты являются параметр -l, позволяющий ознакомиться с содержанием существующей таблицы разделов жесткого диска (или всех жестких дисков при отсутствии пути к файлу устройства), параметры -b, -C, -H и -S, позволяющие вручную указать такие параметры жесткого диска, как размер логического и физического сектора, количество цилиндров, количество головок и количество секторов соответственно (что совсем не обязательно, ведь современные версии ядра Linux предоставляют утилите всю необходимую информацию) и параметр -u, позволяющий активировать вывод количества цилиндров вместо количества секторов (-u=cylinders).

Утилита работает в интерактивном режиме, то есть, вам придется отвечать на задаваемые ею вопросы. Здесь нужно помнить о команде m, которая позволяет вывести список всех доступных вариантов ответа.

Примеры использования

Вывод списка разделов жесткого диска

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

$ lsblk -o "NAME,FSTYPE,MOUNTPOINT,MODEL"
NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
...
sdc                                 MAXTOR STM316081
├─sdc1  swap   [SWAP]               
├─sdc2  ext4                        
└─sdc4  ext4                        
sdd     vfat   /media/alexu/sd card SD Storage      
sde                                 Transcend 1GB   
└─sde1  vfat                        
sr0                                 DRW-24B3ST      
sr1                                 Mass Storage

В качестве примера буду использовать флеш-накопитель с интерфейсом USB малого объема (Transcend 1GB), который в данном случае будет работать аналогично жесткому диску:

# fdisk -l /dev/sde
Диск /dev/sde: 1000 MiB, 1048576000 байт, 2048000 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x00000000

Устр-во    Загрузочный начало   Конец Секторы Размер Идентификатор Тип
/dev/sde1                2048 2047999 2045952   999M            83 Linux

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

# fdisk -l

Создание и удаление разделов

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

# fdisk /dev/sde

Добро пожаловать в fdisk (util-linux 2.31.1).
Изменения останутся только в памяти до тех пор, пока вы не решите записать их.
Будьте внимательны, используя команду write.

Для начала ознакомимся со справкой, воспользовавшись командой m:

Команда (m для справки): m

Справка:

  DOS (MBR)
   a   переключение флага загрузки
   b   редактирование вложенной метки диска BSD
   c   переключение флага dos-совместимости

  Общие
   d   удалить раздел
   F   показать свободное неразмеченное пространство
   l   список известных типов разделов
   n   добавление нового раздела
   p   вывести таблицу разделов
   t   изменение типа раздела
   v   проверка таблицы разделов
   i   вывести информацию о разделе

  Разное
   m   вывод этого меню
   u   изменение единиц измерения экрана/содержимого
   x   дополнительная функциональность (только для экспертов)

  Сценарий
   I   загрузить разметку из файла сценария sfdisk
   O   записать разметку в файл сценария sfdisk

  Записать и выйти
   w   запись таблицы разделов на диск и выход
   q   выход без сохранения изменений

  Создать новую метку
   g   создание новой пустой таблицы разделов GPT
   G   создание новой пустой таблицы разделов SGI (IRIX)
   o   создание новой пустой таблицы разделов DOS
   s   создание новой пустой таблицы разделов Sun

Нам нужно удалить раздел, поэтому воспользуемся командой d:

Команда (m для справки): d
Выбранный раздел 1
Раздел 1 был удален.

fdisk автоматически выберет единственный первый раздел и удалит его. Теперь следует воспользоваться командой p для вывода списка всех разделов и проверки корректности удаления раздела:

Команда (m для справки): p
Диск /dev/sde: 1000 MiB, 1048576000 байт, 2048000 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x00000000

Теперь создадим новый раздел с помощью команды n:

Команда (m для справки): n
Тип раздела
   p   основной (0 первичный, 0 расширеный, 4 свободно)
   e   расширенный (контейнер для логических разделов)
Выберите (по умолчанию - p):

Используется ответ по умолчанию p
Номер раздела (1-4, по умолчанию 1):
Первый сектор (2048-2047999, по умолчанию 2048):
Последний сектор + число секторов или + размер{K,M,G,T,P} (2048-2047999, по умолча

Создан новый раздел 1 с типом 'Linux' и размером 999 MiB.

Утилита по умолчанию предлагает ответы, позволяющие создать основной раздел размером в весь диск. Разумеется, вы можете создавать разделы других типов и размеров, вводя соответствующие ответы на вопросы.

Осталось записать изменения на диск с помощью команды w:

Команда (m для справки): w
Таблица разделов была изменена.
Вызывается ioctl() для перечитывания таблицы разделов.
Синхронизируются диски.

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

$ lsblk -o "NAME,FSTYPE,MOUNTPOINT,MODEL"
NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
...
sdc                                 MAXTOR STM316081
├─sdc1  swap   [SWAP]               
├─sdc2  ext4                        
└─sdc4  ext4                        
sdd     vfat   /media/alexu/sd card SD Storage      
sde                                 Transcend 1GB   
└─sde1  vfat                        
sr0                                 DRW-24B3ST      
sr1                                 Mass Storage

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

# mkfs.vfat -n "Jet Flash" /dev/sde1
mkfs.fat 4.1 (2017-01-24)
mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows

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