如果我希望使用 dd 实用程序克隆我的 Linux 映像,我可以这样做dd if=/dev/SDX of=/dev/SDY
,其中 SDX 是存储 Linux 映像的内部存储设备,SDY 是我想要将其复制到的外部存储设备。
但是,如果我在不克隆到不同存储设备并使用相同内部存储器的情况下执行此操作,例如:dd if=/dev/SDX of=/home/my_dir/my_image.img
,则会在实际图像所在的同一内部存储设备中创建图像文件。这似乎对我来说效果很好,但效果如何呢? /home/my_dir/
在里面/dev/SDX我正在克隆哪个?
答案1
确实,这似乎工作顺利——强调“似乎”。
为了简化说明,我假设一个没有日志记录的旧文件系统(如 ext2)。
dd 启动后,my_image.img
就会创建该文件。该文件存在的信息以及在哪里它身体上的驻留在磁盘上,存储在文件系统的索引中(将其视为“目录”)。文件的最终大小尚不清楚,因此它占用最小的默认大小(这通常不会向用户应用程序显示)。
当数据写入文件时,它会增长并且索引会定期更新。但是,索引也驻留在磁盘上。一旦dd复制了索引,副本中的索引就不再更新。如果您实际尝试使用该副本,您会发现它不完整。
当然,所有这些都是学术性的,因为 dd 无法将完整的图像文件放入其内部(除非您采用某种压缩)。
使用这样的命令,您可以自己尝试一下:
dd if=/dev/zero of=demo.raw bs=1M count=256 # create a dummy "partition" for demonstration
mkfs.ext4 demo.raw # create ext4 filesystem
target=$(mktemp -d) # create a temporary mountpoint
sudo mount demo.raw $target # mount the filesystem
sudo chown $USER $target # make filesystem root writable for current user
dd if=demo.raw of=$target/inner.raw bs=1M # copy fileystem into itself – error as expected (no space left on device)
rm $target/inner.raw
dd if=demo.raw bs=1M | gzip -c > $target/inner.raw.gz # copy fileystem into itself, using compression
gzip -c $target/inner.raw.gz > inner.raw # decompress image
sudo mount inner.raw /mnt # mount inner copy – error as expected (copy is an incomplete file)
sudo umount $target
rm demo.raw inner.raw
答案2
这不应该起作用。您不能将 8G RAW 图像放入具有 6G 可用空间的同一文件系统中。可能的解释:/dev/SDX 读取错误(坏扇区等),并且 dd 在到达磁盘末尾之前停止,导致输出映像小于磁盘(因此它适合)。再次尝试 dd:
# dd if=/dev/SDX oflag=direct conv=noerror,notrunc of=/path/image.img
并检查磁盘大小:
# df -h
以及生成图像的大小:
# ls -lh /path/image.img