我最近意识到我们可以使用cat尽可能多的dd,而且它实际上比dd
我知道这dd在处理块大小实际上影响正确性而不仅仅是性能的磁带时很有用。然而,在这些日子里,是否存在dd可以做一些cat不能做的事情?(在这里,我认为不到 20% 的性能差异无关紧要。)
具体的例子会很好!
简短版本:在什么情况下可以dd安全地用于复制数据,安全意味着不存在由于部分读取或写入而导致损坏的风险?
长版本 — 序言: dd通常用于复制数据,尤其是从设备复制数据或向设备复制数据(示例)。有时将其归因于能够以比其他工具更低的级别访问设备的神秘特性(实际上是设备文件在发挥作用)——但dd if=/dev/sda与cat /dev/sda. dd有时被认为更快,但cat在实践中可以击败它。尽管如此,它dd具有独特的特性,使其有时真正有用。
问题: dd if=foo of=bar实际上与cat <foo >bar. 在大多数 unices¹ 上,dd对read(). (我发现POSIX在什么构成“读取输入块”方面很模糊dd。)如果read()返回部分结果(根据 POSIX 和其他参考文档,除非实现文档另有说明,否则允许这样做),则复制部分块。存在完全相同的问题write()。
观察:在实践中,我发现dd可以处理块设备和常规文件,但这可能只是我没有太多练习。说到管道,不难找dd错;例如试试这个代码:
yes | dd of=out bs=1024k count=10
Run Code Online (Sandbox Code Playgroud)
并检查out文件的大小(它可能远低于 10MB)。
问题:在什么情况下可以dd安全地用于复制数据?换句话说,在块大小、实现、文件类型等方面的哪些条件可以确保dd将复制所有数据?
(GNU dd有一个 …
我正在将一些数据 CD/DVD 复制到 ISO 文件中,以便以后在驱动器中不需要它们的情况下使用它们。
我在网上寻找程序,我发现了很多:
使用的cat复制介质:http://www.yolinux.com/TUTORIALS/LinuxTutorialCDBurn.html
cat /dev/sr0 > image.iso
Run Code Online (Sandbox Code Playgroud)dd这样做的用途(显然是最广泛使用的):http : //www.linuxjournal.com/content/archiving-cds-iso-commandline
dd if=/dev/cdrom bs=blocksize count=count of=/path/to/isoimage.iso
Run Code Online (Sandbox Code Playgroud)使用 justpv来完成此操作:有关man pv更多信息,请参阅此处,但这里有一个摘录:
Taking an image of a disk, skipping errors:
pv -EE /dev/sda > disk-image.img
Writing an image back to a disk:
pv disk-image.img > /dev/sda
Zeroing a disk:
pv < /dev/zero > /dev/sda
Run Code Online (Sandbox Code Playgroud)我不知道是不是所有的人都应该是等价的,虽然我测试了其中的一些(使用md5sum工具)和,至少,dd并且pv是不等价的。以下是md5sum使用每个过程的驱动器和生成的文件:
dd程序的md5: 71b676875b0194495060b38f35237c3c
光伏程序的md5: f3524d81fdeeef962b01e1d86e6acc04
编辑: …
原问题:
完整的 dd 副本需要多长时间才能完成?
到目前为止,它已经运行了 5 个小时,但仍在继续……
我使用的是 Linux Ubuntu 12.04 64bit,我使用的命令是:
dd if=/dev/sdb of=/dev/sdc
Run Code Online (Sandbox Code Playgroud)
更新:1
我现在可以看到进度了,复制 430GB 已经超过 6 个小时了。硬盘是3TB...
没有更快的方法吗?
更新:2
sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128K
Run Code Online (Sandbox Code Playgroud)
3TB 的 ETA 大约需要 9 小时,而在 6 小时后达到 430GB 之前,我猜使用前面的命令大约需要 36 小时。
我在 ubuntu 系统上运行以下命令:
dd if=/dev/random of=rand bs=1K count=2
Run Code Online (Sandbox Code Playgroud)
但是,每次运行它时,我都会得到一个不同大小的文件。为什么是这样?如何生成填充随机数据的给定大小的文件?
我有一台装有 Debian 的笔记本电脑,我打算卖掉这台笔记本电脑。
在出售 Debian 安装之前删除它是否足以从我的个人数据中完全清除我的笔记本电脑,如果是,我该如何卸载 Debian(以便笔记本电脑上没有任何操作系统)?
我受到以下限制:
.zip计算机上有一个 1.0 GB 的文件,其中包含一个文件,一个raspbian. 解压缩后,此文件为 3.2 GB,名为2015-11-21-raspbian-jessie.img.dd.在这些限制下,我可以将图像写入 SD 卡吗?
我知道可以通过管道传输数据tar,然后通过管道将数据传输到其他地方,但是,这是否仍然适用于zip文件格式,或者在访问任何文件之前是否需要解压缩整个存档?
我需要将一个磁盘复制到另一个磁盘。我尝试使用下面的命令,在 federo 中复制 1 TB 的磁盘需要将近一天的时间。
dd if=/dev/sda of=/dev/sdb
Run Code Online (Sandbox Code Playgroud)
我已经使用以下命令在 Unix(HP-UX) 系统上尝试了相同的操作,并在几个小时内完成
dd if=/dev/sda of=/dev/rdsk
Run Code Online (Sandbox Code Playgroud)
我可以用什么替代方法来更快地从磁盘复制到磁盘?
我有一个 1 TB 的文件。我想从字节 12345678901 读取到字节 19876543212 并将其放在具有 100 MB RAM 的机器上的标准输出上。
我可以轻松编写一个执行此操作的 perl 脚本。sysread 提供 700 MB/s(很好),但 syswrite 仅提供 30 MB/s。我想要更高效的东西,最好是每个 Unix 系统都安装的东西,并且可以以 1 GB/s 的速度交付。
我的第一个想法是:
dd if=1tb skip=12345678901 bs=1 count=$((19876543212-12345678901))
Run Code Online (Sandbox Code Playgroud)
但这效率不高。
编辑:
我不知道我是如何测量 syswrite 错误的。这提供了 3.5 GB/s:
perl -e 'sysseek(STDIN,shift,0) || die; $left = shift; \
while($read = sysread(STDIN,$buf, ($left > 32768 ? 32768 : $left))){ \
$left -= $read; syswrite(STDOUT,$buf);
}' 12345678901 $((19876543212-12345678901)) < bigfile
Run Code Online (Sandbox Code Playgroud)
并避免yes | dd bs=1024k count=10 | wc噩梦。
我正在尝试使用以下dd命令将远程 xfs 磁盘克隆到另一个位置。
ssh root@source_ip "dd if=/dev/vda2 bs=16M conv=noerror,sync status=progress " | sudo dd of=/dev/nvme1n1 bs=16M conv=noerror,sync status=progress
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误消息
828895133696 bytes (829 GB) copied, 39610.432258 s, 20.9 MB/s
1288490188800 bytes (1.3 TB) copied, 64529.849170 s, 20.0 MB/s
dd: error writing '/dev/nvme1n1': No space left on device
Run Code Online (Sandbox Code Playgroud)
源盘有 1TB,目标盘有 1.2TB。
谁能帮助解释为什么在这种情况下不能执行磁盘到磁盘克隆?谢谢!
我想尝试从源磁盘恢复已删除的文件,但我不确定 DD 是否是这种情况下唯一正确的工具。