슬래시 (/)가 Linux 루트 디렉토리 이름의 일부입니까?


46

슬래시 ( /)가 실제로 Linux 루트 디렉토리 이름의 일부입니까? 아니면 그냥 상징입니까?

무엇에 대한 /etc등등?

최신 정보

/dev/sda2Linux 루트 디렉토리의 블록 장치를 가정하십시오 .

$ sudo debugfs / dev / sda2
debugfs 1.44.1 (2018 년 3 월 24 일)
debugfs :   암호
[pwd] INODE : 2 경로 : /
[루트] INODE : 2 경로 : /
debugfs :   stat /
Inode : 2    유형 : 디렉토리     모드 : 0755 플래그 : 0x80000
세대 : 0 버전 : 0x00000000 : 00000077
사용자 : 0 그룹 : 0 프로젝트 : 0 크기 : 4096
파일 ACL : 0
링크 : 25 블록 수 : 8
조각 : 주소 : 0 번호 : 0 크기 : 0
 ctime : 0x5b13c9f1 : 3f017990-일요일 6 월 3 15:28:57 2018
 atime : 0x5b13ca0f : 3b3ee380-일요일 6 월 3 15:29:27 2018
 mtime : 0x5b13c9f1 : 3f017990-일요일 6 월 3 15:28:57 2018
crtime : 0x5aad1843 : 00000000-토요일 3 월 17 일 16:59:39 2018
추가 inode 필드의 크기 : 32
확장 :
(0) : 9249

따라서 inode # 2라는 디렉토리가 있지만 이름은 없습니다.


1
최근 업데이트와 관련하여 일부 debugfs출력이 표시됩니다. 이것이 어떻게 질문을 바꾸는 지 명확히 할 수 있습니까?
Kusalananda

그렇지 않습니다. 방금 답변을 완료하고 싶었습니다. 그러나 나는 다른 것을 추가하고 싶지 않았습니다. 그래서 나는 그것을 업데이트했다. 답에 답을 넣으면 삭제됩니다
mlibre

답변:


61

POSIX.1-2008 표준에 따르면

단일로 구성된 경로 이름 /은 프로세스의 루트 디렉토리로 해석됩니다. 널 경로명은 성공적으로 해결되지 않습니다.

표준은 파일 이름경로 이름을 구분 합니다. /루트 디렉토리 경로의 경로 이름입니다. 디렉토리의 이름은 "루트 디렉토리"이지만 파일 시스템에는 이름이 없으며 파일 이름이 없습니다. 파일 이름이있는 경우 해당 이름은 루트 디렉토리 위의 디렉토리에있는 디렉토리 항목이며 해당 디렉토리가 없습니다.

문자 /는 경로 구분자이므로 파일 이름의 일부가 될 수 없습니다.

명확성을 기하기 위해 : /는 루트 디렉토리 의 이름 이 아니라 그 경로 에 대한 경로 이름 입니다.

/etc다른 경로 이름입니다. etc디렉토리 의 절대 경로 이름입니다 . 해당 경로의 디렉토리 이름은 etc(파일 이름은 etc)입니다.

/usr/local/bin/curl의 경로 이름입니다 curl같은 방법으로 실행 파일 /etc의 경로 이름입니다 etc디렉토리.


"파일 이름이 있으면 그 이름은 루트 디렉토리 위의 디렉토리에있는 디렉토리 항목이됩니다."기술적으로 inode 번호와 이름 (우리가 알고있는 inode 2)의 두 가지가됩니다. 또한 /..다시 지적하고 /, /그 자체를위한 디렉토리 엔트리를 가지고 있다는 점 에 주목하는 것도 흥미 롭다 /.. 세 가지 모두 동일한 inode를 가리키고 있습니다
-2

@SergiyKolodyazhnyy 기술적 으로 루트 디렉토리는 "프로세스 당"이며 chroot 환경에서 중요합니다. chroot에서 루트 디렉토리의 inode 번호는 특정 번호가 아닙니다 (chroot 루트의 inode 번호 임). 또한, 루트 2가 아닌 상황에서 2 번은 사용 된 파일 시스템에 달려 있다고 생각합니다.
Kusalananda

