有时我会在网上看到“确保你设置 'bs=' 因为默认值会花费太长时间”的评论,以及我自己非常不科学的经验,“这似乎比其他人花费的时间更长上周时间”似乎证明了这一点。因此,每当我使用“dd”(通常在 1-2GB 范围内)时,我都会确保指定 bytes 参数。大约有一半的时间我使用我从中复制的任何在线指南中指定的值;剩下的时间我会从'fdisk -l'列表中选择一些有意义的数字,我认为是较慢的媒体(例如我正在写入的SD卡)。
对于给定的情况(媒体类型、总线大小或其他重要事项),有没有办法确定“最佳”值?容易确定吗?如果没有,是否有一种简单的方法可以达到 90-95%?或者“只选择大于 512 的东西”甚至是正确答案?
我想过自己尝试这个实验,但是(除了工作量很大)我不确定哪些因素会影响答案,所以我不知道如何设计一个好的实验。
简短版本:在什么情况下可以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有一个 …
我有一个相当大的文件(35Gb),我想就地过滤这个文件(即我没有足够的磁盘空间来存放另一个文件),特别是我想 grep 并忽略一些模式 - 有没有办法在不使用其他文件的情况下执行此操作?
假设我想过滤掉所有包含foo:例如...
原问题:
完整的 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 小时。
驱动器开始出现故障,我只能通过其/dev/sdb设备文件名称来了解该设备。我可以使用哪些方法将该设备文件与实际硬件设备相关联,以了解要物理替换哪个驱动器?
奖励:如果我/dev/disk/在此安装中没有其子目录怎么办?(遗憾的是,我没有)
我有几个文件大小 > 1 GB。我需要从文件中删除最后几个字节。我该怎么做?我更喜欢就地编辑文件以节省磁盘空间。
我在 HP-UX 上。
以下 Python 代码的控制台等效项是什么:
target = file("disk", "w") # create a file
target.seek(2*1024*1024*1024) # skip to 2 GB
target.write("\0")
target.close()
Run Code Online (Sandbox Code Playgroud)
也许一些dd咒语?这个想法是制作一个表观大小为 2 GB 的文件,用于例如虚拟化。
kvm disk -cd whatever.iso #Only allocate space as necessary
Run Code Online (Sandbox Code Playgroud) 我已经阅读了有关如何使硬盘驱动器安全加密的信息,其中一个步骤是将随机位写入驱动器,以使加密数据与硬盘驱动器上的其余数据无法区分。
但是,当我dd if=/dev/urandom of=/dev/sda过去尝试使用时,预计 ETA 会在几天之内。我看到了一些关于使用badblocks代替 urandom 的内容,但这似乎并没有多大帮助。我只想知道是否有任何方法可以帮助我加快速度,例如dd我可能缺少的选项或其他内容,或者速度是否只是 HD 的限制。
如果我dd按如下方式使用命令:
dd if=/dev/zero of=/dev/sdX bs=16M
Run Code Online (Sandbox Code Playgroud)
如果它不是 16M 的精确倍数,那么在磁盘末尾会发生什么?这是否意味着磁盘的最后剩余部分没有归零?
我在https://www.marksanborn.net/howto/wiping-a-hard-drive-with-dd/ 中注意到,他写道美国政府使用
dd if=/dev/urandom of=/dev/sda bs=8b conv=notrunc
Run Code Online (Sandbox Code Playgroud)
该conv=notrunc选项是确保擦除每个最后一个字节的方法吗?
除了从解释man的网页和--help信息,以何种方式做的命令dd,cp以及rsync不同的使用拷贝文件的时候?在哪种情况下,这些中的每一个都优于其他的,对于“优越”的某些定义,以便它应该优先使用?
dd ×7
file-copy ×2
files ×2
hard-disk ×2
large-files ×2
block-device ×1
cloning ×1
cp ×1
editors ×1
encryption ×1
grep ×1
hp-ux ×1
io ×1
linux ×1
performance ×1
random ×1
rsync ×1
sparse-files ×1