파일시스템
파일시스템이란 운영체제가 저장매체에 파일을 읽고 쓰기 위한 자료구조 또는 알고리즘을 말한다.
0과 1의 데이터 비트로 저장 매체를 관라히기에는 오버헤드가 너무 크다는 단점때문에
- 블록 단위로 관리하는 방법 등장
- 블록마다 고유 번호를 부여해서 관리하는 방법 등장
- 일반적인 사용자가 관리하기에 어려움
- 사용자는 파일 단위로 관리
이와같은 해결 방법들이 등장했다.
다음과 같은 고민들로 저장매체에 효율적으로 파일을 저장하는 방법에 대해서
- 가능한 연속적인 공간에 파일을 저장
- 외부 단편화, 파일 사이즈 변경 문제로 불연속 공간에 파일 저장 기능 지원 필요
- 블록 체인: 블록을 링크드 리스토로 연결한 구조
- 끝에 있는 블록을 찾으려면 첫 블록부터 주소를 조회해야 함
- 인덱스 블록 기법: 각 블록에 대한 위치 정보를 기록해서, 한번에 끝 블록을 조회
이와 같이 고민하기 시작했다.
우리가 운영체제를 사용하면서 일반적으로 볼 수 있는 파일 시스템 구조는 다음과 같다.
- Windows: FAT, FAT32, NFTS
- 리눅스(UNIX):ext2, ext3, ext4
파일 시스템과 시스템 콜
운영체제마다 동일한 시스템콜을 사용해 다양한 파일 시스템 지원이 가능하도록 구현했다.
inode 방식의 파일 시스템
inode 방식의 파일 시스템은 세 가지의 블록 타입을 가지고 있다.
- 수퍼 블록: 파일 시스템 정보/파티션 정보
- 아이노드 블록: 파일 상세 정보
- 데이터 블록: 실제 데이터
inode와 파일
파일은 indoe의 고유값과 자료구조에 의해 주요 정보를 관리하는 역할을 한다.
- '파일이름:indoe'로 파일 이름은 inode 번호와 맹칭
- 파일 시스템에서는 inode를 기반으로 파일 엑세스
- inode 기반 메타 데이터 저장
inode 구조
inode 기반 메타 데이터는 Mode(권한), Owner info(소유자), Size(파일 사이즈), Timestamps(시간관련 정보) 등이 있다.
inode 구조와 파일
- files.txt의 inode 번호 조회
- 번호에 해당하는 inode 블록에 접근
- Direct Blocks(12개의 주소 공간)를 통해 데이터를 조회
inode 구조와 파일 데이터
- Single indirect: 4KB의 특정 블록
- 1024개의 데이터(4KB)를 가지고 있는 실제 주소 => 4MB
- Double indirect: 싱글인다이렉트 포인터의 주소를 가진 블록 주소
- 1024개의 데이터 블록을 가리키는 실제 주소 => 4GB
- Triple indirect: 더블인다이렉트 포인터의 주소를 가진 블록 주소
- 1024개의 데이터 블록을 가리키는 실제 주소 => 1024 1024 1024 * 4KB
디렉토리 엔트리
- 리눅스 파일 탐색
- ex) -/home/ubuntu/link.txt
- 각 디렉토리 엔트리(dentry)를 탐색
- 각 엔트리는 해당 디렉토리 파일과 디렉토리 정보를 보유
- dentry에서 'home'을 조회 => 'home'에서 'ubuntu' 조회 => 'ubuntu'에서 link.txt 파일 이름에 해당하는 inode 취득
가상 파일 시스템
전통적인 유닉스에서는 파일 시스템 구조를 확장하여, 네트워크와 같은 다른 기기/디바이스에 파일 시스템 구조를 접목시켜 사용할 수 있도록 구조화했다.
- 유닉스
- 모든 디바이스를 파일처럼 조작할 수 있음
- 모든 것은 파일이라는 철학
- 모든 자원에 대한 추상화 인터페이스로 파일 인터페이스를 활용
이미지출처