Reduzindo Raspberry Pi SD .img via Ubuntu Server (cli)

2

Eu instalei o Raspbian em um cartão de 16 GB e expandi o sistema de arquivos. Quando fiz um backup dd do cartão, a saída do arquivo .img foi de ~ 16 GB. A maior parte é um espaço não utilizado na partição ext4 - estou usando apenas 2,5 GB nessa partição. (Existem duas partições - a primeira é FAT para boot e a segunda é ext4 para rootfs.) Eu gostaria de reduzir o arquivo backup.img que reside em uma instalação do Ubuntu 16.04 Sever (sem GUI) para que eu possa restaurar a imagem para um cartão de tamanho menor (digamos 8GB, por exemplo).

Até agora, montei a partição ext4 para /dev/loop0 usando o valor de deslocamento fornecido por fdisk -l backup.img . Então eu usei e2fsck -f /dev/loop0 e, em seguida, resize2fs -M /dev/loop0 , que parecia encolher o ext4 fs ... estou no caminho certo? Eu sinto que parted pode ser o próximo, mas eu tenho não experiência com ele.

Como faço isso usando apenas ferramentas cli?

Atualização:

Aqui está a saída da execução de fdisk -l backup.img :

Disk backup.img: 14.9 GiB, 15931539456 bytes, 31116288 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: dos
Disk identifier: 0x79d38e92

Device        Boot  Start      End  Sectors  Size Id Type
backup.img1 *      8192   124927   116736   57M  e W95 FAT16 (LBA)
backup.img2      124928 31116287 30991360 14.8G 83 Linux
    
por jsejcksn 25.04.2016 / 10:07

2 respostas

1

Posso confirmar que você está no caminho certo encolhendo esse sistema de arquivos; O fdisk / parted é o próximo. A parte complicada é acertar ao lado do tamanho do novo sistema de arquivos, fazer a sua matemática ou vazar cem KB a mais só para estar seguro. Você pode ajustá-lo mais tarde no novo cartão, se necessário.

A ordem é normalmente: umount, redimensionar, fdisk / parted, partprobe, fsck e mount para verificar se tudo está OK. Como a partição que você está redimensionando é menor que 2T, você pode usar fdisk ou parted .

O processo de redimensionamento tem que vir primeiro, já que você não será capaz de reduzir a partição de forma confiável enquanto o sistema de arquivos ainda reivindica o espaço que você precisa recuperar. Depois que você precisar encolher a partição mais uma vez para manter a consistência, e por não ter o espaço restante, você quer livrar-se de "reservado" para uso. O sistema de arquivos é o último a tornar a estrutura do sistema de arquivos consistente com o novo tamanho.

Vou deixar esses artigos de RH. Está faltando o partprobe , já que o novo tamanho da partição nem sempre é reconhecido imediatamente ou por kernels mais antigos.

Como reduzir um sistema de arquivos ext2 / 3/4 com resize2fs

Como redimensionar uma partição usando o fdisk

Suas etapas ausentes são:

sudo fdisk /dev/loop
p     - to check for partition number (probably 2)
d     - to delete
2     - partition 2
n     - new partition
p     - primary
ENTER - default beginning
+new size -  smaller card size
w      - write it

sudo partprobe /dev/loop

Para finalizar, desmonte o arquivo de imagem; como o tamanho extra não é mais marcado como usado pelo sistema de arquivos e pelo tamanho da partição na imagem do arquivo, o sistema operacional não tentará usar esse espaço. Por isso, pode ser truncado com segurança para o tamanho pretendido:

truncate -s 8GB fileName

Para usar os tamanhos apropriados, como sou preguiçoso, colocaria o sistema de arquivos em algo menor do que o necessário (ou seja, tamanho da nova partição - 400k e depois expandi-lo novamente depois de encolher a partição) e criaria a partição com o tamanho necessário (8GB-2048 (2K) para possível preenchimento da primeira partição - menos o tamanho da primeira partição). Não há muita matemática envolvida.

Para calcular corretamente, por favor, dê uma olhada:

Como redimensionar partições ext3 sem perder dados

    
por 25.04.2016 / 10:23
0

Que tal usar o Redutor automático de imagem RPi ?

Você também pode dar uma olhada no código para ver o que está acontecendo.

if [[ ! $(whoami) =~ "root" ]]; then
echo ""
echo "**********************************"
echo "*** This should be run as root ***"
echo "**********************************"
echo ""
exit
fi

if [[ -z $1 ]]; then
echo "Usage: ./autosizer.sh "
exit
fi

if [[ ! -e $1 || ! $(file $1) =~ "x86" ]]; then
echo "Error : Not an image file, or file doesn't exist"
exit
fi

partinfo='parted -m $1 unit B print'
partnumber='echo "$partinfo" | grep ext4 | awk -F: ' { print $1 } ''
partstart='echo "$partinfo" | grep ext4 | awk -F: ' { print substr($2,0,length($2)-1) } ''
loopback='losetup -f --show -o $partstart $1'
e2fsck -f $loopback
minsize='resize2fs -P $loopback | awk -F': ' ' { print $2 } ''
minsize='echo $minsize+1000 | bc'
resize2fs -p $loopback $minsize
sleep 1
losetup -d $loopback
partnewsize='echo "$minsize * 4096" | bc'
newpartend='echo "$partstart + $partnewsize" | bc'
part1='parted $1 rm 2'
part2='parted $1 unit B mkpart primary $partstart $newpartend'
endresult='parted -m $1 unit B print free | tail -1 | awk -F: ' { print substr($2,0,length($2)-1) } ''
truncate -s $endresult $1
    
por 25.04.2016 / 10:30