1つのファイルを別のファイルの上にバインドマウントし、エディターで変更を加えた後、両方のファイルの変更が表示されません。ただし、リダイレクトを使用してシェルで変更を加えた場合、たとえば、両方のファイルで変更が表示されます。以下に例を示します。
最初のケース:
-bash-3.00# echo foo >| foo
-bash-3.00# echo bar >| bar
-bash-3.00# diff foo bar
1c1
< foo
---
> bar
-bash-3.00# mount --bind foo bar
-bash-3.00# echo modified >> foo
-bash-3.00# diff foo bar
-bash-3.00# umount bar
上記のケースのすべては私が期待するとおりです。 「foo」に「modified」を追加した後、2つのファイルに違いはありません。
ただし、同じテストを実行してもviを使用してfooを編集すると、異なる結果が得られます。
2番目のケース:
-bash-3.00# echo foo >| foo
-bash-3.00# echo bar >| bar
-bash-3.00# diff foo bar
1c1
< foo
---
> bar
-bash-3.00# mount --bind foo bar
-bash-3.00# diff foo bar
-bash-3.00# vi foo
# append "modified with vi" and :wq vi
"foo" 2L, 21C written
-bash-3.00# cat foo
foo
modified with vi
-bash-3.00# cat bar
foo
-bash-3.00# diff foo bar
2d1
< modified with vi
-bash-3.00#
ここでは、一方が他方にバインドマウントされていても、2つのファイルは異なります。ここの誰かがこの場合に何が起こっているのか知っていますか?
ありがとう!
何が起こっているのかというと、マウントがまだ配置されていても、viが新しいファイル(inode)を作成し、事実上、バインドを元に戻しているということです。追加には、既存のファイル(inode)が使用されます。
テストをステップ実行するときに、ls -li
を使用してファイルのiノード番号を確認します。
$ echo foo > foo
$ echo bar > bar
$ ls -li foo bar # 2 inodes so 2 different files
409617 -rw-r--r-- 1 derek derek 4 Jul 31 12:56 bar
409619 -rw-r--r-- 1 derek derek 4 Jul 31 12:56 foo
$ Sudo mount --bind foo bar
$ ls -li foo bar # both inodes are the same so both reference the same file (foo)
409619 -rw-r--r-- 1 derek derek 4 Jul 31 12:56 bar
409619 -rw-r--r-- 1 derek derek 4 Jul 31 12:56 foo
$ echo mod >> foo
$ ls -li foo bar # appending doesn't change the inode
409619 -rw-r--r-- 1 derek derek 8 Jul 31 12:57 bar
409619 -rw-r--r-- 1 derek derek 8 Jul 31 12:57 foo
$ vi foo
$ ls -li foo bar # vi has created a new file called foo (new inode)
# bar still points to the old foo
409619 -rw-r--r-- 0 derek derek 8 Jul 31 12:57 bar
409620 -rw-r--r-- 1 derek derek 14 Jul 31 12:57 foo
$ Sudo umount bar
$ ls -li foo bar # umount uncovers the original bar. original foo has no references
409617 -rw-r--r-- 1 derek derek 4 Jul 31 12:56 bar
409620 -rw-r--r-- 1 derek derek 14 Jul 31 12:57 foo
ファイル名ではなく、基になるiノードの観点から考える必要があります。シンボリックリンクでは実行できなかった、何をしようとしていますか?
バリエーションを試してみましたが、やりたいことができると思います。以下を見てください...
$ ls -li a/foo /mnt/c/foo
3842157 -rw-r--r-- 1 derek derek 17 Jul 31 19:45 a/foo
840457 -r--r--r-- 1 root root 6 Jul 31 19:41 /mnt/c/foo
$ Sudo mount --bind a/foo /mnt/c/foo
$ ls -li a/foo /mnt/c/foo
3842157 -rw-r--r-- 1 derek derek 17 Jul 31 19:45 a/foo
3842157 -rw-r--r-- 1 derek derek 17 Jul 31 19:45 /mnt/c/foo
$ vi /mnt/c/foo
$ ls -li a/foo /mnt/c/foo
3842157 -rw-r--r-- 1 derek derek 22 Jul 31 20:02 a/foo
3842157 -rw-r--r-- 1 derek derek 22 Jul 31 20:02 /mnt/c/foo
$ Sudo umount /mnt/c/foo
$ ls -li a/foo /mnt/c/foo
3842157 -rw-r--r-- 1 derek derek 22 Jul 31 20:02 a/foo
840457 -r--r--r-- 1 root root 6 Jul 31 19:41 /mnt/c/foo
a/foo
が読み取り専用ファイル/mnt/c/foo
にマウントされている間、/mnt/c/foo
を編集でき、iノードを変更せずにa/foo
の内容を変更しました。