폴더에 대해 생성 된 특수 하드 링크“.”를 연결 해제 (제거)하는 방법은 무엇입니까?


29

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.내부 folder의 inode 번호는 동일합니다 ( -i옵션으로 표시).

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

실험과 호기심만을위한 것입니다. 또한 대답은 ..특수 파일 에도 적용될 수 있다고 생각합니다 .

나는 rm사람 을 들여다 보려고했지만 그것을 할 방법을 찾지 못했습니다. .내가 얻는 모든 것을 제거하려고하면 :

rm : "." ".."는 제거되지 않을 수 있습니다

나는 이런 것들이 작동하는 모든 방식에 대해 정말로 궁금하기 때문에 주제에 대해 장황하게 설명하지 마십시오.

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

POSIX 표준은 하드 링크가 2 개 미만인 폴더는 허용하지 않지만 실제로는 그 이유를 알지 못합니다. 어쨌든 할 수 있는지 알고 싶습니다.



@StephenKitt 내 편집 내용을 참조하십시오.
Fantattitude

1
나는 투표를 철회했다. 투표가 어떻게 진행되는지 보자 ...
Stephen Kitt

2
상대 경로에는 둘 다 필요합니다. 왜 이것들을 제거하고 싶습니까 (일반적인 호기심 이외)?
HalosGhost

@HalosGhost 저는 시스템의 한계와 이러한 방식으로 디자인 된 방법과 이유를 탐구하면서 매우 궁금합니다.
Fantattitude

답변:


46

.적어도 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 .,하지만 그건 (디렉토리의 아이 노드 삭제 거대한 덕분에 BowlOfRed을 위해 이 지적 잎,) 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>?

.디렉토리 항목 이 다시 작성 됩니다.


매우 흥미로운! 고맙습니다! 따라서 .폴더는 실제로 FS 내에 존재하며 도구는 제대로 작동 할 것으로 예상합니다.
Fantattitude

정말 당신에게 반가워요. Linux와 그 FS는 이런 종류의 정보를 스스로 찾을만큼 충분히 알지 못하므로
답장을 보내 주셔서

3
"rmdir"(실제로 inode를 제거함)을 "unlink"(디렉토리 항목 만 제거함)로 변경해보십시오. 대부분 작동하는 디렉토리를 남겨둔 것으로 보입니다 ( mount또는에 오류 없음 ls). 다른 문제가 발생하는지 보지 못했습니다.
BowlOfRed

@BowlOfRed는 정말 고마워요. 아주 좋은 지적입니다. 그래서 저는 rmdir .실제로 test이것을 파괴 디렉터리 항목으로 남겨두고 문제를 일으킬 것으로 예상했습니다. 확인하고 unlink답변을 업데이트하겠습니다!
Stephen Kitt

1
@GiacomoCatenazzi는 권한이없고 소유권이 디렉토리 항목이 아닌 inode에 저장됩니다.
Stephen Kitt

5

이 디렉토리 항목을 제거 할 방법이 없습니다. .항목 수단 "이 디렉토리"를 ..입력 수단 "이 디렉토리의 상위 디렉토리". 그들은 실제로 하드 링크가 아니며 디렉토리 구조가 생성 / 표현되는 방식입니다.


나는 그것이 하드 링크 인 것처럼 보이기 때문에 가능하다면 궁금합니다. 그들이 왜 그렇지 않다면 그들은 inode의 하드 링크 수에 합산합니까?
Fantattitude

3
> 실제로는 하드 링크가 아니며 디렉토리 구조를 생성 / 표현하는 방식입니다. 또한 복제하십시오. unix.stackexchange.com/questions/289385/…
Xalorous

@Xalorous 그리고이 특수 파일을 정확히 나타내는 것은 하드 링크가 아닌 경우 무엇입니까? 그것들은 존재하기 때문에 어딘가에 있어야합니다. 단지 ls나에게 현실적으로 보이지 않는 다른 도구 또는 자동으로 표시되는 경우는 예외 입니다.
Fantattitude

@Fantattitude는 rmdir이 PWD를 제거 할 수없는 POSIX 요구 사항을 구현하기 위해 폴더 자체를 나타내는 방식입니다.
Xalorous

1
전통적인 유닉스 파일 시스템에서는 실제 하드 링크입니다. 다른 파일 시스템의 드라이버에 의해 즉석에서 합성됩니다.
Barmar

2

유닉스 6 소스 코드에 대한 라이온스 노트에 설명 된대로초기 유닉스에는 파일과 디렉토리가 디스크에 inode 구조로 표시되는 디스크 파일이있었습니다. 파일 내용이 디렉토리임을 나타내는 특수 비트가있었습니다. 각 inode에는 소유 한 inode에 대한 링크가있어 파일이 어떤 디렉토리에 있는지 알 수 있습니다. 예외는 자신을 소유 한 '/'디렉토리입니다. 내용에 대한 링크도있었습니다. 아이 노드에 내용이 없으면 빈 목록으로 돌아갈 수 있습니다. 디렉토리는 단지 축복받은 파일이기 때문에 빈 디렉토리에도 가비지 수집을 막기 위해 내용이 있어야했습니다. 따라서 ..는 부모 inode와.에 대한 inode의 링크였습니다. 디렉토리가 여전히 사용 가능함을 나타 내기 위해있었습니다. undir을 호출하여 rmdir은을 제거 할 수 있습니다.


0

post 의 답변 '가능한 복제본'에서 알 수 있듯이 POSIX 표준은 rmdir이 현재 디렉토리를 제거하려고 시도하면 실패하도록 지정합니다.

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

또한 'dot'및 'dot dot'을 제거 할 수 있습니다 . 그들을 정의하지 않는 자신의 OS를 작성하십시오. Unix (및 확장명 Mac OSX), Linux 및 MS DOS 및 Windows는 모두 점과 점을 사용합니다.

TL; DR- 'dot'은 OS 정의에 있습니다.


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