Ext2 Undelete など


ext2 ファイルシステムにおける, undelete の実装

ゴミ箱の状況
某 unix における
ゴミ箱の図
UNIX でファイルが消えるというのは, いちいちデータを消しゴムで消してまわ ることではない. inode(ファイルの本体みたいなものらしい) へのリンクが一個も無くなるということである. リンクの切れている inode にはアクセスする手段は無くなる, そして, いつしか上書きされてしまうのである.

「デスクトップ」といえば私にとって, それはりんご計算機の画面を意味する. りんご計算機の世界では, ファイルを抹殺してもゴミ箱に入るだけで, 「ゴミ箱を空にする」という操作を行わねば, ファイルは消えないのだ. りんご計算機でファイルが消えるという現象が, どのようにして実装されているの か, わしは知らんが, まあ, このように, うっかりファイルを抹殺してしまうと いうことが, 極力無いように配慮されているのである.

ところで, UNIX 方面でも, 細菌はじゃなく最近は「デスクトップ」が大流行り である. きっと, それを見た口うるさい昔からの りんごユーザは, 「だーから 言わんこっちゃない」と, 鼻の穴を広げているかも知れぬ. 過去の資産にすがっ て, 勝手に広げておれ. ところで, 卑しくも「デスクトップ環境」を名乗るのであれば, ファイル名 「*」を消すつもりで, つい

rm *
しても, 復活できる, 人に優しい ものでなければなるまい. (*)

ext2 ファイルシステムを undelete できるようにする非公式パッチというのを 使って, カーネルをコンパイルした. ここ には, カーネルの各種非公式パッチが揃っていて, 怪しく楽しげな世界が 形成されているのだ. このパッチは, ある flag が on になっているファイルを rm すると, ゴミディレクトリに移動 され, flag は off になるというものだ. flag が off の時に rm すると, 普通に rm される. なんで, こんなのを持って来たかと言うと, gmc で undelete できるらしいの で, それと関係あるかと思って持って来たのだった. でも, このパッチは gmc とは全然関係無かった. gmc で undelete するには, e2fsprogs というパッケージに含まれるライブラリが必要なのだった. これは, さっき download してきたが, 残念ながら make すると parse error である. わけ判らん. Linux 用のプログラムだぜ.

まあ, GNOME で削除すると, 普通の rm だから, 現状でもゴミ箱ディレクトリに移動する ことには変わりは無い. それに, コマンドラインから rm したものも, ゴミ箱漁ればちゃんと復活可能だ. gmc の undelete よりも, こっちの方が便利かも. とりあえず, デスクトップから, ゴミ箱ディレクトリへの symlink をつけてみ た. 作者の意図とは違う形ではあるが, これで undelete はできている. ext2 ファイルシステムには, いろいろ余っている空間があって, 他にも普通の unix には存在しない機能を追加できるようだ.

パッチは, 単に圧縮された一個のファイルとして存在し, 使い方は書いてない. 使い方を知らないような奴は, 使うなということなのであ ろうか. しょうがないので, Linux のカーネルソースツリーの一番上で,

patch < patchfilename
とかやった. patch が, 何か文句たれまくってたが, とりあえず Config.help とかも修正さ れる, 非常に本格的でマジメなパッチである. make config して, config_experimental を 「Y」 にしとけば, (この記事読む人は, 当然 ここは Y で make してるよな) ext2fs_undelete とかいう項目が出現し, 「?」 をタイプすれば, ちゃんと修正された help も見れるのだ. すばらしい. そして, ドキドキの再起動. 何の問題も無く起動し, rm すると, そのファイルはゴミディレクトリに移動していた.

ちなみに, ゴミ箱ディレクトリは, パーティションに一個である. デフォルトでは ".wastebasket" である. せめて, ユーザに一個欲しいところである. それから, /tmp を undelete 可能にしとくと, /tmp がおいてあるパーティショ ンが一瞬で埋まるから気を付けろ(爆笑). ディレクトリ毎に undelete するかどうかが chattr コマンドで設定可能だ. というか, 設定しないといけない. 自分のホームディレクトリに存在している全ファイルを undelete 可能にす るには, わしは find とか xargs とかを使ったが, 今見ると chattr には -R という, モロそれ用のオプションがあった. それから, 気が付くと, emacs のバックアップファイルなどが, 大量にゴミ箱に存在 していたりする.

