Поиск по сайту:

Как работать с таблицами разделов с помощью fdisk, cfdisk и sfdisk в Linux


Fdisk, cfdisk и sfdisk — это утилиты для создания разделов из командной строки, включенные по умолчанию во все дистрибутивы Linux. Они предоставляют разные интерфейсы для одного и того же набора функций: хотя все они могут использоваться в интерактивном режиме, только sfdisk ориентирован на скрипты. Они поддерживают таблицы разделов DOS, GPT, SGI и SUN.

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

В этом уроке вы узнаете:

  • Как использовать fdisk, cfdisk и sfdisk для работы с таблицами разделов
  • Как использовать sfdisk для дампа и восстановления таблицы разделов
  • Как перечислить идентификаторы типов разделов MBR и GPT

Мы можем управлять разделами из "главного" интерфейса, используя соответствующие пункты в нижнем меню:

Чтобы изменить тип раздела, выбираем его и нажимаем клавишу t (или T), затем выбираем пункт в специальном меню:

Использование sfdisk

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

sudo sfdisk /dev/vda

Welcome to sfdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Checking that no-one is using this disk right now ... OK

Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

sfdisk is going to create a new 'dos' disk label.
Use 'label: ' before you define a first partition
to override the default.

Type 'help' to get more information.

>>> 

Как и при использовании fdisk и cfdisk, изменения записываются на диск только по явному запросу, а таблицы разделов "DOS" используются по умолчанию; Чтобы переключиться на GPT, нам необходимо выполнить:

>>> label: gpt

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

<start> <size> <type> <bootable>

Параметр "start" - это начальная точка раздела (выраженная в секторах или в одном из доступных форматов, которые мы видели ранее), "size" и "type" - соответственно, размер и тип раздела. Наконец, параметр "bootable" используется для обозначения раздела как загрузочного, используя символ "*".

Давайте рассмотрим пример. Предположим, мы работаем над таблицей разделов DOS и хотим создать загрузочный раздел размером 1 ГиБ. Вот что мы напишем:

>>> ,1GiB,83,*

Давайте объясним. Прежде всего, мы опустили первое поле, поэтому для раздела используется начальная точка по умолчанию. Во втором поле мы написали "1GiB": это размер раздела. В третьем поле мы указали тип раздела: в данном случае мы использовали 83, который является идентификатором таблицы разделов DOS для типа "файловая система Linux" (идентификаторы GPT отличаются, как мы увидим). Наконец, в четвертом поле мы использовали "*", чтобы отметить раздел как загрузочный. Вот результат выполнения команды:

Created a new partition 1 of type 'Linux' and of size 1 GiB.
   /dev/vda1 :         2048      2099199 (1G) Linux
/dev/vda2:

Теперь мы можем передать информацию о следующем разделе или записать таблицу разделов на диск, используя команду "write".

sfdisk в режиме "скрипт"

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

echo ",1GiB,83,*" | sudo sfdisk /dev/vda

Мы даже можем использовать "строку здесь":

sudo sfdisk /dev/vda <<< ",1GiB,83,*"

Обратите внимание, однако, что такие команды всегда "начинаются с нуля", поэтому они каждый раз создают новую метку диска (удаляя существующие разделы), и что в режиме "скрипт" sfdisk немедленно записывает изменения на диск. Что, если мы захотим добавить партицию в существующую таблицу? Для выполнения этой задачи мы используем опцию --append. Например, чтобы добавить раздел в существующую таблицу и назначить ему все оставшееся место на диске, мы выполним:

echo ",," | sudo sfdisk --append /dev/vda

Как создать сразу несколько разделов? Мы можем использовать ту же технику, разделяя каждую инструкцию с новой строки. В приведенном ниже примере мы создаем таблицу разделов GPT и две секции с помощью одной команды:

echo -e "label: gpt\n,1GiB\n," | sudo sfdisk /dev/vda

Удобнее было бы использовать конструкцию «здесь документ», которая более понятна нам, глупым людям:

sudo sfdisk /dev/vda << EOF
label: gpt
,1GiB
,
EOF

В отличие от fdisk и cfdisk, sfdisk по умолчанию не стирает первый сектор диска при создании новой таблицы разделов. Чтобы получить такое же поведение двух других утилит, он должен быть вызван с опцией --wipe always.

