共有マウント


Rev.8を表示中。最新版はこちら

/mnt1/mpoint/と/mnt2を作成します。/mnt2に/mnt1をバインドマウントします。これで/mnt1と/mnt2は同じ内容となります。なお/mnt1/mpoint/下に、違いが分かるためtestのファイルがあります。
[root@localhost ~]# ls /mnt1/mpoint/
test
[root@localhost ~]# mount --bind /mnt1 /mnt2
[root@localhost ~]# ls /mnt1/mpoint/
test
[root@localhost ~]# ls /mnt2/mpoint/
test
/mnt1/mpointに/home/kitamuraをバインドマウントいたします。/mnt1/mpointは/home/kitamuraの内容となります。しかし、/mnt2/mpointは元の/mnt1/mpointのままです。
[root@localhost ~]# mount --bind /home/kitamura/ /mnt1/mpoint/
[root@localhost ~]# ls /mnt1/mpoint/
Desktop  Documents  Downloads  Mail  Pictures  Public  Templates  Videos  lkm

[root@localhost ~]# ls /mnt2/mpoint/
test
上のmountをumountして、/に共有設定をして同じ事を行うと、/mnt2/mpoint/もマウント先の内容となります。
[root@localhost ~]# umount /mnt2/mpoint/
[root@localhost ~]# umount /mnt2

[root@localhost ~]# mount --make-shared /
[root@localhost ~]# mount --bind /mnt1 /mnt2
[root@localhost ~]# mount --bind /home/kitamura/ /mnt1/mpoint/
[root@localhost ~]# ls /mnt1/mpoint/
Desktop  Documents  Downloads  Mail  Pictures  Public  Templates  Videos  lkm
[root@localhost ~]# ls /mnt2/mpoint/
Desktop  Documents  Downloads  Mail  Pictures  Public  Templates  Videos  lkm
共有マウントは、マウントプラパゲーションと呼ばれるプライベートマウント/スレーブマウント/バインド不可マウントの新しき追加されたフラグです。共有マウント同士はマウントを共有します。スレーブは共有のファイルシステムを共有しますが、自分自身のマウントは共有しません。バインド不可はそのファイルシステムでバインドマウントはできません。これらのフラグを新規マウント時には設定することはできません。従ってマウントしたファイルシステムはプライベート/バインド化となります。マウントプラパゲーションにかかる設定をする場合、マウントした後に、設定をすることで実現します。

従って、最初の例では、/mnt1/mpointはプライベートマウントとなるため、/mnt2ファイルシステムから参照できません。/に共有を設定すると、/下の/mnt2をバインドマウントすると、/mnt2のmntオブジェクトは/のmntオブジェクトを引き継ぐため、共有でmntオブジェクトが割り当てられます。そして/mnt1/mpointをバインドマウントすると、同じように/のmntオブジェクトが引き継がれ、お互い共有状態のmntオブジェクトが作成され、/mnt2/mpointも/mnt1/mpoinのマウント先を参照できるようになるわけです。

また、異なるネームスペース空間でそれぞれファイルシステを管理する事で、同じような事が実現できますが、ここでの検証は同じネームスペース空間で実現していると言う事です。

共有情報は/proc/id/mountinfoでチェックする事ができます。共有のファイルシステムは、mntオブジェクトのmnt_group_idが0でありません。上記の場合/を継承していて、すべてshared:1となっています。スレーブの場合、共有している最終ファイルシステムマスタのmnt_group_idをmasterとし、直接つながっている親のファイルシステムのmnt_group_idをpropagate_fromとして表示しています。mnt_group_idは共有/スレーブ間での関連づけかと想像しています。
[root@localhost ~]# cat /proc/1/mountinfo
  :
  :
21 22 253:1 /mnt1 /mnt2 rw,relatime shared:1 - ext4 /dev/mapper/VolGroup-lv_root rw,user_xattr,barrier=1,data=ordered
46 22 253:1 /home/kitamura /mnt1/mpoint rw,relatime shared:1 - ext4 /dev/mapper/VolGroup-lv_root rw,user_xattr,barrier=1,data=ordered
47 21 253:1 /home/kitamura /mnt2/mpoint rw,relatime shared:1 - ext4 /dev/mapper/VolGroup-lv_root rw,user_xattr,barrier=1,data=ordered
48 46 253:1 /home/kitamura /mnt1/mpoint rw,relatime shared:1 - ext4 /dev/mapper/VolGroup-lv_root rw,user_xattr,barrier=1,data=ordered
49 47 253:1 /home/kitamura /mnt2/mpoint rw,relatime shared:1 - ext4 /dev/mapper/VolGroup-lv_root rw,user_xattr,barrier=1,data=ordered
51 22 253:1 /home/kitamura /home/kitamura rw,relatime shared:1 - ext4 /dev/mapper/VolGroup-lv_root rw,user_xattr,barrier=1,data=ordered
なお、mnt_group_idはプロセスIDのように、新規に共有を設定する場合にインクリメントされて設定されていくだけです。0かそうでないかが重要で、数値そのものはあんまし意味がなさそうです・・・。
static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt)
{
  :
       if (IS_MNT_SHARED(r))
               seq_printf(m, " shared:%i", r->mnt_group_id);
       if (IS_MNT_SLAVE(r)) {
               int master = r->mnt_master->mnt_group_id;
               int dom = get_dominating_id(r, &p->root);
               seq_printf(m, " master:%i", master);
               if (dom && dom != master)
                       seq_printf(m, " propagate_from:%i", dom);
       }
       if (IS_MNT_UNBINDABLE(r))
               seq_puts(m, " unbindable");
 :
}

補足

なんとなく、このあたりはdentryで実装しているのかなと思っていましたが、mntオブジェクト内での込み入った実装で、2時間もソースを眺めていると決まって頭が爆発してしまいます。Linuxが世に出て20年も経ってしまい、今ではスマートフォーンからスーパコンピュータまでと、その活躍は素晴らしいものです。(tronだったらと思うと残念です。それゆえソフトバンクは毛嫌いしています。)

今後も、どんどん進化していくでしょう。そしてモノリシックカーネル故の性でしょうか、どんどん複雑化していって、開発に携わる人材不足になりはしないかと(私自身でさえプログラマの端くれですが、自分の書いたプログラムを見るのさえ嫌気が刺すことは しょっちゅうです。)、で、ひょっとすると、スーパコンピュータみたいな高スペックと家電のようなそうでない用と、2分化していくのではと、あるいは部分的にマイクロカーネル化していくのではと。私みたいな者が心配するのもなんですが、linuxファンとしてカーネルを読んでいてふと思った次第です。

いま少し、マウントプロパゲーションの実装が見えたらアップするつもりです。

最終更新 2013/10/28 17:34:06 - north
(2013/10/24 14:52:03 作成)


検索

アクセス数
3576089
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。