FreeBSD の mount の仕組み2006年07月30日 10時47分44秒

FreeBSD の mount は /usr/src/sys/sys/mount.h に基本的な構造体が定義されている。各ファイルシステムは VFS または Virtual File System と呼ばれるものを介している。ファイルシステムの動作を抽象化したものだ。様々なファイルシステムをサポートするための糊といったところか。

mount.h を覗く。


struct vfsops {
        vfs_mount_t             *vfs_mount;
        vfs_cmount_t            *vfs_cmount;
        vfs_unmount_t           *vfs_unmount;
        vfs_root_t              *vfs_root;
        vfs_quotactl_t          *vfs_quotactl;
        vfs_statfs_t            *vfs_statfs;
        vfs_sync_t              *vfs_sync;
        vfs_vget_t              *vfs_vget;
        vfs_fhtovp_t            *vfs_fhtovp;
        vfs_checkexp_t          *vfs_checkexp;
        vfs_vptofh_t            *vfs_vptofh;
        vfs_init_t              *vfs_init;
        vfs_uninit_t            *vfs_uninit;
        vfs_extattrctl_t        *vfs_extattrctl;
        vfs_sysctl_t            *vfs_sysctl;
};

各種操作時に、これらの関数が呼ばれる。異なったファイルシステムでも、統一された入口を持つのでカーネル側は、どの様なファイルシステムを操作しているのかを、認知する必要がない。

smbfs では以下のように定義されている。smbfs 用の構造体の初期値だ。


static struct vfsops smbfs_vfsops = {
        .vfs_init =             smbfs_init,
        .vfs_cmount =           smbfs_cmount,
        .vfs_mount =            smbfs_mount,
        .vfs_quotactl =         smbfs_quotactl,
        .vfs_root =             smbfs_root,
        .vfs_statfs =           smbfs_statfs,
        .vfs_sync =             vfs_stdsync,
        .vfs_uninit =           smbfs_uninit,
        .vfs_unmount =          smbfs_unmount,
};

vfs_init は、ファイルシステムに読み込まれた時に実行されるようだ。kldload や mount_smbfs をやると、実行されているのがわかる。それに対応するのが、vfs_uninit だ。kldunload や shutdown する時に実行される。init はそのファイルシステムを使うにあたって必要な情報を初期化しているようだ。smbfs_init は大したことをしてはいない。

mount が実行されるときは、二段階の様だ。まず、vfs_mount が mount を実行された初期の段階で呼ばれて、その後に vfs_cmount が呼ばれるみたいである。

次回