我最近意识到我们可以使用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有一个 …
我在 ubuntu 系统上运行以下命令:
dd if=/dev/random of=rand bs=1K count=2
Run Code Online (Sandbox Code Playgroud)
但是,每次运行它时,我都会得到一个不同大小的文件。为什么是这样?如何生成填充随机数据的给定大小的文件?
我有一个带有几个 ext4 分区的驱动器(SD 卡),但还有一些未分配的空间。该fstrim
实用程序只能在文件系统中工作。在我重新发明轮子并编写一个之前,是否有另一种实用程序可以修剪未分配的空间(或者可以修剪明确指定的范围)?
我可以验证控制器当前不知道设备上的大部分未分配空间是否可用,正如我观察到的那样,在这张特定的卡上,读取到修剪过的空间返回 0,但设备的扫描显示留下了大量的垃圾数据。
编辑:我在使用hdparm
. 下面的示例丢弃了第一个扇区,但无论我指定的范围如何,我都会看到相同的结果。fstrim
设备上没有问题:
root@ubuntu:~# hdparm --please-destroy-my-drive --trim-sector-ranges 0:1 --verbose /dev/mmcblk0
/dev/mmcblk0:
trimming 1 sectors from 1 ranges
outgoing cdb: 85 0d 06 00 01 00 01 00 00 00 00 00 00 40 06 00
outgoing_data:
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
Run Code Online (Sandbox Code Playgroud) 我购买了便宜的 2 TB HDD(每个 60 欧元),并想在使用它们之前检查它们是否返回读取时提供的数据。我检查了一些廉价的拇指驱动器,方法是复制我放在它们身边的大文件并检查它们返回的数据的哈希值(并发现那些在实际存储容量耗尽后将数据扔掉的)。不幸的是,我没有任何 2 TB 的文件。
我现在想生成 2 TB 的伪随机数据,将其写入磁盘,然后对磁盘进行散列。然后我想将相同的数据直接写入散列函数并获得它应该以这种方式产生的散列。伪随机函数不必以任何方式加密安全,它只需要快速生成具有高熵的数据。
如果我编写的脚本只是对包含数字的变量进行散列,将散列打印到标准输出,增加变量并重复,则数据速率太慢,即使在使用快速 CPU 时也是如此。像 5 个数量级太慢(甚至不是 60 kByte/s)。
现在,我可以尝试这样做,tee
但这似乎是一个非常糟糕的主意,我不能一遍又一遍地重现相同的数据。
理想情况下,我会向程序传递一些简短的参数(一个数字、一个字符串,我不在乎)并在其标准输出中获取任意大量的数据,并且每次调用时这些数据都是相同的。
我擦磁盘使用
wipefs -a /dev/sda.
Run Code Online (Sandbox Code Playgroud)
我很高兴地格式化了磁盘,似乎当我要挂载/dev/sda3 时,它显示"unknown file system type crypto_LUKS"。
我在这个分区上没有加密,所以就像以前的配置以某种方式保存了一样。如果我显然擦除或重置了磁盘,这怎么可能?
我是否必须先打开并解密并删除该驱动器上的加密?