Expandir automaticamente a última partição para usar todo o espaço não alocado, usando partidos no modo em lote

19

Para encurtar a história, preciso executar tudo isso automaticamente na inicialização (sistema incorporado).

Nossos engenheiros enviarão imagens para os dispositivos de produção. Essas imagens conterão uma pequena tabela de partição. Na inicialização, preciso expandir automaticamente a última partição (nº 3) para usar todo o espaço disponível no disco.

Aqui está o que recebo quando olho para o espaço livre no meu disco.

> parted /dev/sda print free
Model: Lexar JumpDrive (scsi)
Disk /dev/sda: 32.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  25.3MB  24.2MB  fat16        primary  legacy_boot
        25.3MB  26.2MB  922kB   Free Space
 2      26.2MB  475MB   449MB   ext4         primary
 3      475MB   1549MB  1074MB  ext4         primary
        1549MB  32.0GB  30.5GB  Free Space

Preciso expandir a partição 3 pelo número de bytes de N (30,5 GB)

Como faço para executar esta etapa automaticamente, sem aviso? Isso precisa funcionar com um tamanho dinâmico de espaço disponível após a 3ª partição.

Paul Knopf
fonte
Não espere receber um script pronto para usar, sem tentar! Então você pode nos mostrar o que você tentou até agora? Outra coisa a partição que você está redimensionando não deve ser montada durante a operação ....
Luciano Andress Martini
Eu tentei resizepartcomando, e funciona, mas requer um tamanho exato. Eu preciso que seja dinâmico.
Paul Knopf
resize2fspode ser o que estou procurando. linux.die.net/man/8/resize2fs
Paul Knopf

Respostas:

21

Nas versões atuais de parted, resizepartdeve funcionar para a partição ( partedentende 100%ou coisas assim -1s, esta última também precisa --parar de analisar as opções no cmdline). Para determinar o valor exato que você pode usar unit s, print free. resize2fsvem depois para o sistema de arquivos.


As versões antigas do partedtinham um resizecomando que redimensionaria a partição e o sistema de arquivos de uma só vez, até funcionou vfat.

Em uma modificação do Kobo ereader, usei isso para redimensionar ao máximo a 3ª partição da memória interna: (assume cegamente que não há 4ª partição e tabela msdos e outras coisas)

start=$(cat /sys/block/mmcblk0/mmcblk0p3/start)
end=$(($start+$(cat /sys/block/mmcblk0/mmcblk0p3/size)))
newend=$(($(cat /sys/block/mmcblk0/size)-8))

if [ "$newend" -gt "$end" ]
then
    parted -s /dev/mmcblk0 unit s resize 3 $start $newend
fi

Portanto, você também pode obter os valores /sys/block/.../se o kernel suportar. Mas partedremova o resizecomando para que você tenha que executar duas etapas agora, resizepartpara aumentar a partição e qualquer ferramenta que seu sistema de arquivos fornecer para aumentar isso, como resize2fspara ext*.

frostschutz
fonte
Era exatamente isso que eu estava procurando. Obrigado pela ajuda!
Paul Knopf
Pergunta secundária, o que há com os 8 bytes no final?
Paul Knopf
Evite redimensionar em um único setor ... você precisaria alterá-lo para -40 ou algo assim (cabeçalho de backup da GPT no final do disco).
frostschutz
Não partedsuporta extensão automática a partir da linha de comando? Porque, não apoiá-lo de forma interativa. Se executado interativamente, perguntará se você deseja corrigir a tabela de partição GPT para corresponder ao tamanho do disco (tipo fix) e, em seguida, você pode executar resizepart 3 -1. Eu tenho tentado descobrir como fazê-lo na linha de comando.
Harvey
Não é tão rápido: o comando redimensionar foi removido na parte 3.0. Tente sfdisk ou gparted.
Gregd
15

Sendo incapaz de escrever corretamente a parte dividida (solicitou confirmação porque a partição foi montada e, ao contrário de outras respostas que achei que não entendiam -1sou 100%), encontrei a ferramenta growpart que faz exatamente isso.

O uso é simples: growpart /dev/sda 3(e então resize2fs /dev/sda3, ou outro comando apropriado para o tipo de sistema de arquivos usado).

No Debian e no Ubuntu, ele é empacotado como cloud-guest-utils .

Ivo Smits
fonte
Esta é a maneira mais conveniente que eu poderia encontrar para isso agora. Funcionou maravilhosamente.
SebiF 13/09
Esta foi a solução para mim - se separaram não gostava ext4 como o sistema de arquivos, e parecia haver nenhuma maneira de evitá-la tentando redimensionar o sistema de arquivos ...
Antti Haapala
não funciona para o Ubuntu 18.04
DreamFlasher 23/04/19
@ DreamFlasher Não sei dizer por que não funcionou para você. Até onde eu posso ver, você pode instalar o pacote cloud-guest-utils e, como essa é a única função fornecida pelo growpart, ele deve funcionar, a menos que haja um erro, seja usado incorretamente ou se algo estiver fora de controle. Observe que o último argumento (3 no exemplo) é a partição a ser redimensionada, contando a partir de 1, e que espaço suficiente precisa estar disponível logo após a partição para poder redimensioná-la dessa maneira.
Ivo Smits
7

A maneira correta de fazer isso é usar o fato de que parted tem a noção de porcentagens. então

parted /dev/sda resize 3 100%
Jonathan Buzzard
fonte
1
desatualizado, não funciona com o Ubuntu 18.04 e mais tarde
DreamFlasher
Um pouco do comando redimensionar foi com a versão 3 separada, agora você precisa usar o comando redimensionar e redimensionar separadamente o sistema de arquivos subjacente ou o PV, se é isso que você está usando. Para ext4, o comando é resize2fs ou, para XFS, é xfs_growfs. Normalmente, ambos são feitos quando o sistema de arquivos é montado e o argumento é o ponto de montagem nos dois casos.
Jonathan Buzzard
0

No Ubuntu 18.04, sou capaz de redimensionar para preencher o espaço não alocado em um script com o seguinte:

sudo parted -s /dev/sdb "resizepart 2 -1" quit
sudo mount -av
sudo umount /dev/sdb2
sudo mount /dev/sdb2 /mnt
sudo resize2fs /dev/sdb2

Pode não ser necessário montar antes de redimensionar. Eu fiz isso para suprimir uma consulta do resize2fs para entrada do usuário.

Nolan Zinn
fonte