Antes de redimensionar o sistema de arquivos, você precisa redimensionar a partição subjacente.
parted test.img resizepart 2 1980MB
Em seguida, redimensione o sistema de arquivos.
Estou tentando redimensionar uma imagem de disco (imagem Raspbian) no disco.
O problema é que quando tento inicializar o RaspberryPi a partir da imagem redimensionada (depois de escrever para um cartão SD) eu recebo:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block
(Desculpe, não capturei o erro exato - posso atualizar se for relevante).
Eu acho que é porque eu não estou atualizando a tabela de partições, aqui está o plano de fundo:
Aqui estão as partições iniciais:
gregmac@test1:~/image$ fdisk -l test.img
Disk test.img: 1389 MB, 1389363200 bytes
255 heads, 63 sectors/track, 168 cylinders, total 2713600 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
Disk identifier: 0x5a7089a1
Device Boot Start End Blocks Id System
test.img1 8192 137215 64512 c W95 FAT32 (LBA)
test.img2 137216 2713599 1288192 83 Linux
Note que inicialmente o tamanho do disco é 1389MB.
Adicione 500MB
gregmac@test1:~/image$ truncate -s +500M test.img
gregmac@test1:~/image$ fdisk -l test.img
Disk test.img: 1913 MB, 1913651200 bytes
255 heads, 63 sectors/track, 232 cylinders, total 3737600 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
Disk identifier: 0x5a7089a1
Device Boot Start End Blocks Id System
test.img1 8192 137215 64512 c W95 FAT32 (LBA)
test.img2 137216 2713599 1288192 83 Linux
Parece bom - o tamanho total do novo é 1913 MB.
Agora, quero redimensionar a segunda partição para usar o novo espaço.
Crie um dispositivo de loop usando o deslocamento (512 unidades por setor * 137216 setores):
gregmac@test1:~/image$ sudo losetup -f --show test.img -o $((512*137216))
/dev/loop0
Execute e2fsck (porque resize2fs reclama se você não o fizer) e resize2fs:
gregmac@test1:~/image$ sudo e2fsck -f /dev/loop0
e2fsck 1.42.9 (4-Feb-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0: 37167/80640 files (0.2% non-contiguous), 250800/322048 blocks
gregmac@test1:~/image$ sudo resize2fs /dev/loop0
resize2fs 1.42.9 (4-Feb-2014)
Resizing the filesystem on /dev/loop0 to 450048 (4k) blocks.
The filesystem on /dev/loop0 is now 450048 blocks long.
Parece que o redimensionamento funcionou corretamente. Eu corri o e2fsck novamente por precaução e, embora veja os novos blocos, nada mais indica um problema:
gregmac@test1:~/image$ sudo e2fsck -f /dev/loop0
e2fsck 1.42.9 (4-Feb-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0: 37167/112896 files (0.2% non-contiguous), 252824/450048 blocks
Também não vale nada, eu posso montar este dispositivo de loop:
gregmac@test1:~/image$ sudo mount /dev/loop0 temp-mnt
gregmac@test1:~/image$ ls temp-mnt/
bin boot dev etc home lib lost+found media mnt opt proc root run sbin srv sys tmp usr var
E df -h
mostra os tamanhos corretos:
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 1.7G 928M 667M 59% /home/gregmac/image/temp-mnt
Aqui está o que eu acho é o problema: a tabela de partições está intacta:
gregmac@test1:~/image$ fdisk -l test.img
Disk test.img: 1913 MB, 1913651200 bytes
255 heads, 63 sectors/track, 232 cylinders, total 3737600 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
Disk identifier: 0x5a7089a1
Device Boot Start End Blocks Id System
test.img1 8192 137215 64512 c W95 FAT32 (LBA)
test.img2 137216 2713599 1288192 83 Linux
Observe que o valor final e de blocos ainda é o que era antes - não representando o aumento no espaço. Eu acredito que o valor final deve ser 3737599 (setores totais menos 1), mas eu não estou 100% claro sobre isso.
Eu estava esperando que resize2fs atualizasse a tabela de partições, mas claramente não atualiza.
Vale mencionar também que, se eu pular as etapas de redimensionamento, esta imagem inicializa bem.
O problema é que estou tentando fazer isso em um script como parte de uma compilação automatizada, e a imagem Raspbian padrão não tem espaço livre em disco suficiente para instalar tudo o que preciso.
Como faço isso de uma maneira scriptável? (não pode exigir entrada interativa do usuário)
Se a tabela de partições não é a causa, o que é?
Antes de redimensionar o sistema de arquivos, você precisa redimensionar a partição subjacente.
parted test.img resizepart 2 1980MB
Em seguida, redimensione o sistema de arquivos.