Dan*_*eer 4 linux terminal dd cloning hard-disk
假设我不小心跑了sudo dd if=/dev/sda of=/dev/sda
而不是sudo dd if=/dev/sda of=/dev/sdb
而且我不想等待 500gb 操作完成才知道我是否破坏了系统。
有谁知道结果会是什么,所以我可以安静地等待它完成,或者只是中断它并从全新安装开始这么长时间?
编辑:这是结果输出
$ time sudo dd if=/dev/sda of=/dev/sda bs=64K conv=sync,noerror status=progress
512001769472 bytes (512 GB, 477 GiB) copied, 9084 s, 56.4 MB/s
dd: error writing '/dev/sda': No space left on device
7814181+1 records in
7814181+0 records out
512110190592 bytes (512 GB, 477 GiB) copied, 9088.72 s, 56.3 MB/s
real 151m28.774s
user 0m28.459s
sys 5m33.146s
Run Code Online (Sandbox Code Playgroud)
孤立地,dd if=/dev/sdx of=/dev/sdx
将写入已经存在的相同数据。无害(*)。
但是,如果设备处于活动状态,例如被文件系统使用,则可能存在竞争条件:
dd 读取数据 (A),文件系统写入数据 (B),dd 写入数据 (A),导致 (B) 丢失/损坏。
所以它仍然可能导致数据丢失或系统崩溃。
如果是 SSD 存储,其他可能的副作用是浪费写入周期,并导致稀疏文件/精简卷/快照占用更多存储空间。
另请注意,如果您对常规文件而不是块设备执行相同操作,结果将是一个空文件并且所有数据都丢失:
$ dd if=foobar of=foobar
0+0 records in
0+0 records out
0 bytes copied, 0.000179684 s, 0.0 kB/s
Run Code Online (Sandbox Code Playgroud)
那是因为如果没有conv=notrunc
第一件事dd
就是将输出文件截断为 0 字节,那么在那个时候,它可以从 0 字节文件中读取的也是 0 字节。
(*) 除非您使用能够更改偏移量的其他选项,例如seek
, skip
, noerror
, sync
, ... 或者如果您最终使用不同但相同的设备if=/dev/sdx of=/dev/sdx1
,例如通过分区引入此类偏移量。在这种情况下dd
,最终会重复写入相同的数据模式(通过读取之前在偏移处写入的内容)。它会破坏一切。
还有一种更模糊的极端情况,即设备不规律地返回错误数据而没有将其正确报告为读取错误。在这种情况下,您最终会将损坏的数据写回设备。