파일 시스템
👩💻 학습 목표
- 파일에 대해 이해하기.
- 디렉터리에 대해 이해하기.
- 파티셔닝과 포매팅이 무엇인지 이해하기.
- 파일 시스템의 파일 할당 방법 학습하기.
- FAT 파일 시스템과 유닉스 파일 시스템을 학습하기.
1. 파일과 디렉터리
파일과 디렉터리는 모두 운영체제 내부 파일 시스템이 관리하는 존재
파일과 디렉터리는 보조기억장치에 있는 데이터 덩어리 ➡ 어떻게 운영체제가 인식하고 관리하는 걸까?
📃 파일
파일(file)이란 하드 디스크나 SSD와 같은 보조기억장치에 저장된 관련 정보의 집합을 의미한다.
달리 표현하면 파일은 의미 있고 관련 있는 정보를 모은 논리적 단위를 의미한다.
[파일의 구성]
- 이름
- 파일을 실행하기 위한 정보
- 파일 관련 부가 정보 : 속성(attribute) or 메타데이터(metadata)
- 파일 속성 : 파일 형식, 위치, 크기 등 파일과 관련된 다양한 정보
1️⃣ 파일 속성과 유형
운영체제마다 유지하는 파일 속성은 조금씩 차이가 있지만, 대표적인 속성의 종류는 다음과 같다.
운영체제, 그중에서 파일 시스템은 파일별로 다음과 같은 속성을 유지하고 관리한다.
- 유형 : 운영체제가 인지하는 파일의 종류를 나타낸다.
- 같은 이름의 파일일지라도 텍스트 파일, 실행 파일, 음악 파일 등 유형이 다르면 실행 양상도 다름.
- 그래서 파일을 실행할때 운영체제에 파일 유형을 알려줘야 한다. ➡ 확장자(extension)을 사용.
- 크기 : 파일의 현재 크기와 허용 가능한 최대 크기를 나타낸다.
- 보호 : 어떤 사용자가 해당 파일을 읽고, 쓰고, 실행할 수 있는지를 나타낸다.
- 생성 날짜 : 파일이 생성된 날짜를 나타낸다.
- 마지막 접근 날짜 : 파일에 마지막으로 접근한 날짜를 나타낸다.
- 마지막 수정 날짜 : 파일이 마지막으로 수정된 날짜를 나타낸다.
- 생성자 : 파일을 생성한 사용자를 나타낸다.
- 소유자 : 파일을 소유한 사용자를 나타낸다.
- 위치 : 파일의 보조기억장치상의 현재 위치를 나타낸다.
📌 확장자는 파일 종류가 무엇인지 운영체제에 알려주는 힌트와도 같다.
- 실행 파일 : 없는 경우, exe, com, bin
- 목적 파일 : obj, o
- 소스 코드 파일 : c, cpp, cc, java, asm, py
- 워드 프로세서 파일 : xml, rtf, doc,docx
- 라이브러리 파일 : lib, a, so, dll
- 멀티미디어 파일 : mpeg, mov, mp3, mp4, avi
- 백업/보관 파일 : rar, zip, tar
2️⃣ 파일 연산을 위한 시스템 호출
파일을 다루는 모든 작업은 운영체제에 의해 이뤄진다.
어떤 응용 프로그램도 임의로 파일을 조작할 수 없으며, 파일을 다루러면 운영체제에 부탁해야 한다.
이를 위해 운영체제는 다음과 같은 파일을 위한 시스템 호출을 제공한다. (외울 필요는 없음)
- 파일 생성
- 파일 삭제
- 파일 열기
- 파일 닫기
- 파일 읽기
- 파일 쓰기
📂 디렉터리
파일들을 일목요연하게 관리하기 위해 디렉터리(directory)를 이용할 수 있다.
(윈도우 운영체제에서는 디렉터리를 폴더(folder)라고 부름)
옛날 운영체제에서는 하나의 디렉터리만 존재하여 모든 파일이 하나의 디렉터리 아래에 있었다.
현대는 컴퓨터 용량이 커져서 저장할 수 있는 파일이 많아지고, 1단계 디렉터리로는 많은 파일을 관리하기가 어렵기 때문에 다음과 같이 여러 계층을 가진 트리 구조 디렉터리(tree-structured directory)가 생겨났다.
- 트리 구조 디렉터리는 최상위 디렉터리가 있고 그 아래에 여러 서브 디렉터리(자식 디렉터리)가 있을 수 있다.
- 서브 디렉터리도 또 다른 서브 디렉터리를 가질 수 있다.
- 최상위 디렉터리는 흔히 루트 디렉터리(root directory)라고 부르고 슬래시(/)로 표현한다.
- 윈도우 운영체제에서는 최상위 디렉터리는 흔히 C:\로 표현한다.
- 그러다 본니 자연스레 생긴 개념이 바로 경로(path)
- 경로는 디렉터리를 이용해 파일 위치, 나아가 파일 이름을 특정 짓는 정보
1️⃣ 절대 경로와 상대 경로
디렉터리에는 동일한 이름의 파일이 존재할 수 없지만, 서로 다른 디렉터리에는 동일한 파일의 이름이 존재할 수 있다.
루트 디렉터리부터 파일까지 경로가 다르면 동일한 이름임에도 공존할 수 있다.
그래서 모든 파일은 루트 디렉터리에서 자기 자신까지 이르는 고유한 경로를 가지고 있고, 이러한 경로를 절대 경로(absolute path)라고 부른다.
- 유닉스, 리눅스, macOS 등의 운영체제에서는 슬래시 기호(/)는 루트 디렉터리를 표시할 뿐만 아니라 디렉터리와 디렉터리 사이의 구분자로도 사용.
- 디렉터리와 디렉터리 사이의 구분자로 슬래시를 사용한다면 a.sh의 절대 경로는
- /home/minchul/a.sh
- 윈도우에서는 디렉터리 구분자로 백슬래시(\)를 사용
- 윈도우 운영체제에서 a.sh의 절대 경로는 C:\home\minchul\a.sh
경로를 나타내는 또 다른 대중적인 방식으로 상대 경로(relative path)가 있다.
절대 경로가 루트 디렉터리부터 시작하는 경로라면 상대 경로는 현재 디렉터리부터 시작하는 경로.
가령 트리 구조 디렉터리 그림에서 현재 디렉터리가 경로가 /home이라면 d.jpg 파일의 상대 경로는 guest/d.jpg가 됨.
- 절대 경로 : 루트 디렉터리부터 시작하는 경로
- 상대 경로 : 현재 디렉터리부터 시작하는 경로
2️⃣ 디렉터리 연산을 위한 시스템 호출
운영체제가 파일 연산을 위한 시스템 호출을 제공하는 것처럼 운영체제는 디렉터리 연산을 위한 시스템 호출도 제공함.
대표적인 예시 (외울 필요 없음)
- 디렉터리 생성
- 디렉터리 삭제
- 디렉터리 열기
- 디렉터리 닫기
- 디렉터리 읽기
3️⃣ 디렉터리 엔트리
많은 운영체제에서는 디렉터리를 그저 '특별한 형태의 파일'로 간주한다.
즉, 디렉터리도 파일이다. 단지 포함된 정보가 조금 특별할 뿐...
파일이 내부에 해당 파일과 관련된 정보를 담고 있다면,
디렉터리는 내부에 해당 디렉터리에 담겨 있는 대상과 관련된 정보를 담고 있다.
그리고 이 정보는 보통 테이블(표) 형태로 구성된다.
즉, 디렉터리는 보조기억장치에 테이블 형태 정보로 저장된다.
각각의 엔트리(행)에 담기는 정보는 파일 시스템마다 차이가 있다.
다만 파일 시스템을 막론하고 디렉터리 엔트리가 공통으로 포함하는 정보가 있다면,
디렉터리에 포함된 대상의 이름과 그 대상이 보조기억장치 내에 저장된 위치를 유추할 수 있는 정보.
(보조기억장치 내의 파일/디렉터리 위치를 나타내는 방법에는 파일 시스템마다 차이가 있음.)
파일 시스템에 따라 디렉터리 엔트리에 다음과 같이 파일 속성을 명시하는 경우도 있음.
""home 디렉터리 테이블"" (..은 상위 디렉터리, .은 현재 디렉터리)
디렉터리 엔트리를 통해 보조기억장치에 저장된 위치를 알 수 있기 때문에 home 디렉터리에서 minchul 디렉터리가 저장된 곳을 알 수 있고 따라서 그곳으로 이동할 수도 있음.
마찬가지로 minchul 디렉터리 엔트리에는 디렉터리에 속한 파일들의 이름(a.sh, b.c, c.tar)과
이들의 위치를 알 수 있는 정보 등이 포함되어 있기 때문에
이 파일들이 보조기억장치 내에 저장된 위치를 알 수 있고 실행할 수 있다.
2. 파일 시스템
파일 시스템은 파일과 디렉터리를 보조기억장치에 일목요연하게 저장하고 접근할 수 있게 하는 운영체제 내부 프로그램.
이러한 파일 시스템에는 다양한 종류가 있고, 하나의 컴퓨터에서 여러 파일 시스템을 사용할 수 있다.
📌파일 시스템이 파일과 디렉터리를 보조기억장치에 1️⃣어떻게 할당하고 2️⃣접근하는지에 관한 이론적인 내용
이러한 이론을 기반으로 만들어진 대표적인 파일 시스템인 💻FAT 파일 시스템과 💻 유닉스 파일 시스템을 학습
2-1 파티셔닝과 포매팅
이제 막 공장에서 생산되어 한 번도 사용된 적이 없는 새 하드 디스크 또는 SSD가 있다고 가정
✏ 이 보조기억장치에 곧바로 파일을 생성하거나 저장할 수 없음
💡 보조기억장치를 사용하려면 파티션을 나누는 작업(파티셔닝)과 포맷 작업(포매팅)을 거쳐야 하기 때문.
📌 파티셔닝(partitioning)
- 저장 장치의 논리적인 영역을 구획하는 작업
- 큰 서랍에 칸막이로 영역을 나누는 작업
- 하드 디스크나 SSD처럼 용량이 큰 저장 장치를 하나 이상의 논리적인 단위로 구획하는 것
- 이렇게 파티셔닝 작업을 통해 나누어진 영역을 하나하나를 파티션(partition)이라고 함.
- 윈도우에서 '디스크 관리'를 통해 볼 수 있음
📌 포매팅(formatting)
- 저장 장치를 완전히 삭제하는 것으로 알고 있는 사람들이 많지만, 사실 이는 완벽하게 정확한 표현이라고 보기는 어려움.
- 포매팅이란 파일 시스템을 설정하여 어떤 방식으로 파일을 저장하고 관리할 것인지를 결정하고, 새로운 데이터를 쓸 준비를 하는 작업을 의미.
- 즉, 어떤 종류의 파일 시스템을 사용할지는 이때 결정남
- 포매팅의 종류는 '저수준 포매팅'과 '논리적 포매팅'이 있음
- 저수준 포매팅은 저장 장치를 생성할 당시 공장에서 수행되는 물리적인 포매팅
- 논리적 포매팅은 파일 시스템을 생성하는 포매팅 ➡ 여기서 설명하는 포매팅
가령 USB 메모리를 포매팅할 때
포매팅할 때 파일 시스템이 결정된다는 것을 알 수 있음.
파일 시스템에는 여러 종류가 있고, 파티션마다 다른 파일 시스템을 설정할 수 있음.
포매팅까지 완료하여 파일 시스템을 설정했다면,
파일과 디렉터리를 생성할 수 있음
파티셔닝과 포매팅은 동시에 진행되는 경우가 많고, 이미 포매팅까지 완료되어 판매되는 경우도 많기 때문에 개념에 익숙학지 않을 수 있지만, 저장 장치를 관리하거나 운영체제를 설치하는 과정에서 파티셔닝과 포매팅은 자주 접하게 될 키워드
2-2. 파일 할당 방법
하드 디스크의 포매팅까지 끝냈다고 가정
저장 장치에 사용할 파일을 저장
운영체제는 파일과 디렉터리를 블록(block)단위로 읽고 씀.
즉, 하나의 파일이 보조기억장치에 저장될 때는 하나 이상의 블록에 걸쳐 저장됨.
하드 디스크의 가장 작은 저장 단위는 섹터이지만,
운영체제는 하나 이상의 섹터를 블록이라는 단위로 묶은 뒤 블록 단위로 파일과 디렉터리를 관리함.
➡ 파일 시스템이 모든 섹터를 관리하기에는 개수가 너무 많고 크기도 작기 때문
이 블록에 사용하는 파일을 할당해야 함.
- 크기가 작은 파일은 적은 수의 블록에 걸쳐 저장
- 크기가 큰 파일은 여러 블록에 걸쳐 저장
이런 상황에서 보조기억장치에 할당하는 방법은 다음과 같다.
1️⃣ 연속 할당 contiguous allocation
- 가장 단순한 방식
- 이름 그대로 보조 기억장치 내 연속적인 블록에 파일을 할당하는 방식
- 연속 할당 파일에 접근
- 파일의 첫 번째 블록 주소와 블록 단위의 길이만 알면 됨.
- 연속 할당을 사용하는 파일 시스템에서는 다음과 같이 디렉터리 엔트리에 파일 이름과 더불어 첫 번째 블록 주소와 블록 단위의 길이를 명시
- 장점 : 파일을 그저 연속적으로 저장하는 방식이기에 구현이 단순
- 단점 : 외부 단편화를 야기함(프로세스를 할당하기 어려울 만큼 작은 메모리 공간들로 인해 메모리가 낭비되는 현상 - 메모리 할당에서 이야기)
- 파일 D와 F가 삭제되면 위와 같음
- 할당할 수 있는 블록은 총 11개가 남지만
- 불행히도, 크기가 블록 7개 이상을 사용하는 파일은 할당 할 수 없음
2️⃣ 연결 할당 linked allocation
- 연결 할당은 각 블록 일부에 다음 블록의 주소를 저장하여 각 블록이 다음 블록을 가리키는 형태로 할당하는 방식
- 어떤 블록의 주소를 저장한다 = 그 블록을 가리킨다
- 어떤 블록의 주소를 알면 해당 블록에 어디든지 접근할 수 있기 때문(C언어의 포인터와 같은 개념)
- 즉, 파일을 이루는 데이터를 연결 리스트로 관리함.
- 연결 할당은 불연속 할당의 일종
- 파일이 여러 블록에 흩어져 저장
- 네 개의 블록으로 구성된 a라는 파일
- 10, 5, 13, 2번 블록에 저장
- 연결 할당 방식에서는
- 10번 블록 끝에 5번 블록 주소를 기록
- 5 ➡ 13
- 13 ➡ 2
- 2 ➡ -1 (마지막 블록에는 다음 블록이 없다는 특별한 표시자로 기록(여기서는 -1))
- 연결 할당을 사용하는 파일 시스템에서는 디렉터리 엔트리에 연속 할당과 마찬가지로 파일 이름과 함께 첫 번째 블록 주소와 블록 단위의 길이를 명시
- 디렉터리 엔트리만 보아도 어떤 파일이 어디에 저장되어 있는지 알 수 있음
- *디렉터리 엔트리에 첫 번재 블록 주소와 마지막 블록 주소를 기록할 수도 있음
- 장점 : 외부 단편화 문제 해결
- 단점
- 반드시 첫 번째 블록 하나씩 차례대로 읽어야 함
- 파일 내 임의의 위치에 접근하는 속도, 즉 임의 접근(random access) 속도가 매우 느림
- i번째 블록에 접근하기 위해서는 반드시 첫 번째 블록부터 i번째 블록까지 일일이 순서대로 접근해야 함.
- 성능면에서 상당히 비효율적
- 하드웨어 고장이나 오류 발생시 해당 블록 이후 블록은 접근할 수 없음
- 하나의 블록 안에 파일 데이터와 다음 블록 주소가 모두 포함되어 있다 보니, 하드웨어 고장이나 오류로 인해 파일을 이루는 블록에 하나라도 문제가 발생하면 그 블록 이후의 블록에 접근할 수 없다는 것.
- 하드 디스크는 굉장히 정교하고 고장에 예민한 장치
- 헤드는 플래터 위에 대단히 미세한 간격으로 떨어져 있는 만큼 충격을 받으면 자칫 헤드가 플래터에 충돌하여 데이터를 손상시킬 수 있음
- 이를 변형한, FAT 파일 시스템을 사용
- 반드시 첫 번째 블록 하나씩 차례대로 읽어야 함
3️⃣ 색인 할당 indexed allocation
- 연결 할당은 블록 일부에 다음 블록 주소를 표현하는 방식
- 색인 할당은 파일의 모든 블록 주소를 색인 블록(index block)이라는 하나의 블록에 모아 관리하는 방식
- 파일 a의 색인 블록은 4번 블록이고
- 파일 a의 데이터가 7번, 13번, 11번 블록에 저장되어 있다고 가정
- 4번 블록 안에는 파일 a를 구성하는 블록들의 주소인 7, 13, 11이 적혀 있음
- 파일 a에 순차적으로 접근하고 싶다면 색인 블록에 저장된 주소에 차례대로 접근하면 됨
- 장점 : 파일 내 임의의 위치에 접근하기 쉬움(연결 할당과 다르게)
- 파일의 i번째 데이터 블록에 접근하고 싶다면, 색인 블록의 i번째 항목이 가리키는 블록에 접근하면 되기 때문
- 색인 블록 안에 파일을 구성하는 데이터 블록 주소가 있으므로 색인 블록만 알면 해당 파일 데이터에 접근할 수 있음.
- 색인 할당을 사용하는 파일 시스템에서는 디렉터리 엔트리 파일 이름과 더불어 색인 블록 주소를 명시
- 색인 할당을 기반으로 만든 파일 시스템이 유닉스 파일 시스템
2-3. 파일 시스템 살펴보기
다양한 파일 시스템이 있지만, 유명한 파일 시스템은 크게 두 가지
- FAT 파일 시스템 - USB 메모리, SD 카드 등의 저용량 저장 장치에서 사용 (연결 할당)
- 유닉스 파일 시스템 - 유닉스 계열 운영체제에서 사용 (색인 할당)
1️⃣ FAT 파일 시스템
📌 연결 할당의 단점(두 가지)를 보완한 파일 시스템이 FAT 파일 시스템
- 단점의 원인 : 블록 안에 다음 블록의 주소를 저장하였기 때문
하지만, 각 블록에 포함된 다음 블록의 주소를 한 데 모아서 테이블 형태로 관리하면 단점들을 상당 부분 해소할 수 있음
➡ 파일 할당 테이블(FAT; File Allocation Table)
- 파일의 첫 번째 블록 주소(4번 블록)만 알면 파일의 데이터가 담긴 모든 블록에 접근할 수 있음
- 디렉터리 엔트리에는 파일 이름과 더불어 파일의 첫 번째 블록 주소가 명시됨.
- 더 이상 다음 블록이 없으면, 특별한 표시자를 표기함(위 그림에서는 -1).
- 빈 공간은 아직 할당되지 않았음을 의미
이렇게 FAT을 이용하는 파일 시스템이 바로 FAT 파일 시스템
- 옛날 마이크로소프트의 운영체제인 MS-DOS에서 사용
- 최근까지 USB 메모리, SD 카드와 같은 저용량 저장 장치용 파일 시스템으로 많이 이용
- FAT 파일 시스템은 버전에 따라 FAT12, FAT16, FAT32 있음
- FAT 뒤에 오는 숫자는 블록을 표현하는 비트 수를 의미
- 윈도우에서는 '블록'이라는 용어 대신 '클러스터'라는 용어를 사용
- 즉, FAT 뒤에 오는 숫자는 클러스터를 표현하기 위한 비트
FAT 파일 시스템에서는 FAT는 파티션의 앞부분에 만들어짐
- 하드 디스크의 한 파티션을 FAT 파일 시스템으로 포맷하면 해당 파티션이 다음과 같이 구성됨
- FAT는 하드 디스크 파티션의 시작 부분에 있지만, 실행 도중 FAT가 메모리에 캐시될 수 있음
- FAT가 메모리에 적재된 채 실행되면 기존 연결 할당보다 다음 블록을 찾는 속도가 매우 빨라짐
- 결과적으로 앞서 설명한 연결 할당 방식보다 임의 접근(random access)에도 유리해짐
- 즉, FAT가 메모리에 적재된 채 실행되면 임의 접근의 성능이 개선됨
📌 FAT 파일 시스템의 디렉터리 엔트리
FAT 파일 시스템에서의 디렉터리들은 위와 같은 형식으로 블록에 저장됨
* 속성(File Attribute) 항목은 해당 파일이 읽기 전용 파일인지, 숨긴 파일인지, 시스템 파일인지, 일반 파일인지, 디렉터리 인지 등을 식별하기 위한 항목

위와 같은 디렉터리 구조를 이루는 FAT 파일 시스템에서는 /home/minchul/a.sh 파일을 읽는 과정을 살펴보자.
위 디렉터리 구조는 파티션 내에 다음 그림과 같이 저장된다고 가정

- FAT 영역 : FAT
- 루트 디렉터리 영역 : 루트 디렉터리
- 데이터 영역 : 기타 서브 디렉터리와 파일
디렉터리는 하나의 블록에 저장된다고 가정, FAT 상에서 더 이상의 블록이 없음을 표시하기 위한 표시자로 -1 사용
a.sh에 접근하려면 루트 디렉터리부터 봐야함.
1️⃣ 루트 디렉터리에서 home 디렉터리는 몇 번 블록에 있는가? 3번

2️⃣ 3번 블록을 읽어 home 디렉터리 내용을 봄. minchul 디렉터리가 몇 번 블록에 있는가? 15번

3️⃣ 15번 블록을 읽어 minchul 디렉터리 내용을 봄. 접근하려는 a.sh 파일의 첫 번째 블록 주소는? 9번

4️⃣ FAT을 보면 a.sh 파일은 9, 8, 11, 13 블록 순서로 저장되어 있다는 것을 알 수 있음. 따라서 파일 시스템은 /home/minchul/a.sh을 읽기 위해 9, 8, 11, 13번 블록에 접근한다.

2️⃣ 유닉스 파일 시스템
- 색인 할당은 색인 블록을 기반으로 파일의 데이터 블록들을 찾는 방식
- 유닉스 파일 시스템에서는 이 색인 블록을 i-node(index-node)라고 부름
- i-node에는 파일 속성 정보와 열다섯 개의 블록 주소가 저장될 수 있다.
- FAT 파일 시스템에서는 파일 속성 정보가 디렉터리 엔트리에 표현됨
- 유닉스 파일 시스템에서는 파일 속성 정보가 i-node에 표현됨.
유닉스 파일 시스템에는 파일마다 이러한 i-node가 있고, i-node마다 번호가 부여되어 있음
그리고 i-node 들은 다음과 같이 파티션 내 특정 영역에 모여 있음
- 문제점
- i-node의 크기는 유한
- i-node 하나는 기본적으로 15개의 블록 주소를 저장할 수 있음
- i-node 하나는 15개의 블록을 차지한느 파일까지 가리킬 수 있음
- 하지만 블록을 20, 30, 그 이상을 차지하는 큰 파일도 있음
- 이 경우 i-node 하나만으로는 파일의 데이터 블록을 모두 가리킬 수 없음
- 유닉스 파일 시스템은 이렇나 문제를 다음과 같이 해결함
문제점 해결 1. 블록 주소 중 12 개에는 직접 블록 주소를 저장함
- i-node가 가리킬 수 있는 15개의 블록 주소 중 처음 12 개에는 파일 데이터가 저장된 블록 주소가 직접적으로 명시됨
- 파일 데이터가 저장된 블록을 직접 블록(direct block)이라고 함.
- 즉, i-node의 12 개 주소는 직접 블록 주소를 저장함
- 이것만으로 파일 데이터 블록을 모두 가리킬 수 있으면 여기서 추가적인 작업은 필요하지 않음
문제점 해결 2. 첫째 내용으로 충분하지 않았다면, 13번재 주소에 단일 간접 블록 주소를 저장함
- i-node의 13번재 블록 주소를 이용
- 13번재 블록 주소는 단일 간접 블록의 주소를 저장
- 단일 간접 블록(single indirect block)이란, 파일 데이터가 저장된 블록이 아닌 파일 데이터를 저장한 블록 주소가 저장된 블록을 의미
문제점 해결 3. 둘째 내용으로 충분하지 않았다면 14번째 주소에 이중 간접 블록 주소를 저장함.
- 13개의 블록 주소로 파일의 모든 블록을 가리킬 수 없다면 i-node의 14번째 블록 주소를 이용
- 14번째 블록 주소는 이중 간접 블록 주소를 저장
- 이중 간접 블록(double indirect block)이란 데이터 블록 주소를 저장하는 블록 주소가 저장된 블록을 ㅡ이미.
- 단일 간접 블록들의 주소를 저장하는 블록이 이중 간접 블록
문제점 해결 4. 셋째 내용으로 충분히하지 않다면 15번째 주소에 삼중 간접 블록 주소를 저장
- 14개의 블록 주소로 파일 블록을 가리킬 수 없다면 i-node의 15번째 블록 주소 이용
- 15번째 블록 주소는 삼중 간접 블록 주소를 저장
- 삼중 간접 블록(triple indirect block)이란 이중 간접 블록 주소가 저장된 블록
- 삼중 간접 블록까지 이용하면 웬만한 크기의 파일은 모두 표현할 수 있음
i-node만 알면 파일 속성뿐만 아니라 파일 크기가 크더라도 파일 데이터를 모두 가리킬 수 있음.
i-node가 파일의 모든 것을 담고 있다고 해도 과언은 아님
그래서 유닉스 파일 시스템의 디렉터리 에늩리도 다음 그림과 같이 파일 이름과 i-node 번호로 구성됨.

위와 같은 디렉터리 구조를 이루는 유닉스 파일 시스템에서는 /home/minchul/a.sh 파일을 읽는 과정을 살펴보자.
위 디렉터리 구조는 파티션 내에 다음 그림과 같이 저장된다고 가정

파일에 접근하기 위해 파일 시스템은 우선 루트 디렉터리 위치부터 찾음
루트 디렉터리 위치는 루트 디렉터리의 i-node를 보면 알 수 있음
유닉스 파일 시스템은 루트 디렉터리의 i-node를 항상 기억하고 있음

1️⃣ 2번 i-node에 접근하여 루트 디렉터리의 위치를 파악. 루트 디렉터리는 1번 블록에 있음

2️⃣ 1번 블록을 읽으면 루트 디렉터리의 내용을 알 수 있음. 루트 디렉터리에서 home 디렉터리의 i-node는 3번 i-node임

3️⃣ 3번 i-node에 접근하여 home 디렉터리 위치를 파악해야 함. home 디렉터리는 210번 블록에 있음

4️⃣ 210번 블록을 읽으면 home 디렉터리 내용을 알 수 있음. minchul 디렉터리의 i-node는 8번

5️⃣ 8번 i-node에 접근하여 minchul 디렉터리의 위치를 파악. minchul 디렉터리는 121번 블록에 있음

6️⃣ 121번 블록을 읽으면 minchul 디렉터리의 내용을 알 수 있음. 파일 a.sh의 i-node 번호는 9번

7️⃣ 9번 i-node에 접근하여 파일 a.sh의 위치를 파악해야 함. a.sh 파일은 98번, 12번, 13번 블록에 있음

따라서 파일 시스템은 /home/minchul/a.sh를 읽기 위해 98번, 12번, 13번 블록에 접근하면 됨
파일 시스템을 아우르는 개념은 방대함(따로 전공서도 있음)
여기서 다루지 않은 파일 시스템
- NTFS(NT 파일 시스템) : 윈도우 운영체제
- ext 파일 시스템 : 리눅스 운영체제
- 등등
📌 저널링 파일 시스템
컴퓨터 강종했을때, 파일 시스템을 변경하는 도중에 이러한 상황(시스템 크래시)이 발생하면 파일 시스템이 훼손될 수 있음.
저널링 파일 시스템이 있기 전에는 이런 상황이 발생하면 부팅 직후 파일 시스템을 검사하고 복구하는 프로그램을 실행시킴.
- 유닉스, 리눅스이 fsck
- 윈도우의 scandisk
다만 이러한 프로그램들은 파일 시스템 내의 모든 블록에 대해 파일 시스템을 검사하기 때문에 시간이 매우 오래 걸림.
대용량 컴퓨터의 경우 몇 시간이 걸림
그래서 등장한 것이 저널링 기법을 이용하는 저널링 파일 시스템.
📌 저널링(journaling) 기법
작업 로그를 통해 시스템 크래시가 발생했을 때 빠르게 복구하기 위한 방법
저널링 기법을 사용하는 파일 시스템에서 파일 시스템을 변경하는 작업은 다음과 같은 순서로 수행
- 작업 직접 파티션의 로그 영역에 수행하는 작업(변경 사항)에 대한 로그를 남김
- 로그를 남긴 후 작업을 수행
- 작업이 끝났다면 로그를 삭제

이 경우 만약 작업을 하던 도중 시스템 크래시가 발생하여 다시 부팅을 해야 한다면 파일 시스템 전체를 검사할 필요 없이 로그 영역에 남긴 로그만 검사해도 됨.
즉, 저널링 파일 시스템은 시스템 크래시가 발생한 직후에 로그 영역을 읽어 크래시가 발생한 당시 어떤 작업을 실행 중이었는지 알아낸 다음 해당 작업을 완료함.
마이크로소프트의 NT 파일 시스템, 리눅스의 ext3, ext4 파일 시스템을 포함하여 현대 대부분의 파일 시스템은 이러한 저널링 기능을 지원함.
📌 마운트
유닉스, 리눅스 등의 운영체제에서 '저장 장치를 마운트한다'라는 표현을 자주 사용함.
이는 저장 장치의 파일 시스템에서 다른 저장 장치의 파일 시스템에 접근할 수 있도록 파일 시슽메을 편입시키는 작업을 의미.


USB 메모리의 파일 시스템을 컴퓨터의 /mnt 경로에 마운트하면 /mnt 경로에 USB 메모리의 파일 시스템이 당므 그림과 같이 연결됨.
즉, /mnt 경로를 통해 usb 메모리에 접근할 수 있음
- /mnt/homework/os/a.cpp 경로를 통해 a.cpp 파일에 접근할 수 있음
- /mnt/pictures/Dog.jpg 경로를 통해 Dog.jpg 파일에 접근할 수 있음

유닉스, 리눅스와 같은 운영체제에서 다양한 저장 장치를 컴퓨터에 연결할 때 mount 명령어로 빈번하게 마운트함
📌 키워드로 정리하는 핵심 포인트
- 파일은 의미 있고 관련 있는 정보를 모은 논리적인 단위.
- 운영체제는 파일의 확장자를 통해 파일의 유형을 파악할 수 있음.
- 파일의 속성에는 파일과 관련된 다양한 부가 정보들이 있음.
- 디렉터리를 이용하면 여러 개의 파일 또는 디렉터리를 묶어 관리할 수 있음.
- 경로는 디렉터리를 이용해 위치를 특정 짓는 저옵.
- 절대 경로는 루트 디렉터리부터 시작하는 경로이고, 상대 경로는 현재 디렉터리부터 시작하는 경로.
- 파티셔닝은 하드 디스크나 SSD처럼 용량이 큰 저장 장치를 하나 이상의 논리적인 여러 단위로 구획하는 작업을 의미.
- 포매팅이란 파일 시스템을 설정하여 어떤 방식으로 파일을 저장하고 관리할 것인지를 결정하고, 새로운 데이터를 쓸 수 있게 하는 작업을 의미.
- 연속 할당은 보조기억장치내 연속적인 블록에 파일을 할당하는 방식
- 연결 할당은 각 블록 일부에 다음 블록의 주소를 저장하여 블록들을 연결 리스트 형태로 관리하는 방식
- 색인 할당은 파일의 모든 블록 주소를 색인 블록에 모아 관리하는 방식
- FAT 파일 시스템은 FAT를 이용하는 연결 할당 기반의 파일 시스템
- 유닉스 파일 시스템은 i-node를 이용하는 색인 할당 기반의 파일 시스템