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 的镜像。

烧录缩小后的镜像后,首次启动时间会延长,因为系统正在自动扩展分区。

posted @ 2026-08-07 01:55  一蜘  阅读(32)  评论(0)    收藏  举报