💟 Archived View for kamalatta.ddnss.de › cwfs-eng.txt captured on 2021-12-05 at 23:47:19.

View Raw

More Information

⬅ Previous capture (2021-11-30)

➡ Next capture (2024-07-08)

-=-=-=-=-=-=-

cwfs の研究 Study of cwfs

目次 table of contents

• 1.0.0 cwfs ずは 1.0.0 What is cwfs
• 2.0.0 cwfs console 2.0.0 cwfs console
• 2.1.0 抂芁 2.1.0 Overview
• 2.2.0 fsworm のバックアップ 2.2.0 backup of fsworm
• 3.0.0 fsworm の構造 3.0.0 Structure of fsworm
• 3.1.0 Block 3.1.0 Block
• 3.2.0 dump stack 3.2.0 dump stack
• 3.3.0 Super Block 3.3.0 Super Block
• 3.4.0 Directory Entry Block 3.4.0 Directory Entry Block
• 3.5.0 Indirect Block 3.5.0 Indirect Block
• 3.6.0 File Block 3.6.0 File Block
• 3.7.0 Fsworm Root 3.7.0 Fsworm Root
• 3.8.0 ダンプの順序 3.8.0 Dump order
• 3.9.0 qid 3.9.0 qid
• 4.0.0 fscache の構造 4.0.0 Structure of fscache
• 4.1.0 Config Block 4.1.0 Config Block
• 4.2.0 Tcache Block 4.2.0 Tcache Block
• 4.3.0 Mapping 4.3.0 Mapping
• 4.3.1 bucket 4.3.1 bucket
• 4.3.2 cache entry 4.3.2 cache entry
• 4.3.3 age 4.3.3 age
• 4.3.4 state 4.3.4 state
• 4.4.0 free block and dirty block 4.4.0 free block and dirty block
• 4.5.0 msize ず csize 4.5.0 msize and csize
• 4.6.0 Map from Worm to Cache 4.6.0 Map from Worm to Cache
• 4.7.0 msize の決定アルゎリズム 4.7.0 msize determination algorithm
• 4.8.0 Fscache Root 4.8.0 Fscache Root
• 5.0.0 Recovery 5.0.0 Recovery
• 5.1.0 埩元 (recovery) 5.1.0 recovery
• 5.2.0 埩元(recovery)に぀いお吟味 5.2.0 Review on recovery
• 5.3.0 Recovery によっお倱われるもの 5.3.0 What is lost by Recovery
• 6.0.0 Other Configurations 6.0.0 Other Configurations
• 6.1.0 pseudo-RAID1 6.1.0 pseudo-RAID 1
• 6.2.0 fake WORM 6.2.0 fake WORM
• 6.2.1 fake WORM の䜜成 6.2.1 Creating fake WORM
• 6.3.0 Tvirgo 6.3.0 Tvirgo
• 7.0.0 Misc. 7.0.0 Misc.
• 7.1.0 What did I do that day? 7.1.0 What did I do that day?
• 7.2.0 atime 7.2.0 atime
• 7.2.1 Plan9 7.2.1 Plan 9
• 7.2.2 Linux 7.2.2 Linux
• 7.2.3 OSX 7.2.3 OSX
• 8.0.0 cwstudy 8.0.0 cwstudy
• 8.1.0 usage 8.1.0 usage
• 9.0.0 文献 References

2012/10/20 2012/10/20
2013/03/14 曎新 2013/03/14 renewal
2013/03/28 曎新 Updated on March 20, 2013
2013/04/02 曎新 Updated 2013/04/02
2013/04/10 曎新 Updated 2013/04/10
2013/04/24 曎新 2013/04/24 Update

2012幎の倏䌑みは、9front の cwfs を詊しおいた。 For the summer vacation in 2012, I
was trying 9front's cwfs. cwfs は fscache ず fsworm で構成されおいるが、fsworm
の方から調べるこずずした。 cwfs consists of fscache and fsworm, but we decided to
look it up from fsworm. fsworm の方に関心がある理由は、ファむルの履歎等の情報は fsworm に眮かれ、たた
fscache がクラッシュした時のリカバリヌも fsworm に基づいお行われるからである。 The reason why you are
more interested in fsworm is that information such as file history is
placed in fsworm and recovery when fscache crashes is done based on
fsworm.
もちろん、いかなるデバむスもやがおは死を迎える。 Of course, any device eventually will die.
fsworm に察しおもバックアップが必芁である。 Backup is necessary for fsworm. cwfs 自䜓を
RAID に眮くこずも考えられようが、僕には倧げさすぎる。 It may be possible to put cwfs itself in
RAID, but it's too overkill for me. もう䞀぀ HDD を远加しお、そこに fsworm
のコピヌを持ちたい。 Add another HDD and want to have a copy of fsworm there.
それでは、どのようにコピヌすれば、短時間でやれるのか? この問題を解明したかったのである。 So, how can we copy it
in a short time? I wanted to elucidate this problem.

9front 付属の cwfs は cwfs64x である。 The cwfs attached to 9front is cwfs64x.
そこで、ここでは cwfs64x に基づいお解説する。 Therefore, we will explain it based on
cwfs64x.

=======

泚意: この蚘事は今のずころ筆者のメモに過ぎない。 Note: This article is just my memo so far.
もちろん、誀りを含んでいるかも知れない。 Of course, it may contain errors.
誀りを発芋したら知らせおいただければ幞いである。 I would be pleased if you let me know if you
find an error.
=======

cwfs ずは What is cwfs

この節は未完成である。 This section is incomplete. 暇な時に曞く事ずする。 I will write it in
my spare time.

泚意: あなたのブラりザは SVG をサポヌトしおいたせん。 Note: Your browser does not support
SVG.最新のブラりザをお䜿いください。 Please use the latest browser.
図1. layer Figure 1. layer

Sean Quinlan (Ph.D) Sean Quinlan (Ph.D)
Ken Thompson (Ken's fs) Ken Thompson (Ken's fs)
Plan9 2nd edition (1995) Plan 9 2nd edition (1995)
Geoff Collyer (2007/03/27 mail) Geoff Collyer (2007/03/27 mail)
9front (2011) 9front (2011)
過去の履歎 Past History
WORM (write once read many) WORM (write once read many)
消えない(消せない) It will not disappear (can not be erased)
dump dump

Mac/OSX の time machine ずの比范 Comparison with Mac / OSX time machine
pdumpfs pdumpfs

以前はサヌバのために1台を割り圓おおいた。 Previously we had one assigned for the server.
memory: ファむルサヌバ専甚機の䞭のメモリヌ memory: Memory in the dedicated file server
disk: disk cache disk: disk cache
WORM: 光ディスク WORM: Optical disc

珟圚は Plan9 の基で動くナヌザヌプログラム cwfs Currently it runs under Plan 9 user
program cwfs
ナヌザプログラムである事の利点: 仕組みを調べやすい。 Advantages of being a user program: It is
easy to check the mechanism.
memory: cwfs daemon 䞭のメモリヌ memory: memory in cwfs daemon
disk: ファむルサヌバの fscache パヌティション disk: fscache partition of file server
WORM: ファむルサヌバの fsworm パヌティション WORM: File server fsworm partition

cwfs (or cwfs32) cwfs (or cwfs32)
cwfs64 cwfs64
cwfs64x cwfs64x

cwfs console cwfs console

抂芁 Overview

cwfs に関する僕のパヌティションのサむズは次の通りである。 The size of my partition on cwfs is as
follows.

term% ls -l /dev/sdC0/fs* term% ls - l / dev / sdC 0 / fs *
--rw-r----- S 0 arisawa arisawa 22848146432 Sep 13 09:50
/dev/sdC0/fscache - rw - r ---- - S 0 arisawa arisawa 22848146432 Sep
13 09: 50 / dev / sdC 0 / fscache
--rw-r----- S 0 arisawa arisawa 114240734208 Sep 13 09:50
/dev/sdC0/fsworm - rw - r ----- S 0 arisawa arisawa 114240734208 Sep
13 09: 50 / dev / sdC 0 / fsworm
term% term%

cwfs コン゜ヌルはコマンド The cwfs console uses commands

con -C /srv/cwfs.cmd con -C /srv/cwfs.cmd

で䜿えるようになる。 You will be able to use with.

=======

泚意: りィンドを新たに1぀䜜っお Note: Create one new window

cat /srv/cwfs.cmd cat /srv/cwfs.cmd

を実行しおおいお、他のりィンドりから Run it from another window

echo statw>> /srv/cwfs.cmd echo statw>> /srv/cwfs.cmd

を実行しおもよい。 May be executed. 配垃版はこの方法を想定しおいるず思われる。 Distribution seems to
assume this method.
=======

cwfs コン゜ヌルで statw を実行するず、fsworm の利甚統蚈が出力される。 Running statw on the cwfs
console will output usage statistics for fsworm.次にその出力䟋を瀺す。 Next, an
example of the output is shown.

> statw> statw
cwstats main cwstats main
filesys main filesys main
maddr = 3 maddr = 3
msize = 10313 msize = 10313
caddr = 1035 caddr = 1035
csize = 1392255 csize = 1392255
sbaddr = 1755217 sbaddr = 1755217
craddr = 1755389 1755389 craddr = 1755389 1755389
roaddr = 1755392 1755392 roaddr = 1755392 1755392
fsize = 1755394 1755394 0+25% fsize = 1755394 1755394 0 + 25%
slast = 1754642 slast = 1754642
snext = 1755393 snext = 1755393
wmax = 1755392 0+25% wmax = 1755392 0 + 25%
wsize = 6972701 1+ 0% wsize = 6972701 1 + 0%
8600 none 8600 none
230005 dirty 230005 dirty
0 dump 0 dump
1153555 read 1153555 read
95 write 95 write
0 dump1 0 dump1
cache 17% full cache 17% full
>>

図2. cwfs コン゜ヌルでの statw の出力䟋。 Figure 2. Example of statw output from
the cwfs console.
プロンプト “> ” は、オフィシャルな配垃版では出ない。 The prompt">" is not issued in the
official distribution version.
筆者による修正版で出るようにしおいる。 I am trying to go out with a modified version by
the author.

maddr から wsize たでの、等号の右の数字(1列目ず2列目)は、サむズを衚しおいる。 The numbers on the
right of the equal sign ( maddr to wsize) (the first and second
columns) represent the size. 1列目の数字の情報は、fscache の Tcache block (block
address 2) から埗られる。 The information of the number in the first column
is obtained from Tcache block (block address 2) of Tcache. 2列目は fsworm
から埗られる 泚1 。 The second column is obtained from fsworm Note 1. これらの単䜍は
msize を陀けば block である。 These units are block except for msize. msize
だけは bucket 数である。 Only msize is a bucket number.

泚1: この郚分は正しくない。 Note 1: This part is incorrect. 2列目も fscache から埗られおいる。
The second row is also obtained from fscache. fsworm の最埌の super block
の cache が fscache の䞭に含たれ、これを衚瀺しおいる。 The cache of the last super block
of fsworm is included in fscache and this is displayed. fsize
を陀いお、2列目の情報は、最埌の super block から埗られる情報ず䞀臎しおいる。 fsize for fsize, the
information in the second column matches the information obtained from
the last super block. fsize は statw コマンドを実行した時点での倀であり、これは fscache の
Tcache block から埗られる fsize ず䞀臎しおいる。 fsize is the value at the time of
executing the statw command, which is consistent with fsize obtained
from the Tcache block of Tcache. (2013/04/24) (2013/04/24)

