我正在使用该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
进程使用(因此列0
中Avail
)。