准备工作
- 先确认指定磁盘设备里面的所有文件是否都转移到了别的地方
- 确认指定磁盘的设备名(
sudo fdisk -l
),下文中,我的设备是/dev/sdb
如果只是要清除某一个分区,那么一定是类似/dev/sda3
、/dev/sdb5
后面接有数字的设备名。
如果没有数字,那么就是整个磁盘全被清空,包括所有分区以及分区表。 - 卸载指定磁盘设备所有分区(如果挂载了的话)
注意:上面步骤及其重要,认真执行,反复确认。
方法
dd
数据复制
写零:
dd if=/dev/zero of=/dev/sdb bs=1M status=progress
写随机数:
dd if=/dev/urandom of=/dev/sdb bs=1M status=progress
其他方法
-
openssl
生成随机数然后重定向到设备:openssl enc -aes-256-ctr \ -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" \ -nosalt < /dev/zero > /dev/sdb
或许效率真的好很多,但是暂时还不理解,放弃。
-
shred
专门用来写随机数据清空文件的,据说速度比使用 /dev/urandom 生成随机数快几倍:# -n 1 设置只覆盖一次,默认 3 次 # -v 显示详细输出(进度信息) shred -n 1 -v /dev/sdb # -z 用 0 覆盖 shred -n 1 -v -z /dev/sdb # 指定随机数生成器 shred -n 1 -v --random-source=/dev/urandom /dev/sdb
不过也有人说
shred
对于日志型文件系统(比如 Ext4)作用不大。
我对测试这个命令毫无兴趣,放弃。 -
wipe /dev/sdb
选择
总的来说,还是使用最熟悉的 dd
来解决问题吧!
sudo dd if=/dev/zero of=/dev/sdb bs=1M ;
for i in $(seq 1 3); do dd if=/dev/urandom of=/dev/sdb bs=1M ; done
#!/bin/bash
i=1
while :; do
dd if=/dev/zero of=bigfile100g_$i bs=100M count=1024
if [ $? -ne 0 ]; then
echo "磁盘空间不足"
break
fi
((i++))
done
无关的话
在新磁盘上安装系统的时候,/dev/sdb
也插在主板上,所以有以下两个问题:
- 开机的时候,Grub 系统选项中还是有
/dev/sdb
中的系统。
执行:update-grub
,重新检查磁盘上可以启动的系统,覆盖 Grub 设置。
如果修改该过 Grub 设置的话,就需要重新修改一下了,或者直接在 Grub 设置中手动删除多余的系统选项。 - 磁盘卸载之后重启速度很慢,查看启动日志(
/var/log/boot.log
)才发现,有一个查找/dev/sdb7
的操作一直卡着,直到超时。
应该是安装系统时/dev/sdb
中的交换分区(/dev/sdb7
)也被加入了/etc/fstab
,所以开机就需要自动查找这个交换分区并挂载。
所以修改/etc/fstab
,删除以下两行:# swap was on /dev/sda7 during installation UUID=fe373e39-7624-4b87-b9cc-0e47b20044bf none swap sw 0 0
参考
- wikia,How to wipe a hard drive clean in Linux
- ArchLinux,Securely wipe disk
- StackExchange,Overwriting a Disk
- Noah.org,Dd - Destroyer of Disks
- LinuxConfig.org,Learning Linux commands: dd
- GNU,11.6 shred: Remove files more securely