使用 dd 克隆时磁盘空间不足,但 dd 继续复制

使用 dd 克隆时磁盘空间不足,但 dd 继续复制

我正在使用该dd工具将 Raspberry Pi SD 卡映像备份到我的本地计算机。克隆其中一张卡时,系统驱动器的可用空间不足。我的机器有 112 GB 可用空间,SD 卡为 128 GB。我发出的复制卡的命令如下:

sudo dd if=/dev/mmcblk0 of=pi_backup.img status=progress

dd当系统空间不足时,没有产生任何类型的错误或警告,并报告整个图像已复制到我的本地计算机。磁盘大小刚刚超过 128GB。系统存储完全满了。

dd输出:

128126352384 bytes (128 GB, 119 GiB) copied, 1524 s, 84.1 MB/s
250347520+0 records in
250347520+0 records out
128177930240 bytes (128 GB, 119 GiB) copied, 1524.57 s, 84.1 MB/s

df -h复制前的输出(/dev/loop为简洁起见,截断了设备):

Filesystem      Size  Used Avail Use% Mounted on
udev            7.7G     0  7.7G   0% /dev
tmpfs           1.6G  3.0M  1.6G   1% /run
/dev/nvme0n1p7  202G   79G  112G  42% /
tmpfs           7.7G   34M  7.7G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           7.7G     0  7.7G   0% /sys/fs/cgroup
/dev/nvme0n1p1  186M   94M   93M  51% /boot/efi
tmpfs           1.6G   20K  1.6G   1% /run/user/125
tmpfs           1.6G  132K  1.6G   1% /run/user/1000
/dev/mmcblk0p1  253M   50M  203M  20% /media/tdarby/boot
/dev/mmcblk0p2  118G   15G   99G  13% /media/tdarby/rootfs

df -h复制后输出:

Filesystem      Size  Used Avail Use% Mounted on
udev            7.7G     0  7.7G   0% /dev
tmpfs           1.6G  3.0M  1.6G   1% /run
/dev/nvme0n1p7  202G  199G     0 100% /
tmpfs           7.7G   34M  7.7G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           7.7G     0  7.7G   0% /sys/fs/cgroup
/dev/nvme0n1p1  186M   94M   93M  51% /boot/efi
tmpfs           1.6G   20K  1.6G   1% /run/user/125
tmpfs           1.6G  136K  1.6G   1% /run/user/1000

ls -lh pi_backup.img复制后:

-rw-r--r-- 1 root root 120G Jan 12 15:28 pi_backup.img

复制后尝试写入磁盘:

~$ echo "hello" >> out.txt
bash: echo: write error: No space left on device

然而,dd从来没有犯过错误。事实上,如果我dd之后再次运行,它会不断复制新映像,就好像磁盘未满一样!

从日志中可以看出,磁盘原本有112G可用空间,复制后文件大小为120G。

据我了解,dd当其输出磁盘已满时,应该会出错,给出类似于dd: error writing ‘/dev/sdx’: No space left on device.没有产生这样的警告。

我担心它dd覆盖了我的磁盘上的相邻文件或分区。即使现在,磁盘仍然满了,我可以dd再次运行该命令,它不会抱怨磁盘已满,它只是继续复制。

这里的预期行为是什么?

答案1

请注意,千兆字节 (GB) 与千兆字节 (GiB, G) 不同。

  • 1 GiB == 1 GiB == 1024 3字节 == 2 30字节 == 1,073,741,824 字节
  • 1 GB == 1 GB == 1000 3字节 == 10 9字节 == 1,000,000,000 字节

df后缀使用了 2 个变体的力量,看看如何dd告诉您这两个变体(128 GB、119 GiB)

您的文件系统有 202G - 79G =~ 123 GiB 可用空间,其中一些是保留的,root 这解释了为什么该Avail列显示 112G(iB),因此足以容纳设备的 119GiB。

确实dd成功了,您会看到仍然有 202G - 199G =~ 3GiB 空闲,即使这些仅可供root进程使用(因此列0Avail)。

相关内容