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"를 추가한 후에는 두 파일에 차이가 없습니다.

그러나 동일한 테스트를 수행하고 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# 

여기서 한 파일을 다른 파일에 바인드 마운트하더라도 두 파일은 서로 다릅니다. 여기 이 사건이 어떻게 진행되고 있는지 아는 사람 있나요?

감사해요!

답변1

무슨 일이 일어나고 있는지는 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

관련 정보