このページを作成してから10年以上が経過し、 当時利用していたKNOPPIX日本語版の開発も終了しています。 基本的な内容は陳腐化していないものの、より新しい情報に基づいたページを作成しています。 以下のページもご参照ください。

Linuxを用いたHDDのデータ完全消去法

作成:

PC を他人に譲ったり、売る、または廃棄するとき。 その HDD に格納されているデータは大丈夫だろうか? って、ちょっと前にそういうネタがはやったような気がします。

まぁさすがに、 HDD 内のデータをそのままでって人はいないでしょうけど、 パーティションを消したり、 HDD を一度フォーマットするっていう程度で安心している人が結構多いと思います。 しかし、これでは HDD 内のデータを完全に消去したとはいえないのです。 ひょっとしたら、クレジットカード番号が漏れて悪用されるなんてことも起こかもしれません。
ここでは、無料で手に入る Linux を使って簡単に HDD のデータを消去する方法を説明します。 (とはいえ、 UNIX の知識が無い人にはやはりつらいと思う)
以下能書き、次の見出しまで読み飛ばしてください。
さらにページの最後に要約があるので、よけいな解説などいらない人はそちらまでジャンプ

能書き

さて、なぜパーティションを消したりフォーマットを書けるだけではいけないのかといいますと, まず、パーティション、こいつは HDD の先頭にある MBR(Master Boot Record)と呼ばれるところで、 どこからどこまでを1パーティションとするかが書かれているわけです。 パーティションを削除するってのは、この先頭部分を書き換えただけな訳で、 実際のパーティションの中身はそのまま残っている訳です。 MBR を復旧すれば元通り使えてしまいます。 Linux を使うと元通りパーティションを切るだけで、そのまま使えたりします。

フォーマットすれば大丈夫と思っている人は多いと思います。かく言う私もそうでした。 フォーマットっていうのはそれぞれのファイルがどこに書き込まれているかという ファイルシステムの情報を消す(初期化する)だけなので、 これまたファイルシステムを経由せず HDD に直接アクセスするソフトを使えば簡単にデータを読み出すことができるんですね。 実際に売られている消してしまったファイルを復活させるソフトはこういう仕組みを利用していたりします。
しかし、以前私は Windows でのクイックフォーマットならともかく、 通常のフォーマットはあんだけ時間かけてるんだから、 実データまで消してくれてるだろうと思ってました。 しかし、クイックではないフォーマットとは不良セクタのチェックが入るフォーマットであるだけで、 データを消してくれるわけではないのです。

Knoppixを使ってHDDのデータを完全消去

と能書きをたれましたが早い話、データの場所の情報だけではなく、 実データ部分を含め、 HDD の全領域に上書きしてやればいいわけです。
そういった商用ソフトが出回っていたりしますが、ここでは無料で手に入る Linux を使います。
ディストリビューションはインストールの手間のいらない Knoppix という Linux があるのでこいつを使います。 これは、1枚の CD-ROM で Linux が起動できるもので、インストールの必要もありません。 CD-ROM ドライブに入れて PC を起動するだけで使えます。

まずは注意書き。
ここで紹介する方法を実践される場合は、自己責任でお願いします。私は一切の責任を負えません。
元々データを復旧の手段が無いように消すことが目的ですから、後戻りはできません。 事前にきちんと必要なデータをバックアップしておきましょう。 また、間違って必要なデータを消去してしまわないように、 消去する HDD 以外はハードウェア的に取り外しておきましょう。 また、 HDD の全領域に対して書き込みを行うという行為は、 HDD に対して非常に大きな負担となります。 これが原因で HDD が壊れることもあるかもしれません。 そういうことを覚悟した上でおためしください。

Knoppix の起動 CD-ROM の作成

では Knoppix をダウンロードしましょう。 ダウンロードするのはKnoppix 日本語版 の「ダウンロード」にある CD[ISO]版というやつです。 http://unit.aist.go.jp/itri/knoppix/iso/index.html
Ring サーバにもあるので、近くのサーバが分かる人は ロードバランサ使うよりそちらからダウンロードしたほうが速いです。 たとえば東北大学内からはTains の Ring サーバが速いですね(当たり前)
約 700MB もあるので、ブロードバンド環境のない人は Linux 系の雑誌に付属のやつを探した方がいいですね。
これを書いている時点での最新版は 3.7 (knoppix_v3.7_20041208-20050125.iso)です。 できるだけ新しいやつにしましょう(ファイル名に日付も入ってるのでわかりやすい)。
これをダウンロードして CD-R に焼きます。間違って iso ファイルを焼いてしまわないように。 CD イメージとして焼きます。 焼き方はライティングソフトによって異なりますので、わからない方は説明書を読んでください。

