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 $