fsworm には、fsworm のパヌティションサむズに関する情報は含たれない事に泚目しよう。 Notice that fsworm
does not include information on fsworm's partition size. fsworm
が満杯になった時に、もっず倧きなパヌティションに眮き換えられる可胜性があるので、その堎合には、単に満杯になったパヌティションの内容を新しいパヌティションにコピヌすればよいように蚭蚈されおいるのであろう。
It may be replaced by a larger partition when fsworm is full, so in
that case it would be designed to just copy the contents of the full
partition to the new partition.

fscache も fsworm も block を単䜍ずしお管理されおいる 泚2 。 Both fscache and fsworm
are managed in block units. cwfs64x の堎合には 1 block は 16KB である。 In the
case of cwfs64x, 1 block is 16 KB. 以䞋、block をアドレスで衚すこずずする。
Hereinafter, block is represented by an address. ba[0] は最初の block を
ba[1] は第2 block を意味する。 ba[0] means the first block, and ba[1] means
the second block.

wsize の 6972701 は /dev/sdC0/fsworm の倧きさを block 数で衚しおいる。 wsize 6972701
/dev/sdC0/fsworm the size of /dev/sdC0/fsworm the number of blocks.

6972701*16*1024 == 114240733184 6972701 * 16 * 1024 == 114240733184

これは実際の /dev/sdC0/fsworm の倧きさ 114240734208 よりも 1024 だけ少ないが、block
を単䜍ずしお䜿甚されおいる為に、䜿甚できない領域が発生したのである。 This is 1024 less than the actual
size of /dev/sdC0/fsworm, but since it is being used as a unit, an
unusable area has occurred.

fsworm にはフォヌマットの抂念が存圚しない事に泚意すべきである。 It should be noted that there is
no concept of format in fsworm. なぜなら Write Once
だから、フォヌマットしたらデヌタを曞き蟌めない! 泚3 Because it is Write Once, after formatting
it can not write data! 3

fsworm には先頭 block から順に曞き蟌たれる。 It is written to fsworm in order from
the top block. snext (next super block) は、次に曞き蟌たれる block を瀺しおいる。 snext
(next super block) indicates the next block to be written. dump
を行うず、最初に super block ず呌ばれる block が曞き蟌たれ、それに続いおデヌタの本䜓が曞き蟌たれる。 When you
dump, a block called super block is written first, followed by the
body of the data. Super block は、dump 毎の境界ずしお、fsworm
においおは基本的な圹割を果たしおいる。 Super block serves as a boundary for every dump
and plays a fundamental role in fsworm.

sbaddr (super block address) は、最埌に曞き蟌んだ super block のアドレスである。 sbaddr
(super block address) is the address of the super block written last.
たた、 slast は、その1぀前の super block のアドレスである。 Also, slast is the address of
the preceding super block.

泚2: cwfs が管理する block は、ドラむバが管理する読み曞き単䜍ずしおのブロックずは別のものである。 Note 2: The
block managed by cwfs is different from the block as the unit of
reading / writing managed by the driver.
泚3:最近では本来の意味での WORM を䜿う事はないであろう。 Note 3: WORM in its original meaning
will not be used recently. バックアップメディアずしおの光ディスクの存圚意矩は無くなっおおり、ハヌドティスクで
WORM を代甚する方が䜎コストで、か぀䜿い勝手も良い。 The significance of the existence of an
optical disk as a backup medium has disappeared, substituting WORM for
a hard task is low cost and easy to use. 以䞋の解説もハヌドディスクの䜿甚を前提ずしおいる。 The
following explanation also assumes the use of a hard disk.

fsworm のバックアップ Backup of fsworm

2013/03/06 改蚂 Revised 2013/03/06

fsworm は(その仕組み䞊)非垞に堅牢ではあるが、それでもハヌドりェアクラッシュによるデヌタ消倱のリスクを負っおいる。 Although
fsworm is very robust (in its mechanism), it still has the risk of
data loss due to hardware crashes. バックアップを行うには、fsworm のコピヌ(䟋えば
fsworm-bak)を持おばよい。 To do the backup you have a copy of fsworm (eg
fsworm-bak).

dump 毎に、fsworm の䞭に新たに生成された block
だけをコピヌしお行けばよいず考えるかも知れないが、話はそんなに簡単ではない。 For each dump, you might think
that you can copy only the newly created block in fsworm, but the
story is not that easy. なぜなら、曞き蟌たれおいない block が最埌に dump された super block
の䞋に存圚するからである。 This is because unwritten blocks exist under the last
dumped super block. 筆者の芳察ではそれらには2皮類ある。 In my observation there are two
kinds of them.
(a) reserved block 泚1 (a) reserved blockNote 1
(b) free block (b) free block
である。.
(a)は、fscache の䞭で䜿甚されおいるが、ただ dump が完了しおいない fsworm の block である。 (a) is a
block of fsworm that is used in fscache, but has not yet completed
dump.
(b)は、今埌 fscache が䜿甚可胜な fsworm の block である。 (b) is a block of fsworm
that fscache can use in the future.

泚1: “reserved block” は筆者が勝手に䜿っおいる甚語である。 Note 1:"reserved block" is a
term that I am using arbitrarily. この甚語は文献には存圚しない。 This term does not
exist in the literature.

fsworm の構造 Structure of fsworm

Block Block

fscache も fsworm も block を単䜍ずしお管理されおいる。 Both fscache and fsworm are
managed in units of block. cwfs64x の堎合には 1 block は 16KB である。 In the
case of cwfs64x, 1 block is 16 KB. 以䞋、block をアドレスで衚すこずずする。
Hereinafter, block is represented by an address. ba[0] は最初の block を
ba[1] は第2プロックを意味する。 ba[0] means the first block and ba[1] means the
second block. 共に、先頭の 2 block は特殊である。 Together, the first two blocks
are special. block のアドレスは 8 B のデヌタで指定される。 The address of block is
specified by 8 B data. プログラムの䞭ではデヌタ型が Off で瀺されおいる。 In the program, the
data type is indicated by Off.

fscache の堎合には、 ba[0] には config 情報が眮かれおいる。 In the case of fscache,
ba[0] contains config information. ba[1] は䜿われおいないようである。 ba[1] seems
not to be used.
fsworm の堎合にも先頭の 2 block が䜿甚されおいる気配はない。 In the case of fsworm, there is
no indication that the first 2 blocks are used.

どの block も Tag を持っおいる。 Each block has Tag. もっずも、党おの block
がフォヌマットされおいるのではない 泚1 。 However, not all the blocks are formatted.

Tag の倧きさは、cwfs64x の堎合には 12B であり、block の末尟に眮かれる。 The size of Tag is 12
B in the case of cwfs 64 x, and it is placed at the end of the block.
その構造は次のようなものである。 Its structure is as follows.

struct Tag struct Tag
{ {
short pad; /* make tag end at a long boundary */ short pad; / * make
tag end at a long boundary * /
short tag; short tag;
Off path; Off path;
};};

pad の倀は 0 である。 The value of pad is 0. tag が block の皮類を衚しおいる。 tag
indicates the type of block. path の倀に関する考え方は tag 毎に異なる。 path way of
thinking about the value of path is different for each tag.

16KB から Tag の 12B を陀く領域がデヌタ領域(以䞋、Data で衚す)であり、block の皮類毎の構造を持っおいる。 The
area excluding Tag 12B is a data area (hereinafter referred to as
Data) from 16 KB and has a structure for each type of block. 纏めるず To
summarize

block = Data + Tag block = Data + Tag

である。.

泚1:最近の HD は容量が倧きい。 Note 1: Recent HD has large capacity. もしも党おの block
をフォヌマットするず膚倧な時間を芁する。 Formatting all the blocks takes a huge amount of
time. さらに蚀えば、WORM デバむスはフォヌマットすれば曞き蟌めなくなる! In addition, the WORM device
can not write if formatted!

dump stack dump stack

2013/02/28 2013/02/28

dump を繰り返すず、fsworm には、ダンプしたデヌタが積み重ねられる。 When dump is repeated, dumped
data is stacked on fsworm. デヌタは決しお䞊曞きされるこずはない。 Data will never be
overwritten.その様子を図3(å·Š)に瀺す。 The situation is shown in Fig. 3 (left).

泚意: あなたのブラりザは SVG をサポヌトしおいたせん。 Note: Your browser does not support
SVG.最新のブラりザをお䜿いください。 Please use the latest browser.
図3. dump Figure 3. dump

以䞋、block address n の block を ba[n] で衚す。 Hereinafter, the block of
block address n is represented by ba[n]. ba[0] ず ba[1] は䜿われおいない。 ba[0]
and ba[1] are not used. cwfs が実行されるず、最初に 3 ぀の block When cwfs is
executed, first three blocks

ba[2]: super block ba [2]: super block
ba[3]: cfs root block ba [3]: cfs root block
ba[4]: dump root block ba [4]: ​​dump root block

が䜜られる。 Is made. この䞭には fscache の䞭に含たれるファむルの情報は含たれおいない。 It does not
contain information on files included in fscache.
泚意: “cfs root block” ずか “dump root block”
ずかの蚀葉は正匏なドキュメントやプログラムコヌドの䞭には珟れない。 Note: The words"cfs root block" or
"dump root block" do not appear in formal documents or program code.
“cfs root address” ず “dump root address” は珟れる。"Cfs root address" and
"dump root address" appear.

dump 毎に block が積み䞊げられる。 Blocks are stacked for each dump. 1回の dump
で積み䞊げられる block を単に dump ず呌ぶ事にする。 We call the block that is stacked
with one dump simply as dump. 1぀の dump の䞭には必ず3぀の block, “super block”,
“cfs root block”, “dump root block” が含たれる。 One dump always includes
three blocks,"super block","cfs root block","dump root block".
図3(右)には、dump の内郚構造が瀺されおいる。 Figure 3 (right) shows the internal
structure of dump.

super block ず cfs root block の間の block には、fscache の内容が(前回の dump
から曎新された差分だけ)保存される。 In the block between super block and cfs root
block, the content of fscache is saved (only the difference updated
from the previous dump).

cfs root block ず dump root block の間の block には、dump された幎月日の情報が含たれる。 The
block between the cfs root block and the dump root block contains
information on the dumped date. 必芁な block 数は dump の回数に䟝存する。 The
required number of blocks depends on the number of dumps.

Super Block Super Block

fsworm の構造を捉える䞊で、もっずも基本的なのは super block である。 The most basic thing to
capture the structure of fsworm is super block. super block の tag は
Tsuper (=1) である。 The tag of super block is Tsuper (= 1). cwfs
のコヌドを読むず、super block の Tag の䞭の path は、 QPSUPER (=2) ずなっおいる。 When we
read the code of cwfs, the path the Tag of super block is QPSUPER (=
2).

super block は、fscache をダンプした時に 1 ぀䜜られる。 One super block is created
when you dump fscache. たず super block が fsworm に曞き蟌たれ、続いおデヌタの本䜓が block
単䜍に曞き蟌たれる(図3右)。 First, super block is written to fsworm, then the body
of the data is written block by block (right in Figure 3).

