在嵌入式开发过程中,经常遇到从8GB/32GB的SD卡导出系统.img镜像文件,然而dd命令导出的镜像文件会把整个SD卡的内容都包含在内,包括未使用的空间,当你想把这个镜像文件烧录到一个更小的SD卡时,就会出现空间不足的问题。为了避免这种情况,我们需要对镜像文件进行瘦身处理,去除未使用的空间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #!/bin/bash
IMAGE="$1" if [ -z "$IMAGE" ]; then echo "用法: $0 <镜像文件>" exit 1 fi
LAST_SECTOR=$(fdisk -l "$IMAGE" 2>/dev/null | grep "^$IMAGE" | tail -1 | awk '{print $3}')
if [ -z "$LAST_SECTOR" ]; then echo "无法获取分区信息" exit 1 fi
NEW_SIZE=$(( (LAST_SECTOR + 2048) * 512 ))
echo "原始大小: $(stat -c%s "$IMAGE") 字节" echo "新大小: $NEW_SIZE 字节"
cp "$IMAGE" "${IMAGE}.backup"
truncate -s $NEW_SIZE "$IMAGE"
echo "镜像已精简完成" echo "节省空间: $(( $(stat -c%s "${IMAGE}.backup") - $(stat -c%s "$IMAGE") )) 字节"
|
这个脚本的工作原理如下:
- 获取镜像文件:脚本接受一个参数,即要处理的镜像文件名。
- 获取最后分区的结束扇区:使用
fdisk
命令获取镜像文件的分区信息,并提取最后一个分区的结束扇区。
- 计算新大小:根据最后分区的结束扇区计算新的镜像文件大小,并添加一些缓冲空间。
- 备份原文件:在修改之前备份原始镜像文件。
- 截断文件:使用
truncate
命令将镜像文件截断到新的大小。
- 输出结果:显示原始大小、新大小以及节省的空间。
使用这个脚本可以大大简化镜像文件的处理流程,避免手动计算和操作,提高工作效率。只需将脚本保存为shrink_image.sh
,然后运行bash shrink_image.sh your_image.img
即可自动完成镜像瘦身。确保在执行脚本前备份重要数据,以防止意外数据丢失。