Linux

單個綁定掛載的文件在 linux 中不同步

  • November 1, 2017

我將單個文件綁定安裝在另一個文件之上,並且在使用編輯器進行更改後,我看不到兩個文件中的修改。但是,如果我使用重定向對 shell 進行更改,>>,例如,我確實看到了兩個文件中的更改。下面是一個範例來展示:

第一種情況:

-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

上述情況下的一切都如我所料;將“modified”附加到文件“foo”後,這兩個文件沒有差異。

但是,如果我執行相同的測試但使用 vi 來編輯 foo,我會得到不同的結果。

第二種情況:

-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# 

在這裡,這兩個文件是不同的,即使一個文件綁定安裝到另一個文件上。這裡的任何人都知道在這種情況下發生了什麼?

謝謝!

正在發生的事情是 vi 正在創建一個新文件(inode),並且有效地撤消了綁定,即使掛載仍然存在。追加使用現有文件(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

引用自:https://unix.stackexchange.com/questions/44373