2005/05/17 改訂
2004/10/17 改訂
2003/02/20
fossil が発表されたので、まず最初に fossil を家庭にある Plan 9 端末にインストールしてみることにした。既に venti と vac の組による過去の記録があったが、この際に捨てることにした。つまり完全に新たに venti + fossil のシステムを構築しなおすことにしたわけである。以下はその記録である。
/dev/sdD1
に 21GB の空き領域を作成できたので、ここを使用することにした。term% disk/fdisk /dev/sdD1/data cylinder = 8225280 bytes >>> p p1 0 513 (513 cylinders, 3.92 GB) HPFS * p2 513 2051 (1538 cylinders, 11.78 GB) PLAN9 empty 2051 4865 (2814 cylinders, 21.55 GB) >>> a p3 2051 4865 >>> p p1 0 513 (513 cylinders, 3.92 GB) HPFS * p2 513 2051 (1538 cylinders, 11.78 GB) PLAN9 ' p3 2051 4865 (2814 cylinders, 21.55 GB) EMPTY >>> t p3 PLAN9 >>> w >>> p p1 0 513 (513 cylinders, 3.92 GB) HPFS * p2 513 2051 (1538 cylinders, 11.78 GB) PLAN9 p3 2051 4865 (2814 cylinders, 21.55 GB) PLAN9 >>> >>> qPlan 9 パーティションを2個とると、あとからとった方は
/dev/sdD1/plan9.1
として表示される。term% ls -l /dev/sdD1 --rw-r----- S 0 arisawa arisawa 10486784 Sep 26 07:59 /dev/sdD1/9fat --rw-r----- S 0 arisawa arisawa 0 Sep 26 07:59 /dev/sdD1/ctl --rw-r----- S 0 arisawa arisawa 40020664320 Sep 26 07:59 /dev/sdD1/data --rw-r----- S 0 arisawa arisawa 4145367552 Sep 26 07:59 /dev/sdD1/fs3 --rw-r----- S 0 arisawa arisawa 8335906304 Sep 26 07:59 /dev/sdD1/fs4 --rw-r----- S 0 arisawa arisawa 4219536384 Sep 26 07:59 /dev/sdD1/ntfs --rw-r----- S 0 arisawa arisawa 12650480640 Sep 26 07:59 /dev/sdD1/plan9 --rw-r----- S 0 arisawa arisawa 23145937920 Sep 26 07:59 /dev/sdD1/plan9.1 -lrw------- S 0 arisawa arisawa 0 Sep 26 07:59 /dev/sdD1/raw --rw-r----- S 0 arisawa arisawa 158720000 Sep 26 07:59 /dev/sdD1/swapここに
fs3
と fs4
は /dev/sdD1/plan9
のなかのサブパーティションである。(各々第3版と4版のファイルが置かれている。)/dev/sdD1/plan9.1
に以下のように venti と fossil ようのサブパーティション(arena
と isect
と fossil
)を作成した。この中の empty 0 2
はダミーである。isect
を 0
から始めると文句を言われる。term% disk/prep -r /dev/sdD1/plan9.1 empty 0 2 (2 sectors, 1.00 KB) isect 2 1048578 (1048576 sectors, 512.00 MB) fossil 1048578 3145730 (2097152 sectors, 1.00 GB) empty 3145730 13631492 (10485762 sectors, 5.00 GB) arena 13631492 45206910 (31575418 sectors, 15.05 GB) >>> q term%isect のサイズは、CD-ROM へのバックアップを採りやすいように決めればよい。足らなくなれば後で追加できる。
fossil
に必要なサイズは大きくはない。これは単なる一時的な書き込みバッファである。後に述べる fossil console から snap -a
でバッファ内データを venti に送ればバッファはクリアできる。しかしある程度大きくとらないと、現在の kfs のデータを fossil にコピーするときに不便である。(筆者は大量のデータを kfs に抱えているので、何回か小分けして venti に移した。)term% ls -l /dev/sdD1* --rw-r----- S 0 arisawa arisawa 10486784 Sep 26 07:59 /dev/sdD1/9fat --rw-r----- S 0 arisawa arisawa 16166614016 Sep 26 07:59 /dev/sdD1/arena --rw-r----- S 0 arisawa arisawa 0 Sep 26 07:59 /dev/sdD1/ctl --rw-r----- S 0 arisawa arisawa 40020664320 Sep 26 07:59 /dev/sdD1/data --rw-r----- S 0 arisawa arisawa 1073741824 Sep 26 07:59 /dev/sdD1/fossil --rw-r----- S 0 arisawa arisawa 4145367552 Sep 26 07:59 /dev/sdD1/fs3 --rw-r----- S 0 arisawa arisawa 8335906304 Sep 26 07:59 /dev/sdD1/fs4 --rw-r----- S 0 arisawa arisawa 536870912 Sep 26 07:59 /dev/sdD1/isect --rw-r----- S 0 arisawa arisawa 4219536384 Sep 26 07:59 /dev/sdD1/ntfs --rw-r----- S 0 arisawa arisawa 12650480640 Sep 26 07:59 /dev/sdD1/plan9 --rw-r----- S 0 arisawa arisawa 23145937920 Sep 26 07:59 /dev/sdD1/plan9.1 -lrw------- S 0 arisawa arisawa 0 Sep 26 07:59 /dev/sdD1/raw --rw-r----- S 0 arisawa arisawa 158720000 Sep 26 07:59 /dev/sdD1/swap term%
term% venti/fmtarenas arena. /dev/sdD1/arena clearing the partition configuring /dev/sdD1/arena with arenas=31 for a total storage of bytes=16166273024 and directory bytes=65536 adding arena arena.0 at [335872,537206784) adding arena arena.1 at [537206784,1074077696) adding arena arena.2 at [1074077696,1610948608) adding arena arena.3 at [1610948608,2147819520) adding arena arena.4 at [2147819520,2684690432) adding arena arena.5 at [2684690432,3221561344) adding arena arena.6 at [3221561344,3758432256) adding arena arena.7 at [3758432256,4295303168) adding arena arena.8 at [4295303168,4832174080) adding arena arena.9 at [4832174080,5369044992) adding arena arena.10 at [5369044992,5905915904) adding arena arena.11 at [5905915904,6442786816) adding arena arena.12 at [6442786816,6979657728) adding arena arena.13 at [6979657728,7516528640) adding arena arena.14 at [7516528640,8053399552) adding arena arena.15 at [8053399552,8590270464) adding arena arena.16 at [8590270464,9127141376) adding arena arena.17 at [9127141376,9664012288) adding arena arena.18 at [9664012288,10200883200) adding arena arena.19 at [10200883200,10737754112) adding arena arena.20 at [10737754112,11274625024) adding arena arena.21 at [11274625024,11811495936) adding arena arena.22 at [11811495936,12348366848) adding arena arena.23 at [12348366848,12885237760) adding arena arena.24 at [12885237760,13422108672) adding arena arena.25 at [13422108672,13958979584) adding arena arena.26 at [13958979584,14495850496) adding arena arena.27 at [14495850496,15032721408) adding arena arena.28 at [15032721408,15569592320) adding arena arena.29 at [15569592320,16106463232) adding arena arena.30 at [16106463232,16166608896)
term% venti/fmtisect isect0 /dev/sdD1/isect clearing the partition configuring index section isect0 with space for index config bytes=65536筆者は
$home/venti
に venti.conf を置いている。この内容はindex main isect /dev/sdD1/isect arenas /dev/sdD1/arenaである。
term% cd $home/venti term% venti/fmtindex venti.conf configure index section in /dev/sdD1/isect configure arenas in /dev/sdD1/arena using 65495 buckets of 65495; div=65578 add arena arena.0 at [1048576,537903104) add arena arena.1 at [537903104,1074757632) add arena arena.2 at [1074757632,1611612160) add arena arena.3 at [1611612160,2148466688) add arena arena.4 at [2148466688,2685321216) add arena arena.5 at [2685321216,3222175744) add arena arena.6 at [3222175744,3759030272) add arena arena.7 at [3759030272,4295884800) add arena arena.8 at [4295884800,4832739328) add arena arena.9 at [4832739328,5369593856) add arena arena.10 at [5369593856,5906448384) add arena arena.11 at [5906448384,6443302912) add arena arena.12 at [6443302912,6980157440) add arena arena.13 at [6980157440,7517011968) add arena arena.14 at [7517011968,8053866496) add arena arena.15 at [8053866496,8590721024) add arena arena.16 at [8590721024,9127575552) add arena arena.17 at [9127575552,9664430080) add arena arena.18 at [9664430080,10201284608) add arena arena.19 at [10201284608,10738139136) add arena arena.20 at [10738139136,11274993664) add arena arena.21 at [11274993664,11811848192) add arena arena.22 at [11811848192,12348702720) add arena arena.23 at [12348702720,12885557248) add arena arena.24 at [12885557248,13422411776) add arena arena.25 at [13422411776,13959266304) add arena arena.26 at [13959266304,14496120832) add arena arena.27 at [14496120832,15032975360) add arena arena.28 at [15032975360,15569829888) add arena arena.29 at [15569829888,16106684416) add arena arena.30 at [16106684416,16166813696) configured index=main with arenas=31 and storage=16165765120
/dev/sdD1/fossil
をフォーマットする。term% fossil/flfmt /dev/sdD1/fossil diskThread 1205 diskThread done diskThread 1206 fs->ehi 1 fs->elo 1 active=2 got fs source got file root diskThread done term%以上で準備完了。
term% venti/venti -h tcp!*!8088 -w -c $home/venti/venti.conf configure index section in /dev/sdD1/isect configure arenas in /dev/sdD1/arena initialize 1048576 bytes of lump cache for 128 lumps initialize 3072 bytes of index cache for 64 index entries initialize 417792 bytes of disk block cache sync arenas and index... initialize write queue... starting http server at tcp!*!8088 starting serverHTTP ポートとして 8088 を使用したのは、8080 が httpd によって使用済みだったからである。
tcp!*!8088
とした場合には、venti に関する情報が、外部から 8088 ポートを通じて入手できる。この情報はディスクの使用状態に関するもので、セキュリティの問題をもたらすとは思えないが、インターネット環境ではアクセス可能なクライアントを限定したほうがよいかもしれない。-a
オプションを使用する。flproto
を作成しておく。筆者は $home/venti
に置いた。term% cat flproto fsys main config /dev/sdD1/fossil fsys main venti pc fsys main open -AWP fsys main create /active/adm adm sys d775 create /active/adm/users adm sys 664 users -w /active/adm/users # 注意1 srv -p fscons srv fossil
users
の仕様が変更されています。現在はuser -w /active/adm/usersではなく、単に
users -wです。(2004/10/17)
fsys main venti pcに現れる
pc
は筆者の Plan 9 端末の名称である。venti はここで動作している。つまり一般論として venti が動作しているコンピュータと fossil が動作しているコンピュータは異なっていても構わない。(今の場合には共に pc
である。)fsys main open -AWPの
-AWP
は fossil を完全に無防備な状態で実行する事を意味している。最初の動作確認はここから始めたほうが分かりやすい。実際の運用はどのようにすべきかは後に議論する。create /active/adm adm sys d775 create /active/adm/users adm sys 664によって fossil に
/adm/
と /adm/users
が作成される。これは一度だけ実行すればよいので、二回目からは外しておく。users -w /active/adm/usersは
/adm/users
を初期化する(先の注意1を見よ)。これによって作成される /adm/users
の内容は、最小構成である。term% fossil/fossil -tc '. flproto' nuser 4 diskThread 1240 fs->ehi 1 fs->elo 1 active=2 got fs source got file root nuser 0 prompt: user 'adm' is mandatory user 'adm' is mandatoryこの中で、
fossil/fossil
の -t
オプションは fossil
を実行したウィンドウを fossil のコンソールとして使うことを意味している。(以下、このウィンドウを fossil コンソールと言うことにする。)/srv
の中に fossil
が生成している事を確認する。生成していればterm% mount /srv/fossil /n/fossilのように、どこかに
/srv/fossil
をマウントする。(ここでは /n/fossil
にマウントしている。)term% ls /n/fossilを実行して
/n/fossil/adm /srv/fsconsが表示されれば成功である。
/n/fossil/adm
あるいは /srv/fscons
が表示されないなら、fossil のコンソールから srv fossil
あるいは srv -p fscons
を実行してみるがよい。/adm/users
の形式が fossil で変更されている。term% cat /n/fossil/adm/users adm:adm:adm:sys none:none:: noworld:noworld:: sys:sys:: term%すなわち、ユーザ ID が数字から文字列になったのである。ここでは文字列としてユーザ名ものものが使用されているが、一般的に言えばユーザ名と異なる文字列であればよい。この問題はあとで議論するが、とりあえずユーザ ID とユーザ名を一致させておく方がよいであろう。したがって kfs などで使用されてきた
/adm/users
をそのままコピーするわけにはいかない。sed 's/^([^:]+):([^:]+)/\2:\2/' /adm/users >/n/fossil/adm/usersで変換できる。これまでのファイルシステムと同様に
/n/fossil/adm/users
を書き換えただけではその結果が fossil には反映しない。fossil コンソールでusersを実行する必要がある[注意2]。
users -r /active/adm/usersとします。(2004/10/17)
?, =, +, -, /, and :を除く印字文字と書いてあるが
/adm/users
の書式を考えると、これら以外にコンマ(,
) も禁止されているはずである。
fsys main config /dev/sdD1/fossilに現れる
main
は fossil コンソールが管理するファイル木の名称である。マニュアルには記載されていないが、ソースコードを読む限り main
は特別な名前である。他の名前を持つ木も作成できるが、main
だけが以下に述べる users
コマンドの対象となる。/active /archive /snapshot
/active
の下に読み書きのための通常のファイル木が続く。他方 /archive
と /snapshot
には /active
の過去の姿が映し出される。
/n/fossil/adm/users
への書き込みによって、直ちに fossil の動作がその内容を反映するわけではない。fossil コンソールからusers # 注意3コマンドを投入する必要がある[ 注意3]。
users -r /active/adm/usersとします。(2004/10/17)
users
を実行すると(例えば)次のように読みとられたファイルとユーザ数が表示される。main: users file /active/adm/users nuser 17 len 258 main:既存のファイルシステムを fossil にコピーするには、(多分ユーザが登録されているので)この手順を踏む必要がある。
users
はファイル木 main に作用する。他の名称のファイル木に対しては users
は必要ない。main: snap cacheFlush: 43 dirty blocks cacheFlush: 14 dirty blocks cacheFlush: 13 dirty blocks cacheFlush: 2 dirty blocks cacheFlush: done main:適当なウィンドウを開いてその結果をみてみよう。(
/n/snap
を前もって作成しておく。)term% mount /srv/fossil /n/snap main/snapshot term% ls /n/snap /n/snap/2003もっと詳しくは(現在の筆者のシステムでは)
cpu% ls /n/snap/*/*/* /n/snap/2003/0117/2346/adm /n/snap/2003/0117/2346/usr /n/snap/2003/0118/1127/adm /n/snap/2003/0118/1127/usr /n/snap/2003/0120/1410/adm /n/snap/2003/0120/1410/usr /n/snap/2003/0204/2321/adm /n/snap/2003/0204/2321/usr /n/snap/2003/0206/1435/adm /n/snap/2003/0206/1435/usr /n/snap/2003/0206/2307/adm /n/snap/2003/0206/2307/usr /n/snap/2003/0206/2307.1/adm /n/snap/2003/0206/2307.1/usr /n/snap/2003/0207/2350/adm /n/snap/2003/0207/2350/usr cpu%となる。
/n/snap/2003/0117/2346は 2003 年1月17日の23時46分のスナップショットの意味である。この下にその時の fossil サーバの内容がファイルシステムの形式で納まっている。(筆者はまだ全面的に fossil には移行していない。現在の所、単に
/usr
以下だけに fossil を利用している。)2307.1
のように時刻あとに数字が付いているのは、1分以内に2度スナップショットを撮ったからである。main: snap -a cacheFlush: 5 dirty blocks cacheFlush: 3 dirty blocks cacheFlush: 2 dirty blocks cacheFlush: 1 dirty blocks cacheFlush: 1 dirty blocks cacheFlush: 1 dirty blocks cacheFlush: done main: disk: io=10000 at 15.485ms disk: io=10008 at 12.661ms disk: io=10000 at 14.995ms disk: io=10000 at 15.825ms disk: io=10000 at 18.122ms archive vac:822ea17ca5b0dfbeba30668d328153efb10df476最後の vac の値は fossil がクラッシュした場合に必要になる重要な情報である。この情報は venti に記録され後で取り出すことができる。
snap -a
の結果を見るには、(前もって /n/dump
を作成しておき)term% mount /srv/fossil /n/dump main/archive term% ls /n/dump/*/* /n/dump/2003/0118/adm /n/dump/2003/0118/usr /n/dump/2003/0119/adm /n/dump/2003/0119/usr term%ここに
/n/dump/2003/0118は 2003年1月18日を意味している。同じ日に2度
snap -a
を実行すると/n/dump/2003/0118.1のようにピリオドの後の数字で区別される。
sync
を実行しないと、次回に fossil を立ち上げたときに結果が反映されない。clir
はファイル木の中の任意のファイルやディレクトリを消去する。すなわち /archive
や /snapshot
の中のファイルやディレクトリも消去できる。(実際には参照の手がかりを捨てている)/active
を過去に戻せるのも面白いとは思うが、マルチユーザ環境ではそれは他の問題をもたらすのであろう。fossil ではサポートされていない。過去のスナップショットを /active
にコピーすることによって、必要に応じて元に戻すことになる。
main: epoch low 1 hi 42 1 clri /snapshot/2003/0117/2346 4 clri /snapshot/2003/0118/1127 13 clri /snapshot/2003/0120/1410 16 clri /snapshot/2003/0204/2321 21 clri /snapshot/2003/0206/1435 29 clri /snapshot/2003/0207/2350 40 clri /snapshot/2003/0212/1717 41 clri /snapshot/2003/0213/2317 8 snapshots found with epoch < 4294967295 not setting low epoch main: epoch -y 13 low 1 hi 42 1 clri /snapshot/2003/0117/2346 4 clri /snapshot/2003/0118/1127 2 snapshots found with epoch < 13 old: epoch -y 1 new: epoch -y 13 main: epoch low 13 hi 42 cannot walk /snapshot/2003/0117/2346: snapshot has been deleted cannot walk /snapshot/2003/0118/1127: snapshot has been deleted 13 clri /snapshot/2003/0120/1410 16 clri /snapshot/2003/0204/2321 21 clri /snapshot/2003/0206/1435 29 clri /snapshot/2003/0207/2350 40 clri /snapshot/2003/0212/1717 41 clri /snapshot/2003/0213/2317 6 snapshots found with epoch < 4294967295 not setting low epoch main:
sync
コマンドkill fossil | rc
venti/sync -h pc
kill venti | rc
pc
は筆者の venti サーバの名前である。他方 Plan 9 端末を終了するにはsync
コマンドventi/sync -h pc
disk/ksync
/bin/termrc
の中にv=/usr/arisawa/venti venti/venti -h tcp!*!8088 -w -c $v/venti.conf >[2] /dev/null & sleep 5 fossil/fossil -c '. '$v/flproto mount /srv/fossil /n/fossil mount /srv/fossil /n/snap main/snapshot mount /srv/fossil /n/dump main/archive bind -c /n/fossil/usr /usrを書き込む。これは筆者の例である。
sleep 5
は筆者のシステムでのチューニングであり、Russ Cox は sleep 10
にしているそうな。筆者は現在の所 /usr
に対してのみ fossil を使用しているので、bind -c /n/fossil/usr /usr
としている。fsys main config /dev/sdD1/fossil fsys main venti pc fsys main open -AW fsys main users /active/adm/users # 注意4 srv fossil srv -p fscons
users -r /active/adm/usersですが、省いてもかまいません。(2004/10/17)
open -AW
程度が使いやすいであろう。A
は認証を行わないオプションである。認証サーバを持たない場合にはこのオプションは必須である。持っていてもこのオプションは付けた方が無難である。(認証サーバがダウンしていたら fossil にアクセスできなくなりますからね。)W
は誰にでも chmod
や chgrp
を許すオプションである。このオプションは端末を複数のユーザで共有している場合には使用すべきではない。しかし個人で独占している場合には問題はないであろう。reopen
コマンドを追加して fossil コンソールから A
,W
,P
のオプションをいつでも再設定できるようにしている。これはとても便利なのでベル研の正式版でも採用して欲しい。変更は 9fsys.c
だけである。違いを比較できるよう変更後と変更前の2つの 9fsys.c をダウンロードできるようにしておく。変更後の 9fsys.c、変更前の 9fsys.c。[注意5]srv
コマンドに A
,P
,W
のオプションを付ける事ができるので、この問題は解決している。(2004/10/17)/lib/namespace
に fossil のマウントを登録する必要がある。(でないとネットワークからアクセスしたときに fossil が使用されない。) 以下は筆者の /lib/namespace
の一部である。# authentication mount -a /srv/factotum /mnt # we use fossil mount /srv/fossil /n/fossil bind -c /n/fossil/usr /usr # standard bin bind /$cputype/bin /bin bind -a /rc/bin /bin
/bin/termrc
では fossil の実行に際し -t
オプションを付けるわけにはいかない。この場合 fossil コンソールにアクセスするにはコンソールからcon /srv/fsconsを実行すればよい。con を終了するには control+"\" を打つ[注意6]。