Изменение размера секции

До сих пор мы видели, как создавать разделы с нуля. Как насчет сжатия или расширения существующей перегородки? Что ж, это довольно простая операция, если подумать: все, что нам нужно сделать, это использовать те же параметры, которые мы использовали во время создания. Единственное, что нам нужно, это способ ссылки на конкретный раздел. Мы можем сделать это с помощью опции -N, передав номер секции в качестве аргумента. В предыдущем примере мы создали таблицу разделов GPT с двумя разделами. Первый имел размер 1ГиБ. Чтобы уменьшить его до 512 МиБ, мы выполним:

echo ",512MiB" | sudo sfdisk -N 1 /dev/vda

Вывод команды сообщает о старой и текущей ситуации:

Old situation:

Device       Start      End  Sectors Size Type
/dev/vda1     2048  2099199  2097152   1G Linux filesystem
/dev/vda2  2099200 41940991 39841792  19G Linux filesystem

/dev/vda1: 
New situation:
Disklabel type: gpt
Disk identifier: B95D2ECA-1336-6949-89E8-BDC3B493F9A2

Device       Start      End  Sectors  Size Type
/dev/vda1     2048  1050623  1048576  512M Linux filesystem
/dev/vda2  2099200 41940991 39841792   19G Linux filesystem

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

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

Выгрузка и восстановление таблицы секций

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

sudo sfdisk -d /dev/vda > vda_dump.txt

Чтобы повторно применить выгруженную конфигурацию к диску, мы выполним:

sudo sfdisk /dev/vda < vda_dump.txt

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

sudo sfdisk -d /dev/vda | sudo sfdisk /dev/vdb

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

sudo sfdisk -l /dev/vda
Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B95D2ECA-1336-6949-89E8-BDC3B493F9A2

Device       Start      End  Sectors Size Type
/dev/vda1     2048  2099199  2097152   1G Linux filesystem
/dev/vda2  2099200 41940991 39841792  19G Linux filesystem

Типы разделов

Типы разделов указывают на назначение раздела или содержащуюся на нем файловую систему. Мы можем перечислить доступные типы разделов по-разному, в зависимости от используемой утилиты. При использовании fdisk, например, мы можем получить список доступных типов разделов с помощью l. Шестнадцатеричный идентификатор используется в таблицах разделов DOS, а GUID — в GPT. Выполнив команду l на диске с разделами GPT, мы получим следующий (усеченный) вывод:

  1 EFI System                     C12A7328-F81F-11D2-BA4B-00A0C93EC93B
  2 MBR partition scheme           024DEE41-33E7-11D3-9D69-0008C781F39F
  3 Intel Fast Flash               D3BFE2DE-3DAF-11DF-BA40-E3A556D89593
  4 BIOS boot                      21686148-6449-6E6F-744E-656564454649
  5 Sony boot partition            F4019732-066E-4E12-8273-346C5641494F
  6 Lenovo boot partition          BFBFAFE7-A34F-448A-9A5B-6213EB736C22
  7 PowerPC PReP boot              9E1A2D38-C612-4316-AA26-8B49521E5A8B
  8 ONIE boot                      7412F7D5-A156-4B13-81DC-867174929325
  9 ONIE config                    D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149
 10 Microsoft reserved             E3C9E316-0B5C-4DB8-817D-F92DF00215AE
 11 Microsoft basic data           EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
 12 Microsoft LDM metadata         5808C8AA-7E8F-42E0-85D2-E1E90434CFB3
 13 Microsoft LDM data             AF9B60A0-1431-4F62-BC68-3311714A69AD
 14 Windows recovery environment   DE94BBA4-06D1-4D40-A16A-BFD50179D6AC
 15 IBM General Parallel Fs        37AFFC90-EF7D-4E96-91C3-2D7AE055B174
 16 Microsoft Storage Spaces       E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D
 17 HP-UX data                     75894C1E-3AEB-11D3-B7C1-7B03A0000000
 18 HP-UX service                  E2A1E728-32E3-11D6-A682-7B03A0000000
 19 Linux swap                     0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
 20 Linux filesystem               0FC63DAF-8483-4772-8E79-3D69D8477DE4
 [...]

