Ubuntu 16.04:使用以下命令创建了 64GB SD 卡映像:
date; sudo sh -c 'pv /dev/mmcblk0 >rpi4_Ubuntu18.1_64GB.image'; date
rasbperry pi SD 卡配备 Ubuntu 18.1
Ubuntu 16.04 笔记本电脑可以:
- 挂载 .image 文件?
- 在 .image 文件的挂载点上运行 zerofree?
- 卸载 .image 文件?
我知道可以将图像文件恢复到 SD 卡并使用zerofree处理卡并再次捕捉图像。如果能够在不将它们恢复到 SD 卡的情况下处理多个 .image 文件,那就太好了。
更新:测试结果
映像成功挂载到 /dev/loop9p2:
$ sudo losetup -P /dev/loop9 rpi4_Ubuntu18.1_64GB.image
$ ls -l /dev/loop9*
brw-rw---- 1 root disk 7, 9 Feb 2 19:12 /dev/loop9
brw-rw---- 1 root disk 259, 0 Feb 2 19:12 /dev/loop9p1
brw-rw---- 1 root disk 259, 1 Feb 2 19:12 /dev/loop9p2
零故障:
$ zerofree -v /dev/loop9p2
zerofree: failed to open filesystem /dev/loop9p2
需要零零sudo
:
$ sudo zerofree -v /dev/loop9p2
14346339/14348998/15073019
- 14346339 遇到的非零块数
- 14348998 文件系统中的空闲块数
- 15073019 文件系统内的总块数
奖励:使用脚本pishrink减小图像大小
zerofree
无论底层存储介质是什么,都在兼容的文件系统上运行。我的 Debian 10 系统上的版本zerofree
支持ext2
,ext3
和ext4
文件系统,所以如果 SD 卡上使用的文件系统是其中之一,答案是yes。但看起来您已经对整张卡进行了映像,其中可能有多个分区。如果是这种情况,您将无法仅“挂载映像文件”,因为 mount 命令一次只能处理一个文件系统。而在整盘镜像上,分区表通常会在磁盘的开头占用一些空间,因此您甚至可能无法通过尝试直接挂载整卡镜像来访问镜像上的第一个文件系统。
如果您的系统有一个
losetup
支持该-P
选项的命令,您可以执行一个losetup -P /dev/loop0 rpi4_Ubuntu18.1_64GB.image
,这将为您提供诸如 等设备/dev/loop0p1
-/dev/loop0p2
一个用于映像文件中的每个分区。然后,您可以挂载每个分区设备并zerofree
在它们上运行,然后卸载并losetup -d /dev/loop0
分离循环设备。如果您的
losetup
命令不支持该-P
选项,则有另一种选择:该kpartx
工具(有时单独打包,有时作为device-mapper-multipath
工具的一部分)可以为各个分区创建映射。在这种情况下,您将首先使用losetup /dev/loop0 rpi4_Ubuntu18.1_64GB.image
附加循环设备,然后kpartx -a /dev/loop
为在其上检测到的每个分区创建映射设备。在这种情况下,分区设备的命名会有所不同:它们将是/dev/mapper/loop0p1
等。安装和zerofree
过程将是相同的,但卸载文件系统后的清理也需要两个步骤:首先kpartx -d /dev/loop0
删除分区映射设备,然后losetup -d /dev/loop0
删除主循环设备。