dd if = / dev / zero of = / dev / sda是​​否会清除现有分区表?


13

# dd if=/dev/zero of=/dev/sda清除先前存在的分区表吗?

或者是相反的方式,即

# fdisk /dev/sda g (适用于GPT)

消灭写的零/dev/zero


6
那不是/dev/zero擦除某些东西,而是dd通过复制来擦除它。字节恰好为零,而零字节恰好来自/dev/zero而不是其他一些零源,这一事实是次要的细节。
chrylis -on罢工

2
如果您只想擦除分区表,那么擦拭可能会更可靠。
管道

Answers:


23

dd if=/dev/zero of=/dev/sda清除先前存在的分区表吗?

是的,分区表位于驱动器的第一部分,因此对其进行写操作将销毁它。这dd会,如果你让它运行(因此将需要相当长的一段时间)的整个驱动器上书写。

诸如此类的东西dd bs=512 count=50 if=/dev/zero of=/dev/sda足以覆盖前50个扇区,包括MBR分区表和主GPT。尽管至少根据Wikipedia所述,GPT在驱动器的末尾具有分区表的辅助副本,所以仅覆盖驱动器头中的部分可能不够。

(不过,您不必使用ddhead -c10000 /dev/zero > /dev/sda否则cat /bin/ls > /dev/sda会有相同的效果。)

的确fdisk /dev/sda g(对GPT)歼灭通过的/ dev /写零的零?

也可以(前提是您保存更改)。

(但是,标题中的措辞只是令人困惑,/dev/zero它本身没有任何常规存储操作。)


旁注:如果的输出/bin/ls足够短,则写操作可能仅覆盖MBR的一些字节,并且最重要的部分(分区的开始和结束扇区)可以保持不变。尽管grub --install /dev/sda仍然需要重新安装MBR(最常见的是),才能使系统再次启动。
彼得-恢复莫妮卡

8
@peterh注意,他们正在重定向实际的ls二进制文件,而不是运行它的输出。最小的“ Hello World” ELF二进制文件似乎是98字节(因此小于MBR),但是我认为可以肯定地说,任何具有实际功能的二进制文件都应大于MBR(众所周知,FreeBSD的小型实现ls是32784)字节长,甚至足够大以覆盖GPT的磁盘启动部分)。;)
n.st

哦,是的,您也可以使用输出ls。列出/usr/bin可能足够长。我仅以echo一个示例为例,但是IIRC您需要近500个字节来覆盖MBR分区表,因此键入它有点麻烦。(无论确切的数字是多少)
ilkkachu

1
您可能应该使用bs并用dd进行计数,否则它将持续一段时间,您只需要将扇区清零即可。旧版磁盘为512字节。(请参见下面的@ n.st)实际上,分区表位于此表的末尾,并且足够小,您可以在复制回保留引导内容之前使用十六进制编辑器进行复制并设置为零。也有用于此的工具,对于NAS磁盘初始化通常是这样做的。
mckenzm

1
只是想补充一点,如果是GPT驱动器,则还必须擦除磁盘末端。符合要求的GPT实现将检查磁盘末尾的辅助表,并同样重写第一部分(忽略您已经拥有的所有内容)。请参阅:news.ycombinator.com/item?id=18541493
wbkang

10

分区表存储在(逻辑2)磁盘设备的开头1附近。

用任何内容(零/dev/zero或其他任何数据)覆盖该区域将用乱码替换分区表,因此在设备上分区的开始位置不再明显。
但是,人们仍然可以扫描整个磁盘,并尝试识别出标记文件系统开始的“魔术字节”。

相反,如果使用fdisk(或任何其他分区工具)创建新的分区表,则该工具将覆盖磁盘的前几个字节以存储该新表。

磁盘只有一个开始,所以最后做的任何事情都会“粘在”那里。

但是请注意,某些分区表格式(如GPT)会将备份副本保留在不同的位置(例如,在GPT的磁盘末尾),可以从中恢复某些分区信息。

1:例如在MBR前512字节中或在GPT的前17408字节中
2:驱动器可以在内部将逻辑块重新映射到物理介质的不同部分,但是该映射对于(不重要)不可见操作系统。


1
几乎是正确的-(旧的MBR类型)分区表位于MBR的字节1BE-1FD中。前几个字节包含IBL(初始引导加载程序)。
RudiC

@RudiC好点了,我现在已经说得更准确了。
n.st
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.