使用 PiShrink 压缩Image file
如何使用 RPI BOOT 和 dd 命令进行备份

介绍。

工业级 Raspberry Pi 与 Raspberry Pi 计算模块(以下简称 CM)可以从固态硬盘驱动器或 microSD 卡启动,正如我们迄今为止所报道的那样。其基本思想是 eMMC 启动。
与 Raspberry Pi 4(”Pi 4″)和 5 不同,CM4 也无法在 eMMC 上写入启动加载程序。我们之前报道过,PL-R4 可以通过将 DIP 开关设置为写入启用,然后通过 USB 从另一个设备传输来替换。
eMMC 中的操作系统(系统区)的工作方式相同。Image文件通过 USB 电缆写入。这看起来有些麻烦,但这是一个不容易更换的系统。
对于工业用 raspi,操作步骤要复杂一些,但使用 dd 命令备份并用 PiShrink 压缩以缩短写入时间很方便。
对于一般的 Pi 4 和 Pi 5,将整个系统备份为Image文件时,使用 dd 命令的方法与本次相同。请参考以下内容。

当时的环境

由于传输图像文件的目的地是 CM4,因此我们使用 Pi 4 作为工作设备。工作设备也可以是 Windows 机器。

  • 工作设备:Raspberry Pi 4 (bookworm) 64bit (Pi 4)
  • 要备份的设备是 PL-R4 (CM4)
  • 使用 RPI BOOT(Windows 机器使用 rpiboot_setup.exe)。
  • 使用 USB-A 转 C 电缆
  • dd 命令(也支持带有 wic 扩展名的 bmap 方法)
  • 用∏收缩器压缩

Raspberry Pi 操作系统已更新升级。(截至本文撰写时的最新版本)

通常使用 Windows 的 Win32 磁盘管理器或 Linux 环境的 dd 命令来备份映像文件。

  • Win32 磁盘管理器(Windows)
  • dd 命令(Linux)

此外,由于这是 CM4 的备份,因此在执行 dd 命令之前需要执行 RPI BOOT。

安装 RPI BOOT

