大西冰城的博客

自动化.img镜像瘦身脚本实现

Word count: 576Reading time: 2 min
2025/06/16
loading

在嵌入式开发过程中,经常遇到从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") )) 字节"

这个脚本的工作原理如下:

  1. 获取镜像文件:脚本接受一个参数,即要处理的镜像文件名。
  2. 获取最后分区的结束扇区:使用fdisk命令获取镜像文件的分区信息,并提取最后一个分区的结束扇区。
  3. 计算新大小:根据最后分区的结束扇区计算新的镜像文件大小,并添加一些缓冲空间。
  4. 备份原文件:在修改之前备份原始镜像文件。
  5. 截断文件:使用truncate命令将镜像文件截断到新的大小。
  6. 输出结果:显示原始大小、新大小以及节省的空间。
    使用这个脚本可以大大简化镜像文件的处理流程,避免手动计算和操作,提高工作效率。只需将脚本保存为shrink_image.sh,然后运行bash shrink_image.sh your_image.img即可自动完成镜像瘦身。确保在执行脚本前备份重要数据,以防止意外数据丢失。
CATALOG