该shred
命令(coreutils
8.23)从头到尾用可配置数据覆盖设备,这对于它设计的用例来说非常好(所有用例都与向整个设备写入某些内容有关)。
在我的情况下,处理设备的前 x 个字节和后 y 个字节shred
对整个设备的影响就足够了,但我似乎找不到避免指定明确值(设备大小等)的好解决方案。我可以使用从随机源写入设备的计算部分dd
,但随后我必须获取设备大小,处理 MiB 和 MB 等。也许有像shred
(或者我只是错过了什么)这样舒适的东西。
大多数分区相关信息(gpt、msdos 分区表和备份)都放在设备的开始和结束处。
答案1
你确定你真正想要的不是“wipefs
-从设备上擦除文件系统签名“?
dd
使用起来并不难,尤其是从gparted
或获取正确的数字fdisk
,见下文。
全盘方法有效,如dd if=/dev/zero of=/dev/sdx
。可能用 来bs=1M
提高速度。或者/dev/zero
用 /dev/urandom 替换以获得更随机的数据。如“ArchWiki 的安全擦除磁盘“。
对于仅一个分区号“n”,又名“sdxn”,可以做到dd if=/dev/zero of=/dev/sdxn
对于“前” n MB,你可以这样做dd if=/dev/zero of=/dev/sdx bs=1M count=n
对于“开始”和“结束”,您可以找出驱动器的扇区大小和总扇区数 -gparted
在“查看->设备信息”下轻松告诉您,它甚至会告诉您分区的起始和结束扇区在哪里。parted
&fdisk
(对于 MBR)也应该如此。
然后,用一些数学知识来确定要擦拭的地方。
Tiny (512b) 精确方法 - 查找要擦除的扇区。如果您的驱动器有 512 字节扇区,并且有 251658240 个扇区(即 120GB,= 251658240 个扇区 * 512 字节 / 1024 转换为 k / 1024 转换为 M / 1024 转换为 G)...
- 要擦除最后的 1G(gig,G=1024*1024*1024 字节),你可以计算出 1GB 中的扇区(1GB/512b = 1 * 1024 * 1024 * 1024 / 512 =2097152),然后从扇区总数中减去该值 251658240 - 2097152 =249561088并从该扇区开始,针对多个扇区:
dd if=/dev/zero of=/dev/sdx bs=512 seek=249561088 count=2097152
- 要擦除最后的 1G(gig,G=1024*1024*1024 字节),你可以计算出 1GB 中的扇区(1GB/512b = 1 * 1024 * 1024 * 1024 / 512 =2097152),然后从扇区总数中减去该值 251658240 - 2097152 =249561088并从该扇区开始,针对多个扇区:
如果每次处理 512b 的速度太慢,您可以将
bs
,seek
&转换为使用 M (M=1024*1024)。磁盘始终从 0 开始,但结束于 251658240 * 512 / 1024 / 1024 =count
122880以 M 为单位。- 擦除最后 1G,一个 G 中有 1024 个 M,因此跳过 122880 - 1024 =121856M 和 do:
dd if=/dev/zero of=/dev/sdx bs=1M seek=121856 count=1024
- 擦除最后 1G,一个 G 中有 1024 个 M,因此跳过 122880 - 1024 =121856M 和 do:
一次 Gig 的粗略估计,在写入超出“末尾”不会造成损坏(磁盘的最末尾,不会擦除中间分区)的情况下工作正常。尝试一次 1G(G=1024*1024*1024 字节)。请参阅了解
man dd
更多信息,它可以理解 K、M、G 等。- 最后一个 G,
dd if=/dev/zero of=/dev/sdx bs=1G seek=119
省略count
继续直到设备末尾。
- 最后一个 G,
或者,对于一个可能快点将“随机”数据写入整个分区/驱动器的方法,你可以使用dm-隐窝:
首先,在要加密的分区(sdXY)或完整磁盘(sdX)上创建一个临时加密容器,例如使用默认参数
# cryptsetup open --type plain /dev/sdXY container
第二,检查它是否存在
# fdisk -l Disk /dev/mapper/container: 1000 MB, 1000277504 bytes ... Disk /dev/mapper/container does not contain a valid partition table
最后,用伪随机数(加密数据)擦除它,不需要使用 /dev/urandom,因为加密密码用于随机性:
# dd if=/dev/zero of=/dev/mapper/container dd: writing to ‘/dev/mapper/container’: No space left on device