« 2007年6月 | トップページ | 2007年9月 »

2007年7月

CD-RW完全消去

CD-RWを完全消去するシェルスクリプト

を書いてみました。二つの違いはOnTheFlyで消去するかどうかです。
TAOで書き込み、サブチャンネルはCDまかせなので、全領域の完璧な消去は保証 できませんが、通常のデータ領域に書き込めるだけ書き込み、最後に初期化も行っているので大きな問題は無いと思います。

ハードディスクなどは米国国防総省規格などで丁寧に消去するソフトウェアがいくつもあるのですが、CD-RWに対応しているものが見つからなかったのでこのようなスクリプトを書きました。といってもlinuxには便利なコマンドがいくつもあるので、その使い方を調べてコマンドを順番に書いただけです。

ハードディスクなどを丁寧に消去するソフトウェアでは何回か書き込みをして0,1には現れないディスク上の痕跡も消すのが普通になってきているようです。CD-RWは昔から通常のライティングソフトで初期化することはできますが、この手の対策は一般的なレベルに遅れないというのが大事でしょうから、このようなスクリプトを書きました。

スクリプトはKNOPPIX5.1.1日本語版(knoppix_v5.1.1CD_20070104-20070122+IPAFont_AC20070123.iso)で動作確認しました。USBにインストールしたKNOPPIXでも動きました。

使い方は、
rootシェルを立ち上げて、

# bash DeleteCDRW_20070727A.bash

と起動し、

this script will temporary make large random data file (about CD size) in current directory.
press enter to continue.

というメッセージで、エンターを押すと、

scanning SCSI(USB) drives...
cdrecord: No such file or directory.
Cannot open SCSI driver!
For possible targets try 'wodim -scanbus'.
For possible transport specifiers try 'wodim dev=help'.
For IDE/ATAPI devices configuration, see the file README.ATAPI.setup from
the wodim documentation.
scanning SCSI(USB) drives... done

scanning ATAPI drives...
scsibus0:
    0,0,0      0) '_NEC    ' 'DVD+-RW ND-6500A' '202C' Removable CD-ROM
    0,1,0      1) *
    0,2,0      2) *
    0,3,0      3) *
    0,4,0      4) *
    0,5,0      5) *
    0,6,0      6) *
    0,7,0      7) *
scanning ATAPI drives... done

input device name (e.g. 0,0,0 or ATAPI:0,0,0 OLDATAPI:0,0,0)

というように使用可能なドライブが表示されるので、

OLDATAPI:0,0,0

というように使用するドライブを入力してエンターを押します。(USB接続のドライブを指定する場合は0,0,0というように入力します。ATAPIドライブは通常ATAPI:0,0,0と指定すれば良いのですが、動かないときはOLDATAPI:0,0,0と指定してください。)
成功すると以下のように進行状況を表示して終了します。 ディスクの最後の領域は不安定なようで(オーバーバーン?)、書き込んだサイズと読み込めるサイズが異なるようです。そのため自動チェックできません。成功したサイズが異常でないかチェックしてください。なお、実行したディレクトリに保存される01urandom_blank.logなどのファイルはスクリプト内で使用したコマンドの出力です。

2007年  7月 25日 水曜日 23:45:55 JST
preparing urandom data...
400000+0 records in
400000+0 records out
819200000 bytes (819 MB) copied, 317.259 seconds, 2.6 MB/s
preparing urandom data... done

2007年  7月 25日 水曜日 23:51:12 JST
writing urandom...
writing urandom... done
write 736968704 bytes

2007年  7月 26日 木曜日 00:00:49 JST
writing zero...
writing zero... done
write 736968704 bytes

2007年  7月 26日 木曜日 00:10:19 JST
writing one...
writing one... done
write 736968704 bytes

2007年  7月 26日 木曜日 00:19:50 JST
preparing urandom data...
400000+0 records in
400000+0 records out
819200000 bytes (819 MB) copied, 311.562 seconds, 2.6 MB/s
preparing urandom data... done

2007年  7月 26日 木曜日 00:25:02 JST
writing urandom...
writing urandom... done
write 736968704 bytes

2007年  7月 26日 木曜日 00:36:28 JST
comparing CD and urandom.raw ...
cmp: ファイル-の末尾
comparing CD and urandom.raw ... done
Read 719586.00 kB at 2041.5 kB/sec.
Max corected retry count was 0 (limited to 128).
The following 1 sector(s) could not be read correctly:
359849

2007年  7月 26日 木曜日 00:42:21 JST
formating CD...
formating CD... done

2007年  7月 26日 木曜日 00:53:09 JST
finished and removing temporal file urandom.raw

以下、DeleteCDRW_20070727A.bashの中で何をやっているのかを説明します。
なお、スクリプト内では変数で書いている部分をここでは具体的な値に変えています。

cdrecord -scanbus
cdrecord dev=ATAPI -scanbus
は接続されているドライブを調べて表示します。

dd bs=2048 count=400000 if=/dev/urandom of=urandom.raw
はランダムデータを用意します。/dev/randomのほうが質の良いランダムデータなのですが、あまりに遅いので/dev/urandomにしました。

cdrecord dev=0,0,0 blank=fast
はCD-RWを簡易初期化します。

cat urandom.raw | cdrecord dev=0,0,0 -
は用意したランダムデータをTAOで書き込みます。わざわざcatを使わなくても良さそうなものですが、<urandom.rawで流し込むとファイルサイズをチェックされて容量オーバーと言われてしまうのでこのようにしました。

cdrecord dev=0,0,0 /dev/zero
全ビット0の値を書き込みます。

tr '\000' '\377' < /dev/zero | cdrecord dev=0,0,0 -
全ビット1の値を書き込みます。

dd bs=2048 count=400000 if=/dev/urandom of=urandom.raw
別のランダムデータを用意します。

cat urandom.raw | cdrecord dev=0,0,0 -
別のランダムデータを書き込みます。

readom dev=0,0,0 f=- 2>09urandom_read.log | cmp urandom.raw -
CD-RWを読み、書き込み用に用意したデータと比較して検証します。

cdrecord dev=0,0,0 blank=all
通常の完全初期化を行います。

消去手順についてですが、
全ビット0を書き、全ビット1を書き、ランダムを書き、検証するというのが米国国防総省規格(DoD標準(5220.22-M))だそうです。丁寧に消去する方法ということですが、どうも疑問に思ってしまうことがあります。というのは、この方法はディスクに3回も書き込みますが、各ステップで何を書き込んだかはばれているとも言えます。書き込み状態の変化が1パターンに限定できると、元のデータの予測に非常に役に立つのではないでしょうか。もちろん実際にはノイズの影響などで復元はまず無理だろうとは思うのですが、せっかく丁寧に消そうとしているので、最初に別のランダムデータも書き込むことにしました。もちろん上の問題点を厳密に解決しようとするなら、書き込んだり書き込まなかったりというのが理想なのでしょうけど、それは難しいのでランダムデータの書き込みで良しとしました。

| | コメント (1) | トラックバック (0)

« 2007年6月 | トップページ | 2007年9月 »