無料Wikiサービス | デモページ
検索

アクセス数
最近のコメント
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
はじめ - 楽打連動ユーザー
はじめ - 楽打連動ユーザー
Adsense
広告情報が設定されていません。

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

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

補足

testmod_cleanup_module()がないと、このモジュールはrmmodできませんでした。

最終更新 2012/01/19 17:57:36 - north
(2012/01/19 17:57:36 作成)