TOC

GNU/Linux 清空磁盘操作

准备工作

  1. 先确认指定磁盘设备里面的所有文件是否都转移到了别的地方
  2. 确认指定磁盘的设备名(sudo fdisk -l),下文中,我的设备是 /dev/sdb
    如果只是要清除某一个分区,那么一定是类似 /dev/sda3/dev/sdb5 后面接有数字的设备名。
    如果没有数字,那么就是整个磁盘全被清空,包括所有分区以及分区表。
  3. 卸载指定磁盘设备所有分区(如果挂载了的话)

注意:上面步骤及其重要,认真执行,反复确认。

方法

dd 数据复制

写零:

dd if=/dev/zero of=/dev/sdb bs=1M status=progress

写随机数:

dd if=/dev/urandom of=/dev/sdb bs=1M status=progress

其他方法

  1. 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
    

    或许效率真的好很多,但是暂时还不理解,放弃。

  2. 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)作用不大。
    我对测试这个命令毫无兴趣,放弃。

  3. 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 也插在主板上,所以有以下两个问题:

  1. 开机的时候,Grub 系统选项中还是有 /dev/sdb 中的系统。
    执行:update-grub,重新检查磁盘上可以启动的系统,覆盖 Grub 设置。
    如果修改该过 Grub 设置的话,就需要重新修改一下了,或者直接在 Grub 设置中手动删除多余的系统选项。
  2. 磁盘卸载之后重启速度很慢,查看启动日志(/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
    

参考

如果你有魔法,你可以看到一个评论框~