会
dd if=/dev/zero of=somepartition bs=512
也可以在
somepartition
之后擦除分区,或者停在somepartition
的末尾吗?会
dd if=/dev/zero of=somepartition bs=512
somepartition
之后擦除分区,或者停在somepartition
的末尾吗?dd
覆盖分区dd
是一个非常强大但也很危险的工具。它会按照你的指令执行而不会询问。所以如果你让它擦除了家庭照片,...只需要一个小的打字错误。
但是如果你仔细检查和反复核对,你可以使用它。
dd if=/dev/zero of=somepartition bs=512
dd if=/dev/zero of=/dev/sdxn bs=4096
在这种情况下,x
是驱动器的盘符,n
是分区号,块大小为4096字节可以加快写入过程。
重要的是您要写入一个分区。如果您写入整个驱动器(驱动器头部末尾)/dev/sdx
,整个驱动器将被覆盖。但是写入分区时,会在分区末尾中断,并保留其后面的分区。(我在Lubuntu 16.04 LTS上现在进行了测试,所以我知道它是这样工作的。)
对于扩展分区(用于在MSDOS分区表中拥有多于四个分区的容器),有一个例外情况。请参考以下链接进行了解:
但是还有另一个问题。我在测试环境中测试了您的命令,当我想要制作扩展分区的镜像时,dd只读取了1 kibibyte(1024字节)。 我现在在Lubuntu 16.04 LTS上对USB闪盘进行了测试,这也适用于写入(以及读取)。只有第一个kibibyte被覆盖。 因此,总结一下,覆盖主分区和逻辑分区的工作原理与此答案的主要描述相符。但是不要使用此方法覆盖扩展分区,因为只会覆盖第一个kibibyte。扩展分区的逻辑分区将无法通过分区表找到,但其中存储的数据仍然存在。dd
以及它的风险性,所以在使用时要非常小心。祝你好运 :-) 总的来说,你应该始终备份所有文件,那些你不能承受丢失的文件。 - sudodusdd
(实际上是Unix类操作系统)工作原理的根本误解:
dd
无法覆盖相邻分区,因为dd
根本无法覆盖分区,就是这样。
dd
只是简单地写入文件。仅此而已。dd
一个代表多个分区的文件,那么dd
将会覆盖该文件。但在这种情况下,并不是dd
超出分区末尾进行写入。dd
仍然会写入直到文件末尾,仅限于文件末尾。dd
传递一个只表示一个分区的文件,那么dd
不会写入超过这个分区末尾的内容。再次强调,这与dd
无关。dd
只会写入你指定的文件。这个文件代表一个单独的分区,在这种情况下,是由内核中的块设备驱动程序确保的。dd
与此无关。dd
写入文件。这些文件代表什么,与dd
无关。dd
对分区一无所知。dd
命令直接写入原始分区。您只能写入文件。当然,您可以将数据写入代表分区的块设备文件(例如/dev/sda1
),但是您无法直接写入原始分区。由于您只能写入代表分区的文件,因此无法超出分区的末尾进行写入,因为该文件仅代表分区本身,而不包括分区末尾之后的部分。 - Jörg W Mittag/dev/sda
并更改数据,dd
与其他任何程序一样能够访问分区。非常好的答案! - Sergey有一种危险但罕见的特殊情况,即使没有错误的块设备驱动程序,也可能发生以下情况:
dd if=/dev/zero of=/path/to/mount_point/zero_file bs=4096
rm -f /path/to/mount_point/zero_file
dd
并不是那么底层。实际上,大多数人使用dd
做的事情都可以用cat
来完成。事实上,cat
稍微快一些,因为它使用的默认块比dd
大。所有的底层代码都在内核中。驱动程序并不真正关心你是使用dd
还是cat
。 - kasperddd if=/dev/zero of=/dev/sda bs=512 count=1
或者 dd if=/dev/zero of=/dev/sda bs=512
是一些例子。使用第二个命令,它将持续写入并填满整个磁盘,"忽略"分区表。如果你指定一个分区 dd if=/dev/zero of=/dev/sda1
,它将不会超出该分区。这有点取决于你想用dd做什么。 - Pantherof=somepartition
,所以不适用于你写入整个磁盘设备的情况。dd
无法绕过设备驱动程序的限制。 - Barmar
/dev/sda1
,以一种无法通过它们访问相邻存储的方式(假设在内核上次读取分区表后未对其进行修改)。如果可以通过这种方式访问相邻存储,那将被视为一个巨大的错误。 - David Foerster