在运行中的 Pi4 上安装 RPI BOOT。在主目录中创建。
(如果在 Windows 机器上,请使用 rpiboot_setup.exe 安装:https://github.com/raspberrypi/usbboot/tree/master/win32)

sudo apt install git libusb-1.0-0-dev pkg-config build-essential
git clone --recurse-submodules --shallow-submodules --depth=1
https://github.com/raspberrypi/usbboot
cd usbboot
make
cd recovary

在 Pi 4(或 Windows 机器)上运行 RPI BOOT 后,用 USB 电缆连接工作设备和 PL-R4 (CM4),然后使用 dd 命令进行备份。

执行 RPI BOOT

执行 RPI BOOT 后,将 PL-R4 DIP 开关切换到支持写入的一侧,并用 USB 电缆将其连接到工作中的 Pi4。
Windows 版 RPI BOOT 的操作步骤相同。

RPI BOOT 的执行过程如下

cd ~/usbboot/recovary
sudo ../rpiboot -d .

在这种情况下,映像文件将备份到 recovary 目录中。
如果连接 USB 电缆后没有出现错误,则在作为工作设备的 Pi 4 的桌面上会出现一个将其识别为存储设备的对话框。
现在可以执行 dd 命令了。

运行 RPI BOOT 后,应通过 USB 电缆连接 PL-R4 和要备份的工作设备:
CM4 的 RPI BOOT 支持 USB 2.0

因此,请将其连接到工作设备 Pi 4 一侧的 USB 2.0 端口。
只连接到 CM4,USB 3.0 端口则卡在 I/O 错误状态。

官方文件还指出

  • The CM5 EEPROM supports MMC, USB-MSD, USB 2.0 (CM4 only), Network and NVMe boot by default. Try booting to Linux from an alternate boot mode (e.g. network) to verify the nRPIBOOT GPIO can be pulled low and that the USB 2.0 interface is working.
    https://github.com/raspberrypi/usbboot?tab =readme-ov-file#troubleshooting

运行 dd 命令


fdisk 命令可用于检查。sudo fdisk -l

这一次,您可以看到通过 USB 电缆连接的 CM4 是/dev/sdb

sudo fdisk -l /dev/sdb
Disk /dev/sdb: 29.12 GiB, 31268536320 bytes, 61071360 sectors
Disk model: 0001
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: 0x4ef66861
Device Boot Start End Sectors Size Id Type
/dev/sdb1 8192 1056767 1048576 512M c W95 FAT32 (LBA)
/dev/sdb2 1056768 61071359 60014592 28.6G 83 Linux

既然知道它是 /dev/sdb,就可以使用 dd 命令进行备份。

区块大小规格

dd 命令指定文件和块大小 (bs)。
有很多选项。如果指定 bs 和 conv=sync,至少可以省略计数。
bs 中指定的字节数是每次读/写的块大小。默认值为 512 字节。
它应该是所用介质物理块大小的倍数。(512 是 1024 (1M)…4096 (4M) 等)
虽然块大小越大速度越快,但使用较小的值更安全,因为如果出现错误,整个块大小将被销毁。即使块大小增大,完成速度也可能因此变慢。
添加status=progress作为跟踪进度的选项。没有它,就无法知道何时完成。

dd 命令格式示例(Image文件名)

sudo dd if=/dev/sdb of=backup-bookworm-4m.img bs=4M status=progress

if 代表 InFile,of 代表 OutFile。因此 if = 读取目标,of 是写入目标。
在 Raspberry Pi 的官方文档中,当写入时,bs=4M,因此我也将备份设置为 4M。
官方文档: https://www.raspberrypi.com/documentation/computers/compute-module.html#flash-the-emmc

结果为 31 GB,传输速率为 9.9 MB/s,耗时约 52 分钟。

31268536320 bytes (31 GB, 29 GiB) copied, 3159.45 s, 9.9 MB/s

我认为这次bs=4M就可以了,因为它是 USB 2.0。
就我个人而言,在我的 Raspberry Pi 上,我过去经常使用 bs=1M,因为它是 16GB 容量的 USB 2.0。
恢复备份的Image文件仍然使用 dd 命令。
由于文件大小较大,恢复需要时间,因此生成的 .img 文件会被压缩。

使用 PiShrink 压缩


对于一个 29 GB 的文件来说,写入Image文件的过程也需要近一个小时。
事实上,每个分区(bootfs、rootfs)实际使用的空间并不大。
在本例中,sdb1 和 sdb2 的实际使用空间分别为 75MB/512MB 和 4.7GB/29G。

Filesystem   Size   Used Avail Use%        Mounted on
/dev/sdb1    510M   75M  436M  15%    /media/raspida/bootfs
/dev/sdb2    29G    4.7G 23G   18%    /media/raspida/rootfs

从备份恢复时,为了尽快写入,应在写入前压缩生成的映像文件。
如果只压缩正在使用的区域,文件大小就会变小,存储图像文件的空间也不会过大。写入的总时间也会缩短,一举两得。

压缩图像文件的应用程序是 PiShrink。
PiShrink:https://github.com/Drewsif/PiShrink

写入压缩映像文件后,分区信息会显示更多可用空间。

在以前的 Raspberry Pi 操作系统中,这个可用空间是通过 raspi-config 手动扩展的。
不过,当前版本会在启动时自动扩展空间(Expanded)。
PiShrink 会将备份映像文件中的分区缩小到已用大小。这意味着文件大小会变小,因为它不包括可用空间。

安装并运行 PiShrink

首先,安装必要的软件包。
在撰写本文时,最新版本的书虫中只有 pigz 没有安装。

sudo apt update && sudo apt install -y wget parted gzip pigz xz-utils udev e2fsprogs

使用 wget 下载脚本文件,并以执行权限将其复制到/usr/local/bin

wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh
chmod +x pishrink.sh
sudo mv pishrink.sh /usr/local/bin

现在就可以开始了。
PiShrink 的使用格式如下。
这次,备份的映像文件创建在~/usbboot/recovary ,因此移动它并使用以下命令。

cd ~/usbboot/recovary
sudo pishrink.sh backup-image-name.img

原始的 .img 文件会被压缩后的大小所取代。
因此,文件大小从 30 GB 减少到 7.1 GB。

pishrink.sh: Gathering data
Creating new /etc/rc.local
pishrink.sh: Checking filesystem
rootfs: 144755/1846656 files (0.1% non-contiguous), 1345322/7501824 blocks
resize2fs 1.47.0 (5-Feb-2023)
pishrink.sh: Shrinking filesystem
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on /dev/loop0 to 1720340 (4k) blocks.
Begin pass 3 (max = 229)
Scanning inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/loop0 is now 1720340 (4k) blocks long.
pishrink.sh: Zeroing any free space left
pishrink.sh: Zeroed 1.8G
pishrink.sh: Shrinking partition
pishrink.sh: Truncating image
pishrink.sh: Shrunk backup-image-name.img from 30G to 7.1G

它可以在没有选项的情况下充分调整大小。

写入备份的图像文件

作为测试,我将还原目标指定为 USB 闪存驱动器并写入其中。
由于它来自同一个 Pi4,所以可以使用 Raspberry Pi Imager,但由于我费尽周折,所以我试着用 dd 命令写入。
USB 存储器的位置可以通过同样的方法查找sudo fdisk -l。在这种情况下,它是/dev/sdc
块大小 (bs) 是 4M,格式与备份中的 if= 和 of= 路径相反。

sudo dd bs=4M if=backup-image-name.img of=/dev/sdc conv=fsync status=progress

这是通过 PiShrink 缩减至 7.1 GB 的图像文件。
虽然这取决于使用的区域,但这次的写入时间仅为 10 分钟左右。
使用的 U 盘容量为 64 GB。

还支持使用 bmap 方法写入

在某些图像文件中,你会看到 .wic 而不是以前的 .img 扩展名。这就是 bmap 方法。
bmap 映像文件也支持使用此 RPI BOOT 写入 CM4。
据说 bmap 方法比 dd 命令更快。
这是因为它针对块映射进行了优化,而且比复制整个图像的方法更快,因为复制的数据更少。
此外,wic 还可以在生成图像后在 wks 文件中生成图像文件(bitbake)。
这最常用于在 Yocto meta-raspberrypi 环境中创建自己的镜像。
也可以使用 bmaptool 创建命令从现有图像文件中生成。
在这种情况下,写入速度并没有太大优势。不过写入速度要快一些。
bmap 方法是一种高效的编写方法,使用嵌入式 Linux 的用户都很熟悉。
为了试试,我安装了 bmap-tools,并从备份的映像文件创建了一个 bmap 文件。

sudo apt install bmap-tools

在使用 PiShrink 或其他方法压缩之前,将图像文件(RAW 磁盘图像)输出为 bmap 格式。

bmaptool create -o bmap-file-image.bmap backup-image-name.img

您可以指定在此生成的 .bmap 文件,并使用 bamptool 命令写入该文件。
有关 bmap 的更多信息,请参阅 Yocto Project 和 bmap-tools。

图像文件备份

对于 Pi 4 和 Pi 5,dd 命令无需任何操作即可直接通过。
对于像这样的 CM4(包括 PL-R4),您可以通过提前将设置更改为写入启用状态并执行 RPI BOOT,以同样的方式处理 dd 命令。
镜像文件可以使用 PiShrink 进行压缩,以减少写入时间。
较小的文件大小将使镜像文件作为备份存储更加方便。
这是一种即使在工业级 raspi 上也能使用 dd 命令进行备份和还原的方法。


文章由拉斯必达提供

非工程师也能愉快使用的 Raspberry Pi 信息网站 raspida.com一个非工程师也能享受和使用的 Raspberry Pi 信息网站。他还为 PiLink 网站提供有关工业用 Raspberry Pi 的技术博客文章