调整磁盘映像文件中的分区大小后,如何更新磁盘映像文件上的分区表?

调整磁盘映像文件中的分区大小后,如何更新磁盘映像文件上的分区表?

我正在尝试调整磁盘上的磁盘映像(Raspbian 映像)的大小。

问题是,当我尝试从调整大小的映像(写入 SD 卡后)启动 RaspberryPi 时,我得到:

内核恐慌 - 不同步:VFS:无法在未知块上安装 root fs

(抱歉,我没有捕获确切的错误 - 如果相关,我可以更新)。

思考这是因为我没有更新分区表,这是背景:

初始图像分区

这是初始分区:

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

请注意,最初磁盘大小为 1389MB。

调整大小

添加 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

看起来不错 - 新的总大小为 1913 MB。

调整文件系统大小

所以现在我想调整第二个分区的大小以使用新空间。

使用偏移量创建循环设备(每扇区 512 个单位 * 137216 个扇区):

gregmac@test1:~/image$ sudo losetup -f --show test.img -o $((512*137216))
/dev/loop0

运行 e2fsck (因为如果不这样做的话 resize2fs 会抱怨)并 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.

看起来调整大小工作正常。我再次运行 e2fsck 以防万一,虽然它看到了新块,但没有其他迹象表明有问题:

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

也没什么价值,我可以安装这个循环设备:

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

df -h显示正确的尺寸:

Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0      1.7G  928M  667M  59% /home/gregmac/image/temp-mnt

分区表

这就是我的思考问题是:分区表未受影响:

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

请注意,结束和块值仍然是之前的值 - 不考虑空间的增加。我相信最终值应该是 3737599(扇区总数减 1),但我对此并不是 100% 清楚。

我原以为 resize2fs 会更新分区表,但显然它不会。

所以..

还值得一提的是,如果我跳过调整大小步骤,该图像启动得很好。

问题是我试图在脚本中作为自动构建的一部分来执行此操作,并且库存 Raspbian 映像没有足够的可用磁盘空间来安装我需要的所有内容。

  • 假设分区表是原因,我怎样才能更新它?
  • 我如何以可编写脚本的方式做到这一点? (它不需要交互式用户输入)

  • 如果分区表不是原因,那么是什么原因呢?

答案1

在调整文件系统大小之前,您需要调整底层分区的大小。

parted test.img resizepart 2 1980MB

然后调整文件系统的大小。

相关内容