要解决的问题

一个固件包里的system.img, 尺寸是1GB, 里面的内容只有470MB, 在设备上写入的时候报超出大小了, 所以想把这个img调整为512MB

网上查了很多, 没有一个好用的, 最后还是通过gparted在图形界面下完成的. 记录一下过程

步骤

将img挂载到loop设备

sudo losetup -f
sudo losetup /dev/loop18 system.img.old

用gparted对此loop设备进行修改, 注意一定要在命令行用/dev/loop18 作为参数, 否则直接启动gparted是不显示这个loop设备的

sudo gparted /dev/loop18

处理完成后, 取消loop设备挂载

sudo losetup -d /dev/loop18

.查看img里的分区情况, 进行裁剪, 这个536871424是根据这个算出来的: 原来的块数是2097152, 需要保留的块数是 2097152 / 2 + 1 = 1048577, 每块大小512, 所以 1048577 * 512 = 536871424

fdisk -lu system.img.old
truncate --size=536871424 system.img.old

再挂载检查是否正确

sudo losetup /dev/loop18 system.img.old
sudo fdisk -lu /dev/loop18
mount /dev/loop18 /mnt/mnt1/
sudo umount /mnt/mnt1
sudo losetup -d /dev/loop18

.

Gparted中操作涉及的命令行

从截图可以看到, 这些是可以通过命令行实现的,

涉及的命令有:

# check file system
e2fsck -f -y -v -C 0 '/dev/loop18'

# shrink file system
resize2fs -p '/dev/loop18' 524288K
02-09 21:40