Network Users' Group ``wheel'' / Dai ISHIJIMA's Page / ソフトウェアのページ
ハードディスク消去ツール / 2002/09追記 / 2002/10追記 / 2003/10追記
関連リンク

初版: 2002/03/13
最終更新日: 2003/10/14


フロッピーからブートすれば、きれいにデータを消すことのできる

ハードディスク消去ツール

This webpage is documented only in Japanese. There is no page written in English.

最新β版のダウンロードこちらからどうぞ
Click here to the latest version.

関連リンクこちら

このソフトウェアは、フリーウェアです。
このプログラムの全部、または一部を
商用利用することはご遠慮ください。
作者はこのソフトウェアの運用に関する一切の責任を負いません。
利用者の自己責任のもとでご使用ください


2001年のある日、 職場のパソコン (約200台ぐらい) のハードディスクに不具合がみつかり、 それらのパソコンのハードディスクを交換することになりました。 作業はそのパソコンメーカのサポート担当の方々が行うということに なったのですが、 そこで問題となったのは、

という点でした。

後者に関して、メーカの担当者様いわく、

磁石でも近づけたらすぐ消えますがな

と、とっても頼もしい迷言を残されたので、

コイツらには任せておけない

と思って、このツールを作りました:-p


まったく同じディスクがあって、 片方からもう一方にデータをまるごとコピーする場合、 UNIXフリークなら、まっさきに

	# dd if=コピー元 of=コピー先
という手段を思いうかべるのではないでしょうか。 また、ディスクの中身を消去するんなら
	# dd if=/dev/zero of=消したいディスク
という方法を考えると思います。

さて、コピーしたいディスクや消去したいディスクが数台程度なら、 手で上記コマンドを打ったりというのも悪くはない選択肢ですが、 100台を越えるディスクに対して、同じような手作業を行うのは いかにも「サル仕事」です。 そこで、フロッピーからブートするだけで 簡単にハードディスクのコピーをとったり、 消去を行うツールを作成しました。

この仕事を行うために使ったのは、 FreeBSD 4.4Rのブートフロッピーにちょいと手を加えたものです。 通常、FreeBSDのブートフロッピーは、 インストーラを起動しますが、 インストーラの代わりに、コピーなり消去なりのツールを 起動するようにしておけば、ばっちりです。

ハードディスクのコピーや消去を行うためには、 上記の例に示したように、 dd(8) コマンドを使うので、 これをフロッピーに入れておく必要があります。 また、ついでなので、 「ちゃんと消去できたか」をチェックするプログラムなどを 仕込んでおこうとすると、dd以外にも echo(1), test(1), expr(1) などのシェルスクリプト用のコマンドも入れておく必要があります。 そこで、必要最小限の機能だけを持ったカーネルと これらのコマンド類が入ったフロッピーを作ります。

…というわけで作ったのが wipe-out.tgz です。 詳細はこの中のmakefd.shをご覧くださいまし。

フロッピーディスクのイメージファイルは wipe-out-00-img.flp.gz (約1.2Mバイト) からどうぞ。 このイメージを展開して、 rawriteなどのツールでフォーマット済み2HDフロッピーに書き込めば、 このページに書いてあるブートフロッピーのできあがりです。


makefd.shがやってることの解説

ブートフロッピーの構造は、FreeBSDのファイルシステムとしては、

     /
     |
     +-- kernel.gz
     +-- boot/
             |
             +-- boot1
             +-- boot2
             +-- loader
となっています。 また、ブートブロックにはもちろんブートストラップが入っています。 ブート用フロッピーを作るには、たとえば、
	% fdformat fd0
	% disklabel -w -B -b /boot/boot1 -s /boot/boot2 /dev/rfd0c fd1440
	% newfs -t 2 -u 18 -l 1 -c 40 -i 5120 -m 5 -o space /dev/rfd0a
とします。

カーネル (kernel.gz) には、 MFSを組み込んであり、その中には、 ディスクコピーや消去に必要なファイルが入っています。 MFSの構造は

    /
    |
    +-- dev/
    |      |
    |      +-- 必要最低限のデバイスファイル
    |
    +-- tmp/
    +-- etc/
    |      |
    |      +-- passwd
    |      +-- master.passwd
    |      +-- rc
    |
    +-- bin/
    |      |
    |      +-- dd
    |      +-- echo
    |      +-- sh
    |      +-- test
    |      +-- expr
    |
    +-- sbin/
    |       |
    |       +-- init
    |       +-- mount_cd9660
    :
となっています。

