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.