我正在尝试创建图像/dev/sda
并将输出写入.iso
同一设备上的新文件。如何排除新的图像文件;从而防止输出变成自己的输入,反之亦然?正如您所看到的,它最终会创建某种无限反馈循环(如衔尾蛇),直到没有可用空间为止。
root@linux:~# df /dev/sda1
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 303569136 4313624 283812008 2% /
root@linux:~# dd if=/dev/sda of=/root/image.iso
306419534336 bytes (306 GB, 285 GiB) copied, 10098.4 s, 30.3 MB/s
dd: writing to '/root/image.iso': No space left on device
598483361+0 records in
598483360+0 records out
306423480320 bytes (306 GB, 285 GiB) copied, 10099.5 s, 30.3 MB/s
root@linux:~# df /dev/sda1
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 303569136 303552756 0 100% /
root@linux:~# ls -sh /root/
total 286G
286G image.iso
答案1
你无法从这里到达那里。
相反,你无法做你想做的事。请记住,dd 只是读取和写入块...当您将其指向 /dev/sda 时,它会继续前进,正如您所注意到的。
如果您确保磁盘完全没有碎片,因此数据都是背靠背的,并且只添加这么多块(为了获取数据,但在到达要写入的位置之前停止),您也许可以这样做。检查 dd 的 bs(块大小)和计数参数。
可能对您有用的是,创建一个足够大小的空文件,向其中写入文件系统,挂载它,然后使用 rsync 将数据复制到新文件系统。然后只需卸载稀疏文件,您就拥有了包含所有数据的文件系统的“映像”。
答案2
您要求 dd 读取设备的块,而不是文件内容。如果你想读取文件系统数据,你可以使用转储实用程序之一,对于 ext,它是dump
,其他如 XFS 有一个xfs_
前缀。
本质上,您可以做的是使用 LVM 或 ZFS 并拍摄快照,这不会以与您不打算复制相同的明显方式消耗数据,而是仅在基础数据发生更改时才进行复制(复制到写)。
要做的dd
就是启动块 0,继续遍历整个设备,直到到达最后一个柱面,并且无法将原始数据存储在比原始数据更少的空间中。如果磁盘首先填满零:
dd if=/dev/zero of=/root/space_hog
然后,您可以删除该文件并立即通过压缩工具执行 dd 操作:
dd if=/dev/sda | gzip > /root/image.iso.gz
由于随机数据的压缩(此设备上有交换吗?)是一项棘手的工作,因此需要更长的时间。