その他にインストールしたもの. これは gnome 関連.

mc(corba-gmc) は, あまり死ななくなった. 4.5.27 は, デスクトップのものの アイコンを変更できないという BUG があったが, それが直っている.

Window Maker におけるイベントに割り付けるアクションの変更

Window Maker は, マウスボタンで窓をクリックした時の振舞は 設定できないのであろうか. とドキュメントを漁っていたが, どこにも書いてない. 手前にでかい窓が出現して, 向こうに小さい xterm が存在しているときに, 手前の窓を向こうへやって, 向こうの xterm を触ろうと思ったら, いちいち Alt を押しながらタイトルバーをクリックせねばならない. あるいは, circulate raise を使うか. いずれにせよ, キーボードが絡むので両手を使わねばならず, 非常にうざい. ウィンドウリストを使うというのもあるが, 窓の名前 -> デスクトップのオブジェクト, という mapping は, かならずしも自明でも自然でもない. xterm が 5個くらい動いているときは, 「これだっけ?」とクリックして, となりのワークスペースへふっ飛ばされ, ムカツクこともしばしばだ. これは, 良くない. 非常に不便である. マウスだけで手前の窓を向こうへやるという操作が可能であるべきだ!

こんなときは, ソースだ.

ソースを使え, ルーク
Use The Source, Luke 略して UTSL である. どっかにドキュメントされてない設定のディレクティブがあるかも, と思ってソースを当たった. なさそうであった. どうせイベントとアクションを関連づけるヘッダファイルがあるに違いないと 思って *h を grep で探した. 無し.

結局, イベントとアクションは, src/window.c に埋め込みであることが 判明. タイトルバーのダブルクリックイベントが発生したら, それが 左ボタンの場合, 左ボタンで modifier(Alt とか) が入っている場合, 真中の場合, とかいって, if と else で分岐がかけてあるのだった. 言い替えれば, 設定不可能なのである.

Window Maker は, ルックスと機能の割には軽いが, それはこの辺にも 秘密があるのかも知れない. 主要な機能は, ソースに埋め込んでしまってあるのだ.

とはいえ, このままでは非常に使い勝手が悪いので, Brian Kerninghan 師 と Dennis Ritchie 師 の手になる「ぷろぐらみんぐげんご しー」を見ながら タイトルバーを左ボタンで ダブルクリックするというイベントを窓を向こうへやるというアクションに 割り当てて, make すると, window.c に depend しているファイルだけをコン パイルしなおしてくれるのが make の良いところ. こういう変更が簡単にできるのが, Free Soft の良いところ. しかし, デフォルトのままで, みんな不便に思わないのであろうか.


(*) UNIX の世界では, "*" が「任意の文字列」を意味するというというのは, もはや常識であろう(どこで?). ところで, "*" を任意の文字列に置き換えているのは, シェルであり, ファイル消去のプログラム自体は, 文字 "*" を受け取るわけではない. シェルが展開したいろんなファイル名をもらい, 仕事をするだけだ. いちいち, もらったファイル名を, 存在するファイルのリストと比較してから ファイル消去するという作りになっていない限り, ファイル消去プログラムは 「全部消しますよ」という警告を出せないのだ.

問答無用でファイルを消してしまうという, この一見悲惨な仕様であるが, 各プログラムは, 自分のやるべき事だけをきちんとやる, という UNIX の方針からすれば, また, 論理的で自然なものでもあるのだ. しかし, 時代は流れてゆく, 使える計算機資源も増えて, 誰でも UNIX を使える ようになった今, あいかわらず rm * は全部のファイルを消去するが, 消えたファイルはゴミ箱から復活するというわけだ.