하드링크의 inode가 더 이상 변경되지 않는 이유는 무엇입니까?

하드링크의 inode가 더 이상 변경되지 않는 이유는 무엇입니까?

저는 Vim 8.2를 사용하여 Ubuntu 18.04에서 파일을 편집합니다. 파일을 열고 일부 내용을 변경한 후 Vim을 사용하여 종료하면 파일의 inode 번호가 변경됩니다.

내가 이해한 바에 따르면 이는 내 Vim에 백업 메커니즘이 활성화되어 있기 때문에 각 버전이 .swp이전 파일을 대체할 새 파일을 생성하기 때문입니다. 새 파일에는 새 inode 번호가 있습니다. 그게 다야.

그런데 뭔가 이상한 걸 발견했어요.

아래와 같이 첫 번째 이후에 vim 11.cppinode가 변경 409980되어 가 됩니다 409978. 그러나 파일에 대한 하드 링크를 만든 후에는 Vim을 사용하여 파일을 11.cpp어떻게 수정하더라도 해당 파일의 inode 번호는 절대 변경되지 않습니다. 11.cpp하드 링크를 삭제하면 xxxVim 버전이 바뀔 때마다 해당 링크의 inode 번호가 다시 변경됩니다.

정말 혼란스럽습니다.

$ ll -i ./11.cpp
409980 -rw-rw-r-- 1 zyh zyh 504 Dec 22 17:23 ./11.cpp

$ vim 11.cpp     # append a string "abc" to the file 11.cpp
$ ll -i ./11.cpp
409978 -rw-rw-r-- 1 zyh zyh 508 Dec 22 17:25 ./11.cpp

$ vim ./11.cpp   # remove the appended "abc"
$ ll -i ./11.cpp
409980 -rw-rw-r-- 1 zyh zyh 504 Dec 22 17:26 ./11.cpp

$ ln ./11.cpp ./xxx   # create a hard link
$ ll -i ./11.cpp
409980 -rw-rw-r-- 2 zyh zyh 504 Dec 22 17:26 ./11.cpp

$ vim 11.cpp     # append a string "abc" to the file 11.cpp
$ ll -i ./11.cpp
409980 -rw-rw-r-- 2 zyh zyh 508 Dec 22 17:26 ./11.cpp

$ vim 11.cpp     # remove the appended "abc"
$ ll -i ./11.cpp
409980 -rw-rw-r-- 2 zyh zyh 504 Dec 22 17:26 ./11.cpp

답변1

설정인거 같네요backupcopyauto( :set backupcopy?확인하려면 Vim에서 실행하세요).

주요 값은 다음과 같습니다.

yes파일의 복사본을 만들고 원본을 덮어쓰고 파일 이름을 바꾸고
no 가장 적합한 이전 파일 위에 새 파일을 씁니다.
auto

[…]

auto값은 중간 값입니다. Vim이 부작용 없이 파일 이름을 바꿀 수 있다고 판단할 때 사용됩니다(속성은 전달될 수 있고 파일은 링크가 아닙니다). 문제가 예상되면 사본이 만들어집니다.

명확하지 않은 경우: ( yes복사 및 덮어쓰기)는 inode 번호를 변경하지 않지만 no(이름 바꾸기 및 다시 쓰기)는 변경합니다.

귀하의 경우 처음에는 , auto와 같습니다 no. ln ./11.cpp ./xxxVim 이후눈치채다auto유사하게 작동하는 또 다른 링크가 있습니다 yes.

답변2

일반적으로 백업을 활성화할 때 가장 효율적인 방법은 원본 파일의 이름을 바꾸고 편집된 변경 사항이 포함된 새 파일을 만드는 것입니다.

그러나 이는 대상 파일에 여러 개의 하드 링크가 있는 경우 올바른 접근 방식이 아니므로 vim원본 파일과 일치하는 백업 파일을 작성한 다음 원본 파일을 그 자리에서 업데이트하는 덜 효율적인 경로가 선택됩니다.

답변3

재현해서 아이노드 번호가 바뀌면 어떻게 될까 생각해봤습니다.

이는 편집자가 새 파일을 만들고 이전 파일을 삭제했음을 나타냅니다. 데이터 손실 위험을 줄이려면 일부 이름을 바꿔야 할 수도 있습니다. 이름이 여러 개인 파일에 대해 이 작업을 수행하는 경우 이전 이름(파일을 열 때 사용한 이름)을 삭제하면 다른 이름은 그대로 남아 이전 파일을 가리킵니다.

참고: 하드 링크 같은 것은 없습니다. inode만 메타데이터와 파일 콘텐츠를 가리킵니다. 또한 (일반적으로) inode를 가리키는 하나 이상의 파일 이름이 있습니다. 이들 이름 각각은 동일한 상태를 갖습니다(하드 링크가 아니며 단지 inode를 가리키는 이름일 뿐입니다).

관련 정보