以下、コマンドの出力例とか出してますが、実機でやるのがめんどくさかったので Virtual PC で実行した結果を表示しています。

起動

まず起動してみましょう(この後 PC を数時間放置プレイすることになるので必要のないパーツははずしておこう、電気は大切に)。 最初の画面で Enter キーを押せば起動しますが、 それではうまくいかない場合はいろいろと起動オプションを選択します。 この作業を行う上では XWindowSystem は必要ないので起動の際コンソールのみで起動するように RunLevel をしてすれば、 グラフィックボードを認識しない場合でも使えますし、起動の時間を短縮できます。 boot オプションは起動画面がでている間に F2 や F3 を押すとヘルプが表示されるので、 詳しくはそちらを参照してください。 コンソールログインでの RunLevelは一般的な Linux の 3 と違って 2 です。 起動ラベルは knoppix なので、

boot: knoppix 2

とします。 Knoppixの場合コンソールでもフレームバッファを使っているため、 グラフィカルログインはOKだけど、コンソールログインは表示できないとかってことも起こりえます。 ここは、状況に合わせて臨機応変に
執筆時点の Knoppix は Kernel2.4 がデフォルトで Kernel2.6 がオプションで選択できます。
デフォルトのカーネルではうまくデバイスを認識しないなどうまくいかない場合はそちらを試してみましょう。 (逆に2.4ではちゃんと動くけど2.6だとうまくいかないってこともある)

Tips

上で紹介した Knoppix は日本語版なので、日本語化がされているわけですが、 コンソールでは日本語表示ができない模様、文字化けで訳わからん。そんなときは

# export LANG=C

とすれば、メッセージが英語で表示されるようになり、 文字化け解消(はじめから英語版使えとかつっこまない)。
さらに、私のようにちょっと変わり者の、英語キーボード使いは、 デフォルトで日本語キーボードのキーマップが読み込まれているため | とかが入力できない。 そういうときは

# kbdconfig

でキーマップを適切なやつに変更すれば万事OK。(英語キーボードは us)

HDDの確認

では、起動後グラフィカルログインした場合、ターミナルを立ち上げます。 コンソールの場合そのまま。 そして、とりあえず root になります(コンソールログインでははじめから root の可能性あり)。 パスワードは空なので

su

だけで、OK
そして、

# dmesg | grep hd
    ide0: BM-DMA at 0xffa0-0xffa7, BIOS settings: hda:DMA, hdb:pio
    ide1: BM-DMA at 0xffa8-0xffaf, BIOS settings: hdc:DMA, hdd:pio
hda: Virtual HD, ATA DISK drive
hdc: Virtual CD, ATAPI CD/DVD-ROM drive
hda: attached ide-disk driver.
hda 33554304 sectors (17180 MB) w/64KiB Cache, CHS=2088/255/63
 hda: hda1 hda2 hda3 < hda5 hda6 >
hdc: attached ide-scsi driver.

として、HDDがどのように認識されているかを確認します。
一般にHDDのデバイス名は、IDEの場合、 プライマリマスターが hda プライマリスレーブが hdb セカンダリマスターが hdc セカンダリスレーブが hdd となります。
SCSI の場合は sda, sdb, ... となります。
追加の IDE コントローラがあった場合、通常はhde以降が割り当てられたりしますが、 この場合の順序などは環境によって異なってきたりします。 SATA の場合は IDE として扱われる場合、 SCSI として扱われる場合と、 状況によって異なってきますので一般的にどうなるとははっきりわかりません。 この環境の場合、原則通りの名前が付いています。 また、DMAもきちんと働いています。

 hda: hda1 hda2 hda3 < hda5 hda6 >

この行は HDD のパーティション情報です。 <> で囲まれたところは拡張パーティションの論理パーティションを表しています。

DMAが有効かどうかは、以下のようにしても確かめられます。

# hdparm -d /dev/hda

/dev/hda:
 using_dma    =  1 (on)

DMA が効いていない場合、HDDの書き込みにすさまじい時間がかかってしまいます。 もし、offと表示された場合、以下のようにHDDの情報を表示して設定可能な転送モードを確認します。

# hdparm -i /dev/hda

