Linuxで同期されていないシングルバンドルマウントファイル

Linuxで同期されていないシングルバンドルマウントファイル

ファイルバンドルが別のファイルの上にマウントされており、エディタを使用して変更した後、両方のファイルに変更は表示されません。ただし、たとえば>>などのリダイレクトを使用してシェルを変更すると、両方のファイルに変更が表示されます。以下はデモンストレーションの例です。

最初の状況:

-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つのファイルは異なります。ここでこの事件がどのように進行されているかを知っている人はいますか?

ありがとうございます!

ベストアンサー1

何が起こっているのかは、viが新しいファイルを作成し、マウントがまだそこにあるにもかかわらず、効果的にバインドを解除することです。既存のファイル(inode)を追加。

ls -liテスト中にファイルのinode番号を見てください。

$ 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

ファイル名ではなくデフォルトのinodeについて考える必要があります。シンボリックリンクができないことをしようとしますか?


バリエーションを試してみたら、あなたが望むことができると思います。以下で確認してください…

$ 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編集が可能になり、inodeを変更せずに/mnt/c/foo内容が変更されます。a/foo

おすすめ記事