На диске, разделенном на разделы DOS, вывод будет следующим:

00 Empty            27 Hidden NTFS Win  82 Linux swap / So  c1 DRDOS/sec (FAT-
01 FAT12            39 Plan 9           83 Linux            c4 DRDOS/sec (FAT-
02 XENIX root       3c PartitionMagic   84 OS/2 hidden or   c6 DRDOS/sec (FAT-
03 XENIX usr        40 Venix 80286      85 Linux extended   c7 Syrinx         
04 FAT16 <32M       41 PPC PReP Boot    86 NTFS volume set  da Non-FS data    
05 Extended         42 SFS              87 NTFS volume set  db CP/M / CTOS / .
06 FAT16            4d QNX4.x           88 Linux plaintext  de Dell Utility   
07 HPFS/NTFS/exFAT  4e QNX4.x 2nd part  8e Linux LVM        df BootIt         
08 AIX              4f QNX4.x 3rd part  93 Amoeba           e1 DOS access     
09 AIX bootable     50 OnTrack DM       94 Amoeba BBT       e3 DOS R/O        
0a OS/2 Boot Manag  51 OnTrack DM6 Aux  9f BSD/OS           e4 SpeedStor      
0b W95 FAT32        52 CP/M             a0 IBM Thinkpad hi  ea Linux extended 
0c W95 FAT32 (LBA)  53 OnTrack DM6 Aux  a5 FreeBSD          eb BeOS fs        
0e W95 FAT16 (LBA)  54 OnTrackDM6       a6 OpenBSD          ee GPT            
0f W95 Ext'd (LBA)  55 EZ-Drive         a7 NeXTSTEP         ef EFI (FAT-12/16/
10 OPUS             56 Golden Bow       a8 Darwin UFS       f0 Linux/PA-RISC b
11 Hidden FAT12     5c Priam Edisk      a9 NetBSD           f1 SpeedStor      
12 Compaq diagnost  61 SpeedStor        ab Darwin boot      f4 SpeedStor      
14 Hidden FAT16 <3  63 GNU HURD or Sys  af HFS / HFS+       f2 DOS secondary  
16 Hidden FAT16     64 Novell Netware   b7 BSDI fs          f8 EBBR protective
17 Hidden HPFS/NTF  65 Novell Netware   b8 BSDI swap        fb VMware VMFS    
18 AST SmartSleep   70 DiskSecure Mult  bb Boot Wizard hid  fc VMware VMKCORE 
1b Hidden W95 FAT3  75 PC/IX            bc Acronis FAT32 L  fd Linux raid auto
1c Hidden W95 FAT3  80 Old Minix        be Solaris boot     fe LANstep        
1e Hidden W95 FAT1  81 Minix / old Lin  bf Solaris          ff BBT            
24 NEC DOS

Чтобы узнать доступные типы при использовании sfdisk, вместо этого мы можем использовать опцию -T и передать тип метки раздела в качестве аргумента в --label. Например, чтобы получить список типов разделов для GPT и их GUID, мы выполним:

sfdisk -T --label gpt

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

ТИП ПЕРЕГОРОДКИПСЕВДОНИМИдентификатор MBRGPT GUID
линуксL830FC63DAF-8483-4772-8E79-3D69D8477DE4
обмениватьS820657FD6D-A4AB-43C4-84E5-0933C84B4F4F
растянутыйБывший05&8211;
домH–933AC7E1-2EB4-4F13-B844-0E14E2AEF915
uefiUЭФC12A7328-Ф81Ф-11Д2-БА4Б-00А0К93ЭК93Б
рейдRФДA19D880F-05FC-4D3B-A006-743F0F84911E
lvmV8ЭE6D6D379-Ф507-44К2-А23К-238Ф2А3ДФ928

Выводы

В этом уроке мы узнали, как работать с таблицами разделов с помощью трех похожих утилит, которые предустановлены во всех дистрибутивах Linux: fdisk, cfdisk и sfdisk. Первые два предназначены для работы в интерактивном режиме; Третий, SFDid, ориентирован на скрипты.

Статьи по данной тематике: