rootfsとルートファイルシステムの検証
rootfsとルートファイルシステムの関係の検証するサンプルです。path_lookup()でルートファイルシステムのルートのdntryを取得します。引数でLOOKUP_FOLLOWとするのが重要です。
最初は/のdentryの所属する、ファイルシステムの情報を表示しています。mntroot/mntpointともエントリの名前は/ですが、アドレスが示すように、このエントリは別物です。mntrootは該当ファイルシステムの/で、mntpointはアタッチしている親のエントリ(この場合はrootfsと言うことですが。)です。なお、bindオプションでマウントすれば、バインド元のディレクトリがmntrootに設定されます。
/ :[mntroot:f742sa3b8:/]:[mntpoint:f7402088:/]
if (mnt != m_mntparent)は、このファイルシステムはm_mntparentにマウントされている事になります。条件の処理が実行されるというのは、この/は別のファイルシステムにマウントされていると言うことです。
if (m_mntparent == m_mntparent->mnt_parent)で、親のファイルシステムと自分自身が同じなら、このファイルシステムはマウントされていません。これがrootfsです。そのmntrootはまさにルートのルートと言うべきルートです。なお、mntpointもこのルートが設定されているようです。
rootfs:[mntroot:f7402088:/]:[mntpoint:f7402088:/]
最初は/のdentryの所属する、ファイルシステムの情報を表示しています。mntroot/mntpointともエントリの名前は/ですが、アドレスが示すように、このエントリは別物です。mntrootは該当ファイルシステムの/で、mntpointはアタッチしている親のエントリ(この場合はrootfsと言うことですが。)です。なお、bindオプションでマウントすれば、バインド元のディレクトリがmntrootに設定されます。
/ :[mntroot:f742sa3b8:/]:[mntpoint:f7402088:/]
if (mnt != m_mntparent)は、このファイルシステムはm_mntparentにマウントされている事になります。条件の処理が実行されるというのは、この/は別のファイルシステムにマウントされていると言うことです。
if (m_mntparent == m_mntparent->mnt_parent)で、親のファイルシステムと自分自身が同じなら、このファイルシステムはマウントされていません。これがrootfsです。そのmntrootはまさにルートのルートと言うべきルートです。なお、mntpointもこのルートが設定されているようです。
rootfs:[mntroot:f7402088:/]:[mntpoint:f7402088:/]
#include <linux/module.h> #include <linux/kernel.h> #include <linux/mnt_namespace.h> #include <linux/namei.h> #include <linux/mount.h> MODULE_LICENSE("GPL"); static int testmod_init_module(void) { struct nameidata nd; struct vfsmount *mnt, *m_mntparent; struct dentry *d_current, *d_mntroot, *d_mntpoint; int err = 0; err = path_lookup("/", LOOKUP_FOLLOW, &nd); if (err) { printk("path_lookup err\n"); return -1; } mnt = nd.path.mnt; m_mntparent = mnt->mnt_parent; d_mntroot = mnt->mnt_root; d_mntpoint = mnt->mnt_mountpoint; printk("/:[mntroot:%x:%s]:[mntpoint:%x:%s]\n", d_mntroot, d_mntroot->d_name.name, d_mntpoint, d_mntpoint->d_name.name); if (mnt != m_mntparent) { if (m_mntparent == m_mntparent->mnt_parent) { d_mntroot = m_mntparent->mnt_root; d_mntpoint = m_mntparent->mnt_mountpoint; printk("rootfs:[mntroot:%x:%s]:[mntpoint:%x:%s]\n", d_mntroot, d_mntroot->d_name.name, d_mntpoint, d_mntpoint->d_name.name); } } return 0; } static void testmod_cleanup_module(void) { } module_init(testmod_init_module); module_exit(testmod_cleanup_module);
[root@localhost kitamura]# dmesg : : /:[mntroot:f742a3b8:/]:[mntpoint:f7402088:/] rootfs:[mntroot:f7402088:/]:[mntpoint:f7402088:/]