SD/TF 卡镜像文件(.img)压缩:使用 PiShrink
PiShrink 简介
PiShrink 是一个专为树莓派/ARM 镜像设计的 Bash 脚本,能自动缩小镜像文件大小(截断未使用的空间),并支持注入自动扩容脚本,使烧录后的系统在首次启动时自动扩展分区至整个 SD 卡容量。
安装 PiShrink
sudo apt update && sudo apt install -y wget parted gzip pigz xz-utils udev e2fsprogs
wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh
chmod +x pishrink.sh
sudo mv pishrink.sh /usr/local/bin
缩小镜像(自动注入扩容脚本)
基本命令(缩小并直接覆盖原文件):
自动扩容功能默认开启,无需额外参数。
非树莓派设备 扩容脚本可能无效
若需禁用,加 -s。
sudo pishrink.sh your_image.img
生成新文件(保留原大文件):
sudo pishrink.sh your_image.img new_image.img
同时使用 XZ 压缩(生成 .xz 文件,体积更小):
sudo pishrink.sh -Z your_image.img # 生成 your_image.img.xz
-z 使用 gzip(较快),-Z 使用 xz(更小但慢)。
测试压缩后的镜像(验证完整性)
压缩后的镜像(如 .xz 文件)在烧录前建议进行完整性验证,确保文件系统未损坏、引导文件齐全。
解压(如使用了 -Z 或 -z 参数)
若压缩时使用了 -Z(xz)或 -z(gzip),需先解压:
unxz -k your_image.img.xz # -k 解压缩后保留原始的 .xz 文件
若为 gzip 格式,则用 gunzip your_image.img.gz。
查看分区表
使用 fdisk 查看镜像的分区布局,获取每个分区的起始扇区:
fdisk -l your_image.img
示例输出:
Disk your_image.img: 5.65 GiB, 6067884544 bytes, 11851337 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
Disklabel type: dos
Disk identifier: 0xe830825c
Device Boot Start End Sectors Size Id Type
your_image.img1 2048 526335 524288 256M 83 Linux
your_image.img2 526336 11851336 11325001 5.4G 83 Linux 526336 21497855 20971520 10G 83 Linux
Start 列即为该分区的起始扇区号。
扇区大小通常为 512 字节(可从 fdisk 输出中的 Sector size 行确认)。
计算偏移量
偏移量(字节) = 起始扇区号 × 扇区大小(通常为 512)
分区 1 偏移 = 2048 × 512 = 1048576
分区 2 偏移 = 526336 × 512 = 269484032
注意:根据你的镜像实际分区情况,计算对应的偏移值。
检查根文件系统(ext2/3/4)
使用 losetup 将根分区(通常是最后一个分区)挂载为 loop 设备,并运行 e2fsck 检查文件系统一致性:
# 自动分配空闲 loop 设备并设置偏移
sudo losetup -f -o 269484032 your_image.img
# 查看分配的设备名(例如 /dev/loop18)
sudo losetup -l | tail -1
# 检查文件系统(自动修复轻微错误)
sudo e2fsck -f -p /dev/loop18
# 输出 rootfs: 160442/333696 files (0.6% non-contiguous), 1083568/1415625 blocks
# 检查完成后释放设备
sudo losetup -d /dev/loop18
如果 e2fsck 报告 clean 或无错误,则文件系统正常。
挂载分区验证内容
挂载根分区(例如 / 目录):
sudo mkdir -p /mnt/check
sudo mount -o loop,offset=269484032 your_image.img /mnt/check
ls -l /mnt/check
# 应能看到 bin, etc, home, usr, var 等标准目录
若存在独立的 /boot 分区(如本示例中的第一个分区),挂载并检查引导文件:
sudo umount /mnt/check # 先卸载根分区
sudo mount -o loop,offset=1048576 your_image.img /mnt/check
ls -l /mnt/check
# 应能看到 vmlinuz, initrd.img, dtb, boot.scr 等文件
引导文件的存在是系统能否启动的关键。
挂载点清理(测试后)
sudo rmdir /mnt/check # 若目录为空
注意事项:
PiShrink 仅支持最后一个分区为 ext2/3/4 的镜像。
烧录缩小后的镜像后,首次启动时间会延长,因为系统正在自动扩展分区。

浙公网安备 33010602011771号