Pesquisa de site

Como manipular tabelas de partição gpt com gdisk e sgdisk no Linux


GPT é a sigla para GUID Partition Table: é o novo padrão para dispositivos de armazenamento: faz parte das especificações do firmware UEFI e sucessor do MBR, do qual supera diversas limitações. O MBR, por exemplo, permite um máximo de 4 partições primárias (o GPT suporta até 128 delas) e funciona apenas com unidades de até 2 TB. No Linux existem várias ferramentas que podemos usar para criar e manipular tabelas de partição GPT. Neste tutorial nos concentramos no uso dos utilitários gdisk e sgdisk.

Neste tutorial você aprenderá:

  • Como listar a tabela de partições de um dispositivo com gdisk

  • Como criar uma tabela de partição GPT

  • Como criar uma nova partição

  • Como remover uma partição

  • Como redimensionar uma partição

  • Como trabalhar de forma não interativa com sgdisk

Requisitos de software e convenções usadas

Gdisk versus sgdisk

Neste tutorial usaremos duas ferramentas diferentes: gdisk e sgdisk. Eles nos permitem realizar as mesmas operações, com uma grande diferença: o primeiro funciona de forma interativa, fornece prompts de confirmação e uma interface baseada em perguntas. As alterações que realizamos com ele são gravadas no disco somente quando utilizamos o comando dedicado, para minimizar erros.

Este último, em vez disso, funciona de forma não interativa: deve ser usado dentro de scripts de shell ou, mais geralmente, diretamente na linha de comando. Os comandos Sgdisk são aplicados imediatamente, portanto devem ser usados com muito cuidado. Na primeira parte deste tutorial focamos em como realizar as operações básicas com gdisk, na segunda vemos como realizar as mesmas operações com sgdisk.

Listando a tabela de partição de um dispositivo

Para começar a usar o gdisk, basta invocar o programa passando como argumento o caminho do dispositivo que queremos manipular. Para listar a tabela de partições de um dispositivo, chamamos o programa com a opção -l:

$ sudo gdisk -l /dev/sdc

A seguir está o que o comando acima retorna em um dispositivo que não foi totalmente inicializado:

GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries in memory.
Disk /dev/sdc: 15122432 sectors, 7.2 GiB
Model: SD/MMC/MS PRO
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 32A31D98-1500-4FE5-836A-69F289D048A7
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 15122398
Partitions will be aligned on 2048-sector boundaries
Total free space is 15122365 sectors (7.2 GiB)

Criando uma nova tabela de partição GPT

O dispositivo com o qual estamos trabalhando, como vimos, está completamente vazio; não contém nenhuma tabela de partição. Para criar uma nova tabela de partição GPT nela, passamos ela como argumento ao invocar o gdisk, sem fornecer nenhuma opção:

$ sudo gdisk /dev/sdc

Assim que iniciarmos o comando acima, seremos solicitados a inserir um comando de comando:

Command (? for help):

Para criar uma nova tabela de partição GPT, devemos usar o comando o (digitamos o e pressionamos enter). Seremos avisados de que a ação destruirá todas as partições existentes no disco e seremos solicitados a confirmar nossa escolha:

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y

Como já dissemos, ao usar o gdisk, as alterações que fazemos no disco não são gravadas imediatamente: esta é uma medida de segurança. Para torná-los eficazes devemos usar o comando w:

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.

Seremos solicitados a fornecer uma última confirmação. Depois de fornecê-lo, as alterações entrarão em vigor e (esperançosamente) seremos notificados sobre o sucesso da operação.

Criando uma nova partição

Inicializamos nosso dispositivo, agora podemos começar a criar partições; vamos ver como fazer isso. Para criar uma nova partição devemos usar o comando n. Seremos solicitados a responder uma série de perguntas; como resposta para cada um deles podemos fornecer um valor ou apenas pressionar enter para aceitar o valor padrão, exibido entre parênteses.

A primeira coisa que devemos decidir é o número que deve ser usado para a partição, no intervalo de 1 a 128. Aqui geralmente queremos usar o valor padrão, que é progressivo.

Em segundo lugar, devemos decidir em qual setor do disco a partição deve iniciar. Para a primeira partição, o setor inicial padrão é 2048. O valor padrão é o que queremos usar para este parâmetro na grande maioria dos casos.

A próxima coisa que devemos decidir é em qual setor a partição deve terminar: isso, como você pode imaginar, determina o tamanho da partição. Em vez de especificar um setor, podemos fornecer o tamanho da partição diretamente, com um número inteiro seguido por um dos sufixos disponíveis: K,M,G,T,P. Para criar uma partição de 500 MiB de tamanho, por exemplo, inseriríamos +500M como valor.

Por último, seremos solicitados a decidir qual código HEX usar para a partição. Aqui o valor padrão é 8300 (sistema de arquivos Linux). Para obter a lista de todos os códigos disponíveis, basta inserir o comando L e pressionar <enter> novamente:

