고쳐 쓰다

고쳐 쓰다

*nix 파일 시스템의 파일에는 거의 항상 연관된 inode 번호가 있습니다. 대부분의 경우 사용자는 파일 이름(즉, 계층적 경로 이름-파일 이름 구조)을 사용하여 파일과 상호 작용하기 때문에 이러한 inode 번호에 크게 신경 쓰지 않는 것 같습니다. 따라서 파일 이름을 바꾸는 것은 흔한 일입니다.

mv oldname newname

한 inode 번호에서 다른 inode 번호로 이름 바꾸기(재할당)는 어떻게 작동합니까?

배경은 내 파일 시스템에서 파일을 백업(예: 복원/카탈로그)하고 싶다는 것입니다. 복구하면서 이전 inode #7이 다시 행운의 inode #7이 된 것을 보고 기뻤습니다.

커널의 파일 시스템 처리가 inode 처리를 추상화할 수 있다는 점을 알고 있으면 할당하려는 파일 앞에 다른 파일이 #7로 할당되는 경우가 있다고 가정합니다. 간단히 말해서, #7이 이미 사용 중일 때 "친애하는 커널이 inode #12345를 #7로 변경했습니다" 결정에 문제가 있을 것으로 예상됩니다. 파일 이름은 파일 이름에 비해 고유하지만 파일 이름을 이미 사용된 파일 이름으로 바꾸려면 다음을 수행합니다.

mv newname othername
mv oldname newname

위의 방법으로 이전 파일 oldfile의 이름 을 .newnamenewnameothername

따라서 inode 번호 지정을 변경/영향을 줄 수 있는 방법이 있을 수 있다고 생각합니다. 이 경우 질문에 완벽하게 답할 수 있습니다. 어떤 방식으로든 파일 시스템에 종속적인 경우 ext4에 대해 가장 알고 싶습니다.

고쳐 쓰다

내 부주의로 인해 무시하게 됐어https://stackoverflow.com/questions/5752822/how-do-i-create-a-file-with-a-특이적-inode-number이것은 대부분의 동일한 문제를 해결합니다. Unix 및 Linux가 아닌 SO를 사용하고 있으므로 이 질문을 여기에 남겨두거나 삭제하는 것으로 충분한지 잘 모르겠습니다. 그런데 이미 답이 나와 있는 걸까요?

답변1

35년이 지난 지금 이 옵션은 더 이상 존재하지 않습니다. 괜찮은 파일 시스템으로는 inode 수를 제어할 수 없습니다.

당신이 할 수 있는 일은 ufsrestore에서 복구 기호를 구문 분석하는 것이지만 문서화되지 않았고 바이너리입니다.

Star는 동일한 기본 알고리즘을 사용하여 이름 변경을 추적하고 데이터베이스를 별 기호 테이블에 배치합니다. 파일은 텍스트 파일이며 star_sym 프로그램은 이를 사람이 읽을 수 있는 형식으로 변환합니다.

따라서 얻을 수 있는 최선의 방법은 이전 inode 번호에서 새 inode 번호로의 변환 테이블입니다.

답변2

ext4의 경우 debugfs도구를 이런 방식으로 사용할 수 있습니다
(debugfs가 파일 시스템을 손상시킬 수 있으므로 적절한 예방 조치를 취해야 합니다).

목표는 inode라는 77이름의 파일을 만드는 것입니다 /lucky77. inode가 77아직 사용되지 않았거나, 비어 있거나, 사용 가능하지 않다고 가정하고, filename도 마찬가지입니다 /lucky77. 또한 마운트되지 않은 파일 시스템에서 오프라인으로 작업합니다.

debugfs -w /dev/ext4fsblockdev
debugfs 1.42 (29-Nov-2011)
debugfs:  seti <77>
debugfs:  sif <77> mode 0x81B6
debugfs:  ln <77> luck77
debugfs:  sif <77> links_count 1
debugfs:  quit

inode가 이미 사용 중인 경우 먼저 inode를 변경하려면 추가 단계가 필요합니다. 간단한 경우, 파일 복사본을 만든 다음 원본을 삭제하면 복사본이 새 inode를 사용하므로 파일 이름이 해제됩니다. 어쨌든 디렉토리나 inode에 대한 하드 링크 또는 기타 상황과 같은 더 복잡한 상황이 발생합니다. 이러한 경우 필요한 inode를 해제하려면 단순한 처리 이상의 작업이 필요합니다.

답변3

AFAIK, 파일 데이터를 복사하지 않고 하나의 inode를 다른 inode로 복사할 수 없습니다.

특정 inode 번호를 가진 새 파일을 요청하기 위한 API도 없습니다.

따라서 당신이 할 수 있는 일은 cp -a old new && rm old파일에 대한 새로운 inode를 얻는 것뿐이지만 그것이 무엇인지 선택할 수는 없습니다. 물론 이는 전체 데이터를 복사하므로 속도가 느립니다.


파일 시스템용 일부 FS 관련 덤프/복원 도구는 inode 번호를 보존할 수 있지만 대부분은 그렇지 않습니다. 이러한 도구는 파일 시스템 API를 통하지 않고 블록 장치에 직접 읽고 씁니다. XFS: ( xfsdump/xfsrestore때때로) inode 번호를 유지하지 않음. ( dumpe2fs정보만 인쇄됩니다. Linux ext2 dump 명령은 dumpinode 번호를 보존할지 여부를 .IDK라고 합니다.)


inode 번호를 보존/제어하는 것은 일반적으로 유용한 일이 아닙니다. inum을 통해 파일을 열거나 주어진 inum을 참조하는 파일 이름을 찾는 시스템 호출도 없습니다(전체 트리를 탐색하는 것 제외). (FS 디버깅 도구는 xfs_db물론 inum을 통해 블록 장치를 읽어 파일을 가져올 수 있습니다.)

어떤 경우에는 inode 번호를 직접 소유하는 파일 시스템 외부에서 사용됩니다. NFS 사용파일 핸들로서의 Inode 번호클라이언트와 서버 사이. XFS데이터 마이그레이션이를 사용하여 테이프로 마이그레이션된 데이터를 FS의 파일과 일치시킵니다. 분명히 이것이 xfsdump/xfsrestoreinode 번호 보존에 관심을 갖는 이유입니다.

관련 정보