初版: 2002/03/13
最終更新日:
2003/10/14
フロッピーからブートすれば、きれいにデータを消すことのできる
このソフトウェアは、フリーウェアです。
このプログラムの全部、または一部を
商用利用することはご遠慮ください。
作者はこのソフトウェアの運用に関する一切の責任を負いません。
利用者の自己責任のもとでご使用ください
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フロッピーに書き込めば、 このページに書いてあるブートフロッピーのできあがりです。
ブートフロッピーの構造は、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協力してくださる方がいれば…、 ね:-)
使用マシンスペック
上記マシンで、80Gバイトを消すのにおよそ45分程度かかりました。