파일
유닉스에서, 파일이란 일련의 바이트로 이뤄진 무언가이다. 즉, 커널은 파일의 내용을 신경쓰지 않는다.
사용자 관점에서, 파일은 트리 구조로 이루어진 이름 공간으로 조직화된다. 루트 /를 기반으로, /와 널문자인 \0을 제외한 일련의 아스키 문자로 파일 및 디렉토리 명이 구성된다. 같은 디렉토리에서는 이름이 서로 달라야 하지만, 다른 디렉토리에서는 같은 이름을 사용해도 된다.
유닉스에서 각 프로세스는 현재 작업 디렉토리와 연계되어 있다. 이 것은 픟로세스의 실행 컨텍스트에 속하고, 프로세스가 현재 사용하는 디렉토리를 가리키게 된다. 경로명은 슬래시 / 로 시작하면 그 경로명은 시작 지점이 루트 디렉토리기 때문에 절대 경로라 한다. 그렇지 않다면 상대 경로이다.
파일명을 지정할 때, . 이나 ..을 사용하기도 하는데, 이는 현재 디렉토리와 부모 디렉토리를 뜻한다.
하드 링크
ln f1 f2
경로명 f1이 나타내는 파일에 f2라는 경로명을 주어 새로운 하드 링크를 만든다. 하드 링크에는 두 가지 제약이 있다.
디렉토리에 대한 하드 링크를 만들 수 없다. 만약 가능할 경우, 트리 구조인 디렉토리 계층 구조를 순환 그래프로 만들어버릴 수도 있다.
링크는 동일한 파일 시스템에 들어 있는 파일 사이에만 만들 수 있다. 이는 유닉스 시스템에서 서로 다른 디스크나 다른 파티션에 위치한 여러 파일 시스템을 소유할 수 있는데, 사용자는 그들 사이의 물리적 구분이 어떻게 되어 있는지 모를 수 있기에 꽤나 문제가 있는 제약이다.
소프트 링크
소프트 링크는 위 하드 링크의 제약을 해결하기 위해 도입되었다. 소프트 링크는 심볼릭 링크라고도 한다. 이는 다른 파일의 임의 경로명을 포함하는 짧은 파일로, 경로명은 파일 시스템에 들어있는 어떠한 파일도 가리킬 수 있으며, 존재하지 않는 파일도 가리킬 수 있다.
ln -s f1 f2
이는 f2를 참조하면 자동으로 f1을 참조하도록 바뀐다.
파일 유형
유닉스 파일 유형은 다음과 같다.
정규 파일
디렉토리
심볼릭 링크
블록 장치에 해당하는 장치 파일
문자 장치에 해당하는 장치 파일
파이프와 이름이 있는(named) 파이프
소켓
장치 파일은 입출력 장치와 커널에 통합된 장치 드라이버와 관련이 있다. 프로그램이 어떤 장치 파일에 접근하면, 이는 그 파일과 연결된 입출력 장치에 직접 전달된다.
파이프와 소켓은 프로세스간 통신을 위해 사용하는 특별한 파일이다.
파일 디스크립터와 아이노드
유닉스는 파일과 파일 디스크립터를 명확하게 구별하고, 파일에는 파일의 길이나 EOF를 나타내는 구분자와 같은 제어 정보가 들어 있지 않다. 파일 시스템이 파일을 다룰 때 필요한 모든 정보는 아이노드에 있다. 각 파일은 자신 만의 아이노드를 가지고 있다. 포직스 표준에서, 아이노드는 다음과 같은 속성을 제공한다.
파일 유형
파일과 연계되어 있는 하드 링크의 수
바이트 단위로 된 파일 길이
파일을 포함하고 있는 장치의 식별자
파일 시슽엠에 들어 있는 파일을 구별할 수 있는 아이노드 번호
파일을 소유하고 있는 사용자 ID
파일의 그룹 ID
여러 시간 기록
접근 권한과 파일 모드
접근 권한과 파일 모드
- 파일을 소유한 사용자
- 소유자를 제외한 파일과 같은 그룹의 사용자
- 나머지 사용자
파일을 사용하는 사용자는 위 세 분류로 나뉜다. 사용자 별로 접근 권한, 읽기, 쓰기, 실행 권한이 주어질 수 있다. 따라서 파일과 관련된 접근 권한은 아홉 개의 서로 다른 이진 플래그의 집합이다.
이 밖에 파일 모드를 정의하는 세 가지 플래그가 있다. suid가 설정된 실행 파일을 실행하는 프로세스는 프로세스 소유자의 UID 대신 파일 소유자의 UID를 가진다. sgid 플래그가 설정된 실행 파일을 실행하는 프로세스는 프로세스 그룹 GID 대신 파일 그룹의 ID를 갖는다. sticky 플래그가 설정된 실행 파일은 실행 후 종료되,더라도 메모리에 프로그램을 유지하도록 커널에 요청하게 된다.
프로세스가 파일을 생성하면 파일의 소유자 ID는 프로세스의 UID가 된다. 파일의 소유자 그룹 ID는 부모 디렉토리의 sgid 플래그 값에 따라 이를 생성한 프로세스의 GID나 부모 디렉토리의 GID가 된다.
파일 관련 시스템 콜은 다음 포스팅에서 다루도록 하겠다.
'현생 > 리눅스 커널' 카테고리의 다른 글
유닉스 커널 개요 - 3. 메모리 관리 (0) | 2024.08.23 |
---|---|
유닉스 커널 개요 - 2. 시그널, 프로세스 간 통신, 프로세스 관리 (0) | 2024.08.22 |
유닉스 커널 개요 - 1. 커널, 프로세스와 동기화 (0) | 2024.08.21 |
파일 관련 시스템 콜 (0) | 2024.08.20 |
운영체제 기초 개념 (0) | 2024.08.18 |