0700 Microsoft basic data                0701 Microsoft Storage Replica
0702 ArcaOS Type 1                       0c01 Microsoft reserved
2700 Windows RE                          3000 ONIE boot
3001 ONIE config                         3900 Plan 9
4100 PowerPC PReP boot                   4200 Windows LDM data
4201 Windows LDM metadata                4202 Windows Storage Spaces
7501 IBM GPFS                            7f00 ChromeOS kernel
7f01 ChromeOS root                       7f02 ChromeOS reserved
8200 Linux swap                          8300 Linux filesystem
8301 Linux reserved                      8302 Linux /home
8303 Linux x86 root (/)                  8304 Linux x86-64 root (/)
8305 Linux ARM64 root (/)                8306 Linux /srv
8307 Linux ARM32 root (/)                8308 Linux dm-crypt
8309 Linux LUKS                          830a Linux IA-64 root (/)
830b Linux x86 root verity               830c Linux x86-64 root verity
830d Linux ARM32 root verity             830e Linux ARM64 root verity
830f Linux IA-64 root verity             8310 Linux /var
8311 Linux /var/tmp                      8312 Linux user's home
8313 Linux x86 /usr                      8314 Linux x86-64 /usr
8315 Linux ARM32 /usr                    8316 Linux ARM64 /usr
8317 Linux IA-64 /usr                    8318 Linux x86 /usr verity
Press the <Enter> key to see more codes, q to quit:

Os códigos não são exibidos todos de uma vez. Para rolar a lista devemos continuar pressionando <enter>. Em nosso exemplo acabamos de confirmar o código HEX padrão para a partição:

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-15122398, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-15122398, default = 15122398) or {+-}size{KMGTP}:+500M
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Neste ponto as mudanças existem apenas na memória; digitamos w para gravá-los no disco.

Removendo uma partição

Para remover uma partição existente usando gdisk, temos que usar o comando ‘d’. Assim que entrarmos, seremos solicitados a fornecer o número da partição que queremos excluir. Para este exemplo, removemos a segunda partição do nosso dispositivo:

Command (? for help): d
Partition number (1-2): 2

Para gravar as alterações no disco, como já sabemos, digitamos o comando w.

Redimensionando uma partição

Redimensionar uma partição é sempre uma operação perigosa que deve ser executada com cuidado e possivelmente após a criação de um backup. Realizar tal operação com gdisk é um tanto contra-intuitivo, pois o processo envolve a exclusão da partição atual (somente na memória) e sua recriação com o mesmo setor inicial e o novo setor de tamanho/final.

Ampliando uma partição/sistema de arquivos

Suponha que queiramos estender a segunda partição que criamos neste tutorial, para que ela utilize todo o espaço disponível no disco. Aqui está como procederíamos. Primeiro solicitamos informações sobre a partição que estamos prestes a manipular usando o comando i:

Command (? for help): i
Partition number (1-2): 2
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: D6FF2779-6F14-4E3E-876C-83E38F3A3FD7
First sector: 1026048 (at 501.0 MiB)
Last sector: 3123199 (at 1.5 GiB)
Partition size: 2097152 sectors (1024.0 MiB)
Attribute flags: 0000000000000000
Partition name: 'Linux filesystem'

Como temos que excluir a partição como parte da operação de redimensionamento, queremos manter suas informações atuais em mãos. Uma coisa que podemos querer fazer é aplicar o GUID exclusivo da partição atual à recém-criada (por padrão, um GUID aleatório é gerado). Como já sabemos, para deletar a partição temos que usar o comando d:

Command (? for help): d
Partition number (1-2): 2

Neste ponto recriamos a partição com o comando n, usando o mesmo número de partição e ponto inicial (neste caso o padrão), e fornecemos o novo tamanho. Como neste caso queremos utilizar todo o espaço disponível, utilizaremos também o valor padrão sugerido pela aplicação:

Command (? for help): n
Partition number (2-128, default 2): 2
First sector (34-15122398, default = 1026048) or {+-}size{KMGTP}:
Last sector (1026048-15122398, default = 15122398) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Para alterar o GUID único da nova partição e usar a anterior, devemos entrar no menu “operações avançadas” do gdisk, usando o comando x (observe como o prompt mudanças)

Command (? for help): x

Expert command (? for help):

O comando especialista que queremos usar é c. Assim que entrarmos, seremos solicitados a fornecer o número da partição e o novo GUID para ela. Neste caso inserimos aquela que foi usada para a partição “antiga”:

Expert command (? for help): c
Partition number (1-2): 2
Enter the partition's new unique GUID ('R' to randomize): D6FF2779-6F14-4E3E-876C-83E38F3A3FD7
New GUID is D6FF2779-6F14-4E3E-876C-83E38F3A3FD7

Neste ponto podemos salvar as alterações no disco com o comando w (se por algum motivo quisermos sair do menu “expert” e voltar ao principal, podemos usar m em vez disso):

Expert command (? for help): w

Agora temos uma partição muito maior do que antes, mas se houver um sistema de arquivos nela, ela ainda deverá ser ampliada para cobrir todo o espaço disponível. O comando usado para executar a operação varia dependendo do tipo de sistema de arquivos.

