copy-on-writeファイルシステムはこの世の中にたくさんありますが, ユーザランドからcopy-on-writeファイルシステムの利用感を実装してみたのが cowdancerです.
cowdancerを利用したセッションの画面写真です.
ユーティリティープログラムとして,cow-shellが入っています. cow-shellコマンドを実行すると,カレントディレクトリ以下のi-nodeを保護するシェルのセッションが開始します. その中でファイルに書き込もうとすると,保護対象のi-nodeのファイルには新しいi-nodeのファイルを作成してから 書き込みを実施するようになります.
下記の利用方法を想定しています.
$ tar xfz glibc*.tar.gz
$ cp -al glibc-2.3.2 glibc-2.3.2.orig
$ cd glibc-2.3.2
$ cow-shell
Invoking /bin/bash
$ vi
$ ls -li NEWS
801386 -rw-r--r-- 2 dancer dancer 53267 2003-01-13 18:26 NEWS
$ vi NEWS
$ ls -li NEWS
2030426 -rw-r--r-- 1 dancer dancer 53272 2005-08-13 21:26 NEWS
$ exit
$ cd ..
$ diff -ur glibc-2.3.2-orig/ glibc-2.3.2
glibc-2.3.2だけに発見: .ilist
diff -ur glibc-2.3.2-orig/NEWS glibc-2.3.2/NEWS
--- glibc-2.3.2-orig/NEWS 2003-01-13 18:26:13.000000000 +0900
+++ glibc-2.3.2/NEWS 2005-08-13 21:26:46.000000000 +0900
@@ -1,3 +1,5 @@
+:wq
+
GNU C Library NEWS -- history of user-visible changes. 2003-1-12
Copyright (C) 1992-2002, 2003 Free Software Foundation, Inc.
See the end for copying conditions.
Debian GNU/Linux sid を利用している場合は,apt-get install cowdancerでインストールできます. Debian etch以降で利用可能になる予定です.
最初の設計の段階で検討しました.
| LD_PRELOAD | ptrace | |
| openが呼ばれた状態の追跡 | 可能. 「open」という関数を準備しておく | 可能. システムコールをPTRACE_SYSCALLにてトラップし,システムコール番号を分析することで解析 |
| openシステムコールをアプリケーションコードが直接呼んだ場合 | 不可 | 可能 |
| suidアプリケーションの追跡(例:gpg) | 不可 | 不可? |
| static linkアプリケーションの追跡 | 不可 | 可能 |
| アプリケーション側からのトレースからの回避方法 | LD_PRELOAD環境変数のリセットなど(lddなど) | ? |
| forkされた場合の処理 | 継続 | attachしなおす必要あり(空白の時間が発生するので, 普通はPTRACE_POKEでコード自体を書き直して対処.) |
| chrootした場合の対応 | chroot内部ではLD_PRELOADのパスの指定の仕方が変わるはず? | 可能 |
| fakerootとの互換 | 難しいかもしれない,RTLD_NEXTを使えば特に問題はおきていない. | 問題ないと思われる |
| 実際にシステムコールを発行させない方法 | システムコールを呼ばなければよい | 無理,影響を回避するためにgetpid()に変換してしまう. |
| 過去の事例 | fakeroot, fakechroot, auto-apt | gdb, user-mode-linux |
$Id: cowdancer.html.ja,v 1.5 2006/06/14 13:45:43 dancer Exp $