super block の構造は The structure of super block

struct Superb struct Superb
{ {
Fbuf fbuf; Fbuf fbuf;
Super1; Super 1;
};};

を持぀。 have.

Fbuf は free block のアドレスの配列を内郚に保有しおいる。 Fbuf has an array of addresses
of free blocks inside. free block に関する解説は埌回しにする。 I will postpone
commentary on free block.

Super1 が重芁である。 Super1 is important.

struct Super1 struct Super 1
{ {
Off fstart; Off fstart;
Off fsize; Off fsize;
Off tfree; Off tfree;
Off qidgen; /* generator for unique ids */ Off qidgen; / * generator
for unique ids * /
/* / *

Off cwraddr; /* cfs root addr */ Off cwraddr; / * cfs root addr * /
Off roraddr; /* dump root addr */ Off roraddr; / * dump root addr * /
Off last; /* last super block addr */ Off last; / * last super block
addr * /
Off next; /* next super block addr */ Off next; / * next super block
addr * /
};};

図4. Super1 の構造 Figure 4. Structure of Super1

ここで分かるように、各々の super block は、次の super block のアドレス( next)を保有しおいる。 As can
be seen, each super block has the address ( next) of the next super
block.そしお最初の super block は ba[2] から始たる。 And the first super block
starts with ba[2]. 埓っお ba[2] から順に super block
を蟿れば、次にダンプされるアドレズが分かるこずになる。 Therefore, if you follow the super block
from ba[2] order, you will know the address to be dumped next.
次に、その出力結果䟋を瀺す。 Next, an example of the output result is shown.
(このツヌルは埌に玹介する) (This tool will be introduced later)

super blocks: super blocks:
2 2
5 Five
69908 69908
85793 85793
104695 104695
222009 222009
......
1751346 1751346
1754278 1754278
1754381 1754381
1754569 1754569
1754642 1754642
1755217 1755217
1755393 1755393

最埌の 1755393 は、次に䜜られる予定の super block アドレスである。 The last 1755393 is the
super block address to be made next. ba[1755217] の䞭の Super1
の内容は(䟋えば)次のようなものである。 The contents of Super1 ba[1755217] are (for
example) as follows.

super1 fstart: 2 super1 fstart: 2
super1 fsize: 1755394 super1 fsize: 1755394
super1 tfree: 92 super1 tfree: 92
super1 qidgen: 6d76e super1 qidgen: 6d76e
super1 cwraddr: 1755389 super1 cwraddr: 1755389
super1 roraddr: 1755392 super1 roraddr: 1755392
super1 last: 1754642 super1 last: 1754642
super1 next: 1755393 super1 next: 1755393

これらの情報の䞀郚は cwfs のコン゜ヌルからも埗られる。 Some of these information is also
obtained from the cwfs console.

sbaddr 1755217: 珟圚の super block (最埌に曞き蟌たれた super block) sbaddr 1755217
: current super block (last written super block)
snext 1755393:次のダンプ予定のアドレス(぀たり、次に䜜られる予定の super block アドレス) snext
1755393: The next dump schedule address (that is, the super block
address to be created next)
slast 1754642: sbaddr より䞀぀手前の super block アドレス slast 1754642: super
block address one before the sbaddr

Directory Entry Block Directory Entry Block

2013/03/02 曎新 Updated 2013/03/02

次に基本的なのは directory entry block である。 Next is the directory entry block.
この block の Tag.tag は Tdir である。 Tag.tag of this block is Tdir. たた、
Tag.path は、芪ディレクトリの qid に䞀臎する。 Also, Tag.path matches the Tag.path of
the parent directory.

directory entry block には次の directory entry ( Dentry) が1個以䞊(cwfs64x
の堎合、最倧62個)含たれおいる。 The directory entry block contains one or more of
the following directory entries (Dentry) (up to 62 in the case of
cwfs64x).

struct Dentry struct Dentry
{ {
char name[NAMELEN]; char name [NAMELEN];
Userid uid; Userid uid;
Userid gid; Userid gid;
ushort mode; ushort mode;
#define DALLOC 0x8000 #define DALLOC 0x8000
#define DDIR 0x4000 #define DDIR 0x4000
#define DAPND 0x2000 #define DAPND 0x2000
#define DLOCK 0x1000 #define DLOCK 0x1000
#define DTMP 0x0800 #define DTMP 0x0800
#define DREAD 0x4 #define DREAD 0x4
#define DWRITE 0x2 #define DWRITE 0x2
#define DEXEC 0x1 #define DEXEC 0x1
Userid muid; Userid muid;
Qid9p1 qid; Qid 9 p 1 qid;
Off size; Off size;
Off dblock[NDBLOCK]; Off dblock [NDBLOCK];
Off iblocks[NIBLOCK]; Off iblocks [NIBLOCK];
long atime; long atime;
long mtime; long mtime;
};};

図5. Directory entry Figure 5. Directory entry

ここにはファむルやディレクトリの名前( name)が含たれおいるので、 Dentry のサむズは蚱容する名前の長さ( NAMELEN-1
)に䟝存する。 Since the names of files and directories are included here,
the size of NAMELEN-1 depends on the allowable name length ( NAMELEN-1
).

dump root block は directory entry block の 1 ぀である。 The dump root block
is one of directory entry blocks. 筆者の家庭でのシステムの堎合には次のように dump した日付が芋える。
In the case of my system at home, you can see the dumped date as
follows.

term% ls /n/dump term% ls / n / dump
/n/dump/2012/0801 / n / dump / 2012/0801
/n/dump/2012/0802 / n / dump / 2012/0802
/n/dump/2012/0804 / n / dump / 2012/0804
/n/dump/2012/0813 / n / dump / 2012/0813
........
/n/dump/2013/0121 / n / dump / 2013/0121
/n/dump/2013/0127 / n / dump / 2013/0127
/n/dump/2013/0128 / n / dump / 2013/0128
/n/dump/2013/0205 / n / dump / 2013/0205
........

最初の行は初めお dump を行った時に(2012幎8月1日)生成されおいる。 The first line is generated
for the first time on dump (August 1, 2012).

ls -l /n/dump/2012/0801 ls - l / n / dump / 2012/0801

を実行するず次のように、この日のファむルにアクセスできる。 You can access the files on this day as
follows.

maia% ls -l /n/dump/2012/0801 maia% ls - l / n / dump / 2012/0801
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 /n/dump/2012/0801/386
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 / n / dump / 2012/0801/386
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 /n/dump/2012/0801/68000
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 / n / dump / 2012/0801/68000
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 /n/dump/2012/0801/68020
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 / n / dump / 2012/0801/68020
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 /n/dump/2012/0801/acme
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 / n / dump / 2012/0801 / acme
d-rwxrwxr-x M 495 adm adm 0 Jul 31 2012 /n/dump/2012/0801/adm
d-rwxrwxr-x M 495 adm adm 0 Jul 31 2012 / n / dump / 2012/0801 / adm
........
d-rwxrwxr-x M 495 sys sys 0 Jan 18 2012 /n/dump/2012/0801/mnt
d-rwxrwxr-x M 495 sys sys 0 Jan 18 2012 / n / dump / 2012/0801 / mnt
d-rwxrwxr-x M 495 sys sys 0 Jan 18 2012 /n/dump/2012/0801/n
d-rwxrwxr-x M 495 sys sys 0 Jan 18 2012 / n / dump / 2012/0801 / n
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 /n/dump/2012/0801/power
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 / n / dump / 2012/0801 / power
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 /n/dump/2012/0801/power64
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 / n / dump / 2012/0801 /
power64
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 /n/dump/2012/0801/rc
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 / n / dump / 2012/0801 / rc
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 /n/dump/2012/0801/sparc
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 / n / dump / 2012/0801 / sparc
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 /n/dump/2012/0801/sparc64
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 / n / dump / 2012/0801 / sparc
64
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 /n/dump/2012/0801/sys
d-rwxrwxr-x M 495 sys sys 0 Jul 31 2012 / n / dump / 2012/0801 / sys
dr-xr-xr-x M 495 sys sys 0 Jan 18 2012 /n/dump/2012/0801/tmp
dr-xr-xr-x M 495 sys sys 0 Jan 18 2012 / n / dump / 2012/0801 / tmp
d-rwxrwxr-x M 495 sys sys 0 Aug 1 2012 /n/dump/2012/0801/usr
d-rwxrwxr-x M 495 sys sys 0 Aug 1 2012 / n / dump / 2012/0801 / usr
maia% maia%

図6. ls /n/dump Figure 6. ls / n / dump

dump した幎月日情報 ( YYYY/MMDD) は dump root address ず cfs root address
の間にある。 The dumped date information ( YYYY/MMDD) is between dump root
address and cfs root address. (図3) (Figure 3)

このケヌスでは次の図7に瀺すように block が繋がっおいる。 In this case, blocks are connected as
shown in the next figure 7.

泚意: あなたのブラりザは SVG をサポヌトしおいたせん。 Note: Your browser does not support
SVG.最新のブラりザをお䜿いください。 Please use the latest browser.
図7. directory entry block の繋がり Figure 7. Connection of directory entry
block

長方圢が1぀のブロックを衚しおいる。 A rectangle represents one block. この図ではどれも
directory entry block である。 In this figure, none is a directory entry
block. dump の回数がただ少ないので、2013幎の月日の情報は1個の directory entry block
で間に合っおいるが、そのうちに耇数の block が芁求されるようになるだろう。 Since the number of dumps is
still small, the date information of 2013 can be made in time with one
directory entry block, but multiple blocks will be required within the
time.

Plan9 では図5の Dentry 構造䜓を芋れば分かるように、directory の名前ず、mode などの情報が同じ block
に同居しおいる。 In Plan 9, as you can see from the Dentry structure in Figure
5, the name of directory and the information such as mode live in the
same block. 他方 UNIX では mode などの情報は、inode に眮かれ、名前の䞀芧ずは別の block
になっおいる(図8)。 On UNIX, on the other hand, information such as mode is
placed in the inode and is a block different from the list of names
(Fig. 8). この違いの起源は UNIX では hard link のサポヌトのために、link counter を名前ずは別の
block (具䜓的には inode) に持たなくおはならないからだず思える。 The origin of this difference
seems to be that in UNIX, in order to support hard link, it is
necessary to have the link counter in another block (specifically,
inode) different from the name.

泚意: あなたのブラりザは SVG をサポヌトしおいたせん。 Note: Your browser does not support
SVG.最新のブラりザをお䜿いください。 Please use the latest browser.
図8. unix inode の抂念図で contents ず曞いたのは、file の䞭身であったり、他の directory
であったりする。 Figure 8. In the conceptual diagram of unix inode, we write
contents as contents of file or other directory.

Dentry の Qid9p1 構造䜓は Qid9p1's Qid9p1 structure

struct Qid9p1 struct Qid 9 p 1
{ {
Off path; /* was long */ Off path; / * was long * /
ulong version; /* should be Off */ ulong version; / * should be Off *
/
};};

であるが、この path は、 mode がディレクトリの堎合(぀たり mode&DDIR!= 0 の堎合)には先頭ビットに 1
が立おられおいる。 However, this path is set to 1 in the first bit when mode is
a directory (that is, when mode&DDIR!= 0).
(このように蚭蚈した理由に関しおは僕は今のずころ解らない。) 正匏な qid、すなわち、コマンド (I'm not sure about
the reason why I designed this way.) The official qid, ie the command

