디렉토리에 대한 하드 링크를 제거하는 방법은 무엇입니까?

디렉토리에 대한 하드 링크를 제거하는 방법은 무엇입니까?

Linux에서는 디렉토리를 하드링크하는 것이 불가능하다는 수백 가지 답변을 받기 전에는 예, 알고 있습니다.

(ext4)를 사용하여 파일 시스템을 확인한 후 문제의 파일이 Lost+fount에 나타 났고 e2fsck통계에 따르면 /is/ 2개의 하드 링크가 있는 파일입니다.

# stat --format="File \"%n\" is a %F with %h hardlinks" ./#30934353
File "./#30934353" is a directory with 2 hardlinks

오. 포함된 파일을 건드리지 않고 어떻게 안전하게 삭제할 수 있나요? 시도해 보았는데 rm모두 unlinkdie 디렉토리가 비어 있지 않다고 합니다...

답변1

ext4 파일 시스템의 디렉토리에는 일반적으로 링크가 2개 이상 있습니다. 상위 디렉토리의 항목과 .자체 항목입니다. 바라보다거기자세한 내용은.

하지만 파일 시스템이 일관되지 않으면 여러 위치에 연결된 디렉터리가 있을 가능성이 높으며 링크 수는 이를 반영하지 않습니다.

예를 들어, debugfs -w(마운트 해제된 파일 시스템에서)을 사용하면 link a/b c/d디렉토리에 대한 링크를 강제로 생성할 수 있습니다. 링크 수가 업데이트되지 않은 것을 확인할 수 있습니다( sif a/b links_count 3업데이트해야 함).

$ ls -lid a/b c/d a/b/. c/d/.
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 a/b/
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 a/b/./
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 c/d/
12 drwxr-xr-x 2 chazelas chazelas 1024 May 14 08:37 c/d/./

3개의 링크(a를 가리키고, c를 가리키고, "."가 자신을 가리키고 있음)가 있어도 링크 수는 여전히 2입니다.

fsck문제가 보고됩니다 .

Pass 2: Checking directory structure
Entry 'd' in /c (1282) is a link to directory /a/b (12).
Clear<y>?

따라서 fs가 방금 fsck를 경험한 경우에는 이런 일이 발생할 가능성이 없습니다.

이러한 링크 중 하나를 제거하려면 debugfs -w다시 사용하여(파일 시스템을 마운트 해제한 후) unlink c/d해당 링크에서 작업을 수행하거나 을 사용할 수 있습니다 fsck. 에 여러 링크가 있는 경우 해당 링크의 항목을 확인하여( 사용 ) 어느 것이 링크인지 확인할 directory수 있습니다. 올바른 것( 올바른 부모와 동일한 inode 번호를 갖습니다)...debugfs ls..

관련 정보