inode(ext4)에 대한 하드 링크를 만드는 방법은 무엇입니까?

inode(ext4)에 대한 하드 링크를 만드는 방법은 무엇입니까?

파일의 인덱스 노드(inode)를 알고 있지만 해당 경로(또는 해당 경로)를 모르는 경우 해당 inode에 직접 하드 링크를 생성할 수 있습니까?

를 사용하여 파일을 찾은 sudo find / -inum 123546다음 하드 링크를 생성할 수 있지만 이는 내 응용 프로그램에 비해 너무 느립니다.

저는 ext4 파일 시스템을 사용하고 있습니다.

답변1

AFAIK, 커널 API는 사용되지 않습니다. 그러한 인터페이스가 존재하는 경우 수퍼유저로 제한되어야 합니다. 그렇지 않으면 누구나 검색 액세스 권한이 없는 디렉토리의 파일에 액세스할 수 있습니다.

하지만 debugfs파일 시스템에서 (마운트 해제한 후) 이를 사용하여 이 작업을 수행할 수 있습니다(블록 장치에 대한 쓰기 액세스 권한이 있다고 가정).

디버그 파일 -w/dev/블록/장치

(바꾸다/dev/block/device파일 시스템이 상주하는 실제 블록 장치와 함께).

그런 다음 프롬프트에 debugfs입력하십시오 .

통계<123>
(꺾쇠 괄호 사용, 123을 실제 inode 번호로 대체) 파일이 존재하는지(inode의 링크 수가 0보다 큼) 디렉토리가 아닌지 확인하십시오.

모든 것이 순조롭게 진행되면 다음을 입력하십시오.

ln <123>경로/대상/새 파일
하드 링크를 만듭니다(경로는 파일 시스템의 루트에 상대적입니다). 다음은:

m<123>
링크 수를 늘립니다( Enter링크 수를 제외한 모든 필드에 액세스하려면 이 버튼을 누르십시오. 현재 값에 1을 더해야 합니다).

답변2

사용 사례에 따라 다른 접근 방식은 먼저 하드 링크를 통해 디렉터리의 모든 후보 파일을 수집한 다음 특히 관심 있는 파일을 하드 링크하는 것입니다.

예를 들어

mkdir -pm 0700 by-inode/{0..999}
find <path> ! -type d -printf "%i/%p\0" |
  while IFS=/ read -rd '' i n; do
    ln "$n" "by-inode/$((i/1000))/$i"
  done

(inode 번호가 모두 1,000,000 미만이라고 가정하고 필요한 경우 더 많은 디렉터리를 만듭니다.)

그런 다음 inode가 1000개의 그룹으로 그룹화되어 by-inode/트리에 수집됩니다. 여기에서 필요에 따라 연결할 수 있습니다.

이는 아래 파일을 삭제해도 <path>추가 하드 링크로 인해 공간이 확보되지 않음을 의미합니다.

관련 정보