计算图像文件内分区的校验和

计算图像文件内分区的校验和

包含 2 个分区的外部 USB 闪存驱动器连接到我的 Raspberry Pi。dd如果闪存驱动器上的第一个分区与图像文件的第一个分区不同,我想要将图像文件存储到此外部闪存驱动器。

为了实现这一点,我将比较它们的校验和。

计算闪存驱动器分区的校验和很容易: md5sum /dev/sda1

但是,如何计算存储在映像文件中的第一个分区的校验和?

我使用 Debian 10 操作系统。

答案1

  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
    
  2. 与其生成两个校验和(这需要完整读取现有目标和源图像),不如使用cmp.这可能比生成校验和更有效,因为一旦出现字节不匹配,它就会停止。 (如果没有,它将读到最后,但这并不比您使用的替代方案慢md5sum。)

    cmp /dev/loop0p1 /path/to/existing_image
    

    如果您希望继续使用工具,例如md5sum可以使用我们之前创建的循环设备:

    md5sum /dev/loop0p1
    
  3. 不要使用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以断开图像连接。

相关内容