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


17

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

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

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


1
밀접하게 관련 : inode를 통해 파일을 제거 하거나 이름을 바꿉니다 (둘 다 직접 수행하는 것은 불가능합니다).
질 'SO-정지 존재 악마'

답변:


23

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

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

debugfs -w / dev / block / device

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

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

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

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

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

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


6
이러한 인터페이스는 또한 파일에 링크 수가 0이 아닌지 확인해야합니다. 그렇지 않으면 삭제되었지만 여전히 열려있는 파일을 다시 만들 수 있습니다. IIRC는 커널 불변을 위반하여 거부되었습니다.
질 'SO-정지 존재 악마'


1
@PhilipCouling, 디렉토리 의 실행 권한 비트는 검색 권한으로 변환됩니다 . 나는 이미 디렉토리에서에 대한 검색 액세스 권한이 없다고 말했습니다 .
Stéphane Chazelas

3
@OrangeDog, 검색 권한 은 POSIX 표준에서 사용되는 용어입니다.
Stéphane Chazelas

1
@mosvy :이 검사는 커널에서 제거 될 수 있습니다. 그래도 호스 자체를 사용하지 않으려면 VFS에 두 곳을 패치해야합니다. 몇 년 전 논문 작업을하면서 해냈습니다.
Joshua

3

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

와 같은

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>해도 여분의 하드 링크로 인해 공간을 확보하지 못합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.