하드 링크 수가 0이되면 디렉토리가 제거됩니까?


10

하드 링크 수가 0이되면 디렉토리가 제거됩니까?

디렉토리는로 인해 하드 링크 수로 항상 2 이상을가집니다 .. rm -r디렉토리 일 때 하드 링크 수가 1 대신 2에서 0으로 줄어 듭니까?

디렉토리의 하드 링크 수는 1이 될 수 있습니까?

감사.

답변:


9

첫째로 모든 파일 시스템 사용 ...하드 링크로. 이것은 gnu find 매뉴얼에 설명되어 있습니다. 나는 유닉스 용으로 설계되지 않았고 명확성을 추가하지 않고 사물을 복잡하게 만들었 기 때문에 나머지 대답에 대해서는 그 파일 시스템을 무시할 것입니다. 또한 같은 이유로 루트 디렉토리와 마운트 지점을 무시할 것입니다.

.및로 인해 디렉토리에 대한 링크 수는 두 개 이상 ..입니다. 서브 디렉토리의 수는 링크 수에서 2를 뺀 것과 같습니다. 이로 인해 디렉토리를 링크하거나 링크를 해제 할 수 없으므로 디렉토리 대신 삭제 및 사용하기 전에 파일도 마찬가지 rm -r입니다 . 두 시스템 호출은 커널에서 완전히 다른 코드 경로를 사용합니다.statrmdirunlink


감사. ..하위 디렉토리가있는 경우에만 디렉토리에 하드 링크 가 있습니다. 맞습니까? 그래서 ..오른쪽 디렉토리 항상 존재하지?
Tim

..각 디렉토리에 존재 입니다 하위 디렉토리. 인을 제외한 모든 /너무 한 모든 디렉토리 있도록이있는.
폐지

1
(1) 디렉토리에 하위 디렉토리가 없으면 디렉토리에는 ..자체 하드 링크 가 없습니다. 디렉토리에 대한 하드 링크는 무엇입니까? 경로명을 가진 파일, .? (2) 왜 마운트 지점을 무시합니까?
Tim

디렉토리가 하위 디렉토리 인 경우 항목 ..은 부모를 가리 킵니다. 특별한 경우 루트 디렉토리 링크는 자신을 가리 킵니다. 이렇게하면 cd ..\..어디에서나 비슷한 명령을 예상대로 작동 할 수 있습니다. stat명령으로 테스트 할 수 있습니다 .
BillThor

1
링크 수는 2보다 작지 않은 것이 맞지만, 때문이 아닙니다 ... .부모 디렉토리의 이름과이를 가리키는 이름 때문입니다 . 부모가없는 루트는 예외입니다. 그러나 그것은 ..스스로 를 가리키고 있기 때문에, 또한 링크 수는 2입니다.
Barmar

11

참조 횟수 (예 : 하드 링크 수 열린 파일 핸들 수의 합계 )가 0에 도달 하는 기존에 디자인 된 UNIX 파일 시스템의 모든 파일 이 제거됩니다. 그러나 현대 UNIX 시스템의 경우, rmdir시스템 콜은 오히려 제거보다 한 번의 작업으로 빈 디렉토리를 제거 .하고 ..하나씩.

그러나 역사적 UNIX 시스템에서는이 시스템 호출이 존재하지 않았습니다. 대신, rmdir 명령 (A의 setuid 프로그램이었다 소스 코드는 여기에서 찾을 수 있습니다 ) 디렉토리가 (특별 항목 제외) 비어 있음을 확인하는 다음 제거 ..하고 ., 순서대로 다음 디렉토리 자체는 모든 제거 unlink디렉토리에서 루트 만 사용할 수있는 시스템 호출 (따라서 명령이 setuid 인 이유). 따라서 해당 시스템에서 디렉토리의 링크 수는 잠시 후 1 .이되고 상위 디렉토리에서 디렉토리가 제거되기 전에는 1 이됩니다.

rm명령으로 인해 루트에서도 디렉토리를 제거하지 못했습니다. 그리고 내용을 비운 후 디렉토리를 제거하라는 명령을 rm -r호출합니다 rmdir.

이러한 역사적 체제에서, 오용 unlink프로그램에서 호출, 루트로 실행하는 경쟁 조건으로 실행 rmdir하거나 mv, 또는 현재 디렉토리 (현대 시스템은이를 방지) 삭제 된 과정에서 파일을 생성하면, 파일이나 디렉토리 매달려 될 수 있습니다 하드 링크 수는 0보다 크지 만 디렉토리 트리에는 없습니다. 이 조건은에 의해 감지되었으며 대부분의 파일 시스템에서 물리적으로 가능하기 때문에 여전히 dcheck확인 중 하나입니다 fsck.


우발적으로 파일 시스템은 하드 링크가있는 일반 파일로 디렉토리 ( .및 포함 ..) 를 구현할 필요가 없습니다 . 이러한 파일 시스템에서 디렉토리의 하드 링크 수는 항상 다음과 같이보고됩니다 0(물론 상위 디렉토리 내에 존재하는 경우 "참조 수"는 1입니다).


제거 된 디렉토리의 동작 (예 : 이미 열려 있거나 현재 디렉토리로 가지고있는 프로세스에 의해 검사 될 때) 및 디렉토리의 "링크 수"의 정확한 의미는 지정되지 않습니다. 예를 들어, Mac OS X에서는 실제 하드 링크가 없어도 하드 링크 수는 2 로보고됩니다. 비록 ...목록에 표시되지 않습니다, 디렉토리를 열 수 및 stat이름으로 호출 할 수 있습니다 .또는 ... Linux의 경우, 링크 수는 있지만, 0 ...마찬가지로 여전히 작동합니다.

Mac OS X은 또한 디렉토리 의 모든 파일 수를 하위 디렉토리 수 대신 링크 수로 보고합니다 . 그러나이 경우에도 2 ...사라.


* 여기에는 일반적인 열린 설명자, 메모리 매핑 된 섹션 (예 : 바이너리 및 공유 라이브러리 실행 포함) 및 현재 디렉토리 처리가 포함됩니다.


2
strcpysetuid 실행 파일의 고정 크기 배열에 ... 이것은 좋은 시간이었습니다!
Andrea Corbellini

@AndreaCorbellini 실제로 mkdir동일한 작업을 반대로 수행해야한다는 사실 을 기반으로하여 게시 된 익스플로잇이 있습니다.
Random832

1
나는 그것을 발견했다고 생각한다 : securityfocus.com/archive/1/365038/2004-05-31/2004-06-06/0 :)
Andrea Corbellini

에 대해 묻는 rmdir다면 ..부모 디렉토리를 제거 하지 않습니까 ?
Edward Torvalds

@edwardtorvalds 아니요, ".."링크 자체가 제거되는 것이 아니라 상위 디렉토리가 아니라는 것입니다.
Random832
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.