단일 디렉토리 계층구조, 디렉토리, 링크, 파일 :: YJcode

리눅스 커널은 하나의 계층적 디렉터리 구조로 시스템의 모든 파일을 관리한다. 이 계층구조의 기초에는 루트 디렉터리가 있고( / ) 모든 파일과 디렉터리는 이 루트 디렉터리 하부에 위치한다.

 

파일 시스템 내 각 파일에는 파일의 종류가 표시되어 있다. 파일 종류에는 일반파일, 디바이스, 파이프, 소켓, 심볼릭 or  하드 링크, 디렉터리 등의 파일이 있다.

 

  • 디렉터리, 링크

디렉터리는 그 안에 파일 이름과 해당 파일로의 참조로 이뤄진 표를 담고 있는 특수한 파일이다. 파일 이름과 참조가 서로 연결된 것을 링크라고 하며, 파일은 여러 링크를 가질 수 있어, 같은 디렉터리나 다른 디렉터리에 여러 이름으로 존재할 수 있다.

디렉터리에는 최소한 다음의 두 가지 엔트리가 존재한다. '.'은 해당 디렉터리 자신을 가리키는 링크이고, '..'은 계층상 바로 상위 디렉터리인 부모 디렉터리를 가리키는 링크이다. 단, 루트 디렉터리( / )에서는 자신보다 상위 디렉터리가 없기 때문에 '..' 또한 자신을 가리키는 링크로 간주된다.

 

  • 심볼릭 링크

하드 링크와 마찬가지로, 심볼릭 링크도 파일의 또 다른 이름을 제공한다. 그러나 일반 링크가 디렉토리 목록 안의 파일 이름-포인터 엔트리임에 비해, 심볼릭 링크는 다른 파일 이름을 담고 있는 특별히 표시된 파일이다.(즉 심볼릭 링크는 디렉터리에 파일 이름-포인터 엔트리로 존재하고, 해당 포인터가 가리키는 파일에 다른 파일의 이름이 문자열로 들어 있다.) 심볼릭 링크가 가리키는 파일을 대상 파일이라고 하고, 흔히 심볼릭 링크가 대상 파일을 '가리킨다', '참조한다'라고 표현한다. 시스템 호출에 경로명을 적으면 대부분의 경우 커널은 자동으로 경로명 안의 각 심볼릭 링크를 역참조 한다. 즉 경로명 안의 심볼릭 링크 이름을 링크가 가리키는 파일 이름으로 교체하면서 따라간다. 이과정은 심볼릭 링크가 가리키는 대상 자체가 다른 심볼릭 링크인 경우 재귀적으로 계속 따라가게 된다.( 단 커널은 심볼릭 링크가 루프를 형성할 때는 대비해 역참조 횟수를 제한하고 있다.) 심볼릭 링크가 존재하지 않는 파일을 가리키면, 댕글링 링크라고 한다.

 

  • 파일 이름

대부분의 리눅스 파일 시스템에서 파일 이름은 최대 255자까지 가능하다. 파일 이름에는 슬래시와(/) 널 문제(\0)를 제외한 모든 문자가 포함될 수 있다. 하지만 알파벳과 숫자, '.', '_', '-'만 사용하는 것이 좋다. 이 65개의 문자 집합을 SUSv3에서는 이식성 있는 파일 이름 문자 세트라고 한다.

이식성 있는 문자 세트 외의 문자는 쉘이나 정규표현식 등에서 특별한 의미로 사용될 수 있으므로 파일 이름에는 사용하지 않는 것이 좋다. 피치 못할 사정으로 파일이름에 이러한 특수문자를 사용할 때는 해당 문자 앞에 이스케이프 문자(\)를 사용하여 이것이 단순히 문자로만 사용된다는 사실을 명시하여 주는 것이 좋다.

마찬가지로 하이픈(-)으로 시작되는 파일 이름도 피해야 한다. 그런 파일 이름은 쉘에서는 옵션으로 판단 될 수도 있기에 자칫하면 오류의 원인이 될 수 있다. 정리하자면

 

  • 파일이름은 최대 255자 까지 사용 가능하다.
  • 알파벳과 숫자, '.' , '_' , '-'만 사용한다.
  • 이외의 특수문자를 사용할 경우 특수문자 앞에 이스케이프 문자(\)를 붙여준다.
  • 파일 이름은 하이픈( - )으로 시작하지 않는다.

