Usando o sfdisk

Os programas cfdisk, fdisk e sfdisk, da suíte util-linux, voltaram a ser desenvolvidos de uns anos para cá. São particionadores modernos, que levam em conta a topologia do disco ao alinhar as partições e suportam GPT.

Me concentrarei no sfdisk, a ferramenta scriptável. Existem duas formas de fornecer-lhe entrada.

Esta é mais simples:

início tamanho tipo booteável

Os campos são separados por espaços, vírgulas ou ponto e vírgulas (uso vírgulas). Ao ser omitido, o programa adota um valor padrão para cada campo:

início:    primeiro setor livre
tamanho:   máximo disponível
tipo:      partição Linux, 0x83 (MBR/MS-DOS), 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (GPT)
           (ver sfdisk(8) para outros tipos)
booteável: desabilitado (MBR/MS-DOS apenas)

Ao criar mais de uma partição, cada uma é representada por uma linha. Exemplo:

,50G,L,*
,,L

Primeira linha:
- início: vazio (nada antes da vírgula), corresponde ao primeiro setor disponível, que, num disco limpo, considerando o alinhamento, equivale ao setor 2048.
- tamanho: 50 GiB (pode ser arredondado devido ao alinhamento).
- tipo: L é um atalho para partição Linux.
- booteável: * significa habilitado (vazio ou - significa desabilitado).

Segunda linha:
- início: vazio (nada antes da vírgula), corresponde ao primeiro setor após a partição anterior de 50 GiB (pode ser arredondado devido ao alinhamento).
- tamanho: vazio (nada entre as vírgulas), máximo disponível.
- tipo: L é um atalho para partição Linux.
- booteável: vazio (desabilitado).

Especificar tipo L é opcional, visto que é o padrão. Contudo, coloco mesmo assim para ajudar na organização.

MBR e GPT

Tipo de particionamento é especificado através da opção --label, cujos valores possíveis são dos, gpt, sun e sgi (os dois últimos não têm utilidade em PCs).

Voltando ao exemplo, podemos simplesmente enviar as linhas via STDIN:

# echo -e ',50G,L,*\n,,L' | sfdisk --label=dos /dev/sdx

# echo -e ',512M,U\n,,L' | sfdisk --label=gpt /dev/sdx

(U é EFI System Partition)

Colisões

Como discutido em Assinaturas, temos opções para evitar colisões de assinaturas: --wipe para o disco inteiro e --wipe-partitions para partições.

Para passar o rodo num disco já particionado e recomeçar do zero:

# echo -e ',50G,L,*\n,,L' | sfdisk --wipe=always --wipe-partitions=always --label=dos /dev/sdx

Cria novo rótulo (nova tabela de partições), apagando todas eventuais assinaturas presentes.

Ambas passaram a funcionar sem bugs a partir da versão 2.30 da suíte util-linux.

udev

Ao usar --wipe=always, existe uma grande probabilidade do udevd interferir no processo. O sfdisk apaga a assinatura de disco existente antes de continuar. Isso gera um uevent — o disco deixou de ser particionado momentaneamente —, que dispara processamento do udevd, com finalidade de atualizar suas propriedades. O sfdisk pode falhar em informar ao kernel quando o novo particionamento for completado se o udevd ainda estiver mantendo o dispositivo aberto.

Existe uma API que suprime o processamento de uevents enquanto uma trava exclusiva for mantida no dispositivo.

# echo -e ',50G,L,*\n,,L' | flock /dev/sdx sfdisk --wipe=always --wipe-partitions=always --label=dos /dev/sdx
# udevadm settle

A invocação de flock garante que o comando não falhará. Caso o udevd esteja trabalhando no dispositivo, flock aguarda. E, quando sfdisk finaliza, a trava é removida e o processamento de uevents recomeça.

A partir da versão 2.36, há a opção --lock=yes que torna flock desnecessário.

Por fim, chamamos udevadm settle depois do particionamento. Assim, garantimos que a fila de eventos do udevd estará vazia quando passarmos para os próximos comandos do script. Os dispositivos das partições (/dev/sdx1, /dev/sdx2, etc) estarão prontos, livres de quaisquer assinaturas anteriores, para serem formatados com seu sistema de arquivos preferido.

Relacionado:
Opção --lock das ferramentas da suíte util-linux

Comentários