cowdancer - copy-on-write data access completely in userland

cowdancerとは

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以降で利用可能になる予定です.

原理

ptraceかLD_PRELOADか

最初の設計の段階で検討しました.

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

参考


Junichi Uekawa

$Id: cowdancer.html.ja,v 1.5 2006/06/14 13:45:43 dancer Exp $