包含 2 个分区的外部 USB 闪存驱动器连接到我的 Raspberry Pi。dd
如果闪存驱动器上的第一个分区与图像文件的第一个分区不同,我想要将图像文件存储到此外部闪存驱动器。
为了实现这一点,我将比较它们的校验和。
计算闪存驱动器分区的校验和很容易:
md5sum /dev/sda1
但是,如何计算存储在映像文件中的第一个分区的校验和?
我使用 Debian 10 操作系统。
答案1
您可以使用为映像及其分区
losetup --partscan --find --show /path/to/disk.img
设置一个或多个循环设备 ( )/dev/loopN
例子
dd if=/dev/zero bs=1M count=100 >/tmp/100M.img pimg() { parted /tmp/100M.img --align optimal unit MiB "$@"; } pimg mklabel gpt pimg mkpart primary 2 50 pimg mkpart primary 51 100% pimg print Model: (file) Disk /tmp/100M.img: 100MiB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 2.00MiB 50.0MiB 48.0MiB primary 2 51.0MiB 100MiB 49.0MiB primary lo=$(losetup --partscan --find --show /tmp/100M.img); echo $lo /dev/loop0 ls ${lo}* /dev/loop0 /dev/loop0p1 /dev/loop0p2
与其生成两个校验和(这需要完整读取现有目标和源图像),不如使用
cmp
.这可能比生成校验和更有效,因为一旦出现字节不匹配,它就会停止。 (如果没有,它将读到最后,但这并不比您使用的替代方案慢md5sum
。)cmp /dev/loop0p1 /path/to/existing_image
如果您希望继续使用工具,例如
md5sum
可以使用我们之前创建的循环设备:md5sum /dev/loop0p1
不要使用
dd
- 这是至少使用起来同样快cat
或者pv
,也更容易(没有需要记住的繁琐的选项,如果你弄错了,可能会损坏数据):pv /dev/loop0p1 >/path/to/existing_image
答案2
您可以将图像文件安装为块设备,然后使用md5sum
您在问题中显示的命令。
请注意,下面显示的所有命令均假设您正在以root
.
对于原始磁盘映像
如果它是原始磁盘映像,您可以使用losetup
:
losetup -fP --show disk.img
这将分配一个循环设备(如/dev/loop0
),附加图像,并将分区公开为设备/dev/loop0p1
,/dev/loop0p2
等。
完成后,losetup -d <device>
断开图像连接。
对于 qcow2 图像
如果它是 qcow2 图像,您可以使用以下命令执行类似的操作qemu-nbd
:
加载
nbd
内核模块:modprobe nbd
将映像附加到 nbd 设备。在此命令中,我们将其附加到
/dev/nbd0
,但万一已在使用中,您可以指定任何可用的 nbd 设备(默认情况下有 16 个):qemu-nbd -f qcow2 -c /dev/nbd0 disk.qcow4
图像分区将显示为
/dev/nbd0p1
、/dev/nbd0p2
等。
完成后,运行qemu-nbd -d /dev/nbd0
以断开图像连接。