MFSの作成は、

	# dd of=/tmp/fd-image if=/dev/zero count=164 bs=10752
として、必要な大きさのファイル (/tmp/fd-image) を作成しておき、
	# vnconfig -c /dev/vn0 /tmp/fd-image
	# newfs -t 2 -u 21 -l 1 -c 40 -i 5120 -m 5 -o space -T fd1720 /dev/rvn0
のようにします。 マウントは
	# mount /dev/vn0 /mnt
で行います。 この状態で、上記の必要なファイルを /mnt にコピーすれば 中身ができあがります。 アンマウントは、
	# umount /mnt; vnconfig -u /dev/vn0
とします。

必要なファイルを含んだMFSのイメージファイル (/tmp/fd-image) が できあがったら、 次は、カーネルにこのMFSを仕込みますが、 これは、

	# write_mfs_in_kernel /tmp/kernel /tmp/fd-image
で行います。

話が前後しますが、ここでできあがったカーネルを 上に書いたようにフロッピーに (圧縮してから) コピーすれば、 ブートフロッピーの完成です。


こうして作ったフロッピーでブートすると、 MFS内にある/etc/rcスクリプトが自動的に動きます。 このスクリプトは、

	0) verify disk (primary master: ad0)
	1) verify disk (primary slave: ad1)
	2) copy disk (primary master: ad0 -> primary slave: ad1)
	3) erase entire disk (primary master ATA HDD: ad0)
	4) erase entire disk (primary slave ATA HDD: ad1)
	5) escape to shell
というメッセージを出力して、 キー入力を待ちます。 そして、入力された数字に応じて、 ディスクが消去されているかを検査するスクリプト (0 or 1の場合)、 ディスクをコピーするスクリプト (2の場合)、 ディスクを消去するスクリプト (3 or 4の場合)、 サブシェル (5の場合) を起動します。

ディスクを検査するスクリプト (wipe-out.tgz中のv.sh) は、 ddを使ってセクタを読み出し、 データが消されているか残っているかをチェックします。 すべてのセクタのチェックをすると時間がかかりすぎるので、 ブートブロックやスライスの先頭を重点的にチェックするようにしてあります。

ディスクをコピーするスクリプト (wipe-out.tgz中のc.sh) は、 ddを使ってディスクを丸ごとコピーします。 進行状況がわかるように、 全容量中の何パーセントをコピーしたかを表示するようにしています。

ディスクを消去するスクリプト (wipe-out.tgz中のe.sh) は、 ddを使ってディスクを消去します。 進行状況がわかるように、 全容量中の何パーセントを消去したかを表示するようにしています。

なお、ハードディスクの容量は、自動的に判別するのではなく、 各スクリプトの先頭で設定しています。 今回、消去やコピーを行ったディスクのジオメトリは、 39560シリンダ、16ヘッド、63セクタとなっていたので、

	total=`expr 39560 '*' 16 '*' 63 '*' 512`
と、スクリプトに記述しています。

また、カーネル設定ファイルや 各スクリプトを手直しすれば、SCSIハードディスクなどでも 使用可能です。 最近は、フロッピーを装備していないパソコンもありますが、 同様の処理を行うブータブルCD-ROMも同じような手順で作ることができます。

今回作成したものは、 ハードディスクの容量などを「決め打ち」してますが、 ioctl(2)を使えば (ioctl(fd, DIOCGDINFO, &disklabel) みたいな呪文をとなえるらしい^^) 、これらの情報を得ることができます。 「決め打ち」じゃなくって、もうちょっと汎用性の高いツールに 仕上げることも難しくはなさそうです。 (人柱^H^H協力してくださる方がいれば…、 ね:-

2002/09追記

ハードディスク容量チェックの準備段階として、 ioctl(2)を使って (ioctl(fd, DIOCGDINFO, &disklabel)) ディスクのジオメトリ情報を表示するプログラム (diskinfo.c) を書いてみました。 これを各スクリプトの先頭あたりから呼び出して、 容量を自動設定しておいたり、 あるいは手動でジオメトリパラメータを設定できるようにしたら、 もっと便利なツールになるでしょうね:-)

2002/10追記(暫定)

次版のベータバージョンです。
注: 以下のファイルはまだ検証してません。

2003/10追記(使用例)

中古ハードディスクを入手したので、 これを wipe-out-01b-img.flp.gz で消去してみました。

使用マシンスペック

上記マシンで、80Gバイトを消すのにおよそ45分程度かかりました。


お問い合わせ・連絡先などはこちらをご覧ください
Copyright (C) 2002 by Dai ISHIJIMA