ファイル/デバイス完全消去には(g)shred


あるファイルを完全に消去するにはshredコマンドを使う。
ファイルの他にデバイスに対しても実行可能。
特にオプションが指定されなければ、shredは指定されたファイル、デバイスファイルに対して、ランダムなパターンで三回、上書きをする。


普通のLinuxにはデフォルトでついてくる。
FreeBSDでは、sysutils/coreutilsからインストールする。
これはつまりGNU coreutilsなので(だからLinuxには最初からある)、shredだけではなく、山のようにコマンドが付いてくる。
しかもそのほとんどがFreeBSDのベースシステムにもある超基本コマンドである。
両者を区別するために、coreutilsでインストールされたコマンドにはすべて頭にgが付く。
shredはgshred。
同様に、gdate, gexpr, gtest, gcat, gchgrpなどなど。


使い方は簡単で、ファイルを指定するだけ。
デフォルトでは上書きをするだけでファイルを消さない。
なぜかと言えば、デバイスファイルに対しても使われることを想定しているから。
(デバイスファイル消したらエライことになる)


オプションで--remove あるいは -u を与えてあげれば、上書きした後に消してくれる。


実行例

(試しにログを持ってきて、それに対してshredを実行してみる)
$ tail ./messages 
Jan 17 06:35:40 sylph sudo:      harukiya : TTY=pts/0 ; PWD=/usr/ports/sysutils/coreutils ; USER=root ; COMMAND=/usr/bin/make
Jan 17 06:39:37 sylph sudo:      harukiya : TTY=pts/0 ; PWD=/usr/ports/sysutils/coreutils ; USER=root ; COMMAND=/usr/bin/make install
Jan 17 06:40:40 sylph sudo:      harukiya : TTY=pts/0 ; PWD=/usr/ports/sysutils/coreutils ; USER=root ; COMMAND=/usr/bin/make clean

(-vがないとあっさりしすぎなので付けておくといいでしょう)
$ gshred -v ./messages 
gshred: ./messages: 経過 1/3 (random)...
gshred: ./messages: 経過 2/3 (random)...
gshred: ./messages: 経過 3/3 (random)...

$ !tail
tail ./messages 
(無意味な文字列が表示される)

(-uを付けると消してくれる。名前を変更しまくる念の入れよう)
$ gshred -uv ./messages 
gshred: ./messages: 経過 1/3 (random)...
gshred: ./messages: 経過 2/3 (random)...
gshred: ./messages: 経過 3/3 (random)...
gshred: ./messages: 削除しています
gshred: ./messages: ./00000000 に名前が変更されました
gshred: ./00000000: ./0000000 に名前が変更されました
gshred: ./0000000: ./000000 に名前が変更されました
gshred: ./000000: ./00000 に名前が変更されました
gshred: ./00000: ./0000 に名前が変更されました
gshred: ./0000: ./000 に名前が変更されました
gshred: ./000: ./00 に名前が変更されました
gshred: ./00: ./0 に名前が変更されました
gshred: ./messages: 削除しました


注意! 以下のケースではホントに消えたか保証はせんよ、とのこと。
 journalが有効の場合
 snapshotを取っている場合
 キャッシュを持っている場合(NFS
 圧縮ファイルシステム上にある場合