파일 시스템
물리적으로 디스크 혹은 다양한 저장장치들로 구성된 저장공간을 논리적 형태로 변환시켜 관리하며 사용자가 이를 접근하여 사용할 수 있도록 해준다.
df : 파일 시스템에 대한 디스크 사용 정보를 보여준다.
du [-s] 파일명* : 파일 혹은 디렉토리의 사용량을 보여준다. 파일을 명시하지 않으면 현재 디렉토리 내의 모든 파일들의 사용 공간을 보여준다.
파일 시스템 구조
부트 블록 : 파일 시스템 시작부에 위치하고 보통 첫 번째 섹터에 위치.
부트 스트랩 코드가 저장되는 블록
슈퍼 블록 : 전체 파일 시스템에 대한 정보를 저장 (총 블록수, 사용 가능한 i-노드 개수, 사용 가능한 블록 비트 맵, 블록의 크기, 사용 중인 블록 수, 사용 가능한 블록수 )
i-리스트 : 각 파일을 나타내는 모든 i-노드들의 리스트
한 블록은 약 40개 정도의 i-노드를 포함
데이터 블록 : 실제 파일의 내용(데이터)을 저장하기 위한 블록들
i-노드 (i-node)
하나의 파일은 하나의 i-노드를 갖는다. (리눅스에서 각 파일은 i-노드라 불리는 구조에 의해서 표현)
파일에 대한 모든 정보를 가지고 있음
- 파일 타입: 일반 파일, 디렉토리, 블록 장치, 문자 장치 등
- 파일 크기
- 사용권한
- 파일 소유자 및 그룹
- 접근 및 갱신 시간
- 데이터 블록에 대한 포인터(파일의 위치 정보) 등
데이터 블록 포인터
파일의 내용을 저장하기 위해 할당된 데이터 블록의 주소 (i-노드 내부에 위치)
하나의 i-노드 내의 블록 포인터
- 직접 블록 포인터 12개 96KB ( 8KB *12 direct pointers)
- 간접 블록 포인터 1개 16.384KB ( 8KB * 2048 indirect pointers)
- 이중 간접 블록 포인터 1개 33.554.432( 8KB * 2048 * 2048)
- 삼중 간접 블록 포인터 1개 68.719.476.736 ( 8KB * 2048 *2048 * 2048)
최대 파일의 크기 : 약 64TB
파일 입출력 구현
파일 입출력 구현을 위한 커널 내부의 파일 시스템 자료구조
파일 디스크립터 테이블 (fd 테이블) or 파일 디스크립터 배열 (fd array) : 각 프로세스마다 하나씩 존재
시스템 파일 테이블 or 열린 파일 테이블 : 시스템 레벨에서 전역적으로 하나 존재
(동적) i-노드 테이블 : 시스템 레벨에서 전역적으로 하나 존재
파일 디스크립터 테이블 (FD Table)
파일 디스크립터 배열이라고도 한다.
해당 프로세스가 open 한 파일의 디스크립터(fd) 저장 공간 시스템 파일 테이블(열린 파일 테이블)의 엔트리를 가리킨다.
파일 디스크립터 (fd)
- 파일 디스크립터 테이블의 인덱스
- 열린 파일을 나타내는 번호
- open() 함수의 반환 값으로, pathname이 변환되어 반환된 값
- 프로그래머가 해당 파일에 접근하기 위해 사용되는 값
- 프로세스 당 하나씩 갖는다.
시스템 파일 테이블 (열린 파일 테이블)
알려진 모든 파일 목록을 저장하기 위한 공간
파일을 열 때마다, 파일 테이블의 엔트리가 하나씩 생성
시스템 파일 테이블 항목
- 파일 상태 플래그 (read, write, append, sync, nonblocking 등)
- 파일의 현재 위치
- Reference counter
- 동적 i-node 테이블의 해당 엔트리를 가리킨다
동적 i-노드 테이블 (Active i-node Table)
open 된 파일들의 i-노드를 별도로 저장하기 위한 테이블
파일을 열면 파일 시스템 내에서 i-노드 내용을 가져와 메모리 상의 이 테이블 엔트리로 만든다.
i-노드
- 하드 디스크에 저장되어 있는 파일에 대한 자료구조 (디스크에 저장된 파일 정보를 저장하고 있는 형태)
- 하나의 파일에 하나의 i-노드
- 하나의 파일에 대한 정보 저장 (소유자, 크기, 파일이 위치한 장치, 파일 내용 디스크 블럭에 대한 포인터 등)
파일 상태 정보
파일 상태란 파일의 모든 정보를 말한다.
블록수, 파일 타입, 접근 권한, 링크 수, 파일 소유자의 사용자 ID, 그룹 ID, 파일 크기, 최종 수정 시간 등의 정보
ls-l 명령어가 이와 같은 파일의 상태를 보여준다.
stat 명령어
파일 하나당 하나의 i-노드가 있으며 i-노드 내에 파일에 대한 모든 상태 정보가 저장되어 있다.
stat() 함수는 i-노드에 저장되어 있는 상태 정보를 가져오는 시스템 호출이다.
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *filename, struct stat *buf);
//파일 이름으로 지정
int fstat(int fd, struct stat *buf);
//대상 파일을 fd로 지정
int lstat(const char *filename, struct stat *buf);
//기본적으로 stat()와 동일, 단 대상 파일이 심볼릭 링크일 경우 링크가 가르키는 파일이 아니라
//링크 자체에 대한 정보를 가져옴
파일의 상태 정보를 가져와서 stat 구조체 buf에 저장
파일 타입 검사 함수
파일 타입을 검사하기 위한 매크로 함수
일반 파일 : S_ISREG()
디렉토리 파일 : S_ISDIR()
문자 장치 파일 : S_ISCHR()
블록 장치 파일 : S_ISBLK()
FIFO 파일 : S_ISFIFO()
소켓 : S_ISSOCK()
심볼릭 링크 : S_SISLNK()
디렉토리
디렉토리 엔트리에는 파일 이름과 i-노드 번호가 저장되어 있음
파일 시스템 내에서 디렉토리는 일종의 파일로 다른 파일처럼 구현된다.
디렉토리도 다른 파일 처럼 하나의 i-노드로 표현되며 그 디렉토리의 내용은 디렉토리 엔트리(파일 이름, i-노드 번호)이다.
디렉토리 관련 함수
opendir()
//디렉토리 열기 함수, 성공하면 dir 구조체 포인터를 실패하면 NULL을 리턴
readdir()
//디렉토리 읽기 함수, 디렉토리 엔트리(파일)를 하나씩 읽음\
mkdir()
//새로운 디렉토리를 만는 함수, 성공하면 0, 실패하면 -1 리턴
rmdir()
//디렉토리가 비어있으면 삭제, 성공하면 0, 실패하면 -1 리턴
링크
기존 파일에 대한 또 다른 이름. 링크를 사용하면 하나의 파일에 여러 개의 이름 부여 가능
하드 링크
기존 파일에 대한 새로운 이름. 실제로 기존 파일을 대표하는 i-노드를 가리켜 구현한다.
파일 시스템의 i-노드를 가리키므로 같은 파일 시스템 내에서만 사용될 수 있다.
원본이 삭제되어도 남은 하드 링크로 접근 가능
디렉토리에 대한 하드 링크는 슈퍼 유저만 사용 가능
심볼릭 링크
다른 파일을 가리키고 있는 별도의 파일. 실제 파일의 경로명을 저장하고 있는 일종의 특수 파일이다.
이 경로명이 다른 파일에 대한 간접적인 포인터 역할을 수행함.
다른 파일 시스템에 있는 파일도 링크할 수 있다.
원본이 삭제되면 심볼릭 링크로는 접근 불가능
디렉토리에 대한 심볼릭 링크는 일반 사용자도 생성 가능
'Linux' 카테고리의 다른 글
[리눅스] 시스템 프로그래밍 - 프로세스 제어 (0) | 2022.12.05 |
---|---|
[리눅스] 시스템 프로그래밍 - 프로세스 (0) | 2022.12.02 |
[리눅스] 시스템 프로그래밍 - 파일 입출력 (0) | 2022.11.23 |
[리눅스] 유틸리티 (0) | 2022.10.17 |
[리눅스] 파일 관련 명령어 (0) | 2022.10.16 |