또한 /프로세스 당 루트로 정의되었지만 inode chroot가 반드시 2 일 필요 는 없다는 것을 알지 못했습니다 . 매우 흥미로운 사실. 또한 /특권 커널 프로세스 의 디렉토리 가 무엇인지에 대한 의문을 제기 합니다. 이는 사용자 공간 프로세스 만 관련되어 있음을 의미합니까 /?
Sergiy Kolodyazhnyy

37

슬래시는 구분 기호입니다 . 디렉토리 이름 에는 구분 기호가 포함되지 않지만 전체 경로 이름 에는 구분 기호가 포함됩니다.

따라서 "루트 수준" / 에는 이름 이 없습니다 . 대부분의 유닉스 계열 시스템이이 같은 특별한 경우로 취급에 ...(물론 루트 레벨에서 둘 사이에 차이가 없지만).

명명법이 다를 수 있습니다. 예를 들어 POSIX.1-2017에는 일반적으로 사용되는 몇 가지 정의가 나열되어 있습니다 .

  • 3.2 절대 경로명

    하나 또는 두 개 이상의 <slash>문자로 시작하는 경로 이름 . Pathname 도 참조하십시오 .

  • 경로명

    파일을 식별하는 데 사용되는 문자열입니다. POSIX.1-2008의 컨텍스트에서 경로 이름은 종료 널 바이트를 포함하여 {PATH_MAX} 바이트로 제한 될 수 있습니다. 선택적인 시작 <slash>문자와 <slash>문자로 구분 된 0 개 이상의 파일 이름이 있습니다. 경로 이름은 선택적으로 하나 이상의 후행 <slash>문자를 포함 할 수 있습니다 . 연속 된 여러 <slash>문자는 <slash>정확히 두 개의 선행 <slash>문자를 제외하고는 하나와 동일한 것으로 간주됩니다 .

    참고 : 경로 이름이 이식 가능한 파일 이름 문자 세트 ( 휴대용 파일 이름 문자 세트 참조 )의 <slash>문자, 문자 및 단일 종료 문자에 해당하는 바이트만으로 구성된 경우<NUL>문자, 경로 이름은 지원되는 모든 로케일에서 문자열로 사용할 수 있습니다. 그렇지 않으면 경로 이름은 문자열이 아닌 문자열 일 수 있습니다. 또한 <slash>문자 의 단일 바이트 인코딩은 모든 로케일에서 동일해야하고 멀티 바이트 문자 내에서 발생하지 않아야 <slash>하므로 경로 이름이 문자가 아닌 경우에도 경로 이름 내의 문자에 대한 참조 가 잘 정의됩니다. 끈. 그러나이 특성은 이식 가능한 파일 이름 문자 세트 내의 나머지 문자를 반드시 보유 할 필요는 없습니다.

  • 경로 이름 구성 요소

    Filename의 Filename을 참조하십시오 .

  • 3.170 파일 이름

    {NAME_MAX}파일 이름을 지정하는 데 사용되는 1-바이트로 구성된 일련의 바이트 . 이름을 구성하는 바이트는 <NUL>또는 <slash>문자를 포함하지 않아야한다 . 경로명의 맥락에서 각 파일 이름 뒤에는 a <slash>또는 <NUL>문자 가 와야한다 . 다른 곳에서 파일 이름 뒤에 <NUL>문자가 오는 경우 문자열이되지만 반드시 문자열은 아닙니다. 파일 이름은 점으로 표시 되며 dot-dot특별한 의미가 있습니다. 파일 이름은 "경로 이름 구성 요소"라고도합니다. Pathname 도 참조하십시오 .

따라서 ... 설명을 찾고 있다면 이것이 첫 번째 중지가 아닐 수도 있습니다. 이 UNIX 개념 페이지 와 같은 학습서 가 유용합니다. 예를 들어 "전체 경로 이름"이 "절대"경로 이름 "과 동의어임을 나타냅니다.


3
Nitpick : 도트와 도트는 경로 이름이 아닌 파일 이름입니다. 사실, POSIX 표준은 호기심 배합있다 "루트 디렉토리에, 특별한 경우로를 점 점은 루트 디렉토리 자체를 참조하십시오." (내 강조).
Kusalananda

따라서 문자로 사양을 읽는 /것은 유효한 파일 이름 또는 경로 이름 구성 요소가 아니며 그러한 구성 요소를 포함하는 문자열은 아니지만 여전히 특정 디렉토리에 대해 완전히 유효한 경로 이름입니다. 이것이 필요한 부분은 "이름"을 언급하지 않지만 존재해야합니다. 어떻게 든, 나는 이것이 약간 재미 있다는 것을 알았습니다.
ilkkachu

