폴더에 대해 생성된 특수 하드 링크 "."의 링크를 해제(삭제)하는 방법은 무엇입니까?

폴더에 대해 생성된 특수 하드 링크 "."의 링크를 해제(삭제)하는 방법은 무엇입니까?

Linux에서는 폴더를 생성하면 자동으로 두 개의 폴더가 생성됩니다.하드 링크해당 inode에. 하나는 생성을 요청한 폴더이고 다른 하나는 .이 폴더를 위한 특수 폴더입니다.

예:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

보시다시피 내부적으로 folder및 둘 다 동일한 inode 번호를 갖습니다( 옵션과 함께 표시됨)..folder-i

.이 특정 하드 링크를 제거하는 방법이 있습니까 ?

이것은 단지 실험과 호기심을 위한 것입니다. ..또한 대답은 특수 파일에도 적용되는 것 같습니다 .

나는 사람을 조사해 보았지만 rm어떤 방법도 찾을 수 없었습니다. 모든 것을 삭제하려고 하면 .다음과 같은 결과가 나타납니다.

RM: "." 및 ".."은(는) 삭제할 수 없습니다.

나는 이러한 것들이 작동하는 전체 방식에 대해 정말로 궁금합니다. 따라서 이 주제에 대해 너무 장황하게 설명하는 것을 자제하지 마십시오.

.편집: 내 게시물이 확실하지 않을 수도 있지만 파일을 담당하는 기본 메커니즘과 해당 파일을 삭제할 수 없는 이유를 이해하고 싶습니다 .

POSIX 표준은 2개 미만의 폴더에 대한 하드 링크를 허용하지 않는다는 것을 알고 있지만 그 이유를 이해하지 못합니다. 이것이 가능한지 알고 싶습니다.

답변1

.기술적으로 는 적어도 EXT4 파일 시스템에서는 삭제할 수 있습니다 . 에서 파일 시스템 이미지를 생성하고 test.img이를 마운트하고 test폴더를 생성한 후 다시 마운트 해제하는 경우 다음을 사용하여 편집할 수 있습니다 debugfs.

debugfs -w test.img
cd test
unlink .

debugfs불평하지 않고 .파일 시스템에서 디렉토리 항목을 성실하게 삭제합니다. 놀랍게도 이 test디렉토리는 여전히 사용 가능합니다.

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

만 표시

..

그래서 .정말 사라졌어요. 하지만 cd ., 성능은 ls .여전히 pwd​​이전과 동일합니다!

사용하기 전에 이 테스트를 수행했지만 rmdir .이로 인해 디렉토리의 inode(거대한감사해요빨간 그릇~을 위한이것을 지적하다), 이는 test디렉토리 항목을 매달아두고 발생한 문제의 실제 원인입니다. 이 경우 이미지를 설치 test한 후 폴더를 사용할 수 없게 됩니다.ls

ls: cannot access '/mnt/test': Structure needs cleaning

커널 로그 표시

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

e2fsck이 경우 이미지를 실행하면 test디렉터리가 완전히 삭제됩니다(디렉토리 inode가 사라졌으므로 복구가 필요하지 않습니다).

이 모든 것은 .EXT4 파일 시스템에 특정 엔터티로 존재함을 나타냅니다. 커널의 파일 시스템 코드에서 얻은 인상은 그것이 예상 .하고 ..존재하며 존재하지 않으면 경고한다는 것입니다(참조namei.c), 그러나 unlink .다음을 기반으로 한 테스트에서는 해당 경고가 표시되지 않습니다. e2fsck누락된 디렉토리 항목이 마음에 들지 않아 .수정을 제안했습니다.

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

이렇게 하면 .디렉터리 항목이 다시 생성됩니다.

답변2

이 디렉토리 항목은 삭제할 수 없습니다. 이 .항목은 "이 디렉터리"를 의미하고 이 ..항목은 "이 디렉터리의 상위 디렉터리"를 의미합니다. 실제로는 하드 링크가 아니며 디렉토리 구조가 생성/표시되는 방식일 뿐입니다.

답변3

에서 언급했듯이Unix 6 소스 코드에 대한 Lion의 의견초기 Unix에는 파일과 디렉터리가 inode 구조로 디스크에 표시되는 디스크 파일이 있었습니다. 파일 내용이 디렉터리임을 나타내는 특별한 비트가 있습니다. 각 inode에는 자신이 속한 inode에 대한 링크가 있어 파일이 자신이 있는 디렉터리를 알 수 있습니다. 자체 디렉토리가 있는 "/" 디렉토리는 예외입니다. 콘텐츠 링크도 있습니다. 인덱스 노드에 콘텐츠가 없으면 사용 가능한 목록으로 반환될 수 있습니다. 디렉터리는 축복받은 파일일 뿐이므로 빈 디렉터리라도 가비지 수집을 방지하기 위해 콘텐츠를 포함해야 합니다. 따라서 ..는 상위 inode에 대한 inode의 링크이고, ..는 디렉토리가 여전히 사용 가능함을 나타냅니다. unlink를 호출하여 rmdir을 제거할 수 있으며, 더 이상 참조가 없으면 inode는 사용 가능 목록으로 이동됩니다.

답변4

~처럼'중복 가능성' 게시물대답은 POSIX 표준이 rmdir이 현재 디렉토리를 삭제하려고 시도하면 실패할 것이라고 지정한다는 것입니다.

무엇을 짓든 기초가 있어야 합니다. "여기"라고 말할 방법이 없으면 상대 경로를 정의하기가 어렵습니다. 그래서'. '는 '여기'로 정의됩니다.

당신은요할 수 있는"점"과 "점 점"을 삭제하십시오. 자신만의 운영 체제를 작성하되 정의하지는 마세요. Unix(및 Mac OSX 확장), Linux, 심지어 MS DOS 및 Windows도 모두 점과 점을 사용합니다.

TL;DR - "점"은 운영 체제의 정의입니다.

관련 정보