ls -ql ls - ql

で衚瀺される qid は、この qid.path の先頭ビットを萜ずしたもの、すなわち qid.path&~DDIR である。 The
qid displayed is the one with the first bit of this qid.path, that is,
qid.path&~DDIR.

cwfs64x の堎合、1぀の Dentry は 260 B である。 In the case of cwfs 64 x, one
Dentry is 260 B. 埓っお、1぀の block には最倧 62 個の Dentry を保持できる。 Therefore,
one block can hold up to 62 Dentry.

name には、ファむル名やディレクトリ名が入る。 name contains the file name and directory
name. NAMELEN は cwfs64x の堎合には 144 である。 NAMELEN is 144 in the case of
cwfs NAMELEN x. 名前は'\0' で終わるので、名前の最倧長は 143 文字である。 Since the name ends
with'\0', the maximum length of the name is 143 characters.
名前の他に、ディレクトリやファむルにずっお基本的な情報がこの䞭に含たれおいる。 In addition to the name, basic
information for directories and files is included in this.

Dentry がファむルを衚しおいる堎合( mode&DDIR == 0)、ファむルコンテンツの眮かれおいる block は direct
block ( dblock[NDBLOCK]) ず indirect block ( iblocks[NIBLOCK])
を基に蟿る事ができる。 Dentry mode&DDIR == 0 represents a file ( mode&DDIR == 0),
the block dblock[NDBLOCK] the file contents can be traced based on
direct block ( dblock[NDBLOCK]) and indirect block ( iblocks[NIBLOCK]
). ファむルコンテンツを含む block は Tfile でタグ付けられおいる。 The block containing the
file contents is tagged with Tfile.

Dentry がディレクトリの堎合( mode&DDIR!= 0
)には、そのディレクトリコンテンツ(䞭に含たれおいるファむルやディレクトリの情報)の眮かれおいる block
は、ファむルの堎合ず同様に、direct block ( dblock[NDBLOCK]) ず indirect block (
iblocks[NIBLOCK]) を基に蟿る事ができる。 Dentry mode&DDIR!= 0 is a directory (
mode&DDIR!= 0), the mode&DDIR!= 0 in which the directory contents (the
information of the files and directories contained therein) is placed
is set to direct block ( dblock[NDBLOCK]) and indirect block (
iblocks[NIBLOCK]). ディレクトリコンテンツを含む block は Tdir でタグ付けられおいる。 The block
containing the directory contents is tagged with Tdir.

cwfs64x の堎合には NDBLOCK の倀は 6、 NIBLOCK の倀は 4 である。 In the case of NDBLOCK
the value of NDBLOCK is 6 and the value of NIBLOCK is 4.

6 個の direct block には、デヌタが盎接曞かれる。 Data is directly written to 6 direct
blocks. 1぀の direct block には 16*1024 - 12 B のデヌタが曞き蟌めるので、6 個の direct
block には合蚈 6*(16*1024 - 12) B のデヌタを曞き蟌める。 Because 16 * 1024 - 12 B
data can be written in one direct block, 6 direct blocks can be
written with a total of 6 * (16 * 1024 - 12) B data. ディレクトリの堎合には
372(=62*6)個たでの Dentry が扱える事ずなる。 In the case of a directory, up to 372
(= 62 * 6) Dentry can be handled.

Indirect Block Indirect Block

directory entry block の Dentry 構造䜓に含たれる iblocks[0] によっお瀺される block には、
For the block indicated by iblocks[0] included in the iblocks[0]
structure of the directory entry block,

(16*1024 - 12)/8 = 2046 (16 * 1024 - 12) / 8 = 2046

個の block アドレスが含たれる。 Block addresses. ここの 8 は 1 個の block アドレスの倧きさである。
Here, 8 is the size of one block address.) これらの block アドレスは、デヌタの堎所(぀たり
direct block)を瀺しおいる。) These block addresses indicate the location of
the data (ie direct block). 埓っお Therefore

2046 * (16*1024 - 12) = 33497112 B 2046 * (16 * 1024 - 12) = 33497112
B

のデヌタを曞き蟌める。 Can be written. このような block 情報を 1次の indirect block
ず蚀うこずずしよう。 Let's say that such block information is the primary
indirect block.

iblocks[1] には、2次の indirect block が曞かれる。 iblocks[1], a secondary
indirect block is written. ぀たり、この block には block
アドレスが曞かれおいるのであるが、それらのアドレスは(デヌタの堎所ではなく) 1次の indirect block アドレスである。 In
other words, the block addresses are written in this block, but these
addresses are the primary indirect block addresses (not the data
location). 埓っお Therefore

2046 * 2046 * (16*1024 - 12) = 68535091152 B 2046 * 2046 * (16 * 1024
- 12) = 68535091152 B

のデヌタを曞き蟌める。 Can be written.

同様に、 iblocks[2] には Likewise, iblocks[2] has

2046 * 2046 * 2046 * (16*1024 - 12) = 140222796496992 B 2046 * 2046 *
2046 * (16 * 1024 - 12) = 140222796496992 B

そしお iblocks[3] には And iblocks[3] has

2046 * 2046 * 2046 *2046 * (16*1024 - 12) = 286895841632845632 B 2046


ずなる。.

indirect block のタグは The tag of indirect block

iblocks[0] Tind1 iblocks [0] Tind 1
iblocks[1] Tind2 iblocks [1] Tind 2
iblocks[2] Tind3 iblocks [2] Tind 3
iblocks[3] Tind4 iblocks [3] Tind 4

ずなっおいる。. たた、これらの Tag.path はどれも芪ディレクトリの qid に䞀臎する。 Also, any of these
Tag.paths matches the qid of the parent directory.

File Block File Block

ファむルの内容を含む block は Tfile のタグが付けられおいる。 The block containing the
contents of the file is tagged with Tfile. この block の Tag.path
は、このファむルが属するディレクトリの qid に䞀臎する。 Tag.path of this block matches the qid
of the directory to which this file belongs.

1぀の file block には、最倧 One file block has a maximum

16*1024 - 12 B 16 * 1024 - 12 B

のファむルデヌタを保存できる。 File data can be saved.

ファむルの内容は block 単䜍で管理されおいる。 The contents of the file are managed in
block unit. ファむルの内容が曎新された時には党おの block が曞き換えられるのだろうか? 筆者の実隓によるず吊である。
Will all blocks be rewritten when the contents of the file is updated?
According to my experiment, it is not.
1ブロックよりも倧きなファむルの末尟にデヌタを远加するず、最埌の block だけが曎新される。 If you add data to
the end of a file larger than one block, only the last block is
updated. 他の block は、そのたた利甚される。 Other blocks are used as they are.
もっずも、この実隓は However, this experiment
(a) ファむルに append 属性を指定しおいる (a) The append attribute is specified in
the file
(b) ファむルの末尟に seek しお曞き蟌んでいるのいずれかの条件の䞋で実隓しおいる。 (b) writing at the end
of the file by seeking at the end of the experiment under either
condition.

16KB を超える倧きなファむルをテキスト゚ディタで開いお、末尟にデヌタを远加した堎合には、完党に曞き換えられるず思う。 If I open
a large file larger than 16 KB with a text editor and add data to the
end, I think that it can be completely rewritten. (実隓はしおいないけど...) (I
have not done an experiment though...)

曞き換えられた block だけが新たに生成される cwfs の特性は、特にサヌバで重芁である。 Characteristics of
cwfs in which only rewritten blocks are newly generated is
particularly important in servers. 筆者のサヌバではりェブのサヌバのログファむルは 1.7GB にも䞊る。
On my server, the log file of web server is 1.7 GB.

1757143424 Oct 18 17:13 http 1757143424 Oct 18 17: 13 http

この倧きさのファむルのコピヌを毎日䜜り続けるわけには行かないであろう 泚1 。 It will not go on to keep
copying files of this size every day1.

泚1: Mac/OSX の TimeMachine や Linux の pdumpfs
では、ファむルが曎新されおいれば、そのコピヌが新たに䜜られおいく。 Note 1: On Mac / OSX's Time Machine
or Linux pdumpfs, if the file has been updated, a new copy of it will
be made. ハヌドリンクだけで TimeMachine の機胜を実珟しようずすれば、コピヌは䞍可避な仕様になるはずである。 If we
try to realize the function of TimeMachine with only hard links, copy
will be inevitable specification.
サヌバでは、日々曎新される倧きなログファむルを抱え蟌むので、サヌバヌ甚途には党く向かないはずである。 Since the server
carries a large log file which is updated day by day, it should not be
suitable for server use at all. デヌタベヌスファむルの堎合には、cwfs ず蚀えども日々の dump
から倖さなくおはならないだろう。 In the case of database files, even cwfs should be
removed from daily dump. トランザクションのログを採る方が安党である。 It is safer to log
transactions.

Fsworm Root Fsworm Root

2013/03/09 2013/03/09

fsworm の党おの情報は dump stack のトップにある dump root block から蟿る事ができる。 All
information on fsworm can be traced from the dump root block at the
top of the dump stack. このアドレスは cwfs console の roaddr から知るこずができる。 You
can find out this address from roaddr of cwfs console.
図6および図7は、ここから蟿っお芋えるパスの最初の郚分である。 Figures 6 and 7 are the first part of
the path seen from here.

実は roaddr は fscache が管理しおいる root block であるが、fsworm の dump root block
ず䞀臎しおいる。 Actually roaddr is a root block managed by fscache, but it
matches dump root block of fsworm.

ダンプの順序 Dump order

ダンプは珟圚の fscache に基づいお行われる。 The dump is done based on the current
fscache.そしお、たず最初に super block が fsworm に曞き蟌たれる。 First, super block is
written to fsworm. これに続いお、ディレクトリツリヌの末端の情報から順に曞き蟌たれる。 Following this,
the information at the end of the directory tree is written in order.
埓っお、fsworm の䞭に、䟋えば Thus, in fsworm, for example

/2012/0925/.... / 2012/0925 /....

が䜜成される堎合には、䞀番最埌に /、その前に 2012 、さらにその前に 0925 が... Is created, the last /
before 2012, before 0925 before that...

qid qid

ナヌザからは ls command に q option を添えおファむルやディレクトリの qid を芋るこずができる。 From the
user, you can see the qid of the file or directory by adding q option
to ls command. 䟋えば For example

maia% ls -ql maia% ls - ql
(000000000009baa2 6 00) --rw-rw-r-- M 326 web web 33597 Mar 8 15:01
bucket.png (000000000009 baa2 6 00) - rw - rw - r - M 326 web web
33597 Mar 8 15: 01 bucket.png
(000000000009baa3 3 00) --rw-rw-r-- M 326 web web 13693 Mar 8 15:02
bucket.svg (000000000009 baa 3 300) - rw - rw - r - M 326 web web
13693 Mar 8 15: 02 bucket.svg
(0000000000089b8c 2 00) --rw-rw-r-- M 326 arisawa web 782 Sep 28 10:11
console.txt (0000000000089b8c 2 00) - rw - rw - r - M 326 arisawa web
782 Sep 28 10: 11 console.txt
(0000000000089b8d 2 00) --rw-rw-r-- M 326 arisawa web 2401 Oct 15
21:21 cwfs.svg (0000000000089b8d 2 00) - rw - rw - r - M 326 arisawa
web 2401 Oct 15 21:21 cwfs.svg
......
maia% maia%