/dev/hda:

 Model=MVirtual HD, FwRev=1. 1, SerialNo=
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=32256, SectSize=512, ECCbytes=0
 BuffType=DualPortCache, BuffSize=64kB, MaxMultSect=128, MultSect=128
 CurCHS=33288/16/63, CurSects=33554304, LBA=yes, LBAsects=33554304
 IORDY=on/off, tPIO={min:333,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4
 DMA modes:  sdma0 sdma1 sdma2 mdma0 mdma1 *mdma2
 AdvancedPM=no

 * signifies the current active mode

DMAモードが選択可能であるのに off になっている場合は

# hdparm -d1 /dev/hda

/dev/hda:
 setting using_dma to 1 (on)
 using_dma    =  1 (on)

として、 DMA を有効にします。 設定できないのに DMA を強制的に有効にしようとすると、 ハードウェア的に不具合がでる可能性もあるので気をつけましょう。

比較的新しいDMAコントローラなどの場合ドライバが無いため DMA が有効にできない場合もあります。 その場合、カーネルを変えてみる。 それでもだめなら、新しいバージョンがでるまで待つか、数日間かけても実行するか、他の比較的新しいLinuxを使うかってところですかね・・・

では、全領域に対する書き込みなんていう すさまじいデータ量の書き込みをやるのにどれぐらいの時間がかかるかですが、 先ほど使った hdparm というコマンドを使ってHDDのベンチマークがとれます。

# hdparm -t /dev/hda

/dev/hda:
 Timing buffered disk reads:  212 MB in  3.02 seconds =  70.20 MB/sec

70.20 MB/sec とでました(VirtualHD なのでめちゃ速い)。 (DMA が有効になっていない場合、この数字が一桁だったりします。)
最近のHDDの場合、約50MB/secぐらいで、 100GB の HDD で2000秒(33分20秒)かかる計算になりますが、 おおよそこの3倍ぐらいの時間は見積もっておいた方が良いかもです。

完全消去

では、やっとこさ肝心の消去作業に入ります。
ここではゼロフィル(全領域に0を書き込む)手法をとります。 どうやらゼロフィルしただけの場合、HDDの機能としてはもう読み出せなくなるが、内部のディスクを取り出し、 残留磁気を調査すると読み出せたりするらしい(1の後に0を書いた場所と、0の後に0を書いた場所では異なるという)。 そのため、0で埋めた後、1で上書きし、乱数を何度も書き込みさらに・・・なんてことをする場合もあるらしいです。 まあ、国家規模の相手と諜報合戦でもしない限りそこまで心配する必要は無いのでゼロフィルでいきます。

ここで使うコマンドは dd です。 消去対象の HDD のデバイス名を hda とすると、

# dd if=/dev/zero of=/dev/hda

あとは、終わるのをひたすら待つのみ。
このコマンドは if で指定したファイルから1ブロック(何も指定しない場合512byte)読み込み、 of で指定したファイルに読み込んだデータをそのまま書き込むという動作をエラーがでるまで繰り返す。 /dev/zero っていうのは、仮想デバイスで、読み込むと常に 0 を返すデバイスです。 それを、 HDD 全体を示すファイルに書き込むというわけです。 HDDの先頭から書き込み始め、終端まで書き込むとエラーを出して終了します。
ちなみに、読み込み先を /dev/random にすると、乱数で埋めることができますが、 不正に解釈されるデータが書き込まれたとき、 初期化などに影響が出る可能性がないとはいえないかもしれない(よく知らないのごめん)。

サンプルで示したコマンドはブロックサイズは指定していませんが、デフォルトのサイズは小さすぎるので、 読み込み→書き込みのループのオーバーヘッドで必要以上に時間がかかるかもしれません。

# dd if=/dev/zero of=/dev/hda bs=10MB

等と大きめのサイズを指定すると(少なくともHDDのキャッシュより大きい方がいいのかな?)、早く終わるかもしれません。

国家レベルの諜報機関にも情報を漏らしたくない人は

ちなみに、先に述べたような残留磁気を使った読み出しにまで対処する場合、 shred というコマンドが役に立つでしょう

# shred -n 2 -z /dev/hda

とすると、乱数を2回書き込んだ後、ゼロフィルを行ってくれます。 (nを指定しない場合、25回も乱数を繰り返し書き込むので注意)
当然、回数分時間はかかりますが、より完全な消去が可能です。 (先に書いたようにそこまでする必要は無いと思いますが、試してみたい人向け。 実際ここまでやって情報を漏らしたくないならハンマーでたたき壊した方がいい)

Linuxを用いたHDDのデータ完全消去法 作業要約

  1. Knoppix の起動 CD-ROM を作る
  2. 起動
  3. root になる
  4. HDD の確認・設定
    dmesg | grep hd
    hdparm -t /dev/<HDDのデバイス名(hda等)>
  5. 完全消去
    (ゼロフィル)
    dd if=/dev/zero of=/dev/<HDDのデバイス名(hda等)>(追加オプション:bs=10MB等)
    (スクランブルの後ゼロフィル)
    shred -n <スクランブルの回数> -z /dev/<HDDのデバイス名(hda等)>