理想未来ってなんやねん

娘可愛い。お父さん頑張る。

FreeBSDのファイルシステムのソースコードを読む

ファイルシステムについて興味が出てきたので、OSのソースコードを追いかけて見たいと思います。


今回対象として選んだのはFreeBSD 8.0です。
理由としては、ZFSが移植されている点と、実際にコードを書く場合はGPLではなく修正BSDライセンスの方が良いと個人的に考えているのが理由です。


予備知識はあまりないので、いい加減な事を書くかもしれませんがご了承下さい。
調べたことを順次メモしていきたいと思います。

ソースコードの位置

FreeBSDソースコードは/usr/src/sysの下に置かれます。
ソースコードはインストール時に『Choose Distributions』画面で、『Kern-Developer』にチェックすることでインストールされます。
インストール後であれば、sysinstallで後からインストールすることもできます。
また、CVSupで取得することもできます。


ファイルシステムソースコードは、おそらくfsがつくものだと思いますので見てみると、

$ cd /usr/src/
$ ls -d *fs*
fs		nfs		nfsclient	nfsserver	ufs

fs、nfs、nfsclient、nfsserver、ufsが見つかりました。
次にサイズを見てみます。

$ du *fs* |sort -n
8	fs/deadfs
22	fs/fifofs
26	fs/fdescfs
〜〜〜中略〜〜〜
552	fs/nfsclient
570	ufs/ffs
896	ufs
3058	fs

deadfsが小さく、ufs/ffsが小さいようです。
zfsが見当たらないので別の場所を探してみます。

$ find * -name zfs
boot/zfs
cddl/boot/zfs
cddl/contrib/opensolaris/common/zfs
cddl/contrib/opensolaris/uts/common/fs/zfs
modules/zfs

boot、cddl、modulesの下に見つかりました。

cddlはCommon Development and Distribution Licenseのコードが集まっているのだと思います。
modulesはカーネルモジュールだと思います。
bootはブートローダに関するコードでしょうか。


バラバラに見ていますが、結局どれだけファイルシステムに関するコードがあるのか見てみます。

$ find * -name '*fs*' -type d
boot/i386/gptzfsboot
boot/i386/zfsboot
boot/zfs
cddl/boot/zfs
〜〜〜中略〜〜〜
cddl/contrib/opensolaris/uts/common/sys/fs
compat/linprocfs
compat/linsysfs
fs
fs/deadfs
〜〜〜中略〜〜〜
fs/unionfs
gnu/fs
gnu/fs/ext2fs
gnu/fs/reiserfs
gnu/fs/xfs
modules/dtrace/dtnfsclient
modules/xfs
〜〜〜中略〜〜〜
modules/zfs
nfs
nfsclient
nfsserver
ufs
ufs/ffs
ufs/ufs

第一階層にあるのはboot、cddl、compat、fs、gnu、modules、nfs、nfsclient、nfsserver、ufsでした。
重要そうなのは、modulesっぽいですね。

modulesディレクト

modules以下のファイルシステムに関連しそうなディレクトリを見てみます。

$ ls modules/ufs
Makefile
$ ls modules/zfs
Makefile
$ ls modules/tmpfs
Makefile
$ ls modules/ext2fs

Makefileが一つあるだけでした。

Makefileの中身は、

$ cat modules/ufs/Makefile
# $FreeBSD: src/sys/modules/ufs/Makefile,v 1.6.2.1.2.1 2009/10/25 01:10:29 kensmith Exp $

.PATH:	${.CURDIR}/../../ufs/ufs ${.CURDIR}/../../ufs/ffs

KMOD=	ufs
SRCS=	opt_ddb.h opt_directio.h opt_ffs.h opt_ffs_broken_fixme.h \
	opt_quota.h opt_suiddir.h opt_ufs.h \
	vnode_if.h ufs_acl.c ufs_bmap.c ufs_dirhash.c ufs_extattr.c \
	ufs_gjournal.c ufs_inode.c ufs_lookup.c ufs_quota.c ufs_vfsops.c \
	ufs_vnops.c ffs_alloc.c ffs_balloc.c ffs_inode.c ffs_snapshot.c \
	ffs_softdep.c ffs_subr.c ffs_tables.c ffs_vfsops.c ffs_vnops.c

.if !defined(KERNBUILDDIR)
CFLAGS+= -DSOFTUPDATES -DUFS_DIRHASH
.endif

.include <bsd.kmod.mk>
$ cat modules/tmpfs/Makefile 
# $FreeBSD: src/sys/modules/tmpfs/Makefile,v 1.2.10.1.2.1 2009/10/25 01:10:29 kensmith Exp $

.PATH: ${.CURDIR}/../../fs/tmpfs

KMOD=	tmpfs
SRCS=	vnode_if.h \
	tmpfs_vnops.c tmpfs_fifoops.c tmpfs_vfsops.c tmpfs_subr.c

.include <bsd.kmod.mk>

KMODがカーネルモジュール名、SRCSがソースコード
.include カーネルモジュールをビルドする際のお約束でしょうか。

ソースコードの本体は、fs、ufsの下にあるようですね。
作る場合はソースコードはfsディレクトリ以下等に置いて、modulesディレクトリの下にMakefileを置いてあげれば良さそうです。


次回に続く