dd可以覆盖相邻分区


15

dd if=/dev/zero of=somepartition bs=512

还擦拭分区之后somepartition或结束somepartition


5
代表分区的块设备(例如/dev/sda1)是由内核以无法访问它们的方式创建的(假定分区表在内核最后一次读取后未更改)。如果您可以通过这种方式访问​​相邻的存储,那将是一个巨大的错误。
大卫·佛斯特

Answers:


18

使用覆盖分区 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的USB笔式驱动器上进行了测试,因此我知道它可以那样工作。)

扩展分区的例外

扩展分区(为逻辑分区的容器,以便在MSDOS分区表中具有​​四个以上的分区)是一个例外。在以下链接中对此进行了描述,

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

但是,还有另一个问题。我在测试环境中测试了您的命令,并且当我希望它构成扩展分区的映像时,dd仅读取一个kibibyte(1024字节)。

我现在也在Lubuntu 16.04 LTS的USB笔式驱动器上对此进行了测试,这适用于写入(以及读取)。仅第一个kibibyte被覆盖。

综上所述,覆盖主分区和逻辑分区根据此答案中的主要描述进行工作。但是不要使用此方法来覆盖扩展分区,因为只有第一个kibibyte会被覆盖。扩展分区的逻辑分区将不再通过分区表找到,但是存储在扩展分区中的数据仍然存在。


我已经接受了,但是如果是这样,这应该是正确的答案。
LogicBreaker

3
@LogicBreaker,也许您可​​以移动接受。但这并不重要。更重要的是您了解如何使用dd并且具有风险,因此在使用时要非常小心。祝您好运:-)通常,您应该始终备份所有文件,以免丢失。
sudodus

1
写入裸分区时,您没有很多选择。我感动了,否则会误导他人。
LogicBreaker

1
这就是为什么用户通常无法访问/ dev / *“文件”的原因。
托尔比约恩Ravn的安徒生

1
如果这是您家庭照片中唯一没有备份的副本,那么您随时可能会因盗窃,火灾,事故或简单的硬件故障而丢失照片:-)
user334639

4

写入分区设备不会用dd或其他任何东西在该分区之外进行写入。您可能需要使用全盘设备才能在单个分区之外产生任何影响。

(注意:除非磁盘上的分区表具有重叠的分区,否则永远不会发生。)


3
另一个警告:如果您使用的是LVM之类的东西,则写入物理卷当然会影响许多逻辑卷。
Maxpm

4

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

dd无法覆盖相邻分区,仅是因为dd无法覆盖分区period

dd只需写入文件。而已。

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

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

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


嗯... dd只写文件,你不能用它写原始分区。
LogicBreaker

1
正确。您不能dd用于写入原始分区。您只能写入文件。您当然可以写入代表分区的块设备文件(例如/dev/sda1),但不能写入原始分区。而且,由于只能写一个代表分区的文件,所以不能写超出分区末尾的内容,因为该文件仅代表分区,而不代表分区末尾。
约尔格W¯¯米塔格

3
Jorg提到Unix哲学的主要思想之一-“一切都是文件”。这样,内核将补丁,设备,端口等呈现为文件。结果,每个可以写入文件的程序都可以用来写入分区或设备。强制执行分区边界是内核的工作。您可以/dev/sda在文本编辑器中打开并更改数据,dd就可以访问分区而言,它与任何其他程序都没有什么不同。很好的答案!
谢尔盖(Sergey),

1

有一种危险但罕见的特殊情况,即使使用非越野车块设备驱动程序,也可能发生这种情况:

  • 更改磁盘上的分区表的方式是,将分区x的大小调整为在比以前更低的边界处结束。调整其后面的分区y的大小,使其从较低边界的顶部开始调整大小,或者将新的分区y添加到该空间中。
  • 分区y通过独立于分区表的方式填充了相关数据,例如在整个磁盘块设备(例如/ dev / sda)上将dd与skip / count选项一起使用
  • 不会发出通知内核重新读取分区表的ioctl,或者由于设备繁忙而失败
  • 分区x会由尝试写入分区x的任何进程写入,直到遇到错误情况为止。

0

您必须谨慎对待dd,因为如果您犯了一个错误,您可以覆盖的范围超出了讨价还价的范围,并且这取决于您使用dd的目的(OP对dd的用法以及dd的确切语法含糊不清命令)。

如果您指定一个分区,它将写入该分区,直到该分区已满。

如果您输错了整个磁盘,例如= / dev / sda,则dd将写入整个磁盘开始,以完成忽略(覆盖)分区表的操作。

您还可以在分区上使用dd来覆盖已删除的文件(已删除的文件可能会保留在该分区上,并被各种恢复工具以不同程度的成功发现,直到被覆盖为止。在这种情况下,您可以使用dd来填充可用空间写入文件。

dd if=/dev/zero of=/path/to/mount_point/zero_file bs=4096
rm -f /path/to/mount_point/zero_file

但是,根据您的操作,您可能希望使用其他工具来安全地删除文件。请参阅如何以安全方式删除文件?选择。


6
如果您可以写入/ dev / sdcX并设法在分区边界上进行写入,那么忽略分区表并不奇怪-这是内核中的块设备驱动程序出现故障并忽略了分区表。
rackandboneman

1
@sudodus dd不是那么低的水平。实际上,人们所做的大多数事情都可以使用dd来完成cat。实际上cat,速度稍快,因为它使用的块比dd默认情况下大。所有低级代码都在内核中。驱动程序并不真正在乎您是否使用ddcat
卡巴斯德(Kasperd),

1
@sudodus-抱歉,我没有达到我的预期。dd当然可以继续写作,取决于您告诉它做什么。dd 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。

1
@Panther该问题专门说of=somepartition,因此不适用于写入整个磁盘设备的情况。dd无法绕过设备驱动程序的限制。
Barmar

1
@Bamar阅读了我已经对此发表的评论。我已经看到很多用户混淆了/ dev / sda的$ somepartition
Panther
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.