为什么使用dd写入随机数据会导致磁盘分区?

Mot*_*ted 11 partition dd lsblk

在运行该dd命令之前,该命令lsblk返回以下输出:

NAME              MAJ:MIN  RM   SIZE    RO TYPE  MOUNTPOINT
sda               8:0       0    931.5G  0  disk  
Run Code Online (Sandbox Code Playgroud)

dd if=/dev/urandom of=/dev/sda conv=fsync status=progress运行命令。然而,设备断电并关闭。恢复供电后,该命令lsblk将返回以下输出:

NAME              MAJ:MIN     RM   SIZE    RO TYPE  MOUNTPOINT
    sda           8:0          0   931.5G  0  disk 
      sda2        8:2          0   487.5G  0  disk
Run Code Online (Sandbox Code Playgroud)

fro*_*utz 20

几种可能:

  • Linux 支持许多不同的分区表类型,其中一些使用很少的魔术字节,然后很容易误识别随机数据 (*) [因此有可能随机生成一个有点“有效”的分区表]。

  • 一些分区表类型在磁盘末尾也有备份(最显着的是 GPT),如果驱动器的开头被随机垃圾替换,则可以被选中。

  • 设备工作不正常,在写完数据之前就断开了连接,或者一直返回旧数据,所以分区表仍然存在。有时这会发生在 USB 记忆棒上。

  • ...

(*) 用随机数据制作 1000 个文件,看看结果如何:

$ truncate -s 8K {0001..1000}
$ shred -n 1 {0001..1000}
$ file -s {0001..1000} | grep -v data
0099: COM executable for DOS
0300: DOS executable (COM)
0302: TTComp archive, binary, 4K dictionary
0389: Dyalog APL component file 64-bit level 1 journaled checksummed version 192.192
0407: COM executable for DOS
0475: PGP\011Secret Sub-key -
....
Run Code Online (Sandbox Code Playgroud)

随机粉碎驱动器的目标是使旧数据永久消失。无法保证驱动器之后会显示为空的、未使用的、处于原始状态。

通常采用零擦除来实现这一目标。如果您使用 LVM,LVM 将您创建的任何 LV 的前几个扇区归零是正常的,这样旧数据就不会干扰。

还有一个专门的实用程序 ( wipefs) 来摆脱旧的魔术字节签名,您可以使用它来摆脱文件系统和分区表元数据。

  • 随机数据可以看起来像任何东西。这就是随机的意思。你熟悉无限猴子定理吗?它指出,如果足够多的猴子在足够长的时间内在打字机上随机打字,其中一个会在某个时候或另一个时候产生莎士比亚的全集。MBR 分区表*真的*小(只有 64 字节),它没有校验和或验证,并且格式非常密集。一个 64 字节的随机字符串很可能会产生一个有效的分区表。其他分区表格式也同样简单。 (5认同)

小智 18

从这里可以看出,MBR(主引导记录)相对简单;https://en.wikipedia.org/wiki/Master_boot_record

当您使用时,/dev/urandom您总是可以创建看起来像分区表的东西。解决方案是用零填充分区表区域并dev/urandom用于其余部分。

Linux 还支持其他额外的磁盘格式,这些格式也可能被触发,导致在填充随机数据时出现“无效”分区。


Mar*_*ark 13

将 512 字节的集合定义为主引导记录的事情是0x55 0xAA末尾的值的存在。/dev/urandom产生这样一个值的可能性是 65,536 分之一:不太可能,但同样不可能的事情总是发生。

(其他一些分区表,例如Apple Partition Map,也有类似的短签名。您可能已经生成了其中的一个。)