와 같이 볼 수 있겠다.

 

경로명은 파일 이름들이 /로 구별되어 나열된 것으로 마지막 / 이전까지를 경로명의 디렉터리 부분이라고 하고, 마지막 / 이후 부분을 베이스 부분이라고 한다. 베이스 부분은 경로명에서 존재할 수도 있지만 그렇지 않을 수도 있다.

경로명은 크게 다음의 두 가지로 나뉜다.

 

  • 절대 경로명 : /로 시작해서 루트 디렉터리를 기준으로 나타내고자 하는 파일의 위치를 표현한다. 항상 루트 디렉터리에서부터 경로를 찾아간다는 점에서 절대 경로명으로 불린다.
  • 상대 경로명 : 현재 디렉터리를 기준으로 나타내고자 하는 파일의 위치를 표현한다. 루트 디렉터리에서 경로를 찾아가지 않기 때문에 /로 시작하지 않고 ./ 혹은 ../로 시작하며 이 중./ 의 경우 생략이 가능하다.

각 프로세스에는 현재 작업 디렉터리가 있다. 이것은 프로세스의 단일 디렉토리 계층구조 내에 있는 '현 위치'이며, 해당 프로세스에서 상대 경로명을 해석할 때의 기준 디렉터리이다.

 

프로세스는 부모 프로세스로부터 현재 작업 디렉터리를 상속받는다. 로그인 쉘의 첫 작업 디렉터리는 사용자의 패스워드 엔트리에 지정된 홈 디렉토리로 설정된다. 쉘의 현재 작업 디렉토리는 cd 명령으로 바꿀 수 있다.

 

각각의 파일에는 파일의 소유자와 그룹을 정의하는 사용자 ID, 그룹 ID가 지정되어 있다. 어떠한 프로세스가 이 파일에 접근하려 할 때, 커널은 프로세스의 UID와 GID를 이 파일의 소유자인지(사용자 ID- UID가 일치하는지), 혹은 그룹의 구성원인지(그룹 ID - GID가 일치하는지), 아니면 둘 다 아니고 그 외의 프로세스인지를 확인하고 그에 따라 접근을 허용할지 여부를 결정한다. 이때, 파일에는 어디까지 파일에 대한 권한을 허용할지에 대한 3가지 접근권한 비트가 명시되어 있는데, 첫 번째는 읽기 권한, 두 번째는 쓰기 권한, 세 번째는 실행 권한에 해당한다.

 

  • 읽기 권한을 가지고 있으면 해당 파일이나 프로그램을 열람할 수 있다.
  • 쓰기 권한을 가지고 있으면 해당 파일을 갱신, 수정할 수 있다.
  • 실행 권한을 가지고 있으면 해당 스크립트나 프로그램을 실행할 수 있는 권한이다.

이 권한은 디렉터리에도 설정할 수 있는데 디렉토리는 그 성격이 조금 다르다. 읽기 권한은 디렉토리의 내용물들, 즉 파일 이름을 나열할 수 있는 권한을 말하고, 쓰기 권한은 디렉토리의 내용물을 바꿀수 있는, 디렉토리 하부에 새로운 디렉토리 혹은 파일을 추가, 제거할수 있는 권한, 실행 권한은 디렉토리 하부에 있는 파일에 접근할 수 있는 권한을 말한다.

 

즉, 특정 파일에 접근하기 위해서는 해당 파일에 대한 접근 권한도 있어야 하겠지만 파일이 해당하는 디렉토리에 대한 실행 권한 또한 가지고 있어야 한다는 것이다. 만약 둘 중 하나라도 충족하지 못한다면 파일에 접근은 커널이 차단하게 된다.

'리눅스 > 기본개념 및 용어' 카테고리의 다른 글

시그널  (0) 2019.09.23
파일 I/O 모델  (0) 2019.09.23
프로세스 간 통신과 동기화  (0) 2019.09.22
정적 라이브러리와 동적 라이브러리  (2) 2019.09.22
메모리 매핑  (0) 2019.09.22

+ Recent posts