Como atualizo a tabela de partição em um arquivo de imagem de disco depois de redimensionar uma partição nela?

0

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:

Partições iniciais de imagem

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.

Redimensionar

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.

Redimensionar o sistema de arquivos

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

Tabela de partições

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.

Então ..

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.

  • Assumindo que a tabela de partições é a causa, como posso atualizá-la?
  • 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 é?

por gregmac 03.06.2017 / 06:49

1 resposta

1

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.

    
por 03.06.2017 / 08:10