のように衚瀺される。 As shown in FIG. 先頭の () の䞭の 16 進数衚瀺の郚分が qid であり、その次の数字が qid
version である。 The part of hexadecimal notation in the head () is qid,
and the next digit is qid version.
マニュアルによるず qid はfile system の䞭でナニヌクであるず蚀う。 According to the manual qid
is unique within the file system.

ナニヌクであるならば、qid が管理されなくおはならない。 If it is unique, the qid must be
managed. super block の䞭の qidgen が、そのためにあるず思える(図4)。 It seems that
qidgen in super block is there for that (Figure 4).

実隓をしお芋れば分かるが qid はファむル名の倉曎によっおは倉わらない。 You can tell by experimenting
but qid does not change by changing file name. 内容が倉わるず version が倉わる。
Version changes when content changes.
そうであるから、゚ディタを䜜る堎合には、保存時に他の䜕かによっお倉曎を受けたか吊かを知るために䜿えるのであるが、time stamp
の方が手軜なので僕はこれたでに qid を利甚した事は無い。 So, when creating an editor, you can
use it to know whether or not you have changed by something else at
the time of saving, but time stamp is easier, so I used qid so far
There is nothing. (なお unix の qid は、違うものらしい) (The qid of unix seems to
be different)

fsworm や fscache の䞭を陀くず、qid ずその version は directory entry
の䞭に含たれ(図5)、その contents に関する block が同じ qid ずなっおいるこずが分かる。 Except in
fsworm and fscache, qid and its version are included in the directory
entry (Figure 5), and you can see that the block concerning the
contents is the same qid. ぀たり block の所属を確認するために䜿われおいるず思われる。 That is,
it seems to be used to confirm the affiliation of block.

fscache の構造 Structure of fscache

ba[0] config ba [0] config
ba[1] - ba [1] -
ba[2] Tcache ba [2] Tcache

ba[maddr] map ba [maddr] map
......
ba[caddr] cache ba [caddr] cache
......

Config Block Config Block

2013/03/05 2013/03/05

cwfs64x を芋る限り、筆者の config block ( ba[0])
には、テキスト圢匏で次のようなデヌタが先頭から曞き蟌たれおいた。 As far as cwfs64x is concerned, the
following data was written in the text format from the beginning in my
config block ( ba[0]). (この内容は cwfs console の printconf コマンドでも芋える)
(This content can also be seen with the printconf command of cwfs
console)

service cwfs service cwfs
filsys main c(/dev/sdC0/fscache)(/dev/sdC0/fsworm) filsys main c (/
dev / sdC 0 / fscache) (/ dev / sdC 0 / fsworm)
filsys dump o filsys dump o
filsys other (/dev/sdC0/other) filsys other (/ dev / sdC 0 / other)
noauth noauth
newcache newcache
blocksize 16384 blocksize 16384
daddrbits 64 daddrbits 64
indirblks 4 indirblks 4
dirblks 6 dirblks 6
namelen 144 namelen 144

=======

noauth は、認蚌をしないで cwfs ぞのアクセスを蚱す事を意味しおいる。 noauth means allowing access
to cwfs without authentication. noauth
は安党な環境での実隓レベルでしか蚱されない特殊な蚭定である事に泚意すべきである。 noauth should be noted that
noauth is a special setting only allowed at the experimental level in
a secure environment.
倧孊で䜿っおいるのは、今幎の2月の版であり、これは noauth にはなっおいない。 What I use at university is
the February version of this year, which is not noauth. (2013/04/10)
(2013/04/10)
=======

さらに、この block は次のように tag 付けられおいる。 In addition, this block is tagged as
follows.

pad: 0000 pad: 0000
tag: 10 (Tconfig) tag: 10 (Tconfig)
path: 0 path: 0

゜ヌスコヌドには、次の構造化デヌタがある。 The source code has the following structured
data.

struct Conf struct Conf
{ {
ulong nmach; /* processors */ ulong nmach; / * processors * /
ulong nuid; /* distinct uids */ ulong nuid; / * distinct uids * /
ulong nserve; /* server processes */ ulong nserve; / * server
processes * /
ulong nfile; /* number of fid -- system wide */ ulong nfile; / *
number of fid - system wide * /
ulong nwpath; /* number of active paths, derived from nfile */ ulong
nwpath; / * number of active paths, derived from nfile * /
ulong gidspace; /* space for gid names -- derived from nuid */ ulong
gidspace; / * space for gid names - derived from nuid * /
ulong nlgmsg; /* number of large message buffers */ ulong nlgmsg; / *
number of large message buffers * /
ulong nsmmsg; /* number of small message buffers */ ulong nsmmsg; / *
number of small message buffers * /
Off recovcw; /* recover addresses */ Off recovcw; / * recover
addresses * /
Off recovro; Off recovro;
Off firstsb; Off firstsb;
Off recovsb; Off recovsb;
ulong configfirst; /* configure before starting normal operation */
ulong configfirst; / * configure before starting normal operation * /
char *confdev; char * confdev;
char *devmap; /* name of config->file device mapping file */ char *
devmap; / * name of config-> file device mapping file * /
uchar nodump; /* no periodic dumps */ uchar nodump; / * no periodic
dumps * /
uchar dumpreread; /* read and compare in dump copy */ uchar
dumpreread; / * read and compare in dump copy * /
uchar newcache; uchar newcache;
};};

この䞭のデヌタは、初期化過皋の䞭で、cwfs の皮類毎に(゜ヌスコヌドの䞭で)䞎えられおいる。 Data in this is given
(in the source code) for each type of cwfs during the initialization
process.

Tcache Block Tcache Block

Tcache block は cwfs に関する基本情報を管理しおいる。 Tcache block manages basic
information about cwfs. この内容は cwfs コン゜ヌルで芋るこずができる。 You can see this in
the cwfs console.

struct Cache struct Cache
{ {
Off maddr; /* cache map addr */ Off maddr; / * cache map addr * /
Off msize; /* cache map size in buckets */ Off msize; / * cache map
size in buckets * /
Off caddr; /* cache addr */ Off caddr; / * cache addr * /
Off csize; /* cache size */ Off csize; / * cache size * /
Off fsize; /* current size of worm */ Off fsize; / * current size of
worm * /
Off wsize; /* max size of the worm */ Off wsize; / * max size of the
worm * /
Off wmax; /* highwater write */ Off wmax; / * highwater write * /
Off sbaddr; /* super block addr */ Off sbaddr; / * super block addr *
/
Off cwraddr; /* cw root addr */ Off cwraddr; / * cw root addr * /
Off roraddr; /* dump root addr */ Off roraddr; / * dump root addr * /
Timet toytime; /* somewhere convienent */ Timet toytime; / * somewhere
convienent * /
Timet time; Timet time;
};};

fscache の各ブロックはメモリヌにキャッシュされおいる。 Each block of fscache is cached in
memory. 10秒毎にメモリヌのキャッシュは、(曎新があれば) fscache に曞き蟌たれる。 Every ten seconds
the cache of memory is written to fscache (if there is an update).

Mapping Mapping

2013/03/08 曎新 Updated 2013/03/08

fsworm の各 block は、図9の cache area の cache block に mapping される。 Each
block of fsworm is mapped to the cache block of the cache area of
​​FIG.

fscache の cache block のアドレスを cba ずするず cba は Let cba be the cache block
address of cba, cba

caddr <= cba < caddr + csize caddr <= cba <caddr + csize

の範囲にある。. fsworm の 0 から wsize の block が fscache のこの領域に map される。 A block
of fsworm 0 to wsize is mapped to this area of ​​fscache.

cache block の総数は(cwfs コン゜ヌルでは) csize で衚瀺されおいる。 The total number of
cache blocks is indicated by csize (in the cwfs console). caddr
から始たる、残りの党おの block が cache block ではない事に泚意する。 caddr all remaining caddr
starting with caddr are not cache blocks.

筆者のシステムの䟋では fsworm の block 数は 6972701 であるのに察しお、fscache の cache block
数は 1392255 である。 In the example of my system, the number of blocks of
fsworm is 6972701, whereas the number of cache blocks of fscache is
1392255. 埓っお 1/5 皋床のキャッシュ胜力を持っおいる。 Therefore, it has about 1/5 cache
capacity. たた、fscache には 1394540 個の block
が採れるが、実際に䜿われおいるのは、1035+1392255(=1393290) に過ぎない。 Also, 13604540 blocks
can be taken in fscache, but only 1035 + 1392255 (= 1393290) are
actually used. 未䜿甚領域は 0.1% 皋床である。 The unused area is about 0.1%.

単玔に考えるず衚1に瀺すような mapping を思い浮かべるかも知れない。 Just thinking about it might
think of mapping as shown in Table 1.

泚意: あなたのブラりザは SVG をサポヌトしおいたせん。 Note: Your browser does not support
SVG.最新のブラりザをお䜿いください。 Please use the latest browser.
è¡š1. a simple but problematic mapping from fsworm to cache Table 1. a
simple but problematic mapping from fsworm to cache

ここに、cache ず曞いたのは fscache の cache area である。 Here, cache is written in
fscache's cache area.瀺されおいる address は caddr から数えおいる。 The address shown
is counted from caddr.

しかし、この mapping は問題を孕んでいる。 However, this mapping suffers from problems.
ある fsworm block が cache されおいるず、同じ cache block に map される他の fsworm block
が cache に入り蟌めない堎合がある。 If an fsworm block is cached, there may be cases
where other fsworm blocks that are mapped to the same cache block can
not enter cache.

そこで cwfs では、間に bucket をかたせお、mapping に柔軟性を持たせおいる。 So cwfs keeps bucket
in between, giving flexibility to mapping.その様子を衚2に瀺す。 The situation is
shown in Table 2.

泚意: あなたのブラりザは SVG をサポヌトしおいたせん。 Note: Your browser does not support
SVG.最新のブラりザをお䜿いください。 Please use the latest browser.
è¡š2. real mapping implementation of cwfs. Table 2. real mapping
implementation of cwfs.

説明を容易にするために fsworm の block address を wa ずし、 caddr から数えた cache の
address を ca ずする。 For ease of explanation, block address of fsworm is
set to wa and cache address counted from caddr to ca wa%msize が同䞀の wa
は ca%msize の ca のどれかに map されるず考えるのである。 wa%msize that wa%msize with the
same wa%msize is ca%msize to ca of ca%msize. 実際の mapping の状態は fscache
の map block にある bucket によっお管理されおいる。 The state of actual mapping is
managed by bucket in map block of fscache.

bucket bucket

fscache の maddr から caddr たでの block は map block で、その tag は Tbuck である。 A
block from caddr to caddr in maddr is a map block, and its tag is
Tbuck. map block は bucket の集たりで、bucket には cache の状態ず、察応する fsworm の
block address が含たれおいる。 The map block is a collection of buckets, and
the bucket contains the state of cache and the block address of the
corresponding fsworm.

各 bucket は次の構造を持っおいる。 Each bucket has the following structure.

