Pesquisa de site

Como manipular tabelas de partição com fdisk, cfdisk e sfdisk no Linux


Fdisk, cfdisk e sfdisk são utilitários de particionamento de linha de comando incluídos por padrão em todas as distribuições Linux. Eles fornecem interfaces diferentes para o mesmo conjunto de funções: embora todos possam ser usados interativamente, apenas o sfdisk é orientado a scripts. Eles suportam tabelas de partição DOS, GPT, SGI e SUN.

Neste tutorial aprendemos como manipular tabelas de partição usando fdisk, cfdisk e sfdisk, e explorar as diferenças entre essas ferramentas.

Neste tutorial você aprenderá:

  • Como usar fdisk, cfdisk e sfdisk para manipular tabelas de partição
  • Como usar o sfdisk para despejar e restaurar uma tabela de partição
  • Como listar identificadores de tipos de partição MBR e GPT

Podemos gerenciar partições a partir da interface “principal” usando as entradas apropriadas no menu inferior:

Para alterar o tipo de partição, selecionamos e pressionamos a tecla t (ou T), a seguir escolhemos uma entrada no menu dedicado:

Usando sfdisk

Ao contrário de seus utilitários complementares, o sfdisk é orientado a scripts e, portanto, normalmente é usado para executar operações sem esperar a interação do usuário. sfdisk lê comandos e instruções da entrada padrão. Quando a entrada padrão é um terminal, ela é executada em modo interativo:

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

>>> 

Assim como ao usar fdisk e cfdisk, as alterações são gravadas no disco somente quando solicitadas explicitamente e as tabelas de partição “DOS” são usadas por padrão; para mudar para GPT, devemos executar:

>>> label: gpt

A sintaxe usada para criar uma partição é bastante simples. O formato de entrada deve incluir os seguintes campos, separados por vírgula, espaço ou ponto e vírgula:

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

O parâmetro “start” é o ponto inicial da partição (expresso em setores ou em um dos formatos disponíveis que vimos antes), “size” e “type” são, respectivamente, o tamanho e o tipo da partição. Por fim, o parâmetro “bootable” é utilizado para marcar a partição como inicializável, utilizando o símbolo “*”.

Vejamos um exemplo. Suponha que estejamos trabalhando em uma tabela de partição DOS e queiramos criar uma partição de inicialização de 1GiB. Aqui está o que escreveríamos:

>>> ,1GiB,83,*

Vamos explicar. Em primeiro lugar, omitimos o primeiro campo, portanto o ponto inicial padrão é usado para a partição. No segundo campo, escrevemos “1GiB ”: este é o tamanho da partição. No terceiro campo especificamos o tipo de partição: neste caso usamos 83, que é o identificador da tabela de partição DOS para o tipo “sistema de arquivos Linux” (os identificadores GPT são diferentes, como veremos). Por fim, no quarto campo, utilizamos “*”, para marcar a partição como inicializável. Aqui está o resultado do comando:

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

Agora podemos passar informações sobre a próxima partição ou gravar a tabela de partições no disco, usando o comando “write”.

sfdisk no modo “script”

Como já dissemos, o sfdisk lê instruções da entrada padrão, portanto, para rodar em modo não interativo, podemos passar instruções diretamente para ele. Podemos replicar o que fizemos no exemplo anterior usando um shell pipe:

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

Poderíamos até usar uma “string aqui”:

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

Observe, entretanto, que tais comandos sempre “começam do zero”, então eles criam um novo rótulo de disco a cada vez (excluindo partições existentes), e que quando no modo “script”, sfdisk grava alterações no disco imediatamente . E se quisermos adicionar uma partição a uma tabela existente? Para realizar tal tarefa usamos a opção --append. Para adicionar uma partição a uma tabela existente e atribuir a ela todo o espaço restante em disco, por exemplo, executaríamos:

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

Como criar várias partições de uma vez? Podemos usar a mesma técnica, separando cada instrução com uma nova linha. No exemplo abaixo criamos uma tabela de partições GPT e duas partições com um único comando:

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

