Ubuntu命令行下缩小磁盘镜像img文件尺寸
Ubuntu命令行下缩小磁盘镜像img文件尺寸
要解决的问题
一个固件包里的system.img, 尺寸是1GB, 里面的内容只有470MB, 在设备上写入的时候报超出大小了, 所以想把这个img调整为512MB
网上查了很多, 没有一个好用的, 最后还是通过gparted在图形界面下完成的. 记录一下过程
步骤
1. 调节分区大小
将img挂载到loop设备
# 找到第一个未使用的loop设备, 可以直接用这个loop设备, 也可以新建一个, 不要和其它应用重复就行
sudo losetup -f
# 将img挂载到 loop18 设备
sudo losetup /dev/loop18 system.img.old
用gparted对此loop设备进行修改, 注意一定要在命令行用/dev/loop18 作为参数, 否则直接启动gparted是不显示这个loop设备的. 如果是在 VNC Viewer里面, 用 sudo 可能会有问题, 可以不带sudo, 运行时会自动弹出授权输入密码的对话框
sudo gparted /dev/loop18
通过gparted打开之后, 可以在界面上调节分区的大小, 例如缩小分区, 保存
处理完成后, 取消loop设备挂载
sudo losetup -d /dev/loop18
2. 裁剪img大小
此时就可以根据分区的大小, 对img进行裁剪. 使用 fdisk 查看img里的分区情况.
fdisk -lu system.img.old
裁剪img, 原来的sector范围是 0 ~ 2097151 共 2097152, 保留一半为 2097152 / 2 = 1048576 sector大小 512 byte, 所以需要保留的size按 byte 就是 1048576 * 512 = 536870912
truncate --size=536870912 system.img.old
再挂载检查是否正确
# 挂载到loop设备
sudo losetup /dev/loop18 system.img.old
# 查看大小
sudo fdisk -lu /dev/loop18
# 挂载到文件系统, 检查文件是否挣钱
mount /dev/loop18 /mnt/mnt1/
# 取消文件系统挂载
sudo umount /mnt/mnt1
# 取消loop设备挂载
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