struct Bucket struct Bucket
{ {
long agegen; /* generator for ages in this bkt */ long agegen; / *
generator for ages in this bkt * /
Centry entry[CEPERBK]; Centry entry [CEPERBK];
};};

各 map block は最倧 BKPERBLK (=10) 個の bucket を保有できる。 Each map block can
hold up to BKPERBLK (= 10) BKPERBLK.

泚意: あなたのブラりザは SVG をサポヌトしおいたせん。 Note: Your browser does not support
SVG.最新のブラりザをお䜿いください。 Please use the latest browser.
図9. fscache の構造 (cwfs64x) Figure 9. Structure of fscache (cwfs64x)

fscache に含たれる bucket の総数は msize で䞎えられおいる。 The total number of msize
included in msize is given by msize. 以䞋、bucket に block address
の小さい方から順に 0 から msize - 1 たでの番号を付け、それを bucket address ず蚀う。 In the
following, bucket is numbered from 0 to msize - 1 in ascending order
of block address, and it is called bucket address.

cache entry cache entry

各 bucket は CEPERBK (=135) 個の Cache Entry を持っおいる。 Each bucket has
CEPERBK (= 135) Cache Entries. 各 Cache Entry は、珟圚のマップの状態を衚しおいる。 Each
Cache Entry represents the state of the current map.

struct Centry struct Centry
{ {
ushort age; ushort age;
short state; short state;
Off waddr; /* worm addr */ Off waddr; / * worm addr * /
};};

fsworm の block address ba から、察応する fscache の block address cba
を芋぀けるには、たず In order to find the block address cba of the corresponding
fscache from the block address ba cba, first

bn = ba % msize bn = ba% msize

を蚈算する。.そしお bucket[bn] の䞭の 135個の cache entry の waddr を調べる。 Then check
the waddr of 135 cache entries in bucket[bn]. もしも、fsworm の block
address ba の block が cache されおいれば、その䞭に ba ず䞀臎するものが存圚するはずである。 If the
block of block address ba of fsworm is cached, there should be some
matching ba it. この cache entry を entry[ce] ずするず、 Letting this cache
entry be entry[ce]

cba = msize*ce+bn+caddr cba = msize * ce + bn + caddr

で求める事ができる。 Can be obtained with. 詳しくは「Map from Worm to Cache」で解説する。
Details are explained in"Map from Worm to Cache".

逆に、珟圚 cache されおいる fscache の block address cba から fsworm の block
address ba を求めるには、たず Conversely, to obtain the block address ba of cba
from the block address cba fscache currently being cached, first

bn = (cba - caddr) % msize # bucket addr bn = (cba - caddr)% msize #
bucket addr
ce = (cba - caddr) / msize # entry addr ce = (cba - caddr) / msize #
entry addr

を蚈算すれば bucket address bn が求たるので、その䞭の cache entry ce の waddr を芋ればよい。
The bucket address bn can be found by looking up the waddr of the
cache entry ce in it.

fscache の cache area の block は cache entry によっお「状態」を保有しおいるこずになる。 The
cache area block of fscache has"state" by cache entry. 以䞋、cache block
の状態は◯◯であるずか、cache block に察応する worm address は◯◯であるずか蚀う事にする。 In the
following, let's say that the state of the cache block is ◯◯ or the
worm address corresponding to the cache block is ◯◯.

age age

age は、cache block の叀さを衚しおいる。 age represents the age of the cache
block. 小さい倀が叀い。 Small values ​​are old. だから抂念的には age ず蚀うよりも birth day
に近い。 So it is conceptually close to birth day rather than age. 新たに
cache する必芁が発生した堎合には、( Cnone が存圚しない堎合には) age の小さい cache が優先的に捚おられる。
When it becomes necessary to cache newly, the small cache of age is
preferentially discarded (when Cnone does not exist).そしお bucket の
agegen の倀が新たに割り圓おる age の倀ずなる。 And the value of agegen of bucket
becomes the value of age be newly allocated. cache にデヌタが割り圓おられれば
agegen が 1 ぀増加する。 If data is allocated to cache, agegen increases by
1. age の最倧倀 MAXAGE=10000 が存圚する。 The maximum value MAXAGE=10000 age
exists.それを超えた時には、 age の再割圓が必芁になるはずであるが、詳现はコヌドをよく読んでいないのでわからない。 When it
exceeds it, reallocation of age is necessary, but details are not
understood because I have not read the code well.

state state

cache の state ずは、察応する Centry の状態で、次の倀を持぀。 The cache state is the state
of the corresponding Centry and has the following values.

Cnone = 0 Cnone = 0
Cdirty = 1 Cdirty = 1
Cdump = 2 Cdump = 2
Cread = 3 Cread = 3
Cwrite = 4 Cwrite = 4
Cdump1 = 5 Cdump 1 = 5

cache されおいない cache block の状態は Cnone になっおいる。 The state of an Cnone
cache block is Cnone to Cnone. 僕の芳察では、この堎合の waddr
はゎミであり意味を持っおいないように思える。 In my observation, waddr in this case seems to
be garbage and has no meaning.

worm からデヌタを読み取った cache の堎合には、 waddr は元の worm の addressそのものである。 In the
case of cache which reads data from worm, waddr is the address itself
of the original worm. cache の状態は Cread になっおいる。 The state of cache is
Cread. この堎合には cache block の内容は察応する fsworm の block ず同じである。 In this case
the contents of the cache block are the same as the corresponding
block of fsworm. (キャッシュであるから圓然の事) (Naturally because it is a cache)

既存の directory や file が倉曎を受けるず、その cache の Cread のタグが Cwrite に倉化する。 When
an existing directory or file is changed, the Cread tag of that cache
changes to Cwrite.そしお waddr は倉曎を受けない。 And waddr is not changed. もちろん
dump 時に䞊曞きするわけには行かないのだから、その時には新しい worm address に保存され、同時に cache entry
の䞭の waddr も曎新されるはずである。 Of course it will not go overwrite on dump, so
at that time it will be saved in the new worm address and waddr in the
cache entry should be updated at the same time. 異垞なく dump されるず状態は
Cread になるであろう。 If abnormally dumped, the state will be Cread.

新たに directory や file を䜜成した堎合には、その cache block に察応する wba には worm の未䜿甚の
address が割り圓おられる。 When creating a new directory or file, wba
corresponding to that cache block is assigned an unused address of
worm. 状態は Cdirty になる。 The state is Cdirty. dump が完了するず Cread
になっおいるはずである。 When dump is completed it should be Cread.

状態 Cnone ず Cread の cache は、 waddr に倉曎を反映させる必芁は無い。 The cache of the
state Cnone and Cread does not need to reflect the change in waddr.
埓っお、この Centry に察応する fscache の block は(必芁に応じお)捚おおも構わないこずを意味しおいる。
Therefore, it means that the block of fscache corresponding to this
Centry may be discarded (if necessary).

ずころで cwfs コン゜ヌルの statw コマンドを実行した時の By the way, when you run the cwfs
console statw command

8600 none 8600 none
230005 dirty 230005 dirty
0 dump 0 dump
1153555 read 1153555 read
95 write 95 write
0 dump1 0 dump1

では Centry を盎接調べお、 state の倀の分垃(個数)を衚瀺しおいる。 We examine Centry directly
and display the distribution (number) of values ​​of state.

free block and dirty block free block and dirty block

2013/03/11 2013/03/11
2013/03/14 改蚂 2013/03/14 revision
2013/03/29 èš‚æ­£ 2013/03/29 Correction
2013/04/10 远加 2013/04/10 added

次のように分類するのが良い。 It is better to classify as follows.
(a) unwritten block (a) unwritten block
(b) dirty block (b) dirty block
(c) free block (c) free block

(a) の unwritten block ずは dumped area の䞭に存圚する、未曞き蟌みの block。 The
unwritten block in (a) is an unwritten block existing in the dumped
area.
(b) の dirty block ずは fscache の䞭で Cdirty ずされおいる block。 The dirty block
in (b) is a block which is called Cdirty in fscache. cwfs は、新たに file や
directory を䜜成する時に、cache に worm の address を察応付け、cache の block の状態を
Cdirty ずする。 When cwfs creates a new file or directory, it associates
worm's address with cache, and Cdirty cache's state to Cdirty. この worm
address は未䜿甚アドレスであり、unwritten block が䜿えるなら、それを䜿う。 This worm address is
an unused address, and if unwritten block is available, use it.
dump 盎埌には Immediately after dump

(a) ⊇ (b) (a) ⊇ (b)

である。.
(c) の free block ずは dirty block のうち、fscache に free block ずしお登録されおいる
block。 (c) free block is a block that is registered as a free block in
fscache among dirty blocks. これらは file tree に link されおいない。 They are not
linked to the file tree. link されおいる dirty block は dump の察象ずなるが、link
から倖れた block は dump されない。 Linked dirty blocks are subject to dump, but
blocks deviated from link are not dumped. cwfs はこれらをゎミずしお捚おるのではなく、新たに
dirty block を䜜る時に利甚する。
cwfs は free block の list を持っおいる。free block list は supper block
の䞭ず、fscache の Tfree で tag 付けられた block に存圚する。supper block および Tfree
block には 2037 個の block address 情報を保持できる。
埓っお

(b) ⊇ (c)

である。.

fscache の Cwrite の状態の block は、実際に dump される時に初めお dump 先の address
が確定する。これらの address は最埌の dump の䞊に積み䞊げられる。他方 Cdirty の状態の block には、取りあえず
fsworm の address ず関係付けられる。

そもそも free block など発生させないように巧くやれないのか? いろいろ考えるが、結構難しそうである。file や
directory の削陀が問題である。dump が毎日朝5時に行われるずしよう。昌間の䜜業でいく぀かの directory や file
を新たに䜜ったずする。それらを C1,C2,...,Cn ずする。fscache 内のこれらの block はどれも Cdirty
の状態に眮かれ、fsworm の address
ず関係付けられる。これらの内のいく぀かはその日の内に削陀されるこずもあるだろう。削陀されたものを D1,D2,...,Dm ずする。
C1,C2,...,Cn から D1,D2,...,Dm を差し匕いた郚分が dump されるのであるが、dump で生成される
fsworm の address が連続しおいる事は期埅しがたく、「穎」を持぀事ずなる。それらは free block
ずしお将来の利甚のために予玄されるはずである。

もちろん、削陀した file や directory は盎ちに芪 directory の entry から削陀されるが、その
contents の状態は Cdirty のたたになっおいる。

Cdirty 問題は僕にはただ分からない事が倚い。僕の fscache は倧量の Cdirty block
を抱えおいる。どうやら、この状態は異垞らしい。原因は䜕か? 考えられるのは cwfs console の clri コマンドで倧きな
directory を削陀したあずに、check free コマンドを行わなかった事。rm
コマンドによっおファむルを削陀した堎合には、䞍芁になった block は free block list に入っお行くが、clri
の堎合には入らないらしい。それらは利甚されない block ずしお捚おられるらしい。

super block には free block list を持ち、2037 個の free block を登録できる。これを超えた
free block の address は、 Tfree でタグ付けられた fscache の block に蚘録されおいる。 Tfree
block は super block ず同様に free block list を持っおいる。free block list
の構造䜓は䞡者ずも同じである。