Supondo que temos um sistema de arquivos ext4 na partição, primeiro executaríamos uma verificação usando o comando e2fsck com a opção -f (para forçar a verificação mesmo que o sistema de arquivos pareça limpo) e então prosseguir com o redimensionamento real usando resize2fs, que, quando invocado sem nenhuma opção, estende o sistema de arquivos para todo o espaço de partição disponível:

$ sudo e2fsck -f /dev/sdc2 && sudo resize2fs /dev/sdc2

Reduzindo uma partição

Para reduzir uma partição, devemos executar os passos acima na ordem inversa: primeiro reduzimos o sistema de arquivos (se houver) para um tamanho ligeiramente menor que o novo tamanho que usaremos para a partição, ou para o tamanho mínimo possível (é isso que fazemos no exemplo abaixo, com a opção -M), então reduzimos o particionamos em si e, finalmente, ampliamos o sistema de arquivos novamente, para que ele use todo o espaço disponível.

Supondo que queiramos reduzir a segunda partição do disco para 2 GiB, executaríamos:

$ sudo e2fsck -f /dev/sdc2 && sudo resize2fs -M /dev/sdc2

Neste ponto podemos iniciar o gdisk e realizar os mesmos passos que fizemos no exemplo anterior, desta vez fornecendo um setor final ou um tamanho de partição menor que o atual. Depois que as alterações forem salvas e gravadas no disco, ampliamos o sistema de arquivos para cobrir todo o espaço disponível:

$ sudo e2fsck -f /dev/sdc2 && sudo resize2fs /dev/sdc2

Executando operações de forma não interativa com sgdisk

Como já dissemos, embora gdisk seja um programa interativo, sgdisk é um utilitário de linha de comando que pode ser usado para realizar operações de forma não interativa. Vamos ver como realizar as mesmas operações que realizamos nos exemplos anteriores, diretamente com o sgdisk.

Criando uma tabela de partição GPT

Para criar uma tabela de partição GPT com sgdisk, tudo o que precisamos fazer é executar o seguinte comando:

$ sudo sgdisk -o /dev/sdc

Quando invocado com a opção -o (ou --clear), o sgdisk limpa qualquer tabela de partição existente no dispositivo fornecido e cria uma nova tabela de partição GPT. Novamente, como o programa foi criado para ser usado a partir de scripts, nenhum aviso será emitido e nenhuma confirmação será solicitada, portanto ele deve ser usado com cuidado.

Criando uma partição

Para criar uma nova partição, invocamos sgdisk com a opção -n (abreviação de --new) e fornecemos o número da partição, início e fim da partição com a seguinte sintaxe :

partition_number:partition_start:partition_end

Para criar uma partição com número 2 que utiliza o primeiro setor inicial disponível, com tamanho de 1GiB (1024 MiB), portanto escreveríamos:

2::+1G

Se quisermos que a partição cubra todo o espaço disponível no disco, usaríamos 0 como valor final da partição:

2::0

Se quisermos usar um código HEX específico para a partição, devemos usar a opção -t (abreviação de --typecode) com a seguinte sintaxe:

partition_number:hexcode

O comando completo para criar a partição e atribuir explicitamente o código hexadecimal 8300 seria:

$ sudo sgdisk --new 2::+1G --typecode 2:8300 /dev/sdc

Removendo uma partição

Para remover uma partição do disco diretamente da linha de comando, sem qualquer interação, temos que usar sgdisk com a opção -d (--delete), e fornecer o número da partição como argumento de opção. Para excluir a partição número 2, escreveríamos:

$ sudo sgdisk --delete 2 /dev/sdc

Redimensionando uma partição

O processo de redimensionamento de uma partição com sgdisk é o mesmo que usamos interativamente com gdisk, mas é realizado em uma linha, por exemplo, para ampliar a segunda partição do disco para que ela cubra todo o espaço disponível, executaríamos:

$ sudo sgdisk \
  -d 2 \
  -n 2:0:0 \
  -u 2:D6FF2779-6F14-4E3E-876C-83E38F3A3FD7 \
  /dev/sdc

No exemplo acima a opção -d, como sabemos é usada para deletar a partição, -n é usada para criar uma nova com o mesmo número e o valor padrão para setores inicial e final (0, significa “usar o padrão”).

Finalmente, a opção -u é a abreviação de --partition-guid: nós a usamos para atribuir à nova partição o mesmo GUID da partição excluída.

Para solicitar informações sobre uma partição específica, podemos usar a opção -i e fornecer o número da partição. Por exemplo:

$ sudo sgdisk -i 2 /dev/sdc

Conclusões

Neste tutorial aprendemos como usar os utilitários gdisk e sgdisk para manipular tabelas de partição GPT. Vimos que o primeiro é um programa que deve ser usado de forma interativa e fornece prompts de confirmação e outras medidas de segurança, enquanto o último deve ser usado diretamente na linha de comando ou dentro de scripts de shell, e as modificações que fizemos com ele são imediatamente eficaz. Vimos como criar novas tabelas de partição e como criar, remover e redimensionar partições com ambas as ferramentas. A manipulação de partições é uma atividade perigosa e deve ser realizada com cuidado. Para mais informações sobre as ferramentas mencionadas, consulte seus respectivos manuais.

Artigos relacionados: