之前聽過學長說他把電腦還實驗室時,由於一般格式化通常透過一些復原軟體就可以把資料復原,所以他都會把硬碟填零,就是把硬碟中每一個 bit 設為 0。一直以來都不知道到底該怎麼把硬碟填零,最近突然想到之前在製作 Linux 的 live usb 時,用過 dd 這個指令,該指令可以複製指定的內容到指定的位置。

於是我突然突發奇想想說是不是可以把 /dev/nulldd 寫入到某個分割區來達到清空硬碟的效果,不過我失敗了…。/dev/null 不提供任何資料,任何讀取 /dev/null 者,都會馬上收到 EOF,所以試圖利用 /dev/null 是不可行的。

上網查了一下發現原來有另一個裝置可以一直提供 null 字元,就是 /dev/zero。所以只要使用下列指令即可達到對硬碟填零的效果:

1
dd if=/dev/zero of=/dev/<destination partition>

另外,也可以填入亂數來混淆資料,應該可以達到更進一步的安全,只要將資料來源改成 /dev/urandom

1
dd if=/dev/urandom of=/dev/<destination partition>

在利用 xxd 來查看分割區內的資料,指令如下:

1
2
3
4
5
6
7
8
9
10
11
$ sudo xxd /dev/disk2s2 | less
0000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................

可以發現該分割區的所有資料都被填為 0 了!如果填入的是亂數,則可以看到雜亂無章的內容:

1
2
3
4
5
6
7
8
9
10
11
$ sudo xxd /dev/disk2s2 | less
0000000: f155 d23b fa14 e7fa 2574 ba8d 3ee1 64c0  .U.;....%t..>.d.
0000010: 367a bb71 fb22 0a3d 3a83 bc42 897b 26b2  6z.q.".=:..B.{&.
0000020: b0ad fd62 f04a a6c6 3fee 7f4f cf14 1a35  ...b.J..?..O...5
0000030: 4ec0 6500 221a e977 7a5c e771 e9c2 e3c4  N.e."..wz\.q....
0000040: 79bc 92b5 7b82 75b5 8418 27bc 122e 5742  y...{.u...'...WB
0000050: 70f1 0bd6 7ea2 21a0 7534 4876 aacf 4ccb  p...~.!.u4Hv..L.
0000060: 18c6 66d1 8f34 7e1e 08e0 f162 dbf1 be2c  ..f..4~....b...,
0000070: 5c4e e58c 7605 35e1 7fc1 001d 71d6 5ad6  \N..v.5.....q.Z.
0000080: 3a3e cc19 6820 5517 0c78 df8e 95c8 af99  :>..h U..x......
0000090: 8075 0095 aca8 ac91 e343 4e1f 017a 46a9  .u.......CN..zF.

在填零之前需要得知分割區的檔案位置,使用以下指令即可:

df

1
2
3
4
$ df
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/disk0s2   244277768 154191532  89830236  64% /
/dev/disk2s2    30405312      3168  30402144   1% /Volumes/UNTITLED

mount

1
2
3
4
5
6
$ mount
/dev/disk0s2 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
/dev/disk2s2 on /Volumes/UNTITLED (msdos, local, nodev, nosuid, noowners)

diskutil (OS X only)

假設已知該分割去掛在 /Volumes/UNTILED 這個位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ diskutil info /Volumes/UNTITLED
   Device Identifier:        disk2s2
   Device Node:              /dev/disk2s2
   Part of Whole:            disk2
   Device / Media Name:      DOS_FAT_32_Untitled_2

   Volume Name:              UNTITLED
   Escaped with Unicode:     UNTITLED

   Mounted:                  Yes
   Mount Point:              /Volumes/UNTITLED
   Escaped with Unicode:     /Volumes/UNTITLED

   File System Personality:  MS-DOS FAT32
   Type (Bundle):            msdos
   Name (User Visible):      MS-DOS (FAT32)

   Partition Type:           Microsoft Basic Data
   OS Can Be Installed:      No
   Media Type:               Generic
   Protocol:                 USB
   SMART Status:             Not Supported

   Total Size:               31.1 GB (31142666240 Bytes) (exactly 60825520 512-Byte-Blocks)
   Volume Free Space:        31.1 GB (31131795456 Bytes) (exactly 60804288 512-Byte-Blocks)
   Device Block Size:        512 Bytes

   Read-Only Media:          No
   Read-Only Volume:         No
   Ejectable:                Yes

   Whole:                    No
   Internal:                 Yes

並且,在填零之前務必要把分割區解除掛載(unmount 非 eject),利用以下指令或是圖形化界面即可:

umount

1
$ umount -f /Volumes/UNTITLED

diskutil (OS X only)

1
2
$ diskutil umount /Volumes/UNTITLED
Volume UNTITLED on disk2s2 unmounted

是說,後來發現一個指令叫做 shred,似乎也可以達到一樣的效果,而且更加方便!