我正在尝试调整磁盘上的磁盘映像(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
然后调整文件系统的大小。