O que está acontecendo é que o vi está criando um novo arquivo (inode) e, efetivamente, desfazendo a ligação, mesmo que a montagem ainda esteja em vigor. Anexar usa o arquivo existente (inode).
Dê uma olhada nos números de inode dos arquivos usando ls -li
à medida que eu passo em seus testes.
$ 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
Você precisa pensar em termos dos inodes subjacentes em vez de nomes de arquivos. O que você está tentando fazer que não pode ser feito com links simbólicos?
Eu tentei uma variação e acho que você pode fazer o que quiser. Dê uma olhada no seguinte ...
$ 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
Enquanto a/foo
foi montado no arquivo somente leitura /mnt/c/foo
, eu poderia editar /mnt/c/foo
e ele alterou o conteúdo de a/foo
sem alterar o inode.