inode (ext4)에 대한 하드 링크를 만드는 방법은 무엇입니까? (또는 경로)를 모르는 경우 해당

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

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

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



답변

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

그러나 debugfs파일 시스템에서 (마운트가 해제되면) 파일 시스템에서 블록 장치에 대한 쓰기 권한이 있다고 가정하여 사용할 수 있습니다.

debugfs -w / dev / block / device

( /dev/block/device파일 시스템이 상주하는 실제 블록 장치로 교체하십시오 ).

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

능력치 < 123 >

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

모두 양호하면 다음을 입력하십시오.

ln < 123 > 경로 / to / newfile

하드 링크를 만들려면 (경로는 파일 시스템의 루트에 상대적입니다). 뒤에 :

마일 < 123 >

링크 수를 늘리려면 ( Enter현재 값에 1을 추가하려는 링크 수를 제외한 모든 필드에 대해 누르십시오 ).


답변

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

와 같은

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

(노드 번호가 모두 1,000,000 미만이라고 가정하면 필요한 경우 더 많은 디렉토리를 작성하십시오).

그 후, inode는 1000 단위로 그룹화되어 by-inode/트리에 수집됩니다 . 거기에서 필요에 따라 연결할 수 있습니다.

그러나 파일을 삭제 <path>해도 여분의 하드 링크로 인해 공간을 확보하지 못합니다.