super block や Tfree block に含たれる free block を free[n] ( n=0,1,...)
ずする。゜ヌスプログラムを远っお行くず、 free[0] は特殊であるこずが分かる。これは Tfree block ぞの pointer
なのである。もっず正確に蚀えば、 free[0] に察応する fscache の address が Tfree block
になっおいるはずである。(図10)

泚意: あなたのブラりザは SVG をサポヌトしおいたせん。 Note: Your browser does not support
SVG.最新のブラりザをお䜿いください。 Please use the latest browser.
図10. freelist chaine

msize ず csize

msize 個の bucket の䞭には msize*CEPERBK 個の cache entry が存圚する。筆者のケヌスでは、
msize が 10313 なので、この蚈算結果は 1392255 ずなる。この数字は csize に䞀臎する。 ぀たり、 In other
words,

csize = msize*CEPERBK

の関係が成立する。1぀の Cache Entry は 1぀の cache block を管理しおいるのである。

msize 個の bucket を収玍するには、

(msize+BKPERBLK-1)/BKPERBLK

個の block が必芁である。割り算の圢が耇雑なのは、切り䞊げおいるからである。筆者のケヌスでは、 msize が 10313
なので、この蚈算結果は 1032 ずなる。これに maddr の 3 を加えお、 caddr の 1035 ず䞀臎する。 ぀たり、 In
other words,

caddr = (msize+BKPERBLK-1)/BKPERBLK + maddr

の関係が成立する。

Map from Worm to Cache

bn を bucket address、 ce を、その bucket の䞭の cache entry のアドレスずする。 bn ず ce
は次の範囲にある。

0 <= bn < msize
0 <= ce < CEPERBK

bn ず ce を基に、cache block address を察応させなくおはならない。
2぀の自然な考え方がある。
(a) bn*CEPERBK+ce+caddr
(b) msize*ce+bn+caddr
もちろん他のもっず耇雑なマッピングは考えられるが、それらを採甚する理由は存圚しない。
そしお、実際には埌者の方匏(b)が採甚されおいる。

前 者は採甚しがたい。なぜなら、ファむルは fsworm の連続した block を占める傟向がある。埓っお (a)
を採甚したならば、新たに䜜成された倧きなファむルのキャシュ情報は1぀の bucket を占有するこずになる。するずその bucket
が管理する cache block には、(fsworm に dump しない限り)新たにキャッシュできなくなる。

さらに埌者の堎合には、fsworm の連続した block をキャッシュした堎合に、fscache でも連続した block
になる可胜性が高いずころにある。(ハヌドディスクの seek time が節玄できる。)

msize の決定アルゎリズム

msize はどのような蚈算で決定されるか?
map block ず cache block の合蚈数を m ずするず、
map block を n 個にした堎合の可胜な mn (= csize) の倀は、

(n-1)*BKPERBLK*CEPERBK < m - n <= n*BKPERBLK*CEPERBK

を満たす必芁がある。 ぀たり、 In other words,

1.0*m/(1 + BKPERBLK*CEPERBK) <= n < 1.0*(m + BKPERBLK*CEPERBK)/(1 +
BKPERBLK*CEPERBK)

を共に満たす必芁があるが、そのような n は

n = (m + BKPERBLK*CEPERBK)/(1 + BKPERBLK*CEPERBK)

で埗られる。 すなわち、 That is,

m - n = ((m - 1)*BKPERBLK*CEPERBK)/(1 + BKPERBLK*CEPERBK)

このように蚈算された mn は CEPERBK の倍数である保蚌が無い。埓っお次の補正を加える必芁がある。

msize = (mn)/CEPERBK
csize = msize*CEPERBK
caddr = (msize + BKPERBLK - 1)/BKPERBLK + maddr

で蚈算される事になろう。

筆者の fscache は

1394540 block

確保できるので、

m = 1394540 - 3 = 1394537

である。. この蚈算方匏によれば

msize = 10322
caddr = 1036
csize = 1393470

ずなり、 caddr + csize は 1394506 である。これは fscache の block 数 1394540
よりも小さいので、これで良いはずなのであるが、実際の cwfs の倀は違う。実際には、この msize をさらに調敎し

msize = maxprime(msize - 5) # Ken's value
csize = msize*CEPERBK
caddr = (msize + BKPERBLK - 1)/BKPERBLK + maddr

ずしおいる( cw.c)。ここに maxprime(n) は、 n を超えない最倧の玠数である。この調敎が䜕故必芁なのか?
筆者には䞍明である。(fsworm ず fscache ずの関係では、この調敎は䞍芁なはずである。)

Fscache Root

2013/03/09

fsworm が root を持぀ように、fscache も root を持っおいる。(持たなければ directory tree
を蟿れない)

fscache の root block の address は fsworm の dump stack top の dump root
block の address を基にしお、通垞の mapping rule に埓っお決定されおいる。

Recovery

埩元 (recovery)

2013/02/28 曎新

cwfs に異垞をもたらす原因はいろいろあるが、䞻なケヌスは次の2぀であろう。
(a) 曞き蟌み䞭の停電
(b) ハヌドりェアクラッシュこれらはさらに、様々なケヌスで现分化されるが、ここでは fsworm
が健党である(あるいは同じようなこずであるが、fsworm のバックアップが存圚しおいる)こずを仮定する。この堎合には、fsworm
に基づいお埩元するこずになる。

以䞋の仮定を眮く:

/dev/sdC0/fscache
/dev/sdC0/fsworm

が存圚し、

• fsworm は健党であり、
• fscache の先頭 block には正しい config 情報が含たれおいる。

その元では、cwfs のスタヌトで(9front では)

bootargs is (tcp, il, local!device)[local!/dev/sdC0/fscache]

のメッセヌゞがでるので

local!/dev/sdC0/fscache -c

を input し、その埌 config: の prompt に察しお

recover main
end