POSIX 에서 대답합니다 : 선택적인 시작 문자가 있고 문자로 구분 된 0 개 이상의 파일 이름이 있습니다.
토마스 디키

@Kusalananda는 귀하의 강조에 대한 사양 이론적 근거를 검토합니다. 사양을 정의의 구현 테스트에 관해서 보증인의 명확한 진술이다. 경우 사용, 스펙 보증한다는 정의 된 행동의 부착 신진. 즉, 모든 구현은 에 의존 ../연결 /.
mikeserv

19

유닉스에서 파일 (그리고 디렉토리는 파일 일뿐)에는 "이름"이 없습니다. 링크 에는 이름이 있으며 링크는 이름을 파일에 매핑하는 디렉토리의 항목입니다.

당신은 수있는 링크가 있다고 말할 파일에 이름을하지만, 참고 : 더 이상의 링크를 가질 수 있기 때문에이이 파일은 두 개 이상의 이름을 가질 수 있음을 의미한다.

루트 디렉토리는 루트 디렉토리이기 때문에 링크가있을 수있는 "상위"디렉토리가 없으므로 연관된 이름이있을 수 없습니다. 이론적으로 다른 디렉토리 내의 루트 디렉토리에 링크를 추가하는 것이 가능하지만 대부분의 Unices는 기존 디렉토리에 링크를 추가하는 것을 금지합니다. 파일 시스템 계층 구조 (실제 방향 그래프 임)에서주기를 감지하고주기를 감지 할 수 있기 때문입니다. 그래프에서 값이 비싸지 만이를 감지하지 못하면 커널 내에서 이름을 확인하려고 할 때 무한 재귀로 이어질 수 있습니다.

따라서 기본적으로 루트 디렉토리에는 이름을 기록 할 수있는 디렉토리가 없기 때문에 이름이 없습니다.

다른 답변에서 지적했듯이 이름과 경로 (이름)를 구별해야합니다. 루트 디렉토리 path (name)을 통해 참조 할 수 있습니다 /.


예, 파일은 사람과 마찬가지로 하나 이상의 이름을 가질 수 있습니다. 내 어린 딸의 남편은 보통 중간 이름을 사용하지만 분명히 그의 이름에도 대답해야합니다. 루트 디렉토리의 기본 이름은 "/"이며 "슬래시"로 발음됩니다. 절대 경로 이름이 "/"이므로 상대 경로 이름을 기반으로하는 이름은 특별히 도움이되지 않습니다. ( "루트"라고 부르면 항상 "슬래시 루트"라고해야하는 "/ 루트"와 혼동 될 위험이 있습니다.
Monty Harder

1
그 이름을 기록 할 상위 디렉토리가 없기 때문에 이름이 없다는 점이 마음에 듭니다. 그것은 개념을 잘 설명해줍니다.
Joe

7

"name"이라는 단어의 사용은 약간 유연합니다. "정규화 된 경로 이름"을 참조 할 수 있습니다. "디렉토리 항목"을 참조 할 수 있습니다. 다양한 기능이나 루틴에 전달 된 "파일 이름"을 참조 할 수 있습니다.

따라서, 예를 들어, /etc/foo/var/tmp/../../etc/foo/tmp/../../../../../../foo같은 파일을 참조하는 모든 방법을이다; 디렉토리에 있을 때와 같이 모두 유효한 names 입니다.foo/etc

다시 기본으로 돌아가 봅시다.

유닉스 파일 이름 은 디렉토리 구분 기호로 구분 된 구성 요소로 구성 됩니다 /. 구성 요소에 대한 유일한 제한은 구성 요소가 /NUL 문자를 포함 할 수 없다는 것입니다 . 다른 것은 허용됩니다.

따라서 "정규화 된 경로 이름"은 /etc전체 문자열 /etc입니다. 이는 etc루트 디렉토리에 컴포넌트 가 있음을 의미합니다 .

마찬가지로 디렉토리에 구성 요소 /x/y/z/foo가 있습니다 .foo/x/y/z

이제 루트 디렉토리는 상위 디렉토리에 구성 요소가 없다는 점에서 고유합니다. 그것은 오직 그 이름과 전체 경로가 있습니다 /.

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