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:/]