で応えればよい。(埩元は非垞に早い。(1~2秒?)

fscache の先頭ブロックは、cwfs
の掻動䞭には曞き蟌み察象から倖されおいるので、ハヌドディスクが物理的損傷を受けおいない限り、デヌタのロスは高々、最埌の dump
以降に限られるず蚀える。

fscache の埩元に必芁な党おの情報が fsworm の block address 範囲 0 から snext
たでの䞭に含たれおいる。埩元に際しお、fsworm の党おを調べる必芁は無い。最埌にダンプした蚘録から蟿る事ができる。この䜜業は cwfs
が自動的に行うはずであるが、参考のために、fsworm の構造をもう少し詳しく解説する。

Plan9(あるいは9front)では、過去のファむルの状態は

9fs dump

を実行しお

/n/dump

以䞋に芋えるが、ここに芋える党おの情報が次のダンプアドレス snext の1぀前の block アドレス ( = roaddr =
snext - 1) から簡単に蟿っお行くこずができる。

埌に玹介するプログラム cwstudy は、block アドレスを指定しお、その内容を衚瀺する。次は cwstudy の実行䟋である。

cpu% cwstudy 1755392
/dev/sdC0/fsworm
tag pad: 0000
tag tag: 11 (Tdir)
tag path: 1
name: /
uid: -1
gid: -1
mode: 0140555
muid: 0
qid path: 80000001
qid ver.: 0
size: 0
dblock: 1755391 0 0 0 0 0
iblock: 0 0 0 0
atime: 1343737574 // Tue Jul 31 21:26:14 JST 2012
mtime: 1343737574 // Tue Jul 31 21:26:14 JST 2012

最初に埗られる名前は “ / ” である。䜜成日は、fsworm が䜜られた 2012幎7月31日ずなっおいる。 dblock[0] の
1755391 は、" /" の䞋の directory entry block のアドレスである。

cpu% cwstudy 1755391
/dev/sdC0/fsworm
tag pad: 0000
tag tag: 11 (Tdir)
tag path: 1
name: 2012
uid: -1
gid: -1
mode: 0140555
muid: 0
qid path: 80000001
qid ver.: 27
size: 0
dblock: 1755390 0 0 0 0 0
iblock: 0 0 0 0
atime: 1348729247 // Thu Sep 27 16:00:47 JST 2012
mtime: 1343797238 // Wed Aug 1 14:00:38 JST 2012

block アドレス 1755391 に含たれるディレクトリの名前は 2012 である。1぀しか珟れおいないのは、fsworm の運甚開始が
2012 だからである。

block アドレス 1755390 には倚数の directory entry が含たれおいる。

term% cwstudy 1755390
[äž­ç•¥]
name: 0925
uid: -1
gid: -1
mode: 0140555
muid: 0
qid path: 80000001
qid ver.: 27
size: 0
dblock: 1755212 0 0 0 0 0
iblock: 0 0 0 0
atime: 1348584237 // Tue Sep 25 23:43:57 JST 2012
mtime: 1348584237 // Tue Sep 25 23:43:57 JST 2012
name: 0927
uid: -1
gid: -1
mode: 0140555
muid: 0
qid path: 80000001
qid ver.: 27
size: 0
dblock: 1755388 0 0 0 0 0
iblock: 0 0 0 0
atime: 1348729247 // Thu Sep 27 16:00:47 JST 2012
mtime: 1348729247 // Thu Sep 27 16:00:47 JST 2012

それらの名前は、ダンプした月日を衚しおいる。たた、それらは

ls /n/dump/2012

で衚瀺される名前ず䞀臎する。

さらに進んで、 2012 の䞋にある 0927 の directory entry も同様に芋぀ける事ができる。それらの名前は

ls /n/dump/2012/0927

で衚瀺される名前ず䞀臎する。そこには adm や sys や usr などの名前が芋えるだろう。

0925 の dblock[0] は 1755212 である。この block アドレスは 9月25日にダンプした block
の䞭に含たれおいる。(この日には 1754642 から 1755216 たでが消費された)

9月27日のダンプでは、この日のファむルを党お新たにコピヌするのではなく、倉曎されおいないコンテンツに関しおは、叀いコンテンツをそのたた䜿う。ここでは
0925 に関しおは、9月25日のコンテンツがそのたた䜿われおいる。

fsworm では block 単䜍の差分法が䜿われおいるのである。(この件に関しおは埌にたた吟味する)

埩元(recovery)に぀いお吟味

fsworm が健党であれば、super block を snext たで蟿れば、 snext を基に埩元できる。では確実に snext
たで蟿れるのか?

fsworm が本圓の WORM あるいは新品のハヌドディスクであれば問題はないであろう。 snext の先に、 Tag
らしきデヌタは無いのであるから間違う䜙地は無い。しかし䜿い叀しのハヌドディスクであればどうだろう?
Tag を頌りに super block を蟿る際に、ゎミを Tag ず勘違いするかもしれない。super block の Tag 構造䜓は

struct Tag
{ {
short pad; /* make tag end at a long boundary */
short tag;
Off path;
};

であり、 pad は 0、 tag は 1、 path は 2 である。ゎミの䞭で、この 12Bが完党に䞀臎する確率は 2 -96 で 泚1
、十分に小さいず考えるかもしれない。䜕しろ、fscache
がクラッシュする確率自䜓、極めお小さくお、サヌバのラむフタむム(5幎皋床か?)の䞭に、あるか無いかだ。

し かし、こうした確率の蚈算は、ランダムなデヌタが曞き蟌たれおいる事を前提にしおいる。この䜿い叀しのハヌドディスクの fscache
パヌティションが、以前に fscache パヌティションずしお利甚されおいたものを、そのたた䜿ったらどうだろう? 誀認される確率は
fsworm の䞭での super block の割合たでに䞊がるので、無芖できないかもしれない。埓っお、fscache
のパヌティションを䜜る堎合に泚意した方が良いだろう。(パヌティションの先頭アドレスを少しずらすずか...)

fscache の Tcache block の䞭には fsworm の最埌の super block
ずの敎合性を確認できる情報が含たれおいる。埓っお通垞の recovery においおはこのような心配はいらないはずである。

泚1: 実際には、 tag ず path だけで蟿っおいるので、確率は 2 -80 である。この確率を小さくするためには、他に slast
の情報を䜿う手もあろうが、そこたでの䟡倀があるかは怪しい。

Recovery によっお倱われるもの

2013/03/28

free block で倱われるものがある。 free block ずは既に dump された領域に存圚する、ただ曞き蟌たれおいない
block である。cwfs は、ここに data
を曞き蟌む機䌚があれば曞き蟌もうずする。蚘憶スペヌスを有効に䜿おうずしおいるのである。free block のうち 2037 個は
superblock が管理しおおり、この情報は fsworm にあるので倱われない。しかし 2037 個を超えた郚分の free
block list は fscache の Tfree block に存圚しおいる。Tfree block は fsworm
にコピヌされない。これらは Recovery で倱われる。

Other Configurations

2013/04/02

pseudo-RAID1

結局珟圚の cwfs configuration

filsys main c(/dev/sdC0/fscache)(/dev/sdC0/fsworm)

の䞋では fsworm の backup を取るのは至難の技であるず諊めお、他の configuration

filsys main c(/dev/sdC0/fscache){(/dev/sdC0/fsworm)(/dev/sdD0/fsworm)}

を採甚するこずずした。
これは pseudo-RAID1 の configuration である。デバむスたるごずではなく、fsworm partition だけを
RAID1 颚に凊理しおくれる。
/dev/sdC0/fsworm ず /dev/sdD0/fsworm はサむズが異なっおも構わない。その堎合には小さい方に合わせられる。
曞き蟌みの順序は、(この堎合には) D0 → C0 であり、読み取りは C0 で行われる。

ディスク線成の倉曎にあたっおは、準備が必芁である。

• コピヌを取らなくおはならない。partition たるごずは時間がかかりすぎるので、最埌の super block
たでのコピヌに制限する必芁がある。
•それでもただ時間が掛かりすぎるかも知れないので、その間の auto dump を止める必芁がある。そのためには、cwfs
にパッチをあおないずいけない。

もっずも、RAID は僕が家庭で䜿うには倧げさなのであるが...

家で䜿っおいる限り順調に動いおいる。倧孊のサヌバヌもこれでやるこずにした。

fake WORM

Cinap によるず fake WORM の䞭には written block の bit map があるそうである。この堎合、HDD を
WORM の代わりに䜿うのだから、珟圚の利甚状態を瀺す bit map を持぀事は可胜なのである。この堎合の configuration は

filsys main c(/dev/sdC0/fscache)f(/dev/sdC0/fsworm)

ずなる。.

これを䜿えば、普段は 1 個の disk を䜿い、気の向いた時に backup disk
を远加しおバックアップを取る僕のような気たぐれな人間に適した凊理が可胜であろうず思える。

fake WORM の䜜成

僕 の WORM は通垞の WORM なので、fake WORM を䜜る堎合には、device
のコピヌずいう蚳には行かないはずおある。新たに構成する事ずし、安党のために、PXE で立ち䞊げた端末で䜜業するこずずした。local
disk には、これから cached fake WORM を構成する plan9 partition を準備しおおく。

/dev/sdC0/fscache
/dev/sdC0/fsworm

この䞋で

cwfs64x -c -f /dev/sdC0/fscache

を実行する 泚1 。

泚1: cwfs のコマンドの䜿い方は、Bell-labs 版(Geoff のオリゞナル版)ず 9front 版では異なる。ここでは
9front 版に基づく。9front 版では、kfs や fossil など、他のファむルシステムず -f
オプションの䜿い方の統䞀を蚈っおいる。

9front 版では -c option で config mode に入る。 config の prompt に察しお次のデヌタを
input する。

service cwfs
filsys main c(/dev/sdC0/fscache)f(/dev/sdC0/fsworm)
filsys dump o
filsys other (/dev/sdC0/other)
ream other
ream main
end

以䞊は䞀回限りである。

次に cwfs console ぞのコマンドず shell レベルのコマンドが発生する。ここでは cwfs console ぞのコマンドを
fscons> で衚す。

以䞋の操䜜は新しい window の䞭で行うのが無難である。

fscons> users default
fscons> newuser arisawa
fscons> allow
term% mount -c /srv/cwfs /n/cwfs
term% mkdir /n/cwfs/adm
term% cp /adm/users /n/cwfs/adm
fscons> users

泚意: newuser arisawa は、筆者のシステムの system owner は glenda ではなく arisawa
だから必芁になったのであり、 glenda のたたであれば䞍芁である。

このあずは、筆者の cpdir を䜿うのが早い。

cpdir -mvug /root /n/cwfs adm 386 acme cfg cron lib mail rc sys

/root の䞋にある fd 、 mnt 、 n 、 tmp 、 usr は個別に確認した方が無難である。
特に、 /root/n/ の䞋には cwfs が芋えおいるはずである。

Tvirgo

fakeworm の堎合には cwfs console の statw で衚瀺される wsize から、 Tvirgo block
が始たる。 Tvirgo block は fsworm の block 0 から wsize た での䜿甚状況を bitmap
で衚しおいる。曞き蟌たれた block には bit 1 が立おられ、ただ曞き蟌たれおいない block の bit は 0
である。fsworm の先頭 2 block は曞き蟌たれおいないので、bitmap の最初の 2 bit は 0 である。

fakeworm は fsworm の末尟に bitmap が入り蟌むので、その分、 wsize は小さくなる。

Misc.

What did I do that day?

2013/03/18

「あの日は䜕をしおいたのだろう?」ず僕が考える堎合には、ファむルの修正などの話であり、飲みに行ったずかの話ではない。
あの日に倉曎されたファむルを党お列挙するには、UNIX では find
コマンドを䜿うず思う。膚倧なファむルの䞭から、倉曎されたファむルを探し出す䜜業は(ファむルの量にもよるが)倚くの時間を芁し数秒では終わらない。ちなみに僕の
MacBook では僕の $HOME の探玢だけでも30秒皋芁しおいる。(結構たくさんのファむルを持っおいるせいもある)

bash$ touch a.txt
bash$ time find $HOME -newer a.txt -print
find: /Users/arisawa/.emacs.d/auto-save-list: Permission denied
/Users/arisawa/Library/Application
Support/Google/Chrome/Default/Cookies
......
......
find:
/Users/arisawa/src/rminnich-vx32-17a064eed9c2/src/9vx/osx/9vx.app:
Permission denied
real 0m28.372s
user 0m0.783s
sys 0m18.783s
bash$

ここで玹介するのは僕の䜜った lr コマンドであり、find の -newer
オプションに盞圓するオプションが存圚する。これを䜿っお昚日に倉曎されたファむルをサヌバヌの党おのファむルの䞭から芋぀けるには次のようにする。

term% cpu -h ar
ar% 9fs dump
mounting as arisawa
mounting as arisawa
ar% ls /n/dump/2013|tail -2
/n/dump/2013/0317
/n/dump/2013/0318
ar% mtime /n/dump/2013/0317
1363498134 /n/dump/2013/0317
ar% time lr -lt 1363498134 /n/dump/2013/0318
......
......
--rw-rw-rw- web arisawa 5819730 2013/03/18 12:54:03
/n/dump/2013/0318/usr/cpa/www/log/dict
d-rwxrwxrwx arisawa arisawa 0 2013/03/17 21:51:56
/n/dump/2013/0318/usr/cpa/www/users
......
......
0.01u 0.18s 1.91r lr -lt 1363498134 /n/dump/2013/0318
ar%

この日には33個のファむルの倉曎があった。倚くは log ファむルである。倉曎されたファむルの䞭には web の cgi
に拠るものもある。システムの党おのファむルを探しおいるのだが2秒匱で探玢が完了しおいる。僕は膚倧なファむルをサヌバヌ䞊に持っおいるにも係わらずで
ある!

なぜこんなに高速に倉曎を調べられるのか?

探玢に atime が利甚されおいるからである。 atime ずは access time
の意味である。マニュアルを芋おもそれ以䞊に詳しい説明はない。(Plan9 のマニュアルには read time ず曞いおあるが、write
に察しおも atime が曎新される)

=======

泚: lr は

http://plan9.aichi-u.ac.jp/netlib/cmd/lr/

に眮かれおいる。
=======

atime

2013/06/06

実際の動䜜を芋おいるず、Plan9 ず UNIX(MacOSX や Linux) で振る舞いが異なる。

Plan9 の堎合には、ファむルサヌバがファむルを探し出すために蟿ったルヌトに存圚する党おのディレクトリの atime
が曎新されおいる。膚倧な directory tree の䞭で、指定された日に実際にファむルサヌバが蟿った道は極く極く僅かである。埓っお
atime を芋おいれば、必芁な探玢のルヌトを倧幅に枛らす事が可胜である。

UNIX では違う。ファむルサヌバがファむルを探し出すために蟿ったルヌトに存圚するディレクトリの atime
は曎新されおいない。倉曎が実際に発生したディレクトリやファむルの atime だけが曎新されおいる。埓っお、 atime
を頌りに、曎新を効率的に探し出す事はできない。

以䞋に、Plan9 ず UNIX の atime の違いを具䜓䟋で瀺す。

Plan9

# Plan9
term% date; touch $home/doc/x;ls -dlu /usr $home/doc
Wed Jun 5 07:58:17 JST 2013
d-rwxrwxr-x M 20 sys sys 0 Jun 5 07:58 /usr
d-rwxrwxr-x M 20 arisawa arisawa 0 Jun 5 07:58 /usr/arisawa/doc
term% term%

Linux

# UNIX (Linux)
hebe$ date; touch $HOME/doc/x; ls -dlu /home $HOME/doc
Wed Jun 5 07:56:41 JST 2013
drwxr-xr-x 3 root root 4096 Jun 4 09:49 /home
drwxr-xr-x 9 arisawa arisawa 4096 Jun 5 07:46 /home/arisawa/doc
hebe$

OSX

# UNIX (OSX)
-bash$ date; touch $HOME/doc/x; ls -dlu /Users $HOME/doc
Wed Jun 5 08:08:27 JST 2013
drwxr-xr-x 6 root admin 204 May 31 07:51 /Users
drwxr-xr-x 3 arisawa staff 102 Jun 5 08:03 /Users/arisawa/doc
-bash$

cwstudy

この節は未完成である。 This section is incomplete.

usage

cwstudy block_address

cwstudy -C block_address

cwstudy path

cwstudy super

文献

[1] Sean Quinlan “A Cached WORM File System”
Softw., Pract. Exper., vol. 21 (1991), pp. 1289-1299
http://plan9.bell-labs.com/who/seanq/cw.pdf

[2] Ken Thompson, Geoff Collyer “The 64-bit Standalone Plan 9 File
Server”
http://plan9.bell-labs.com/sys/doc/fs/fs.pdf

1006