单个绑定挂载文件在 linux 中不同步

cap*_*coe 6 linux mount files

我将一个文件绑定到另一个文件的顶部,在使用编辑器进行更改后,我没有看到两个文件中的修改。但是,如果我使用重定向对 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
Run Code Online (Sandbox Code Playgroud)

上述案例中的一切都如我所料;将“修改”附加到文件“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# 
Run Code Online (Sandbox Code Playgroud)

在这里,即使一个文件绑定安装到另一个文件上,这两个文件也是不同的。这里有人知道在这种情况下发生了什么吗?

谢谢!

Sta*_*mer 8

发生的事情是 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
Run Code Online (Sandbox Code Playgroud)

您需要考虑底层 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
Run Code Online (Sandbox Code Playgroud)

虽然a/foo挂载在只读文件上,但/mnt/c/foo我可以编辑/mnt/c/foo它并在a/foo不更改 inode的情况下更改了内容。

  • 许多程序通过读取现有文件、使用临时名称创建新版本、取消链接(删除)旧文件并使用旧名称重命名新文件来工作。 (2认同)
  • @capnroscoe 请参阅 [为什么在“vi”编辑器中编辑时 inode 值会发生变化?](http://unix.stackexchange.com/questions/36467/37177#37177)了解背景信息。 (2认同)