Mais convenientemente, poderíamos usar uma construção “aqui documento”, que é mais legível por nós, seres humanos tolos:

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

Ao contrário do fdisk e do cfdisk, o sfdisk, por padrão, não apaga o primeiro setor de um disco ao criar uma nova tabela de partição. Para obter o mesmo comportamento dos outros dois utilitários, ele deve ser invocado com a opção --wipe Always .

Redimensionando uma partição

Até agora vimos como criar partições do zero. Que tal reduzir ou ampliar uma partição existente? Bem, é uma operação bastante simples se você pensar bem: tudo o que devemos fazer é usar os mesmos parâmetros que usamos no momento da criação. A única coisa que precisamos é de uma forma de fazer referência a uma partição específica. Podemos fazer isso com a opção -N, passando o número da partição como argumento. No exemplo anterior criamos uma tabela de partições GPT com duas partições. O primeiro tinha tamanho de 1GiB. Para reduzi-lo para 512 MiB, executaríamos:

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

A saída do comando relata a situação antiga e atual:

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.

É isso: em vez de especificar a quantidade de espaço a subtrair ou adicionar à partição, especificamos diretamente o seu novo tamanho. Escusado será dizer que se existe um sistema de arquivos em uma partição, precisamos reduzi-lo antes de reduzir a própria partição.

Despejando e restaurando uma tabela de partição

Podemos usar o sfdisk para despejar e restaurar a tabela de partição de um disco. Para realizar tal ação invocamos o utilitário com a opção -d (abreviação de --dump). A configuração é despejada na saída padrão por padrão. Podemos querer redirecioná-lo para um arquivo:

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

Para reaplicar a configuração despejada ao disco, executaríamos:

$ sudo sfdisk /dev/vda < vda_dump.txt

Para replicar a tabela de partição em um disco diferente, podemos canalizar a saída do comando diretamente para outra instância do sfdisk:

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

Se quisermos apenas dar uma olhada na tabela de partições atual, podemos invocar o sfdisk com a opção -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

Tipos de partição

Os tipos de partição sugerem a finalidade de uma partição ou o sistema de arquivos contido nela. Podemos listar os tipos de partição disponíveis de diferentes maneiras, dependendo do utilitário que estamos usando. Ao usar fdisk, por exemplo, podemos obter uma lista dos tipos de partição disponíveis usando l. Identificadores hexadecimais são usados em tabelas de partição DOS, enquanto GUID são usados em GPT. Executando o comando l em um disco particionado GPT, obteríamos a seguinte saída (truncada):

  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
 [...]

Em um disco particionado em DOS, a saída seria a seguinte:

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

Para saber os tipos disponíveis ao usar sfdisk, podemos usar a opção -T e passar o tipo de rótulo da partição como argumento para --label. Por exemplo, para obter a lista dos tipos de partição para GPT e seu GUID, executaríamos:

$ sfdisk -T --label gpt

Existe uma série de alias para tipos de partição por conveniência. Eles assumem automaticamente o valor apropriado dependendo da tabela de partição em uso:

PARTITION TYPE ALIAS MBR ID GPT GUID
linux L 83 0FC63DAF-8483-4772-8E79-3D69D8477DE4
swap S 82 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
extended Ex 05  –
home H 933AC7E1-2EB4-4F13-B844-0E14E2AEF915
uefi U EF C12A7328-F81F-11D2-BA4B-00A0C93EC93B
raid R FD A19D880F-05FC-4D3B-A006-743F0F84911E
lvm V 8E E6D6D379-F507-44C2-A23C-238F2A3DF928

Conclusões

Neste tutorial aprendemos como manipular tabelas de partição usando três utilitários semelhantes que vêm pré-instalados em todas as distribuições Linux: fdisk, cfdisk e sfdisk. Os dois primeiros foram projetados para funcionar de forma interativa; o terceiro, sfdisk, é orientado a scripts.

Artigos relacionados: