파일시스템
: 보조기억장치의 정보를 파일 및 디렉터리(폴더)의 형태로 저장하고 관리할 수 있도록 하는 운영체제 내부 프로그램
- 파일시스템 덕분에 보조기억장치에 있는 수 많은 정보의 덩어리를 파일과 디렉터리의 형태로 저장하고 관리할 수 있음
- 한 운영체제 내에서도 여러 파일시스템을 사용할 수 있고, 파일시스템이 달라지면 보조기억장치의 정보를 다루는 방법도 달라지게 됨
파일과 디렉터리
파일
- 파일은 크게 파일의 이름, 파일을 실행하기 위한 정보, 파일과 관련한 부가 정보(속성)로 구성
- 부가 정보를 속성 또는 메타데이터라고 부름
- 파일 형식, 파일 위치, 파일 크기 등
📌 파일 디스크립터
- 운영체제가 파일을 관리하기 위해 파일을 식별하는 정수형 값
- 프로세스가 파일을 열 때, 운영체제는 파일 디스크립터를 프로세스에 할당
파일 디스크립터는 파일만 식별하지는 않음
파일 디스크립터는 리눅스를 포함한 여러 운영체제에서 파일만을 식별하지 않음
파일뿐만 아니라 입출력장치, IPC의 수단인 파이프, 소켓 또한(일종의 파일로 간주하여) 파일 디스크립터로 식별
디렉터리
운영체제가 여러 파일을 효율적으로 관리하기 위해 사용하는 계층적 구조(트리)의 저장 공간
📌 트리 구조 디렉터리

- 트리 구조로 계층적 관리됨
- 루트 디렉터리 (/): 최상위 디렉터리
- 서브 디렉터리: 하위 디렉터리
- 경로(Path): 특정 파일/디렉터리의 위치를 나타내는 문자열
📌 디렉터리 테이블 & 디렉터리 엔트리
- 디렉터리 테이블: 디렉터리에 속한 요소들의 위치 정보를 포함
- 디렉터리 엔트리: 각 파일의 이름과 위치 정보를 포함하는 행

파일 검색 과정:
1️⃣ /home/minchul/a.sh를 찾을 때, 운영체제는 /home 디렉터리 테이블을 먼저 확인
2️⃣ home 디렉터리에서 minchul 디렉터리의 위치를 확인
3️⃣ minchul 디렉터리 테이블에서 a.sh의 저장 위치를 찾음
➡ 디렉터리 테이블을 통해 파일 위치를 찾고 접근하는 방식

파일 할당
📌 블록(Block)
- 운영체제는 파일과 디렉터리를 "블록" 단위로 읽고 씀
- 하나의 파일은 보조기억장치에서 여러 블록을 차지할 수 있음
- 블록 크기: 보통 4KB(=4096바이트) 정도
- 각 블록은 고유한 블록 주소(Block Address)를 가짐
📌 연결 할당(Linked Allocation)
- 각 블록의 일부에 다음 블록의 주소를 저장하여 각각의 블록이 다음 블록을 가리키는 형태로 할당할 수 있음
- 이 경우 디렉터리 엔트리에는 파일 이름, 파일을 이루는 첫 번째 블록 주소와 파일을 이루는 블록 단위의 길이가 명시됨

📌 색인 할당(Indexed Allocation)
- 파일이 사용하는 모든 블록 주소를 "색인 블록(Index Block)"에 저장
- 디렉터리 엔트리는 색인 블록 주소만 저장

파일 시스템
운영체제마다 각기 다른 파일 시스템을 지원하며, 같은 운영체제라도 다른 파일 시스템을 사용하거나 하나의 컴퓨터에서 여러 파일 시스템을 사용할 수 있음
파티셔닝
한 보조기억장치에 여러 파일 시스템을 적용하여 사용하려면 보조기억장치내에 파일 시스템을 적용할 영역이 구분 되어야함
이때 보조기억장치의 영역을 구하는 작업을 파티셔닝(partitioning)이라고하며, 파티셔닝 되어 나누어진 하 나하나의 영역을 파티션(partition)이라고함. 즉, 보조기억장치는 여러 파티션으로 나눌 수 있으며, 파티션 마다 다른 파일 시스템을 사용할 수 있음
다양한 파일 시스템 중 어떤 파일 시스템을 사용할지는 보조기억장치를 포매팅할 때 결정할 수 있음
포매팅: 파일 시스템을 설정하여 어떤 방식으로 파일을 저장하고 관리할 것인지를 결정하고, 새로운 데이터를 쓸 준비를 하는 작업
📌 운영체제가 지원하는 파일 시스템 종류
- 윈도우: NT 파일시스템(NTFS), Resilient File System(ReFS) 등
- 리눅스: EXT, EXT2, EXT3, EXT4, XFS, ZFS 등
- 맥OS: APFS(Apple File System) 등
이 중 개발자가 자주 접하게 될 많은 파일시스템(EXT, EXT2, EXT3, EXT4, XFS, ZFS 등)에서는 아이노드라는 색인 블록을 기반으로 파일을 할당
아이노드에는 파일이 저장된 위치와 속성 등 사실상 (파일의 이름을 제외한)파일의 모든 것이 담겨 있음
개발 과정에서 파일과 디렉터리, 파일 시스템을 다룰 때는 아이노드라는 용어를 자주 접하게 될 것임
아이노드 기반 파일 시스템
- 파일마다 각각의 아이노드를 가지고 있음
- 각각의 번호가 부여되어 있음
- 아이노드 기반 파일 시스템을 활용하는 맥OS나 리눅스 운영체제의 경우 ls 커맨드의 i 옵션을 통해 확인
📌 실제 아이노드 기반 파일 시스템의 구성
(EXT4 파일 시스템)

- EXT4는 여러 블록의 그룹으로 이루어져 있음
- 각 블록 그룹은 대략 슈퍼 블록, 그룹 식별자, 블록 비트맵, 아이노드 비트맵, 아이노드 테이블, 데이터 블록으로 구성

📌 하드링크와 심볼릭 링크
디렉터리 A에 속한 파일 A가 있다고 가정
디렉터리 엔트리에 파일 이름(A)과 아이노드 번호가 명시되어 있다면 해당 아이노드에 접근할 수 있고, 아이노드를 통해 파일 데이터에 접근할 수 있음

하드 링크 파일은 원본 파일과 같은 아이노드를 공유하는 파일
심볼릭 링크 파일은 원본 파일을 가리키는 파일

마운트
어떤 저장장치의 파일 시스템에서 다른 저장장치의 파일 시스템으로 접근할 수 있도록 파일 시스템을 편입시키는 작업
📌 마운트 과정
1️⃣ 저장장치 연결
- USB를 꽂거나, 새로운 하드디스크/SSD를 추가함
2️⃣ 파일 시스템 확인
- 운영체제가 저장장치의 파일 시스템을 확인함 (ext4, NTFS, FAT32 등)
3️⃣ 마운트 포인트(Mount Point) 설정
- 저장장치를 어떤 디렉터리 경로로 연결할지 지정
- 예) 리눅스에서는 /mnt/usb 또는 /media/external 같은 디렉터리에 마운트
- 윈도우에서는 D:\, E:\처럼 드라이브 문자로 할당
4️⃣ 파일 시스템 접근 가능
- 마운트가 완료되면 해당 저장장치의 파일을 읽고 쓸 수 있음
참고: 북스터디 - 이것이 취업을 위한 컴퓨터 과학이다 (Chapter 3-6)