dd 可以覆盖相邻的分区吗

Log*_*ker 16 dd

dd if=/dev/zero of=somepartition bs=512
Run Code Online (Sandbox Code Playgroud)

还擦除分区后somepartition或停止在结束somepartition

sud*_*dus 19

覆盖分区 dd

dd是一个非常强大但也很危险的工具。它会做你告诉它做的事情,没有问题。因此,如果您告诉它擦除全家福,......这是一个轻微的打字错误。

但是,如果您检查并仔细检查,则可以使用它。

dd if=/dev/zero of=somepartition bs=512
Run Code Online (Sandbox Code Playgroud)

或者我会建议

dd if=/dev/zero of=/dev/sdxn bs=4096
Run Code Online (Sandbox Code Playgroud)

其中x是驱动器号,n是分区号和块大小 4096 字节使写入过程更快。

在这种情况下,写入分区很重要。如果您写入整个驱动器(驱动器头端)/dev/sdx,整个驱动器将被覆盖。但是写入分区会在分区结束时中断,并且会保留其后面的分区。(我现在在 Lubuntu 16.04 LTS 中的 U 盘上进行了测试,所以我知道它是这样工作的。)

扩展分区的例外

扩展分区有一个例外(它是逻辑分区的容器,以便在 MSDOS 分区表中有四个以上的分区)。这在以下链接中有所描述,

我可以使用 dd 制作“扩展”分区的图像吗?

但还有另一个问题。我在测试环境中测试了您的命令,当我希望它制作扩展分区的映像时,dd 只读取了 1 千字节(1024 字节)。

我现在也在 Lubuntu 16.04 LTS 的 U 盘上测试了这个,这适用于写作(以及阅读)。只有第一个 kibibyte 会被覆盖。

总而言之,覆盖主分区和逻辑分区根据此答案中的主要描述工作。但不要使用此方法覆盖扩展分区,因为只会覆盖第一个 kibibyte。扩展分区的逻辑分区将不再通过分区表找到,但存储在其中的数据仍然存在。

  • @LogicBreaker,也许您可​​以接受。但这并不重要。更重要的是你了解如何使用`dd`并且它有风险,所以你在使用它时要非常小心。祝你好运:-) 一般来说,你应该总是有一个所有文件的**备份**,你不能丢失。 (4认同)

Jör*_*tag 5

我认为您的问题是基于对dd(实际上是类 Unix 操作系统)如何工作的根本误解:

dd不能覆盖相邻的分区,只是因为dd不能覆盖分区,period

dd只是写入文件。就是这样。

现在,如果传递dd一个代表多个分区的文件,那么dd将覆盖该文件。但在这种情况下,它不会dd写入超过分区的末尾。dd仍然会写到文件末尾,并且写到文件末尾。

但是,如果您传递dd一个仅代表一个分区的文件,则dd不会写入超过该分区的末尾。同样,这与dd. dd只需写入您告诉它写入的文件。该文件代表单个分区的事实(在这种情况下)由内核中的块设备驱动程序确保。dd与此无关。

所以,简而言之:dd写入文件。这些文件所代表dd的内容与 无关。dd对分区一无所知。

  • Jorg 引用了 Unix 哲学的主要思想之一——“一切都是文件”。因此,内核将分区、设备、端口等呈现为文件。因此,每个可以写入文件的程序都可以用于写入分区或设备。内核的工作是强制执行分区边界。您可以在文本编辑器中打开 `/dev/sda` 并更改数据,`dd` 在能够访问分区方面与任何其他程序没有区别。很好的答案! (3认同)