알려진 두 가지 사실:
- Linux에서는 동일한 파일 시스템의 한 위치에서 다른 위치로 파일을 이동해도 inode가 변경되지 않습니다(파일은 "동일한 위치"에 유지되고 관련 디렉터리만 변경됨).
- 그러나 복사하면 새 inode가 포함된 완전히 새로운 파일이 생성됩니다.
이 정보를 통해 나는 다음을 관찰했습니다.
$ ls -li /tmp/*.db
1452722 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:33 /tmp/vf4.db
$
$ cp /tmp/vf4.db /tmp/vf4.2.db
$ ls -li /tmp/*.db # New inode introduced
1452719 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:38 /tmp/vf4.2.db
1452722 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:33 /tmp/vf4.db
$
$ mv /tmp/vf4.2.db /tmp/vf4.db
$ ls -li /tmp/*.db
1452719 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:38 /tmp/vf4.db
$
$ cp /tmp/vf4.db /tmp/vf4.2.db
$ ls -li /tmp/*.db # Original inode appears again! (1452722)
1452722 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:41 /tmp/vf4.2.db
1452719 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:41 /tmp/vf4.db
$
$ mv /tmp/vf4.2.db /tmp/vf4.db
$ ls -li /tmp/*.db
1452722 -rw-r--r-- 1 omerda omerda 245760 Jul 7 12:41 /tmp/vf4.db
이 "왕복"으로 인해 항상 원본 인덱스 노드가 원본 파일에 다시 추가됩니다. 나는 각 복제본에 완전히 새로운 inode를 사용하고 싶었습니다.
동일한 인덱스 노드를 어떻게 재사용합니까?
편집하다
댓글 섹션에서 일부는 배경 정보를 요청했습니다. 따라서 일부 sqlite 래퍼는 이 나쁜 관행을 사용하여 db 파일을 대체하고 sqlite3은 대체에 대한 오류를 표시하지 않습니다. 하지만,이것은 sqlite에 관한 질문이 아닙니다., 주제와 질문을 고수하십시오.
답변1
파일 시스템 계층이 그렇게 하기로 선택했기 때문에 시스템은 동일한 inode를 재사용합니다. 기사에서 언급했듯이논평, 이는 구현 세부정보입니다. 내 경우에는 그랬지만 ext4
, 다른 파일 시스템 유형이 inode를 다르게 사용(또는 재사용)해서는 안되는 이유가 없습니다. inode가 없고 요청 시 inode 번호가 동적으로 합성되는 파일 시스템을 찾을 수 있습니다. 파일 시스템은 tmpfs
동일한 방식으로 inode 번호를 재사용하지 않습니다.
# Create two files on ext4
touch file
cp file copy
ls -li file copy
133235 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:13 copy
129071 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:13 file
# Remove one, copy the other back
rm file
cp copy file
ls -li file copy
133235 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:13 copy
129071 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:13 file
# Remove one, create an unexpected intervention, copy the other back
rm file
touch thing
cp copy file
ls -li file copy thing
133235 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:13 copy
133237 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:14 file
129071 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:14 thing
tmpfs
이제 파일 시스템에서 이를 반복해 보겠습니다 ./dev/shm
# Create two files on tmpfs
touch file
cp file copy
ls -li file copy
369355 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:27 copy
369354 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:27 file
# Remove one, copy the other back
rm file
cp copy file
ls -li file copy
369355 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:27 copy
368123 -rw-r--r-- 1 roaima roaima 0 Jul 7 11:28 file
잠재적으로 유용한 참고자료
답변2
동일한 인덱스 노드를 어떻게 재사용합니까?
ext4에서 inode 번호는 단순히 실제 inode 데이터를 포함하는 테이블에 대한 인덱스입니다. 전설에 따르면 "i"는 "색인"을 의미합니다. 실제로 단일 연속 테이블로 저장되지는 않지만 중요하지 않습니다.
얻는 특정 inode 번호는 당시 사용 가능한 번호이고 파일 시스템 코드가 선택을 결정적으로 구현하는 것이 합리적이므로 1452719 이전에 처음으로 1452722를 선택한 경우 1452722를 선택하는 것이 합리적입니다. 지금 무료라면 복사본을 만드는 것 외에 다른 변경 사항을 적용하지 않고 다시 수행하세요. 파일의 특정 구현에 대한 inode 번호를 영구적으로 예약할 수는 없습니다. 이렇게 하면 파일 시스템이 삭제된 파일용으로 예약된 사용할 수 없는 inode 항목으로 빠르게 채워지기 때문입니다.
특정 inode 번호를 얻을 것이라고 기대할 수는 없습니다. 주로 시스템의 다른 프로세스가 동시에 파일을 생성하고 파일을 다시 생성하기 전에 얻을 것으로 예상되는 inode 번호를 유지할 수 있기 때문입니다. 또는 다른 프로세스가 파일을 삭제하여 파일 시스템 코드가 다음 파일을 제공할 수도 있습니다. 파일 시스템이 블록 그룹 및 관련 inode로 구성되는 방식은 단순히 파일을 늘리면 파일 시스템이 사용 가능한 inode를 찾는 위치가 변경될 수 있음을 의미할 수도 있습니다. 아니면 아닐 수도 있습니다. 모든 inode 번호는 파일이 식별되었음을 알려줍니다.지금존재하며 새 파일을 만들 때 기존 파일과 일치하지 않는 파일을 얻게 됩니다.
또한 다른 유형의 파일 시스템(예: VFAT)에는 정적 inode 번호가 없지만 실행 중인 카운터만 얻을 수 있습니다.
답변3
이 "왕복"으로 인해 항상 원본 인덱스 노드가 원본 파일에 다시 추가됩니다.
"항상"이라고 하면 "볼 때마다"라는 뜻입니다. 하지만 그건 확실히아니요결과를 보장합니다!
나는 각 복제본에 완전히 새로운 inode를 사용하고 싶었습니다.
물론 이것은 또 다른 가능한 결과이다. 그러나 사용 가능한 inode 수는 무제한이 아니기 때문에 어떤 시점에서는 재활용 가능한(새롭거나 "새"가 아닌) 번호를 얻어야 합니다.
동일한 인덱스 노드를 어떻게 재사용합니까?
모든 기존 파일 시스템은 블록 할당을 관리해야 합니다. 파일이 할당되거나 커지면 파일의 데이터를 저장하기 위해 새 블록을 할당해야 합니다. 파일이 삭제된 후 해당 블록을 재사용할 수 있습니다. 다양한 파일 시스템은 다양한 기술을 사용하여 "사용 가능한" 블록 세트를 관리하고 이를 파일에 할당합니다. 선택한 알고리즘은 분명히 성능과 조각화에 큰 영향을 미칠 것입니다. 때로는 할당이 다음과 같이 보일 수 있습니다.후입 선출법- 즉, 가장 최근에 해제된 블록이 다음 할당 블록이 될 수 있다. 그러나 분명히 이것이 항상 그런 것은 아닙니다.
inode의 상황은 거의 동일합니다. 파일이 할당되면 파일을 식별하기 위해 새 inode 및/또는 inode 번호를 할당해야 합니다. 파일이 삭제되면 해당 파일의 inode와 inode 번호를 재사용할 수 있습니다. 다양한 파일 시스템은 다양한 기술을 사용하여 "무료" inode 세트를 관리하고 이를 파일에 할당합니다. 때로는 할당이 후입선출 방식으로 나타날 수도 있지만 분명히 항상 그런 것은 아닙니다.