본문 바로가기

운영체제

Chapter 15. File-System Internals 정리

이번 장에서는 파일 시스템의 내부 구조를 다룬다. 이전 장이 파일을 디스크 블록에 어떻게 배치할 것인지에 가까웠다면, Chapter 15는 파일 시스템이 운영체제 안에서 어떻게 연결되고, 마운트되고, 공유되며, 원격으로 접근되는지를 설명한다.

핵심은 파일 시스템을 단순한 저장 구조가 아니라 운영체제가 저장장치, 사용자, 권한, 네트워크를 연결하는 추상화 계층으로 이해하는 것이다.

1. 파일 시스템의 기본 구조

컴퓨터는 하나의 파일만 저장하지 않는다. 보통 수천 개에서 많게는 수십억 개의 파일을 저장하며, 이 파일들은 HDD, SSD, NVM, optical disk 같은 random-access storage device에 저장된다.

저장장치 구조는 보통 Disk, Partition, Volume, File system으로 나눌 수 있다. Disk는 물리 저장장치이고, Partition은 디스크를 나눈 구역이다. Volume은 파일 시스템을 담는 논리적 저장 단위이며, File system은 파일과 디렉터리를 관리하는 구조다.

하나의 시스템에는 여러 파일 시스템이 동시에 존재할 수 있다. 예를 들어 tmpfs는 메모리에 존재하는 임시 파일 시스템이고, procfs는 프로세스 정보를 파일처럼 보여주는 가상 파일 시스템이다. ufs나 zfs는 일반 목적 파일 시스템이며, objfs는 커널 객체 정보를 파일 시스템처럼 제공한다.

2. File-System Mounting

파일을 사용하기 전에 open()을 해야 하듯이, 파일 시스템도 사용하기 전에 운영체제에 연결되어야 한다. 이 과정을 mount라고 한다.

마운트는 특정 저장장치의 파일 시스템을 기존 디렉터리 트리의 한 위치에 붙이는 작업이다. 예를 들어 어떤 디스크의 파일 시스템을 /users에 마운트하면, 사용자는 /users 아래에서 해당 파일 시스템의 파일들을 일반 디렉터리처럼 접근할 수 있다.

마운트 과정은 device 이름과 mount point를 운영체제에 전달하는 것에서 시작한다. 이후 운영체제는 해당 device에 유효한 파일 시스템이 있는지 확인하고, 파일 시스템 타입을 파악한 뒤 지정한 디렉터리에 연결한다.

UNIX/Linux에서는 하나의 루트 / 아래에 여러 파일 시스템을 붙인다. macOS는 새 디스크를 발견하면 보통 /Volumes 아래 자동 마운트한다. Windows는 전통적으로 C:, D: 같은 drive letter를 사용하지만, 최신 버전에서는 디렉터리 트리 안에 마운트하는 방식도 지원한다.

3. Partitions and Booting

파티션은 크게 raw partition과 cooked partition으로 나눌 수 있다. Raw partition은 파일 시스템이 없는 파티션으로 swap, database, RAID 정보 등에 사용된다. Cooked partition은 파일 시스템이 존재하는 파티션으로 일반적인 파일 저장에 사용된다.

부팅 가능한 파티션에는 운영체제 커널과 부팅 정보가 있어야 한다. 컴퓨터가 처음 켜졌을 때는 아직 운영체제의 파일 시스템 코드가 실행 중이 아니기 때문에, boot loader는 커널을 찾을 수 있을 정도의 최소한의 파일 시스템 지식을 가지고 있어야 한다.

Boot loader는 부팅 가능한 파티션을 선택하고, 커널의 위치를 찾고, 커널을 메모리에 로드한 뒤 실행을 시작한다. Dual boot 시스템에서는 여러 운영체제 중 하나를 선택해 부팅할 수도 있다.

4. File Sharing과 접근 권한

다중 사용자 시스템에서는 파일 공유가 중요하다. 여러 사용자가 같은 파일에 접근할 수 있으므로 운영체제는 파일마다 owner, group, permission 정보를 관리해야 한다.

Owner는 파일 소유자이며 보통 권한을 변경할 수 있다. Group은 파일을 공유할 사용자 그룹이고, Permission은 읽기, 쓰기, 실행 권한을 의미한다.

UNIX에서는 파일 권한을 owner, group, others 세 범주로 나눈다. 파일 접근 요청이 들어오면 운영체제는 요청한 사용자의 UID/GID와 파일의 owner/group 정보를 비교해 접근 가능 여부를 결정한다.

주의할 점은 외장 디스크처럼 파일 시스템이 다른 컴퓨터로 이동할 수 있는 경우다. 사용자 이름이 같아 보여도 내부 UID가 다르면 운영체제는 다른 사용자로 판단할 수 있고, 이로 인해 의도치 않은 권한 문제가 생길 수 있다.

5. Virtual File System, VFS

현대 운영체제는 ext4, zfs, nfs, tmpfs처럼 여러 종류의 파일 시스템을 동시에 지원한다. 응용 프로그램이 파일 시스템 종류마다 다른 방식으로 접근해야 한다면 매우 복잡해진다.

이를 해결하기 위해 운영체제는 VFS, 즉 Virtual File System 계층을 둔다. VFS는 서로 다른 파일 시스템을 공통 인터페이스로 다룰 수 있게 해주는 추상화 계층이다.

응용 프로그램은 open(), read(), write(), close() 같은 시스템 콜을 사용한다. 이 요청은 VFS 계층을 거쳐 실제 파일 시스템 구현으로 전달된다. 덕분에 사용자는 로컬 파일, 원격 파일, 가상 파일 시스템을 거의 같은 방식으로 접근할 수 있다.

Linux VFS의 주요 객체에는 inode object, file object, superblock object, dentry object가 있다. inode object는 개별 파일을, file object는 열린 파일을, superblock object는 전체 파일 시스템을, dentry object는 디렉터리 엔트리를 표현한다.

6. Remote File Systems

Remote file system은 네트워크를 통해 다른 컴퓨터의 파일을 사용하는 방식이다. 사용자는 원격 서버에 있는 파일을 마치 로컬 파일처럼 접근할 수 있다.

대표적인 방식으로는 FTP, DFS, Web, Cloud storage가 있다. FTP는 파일을 직접 전송하는 방식이고, DFS는 원격 디렉터리를 로컬 디렉터리처럼 보이게 한다. Web은 브라우저를 통해 원격 파일에 접근하는 방식이며, Cloud storage는 클라우드 기반 파일 공유 방식이다.

원격 파일 시스템은 보통 client-server 구조를 사용한다. Server는 파일을 제공하는 컴퓨터이고, Client는 원격 파일을 사용하는 컴퓨터다.

다만 원격 파일 시스템에는 보안 문제가 있다. IP 주소 기반 인증은 spoofing에 취약하고, client와 server의 사용자 ID가 다르면 권한 판정이 틀어질 수 있다. 안전한 인증을 위해 암호화 키 기반 인증을 사용할 수 있지만, 구현과 관리가 더 복잡해진다.

7. Failure Modes

로컬 파일 시스템도 실패할 수 있지만, 원격 파일 시스템은 네트워크와 서버 상태까지 고려해야 하므로 실패 가능성이 더 많다.

로컬 파일 시스템의 실패 원인에는 디스크 고장, 메타데이터 손상, 디스크 컨트롤러 고장, 케이블 문제, 사용자 실수 등이 있다. 원격 파일 시스템에서는 여기에 네트워크 단절, 서버 crash, 클라이언트 crash, 서버 shutdown, 패킷 손실, 인증 문제 등이 추가된다.

원격 파일 시스템은 서버가 잠시 끊겼을 때 요청을 즉시 실패시킬지, 서버가 다시 돌아올 때까지 기다릴지 결정해야 한다. 이 결정은 사용자 경험과 데이터 일관성에 큰 영향을 준다.

8. Stateless와 Stateful

원격 파일 시스템에서 중요한 설계 기준 중 하나는 서버가 클라이언트 상태를 기억하는지 여부다.

Stateless 방식에서는 서버가 클라이언트 상태를 기억하지 않는다. 각 요청은 독립적으로 처리되며, 요청에 필요한 정보가 매번 함께 전달되어야 한다. 서버 crash 후 복구가 단순하다는 장점이 있지만, 요청마다 많은 정보를 포함해야 하고 보안이 약해질 수 있다. NFS version 3는 stateless 방식에 가깝다.

Stateful 방식에서는 서버가 클라이언트의 open file, mount 상태, locking 정보 등을 기억한다. 보안, 성능, 기능을 개선하기 좋고 session 관리에 유리하지만, 서버 crash 후 상태 복구가 복잡하다. NFS version 4는 stateful 성격을 강화했다.

9. Consistency Semantics

Consistency semantics는 여러 사용자가 파일을 동시에 공유할 때, 한 사용자의 변경이 다른 사용자에게 언제 보이는지를 정의하는 규칙이다.

UNIX semantics에서는 한 사용자가 열린 파일에 쓴 내용이 다른 사용자에게 즉시 보인다. 일관성은 강하지만 동시 접근이 많으면 지연이 발생할 수 있다.

Session semantics에서는 open 중인 파일에 쓴 내용이 다른 사용자에게 즉시 보이지 않고, close 이후 나중에 시작한 session에서 변경 내용을 확인할 수 있다. 성능에는 유리하지만 즉각적인 일관성은 약하다.

Immutable shared files semantics에서는 한 번 공유된 파일을 수정할 수 없다. 읽기 전용 공유에 가까운 방식이므로 분산 시스템에서 구현이 단순해진다.

10. NFS

NFS, 즉 Network File System은 대표적인 원격 파일 시스템이다. 원격 디렉터리를 로컬 디렉터리처럼 mount해서 사용할 수 있게 해준다.

NFS는 client-server 구조를 사용하며 UNIX 계열에서 널리 사용된다. TCP 또는 UDP/IP를 사용하고, RPC 기반으로 동작한다. 또한 XDR을 사용해 서로 다른 시스템 간 데이터 표현 문제를 해결한다. 한 컴퓨터가 client이면서 동시에 server가 될 수도 있다.

NFS는 mount와 실제 파일 접근을 분리한다. 먼저 mount protocol을 통해 원격 디렉터리를 마운트하고, 이후 NFS protocol을 통해 파일 작업을 수행한다.

Mount protocol에서는 클라이언트가 서버의 원격 디렉터리에 mount를 요청한다. 서버는 export list를 확인해 접근 가능한 클라이언트인지 검사하고, 허용되면 file handle을 반환한다. 이후 클라이언트는 이 file handle을 이용해 원격 파일에 접근한다.

NFS protocol은 파일 검색, 디렉터리 엔트리 읽기, 링크와 디렉터리 조작, 파일 속성 접근, 파일 읽기와 쓰기 같은 작업을 RPC로 제공한다. NFS v3에는 일반적인 의미의 open()과 close()가 없는데, 이는 서버가 stateless 방식으로 동작하기 때문이다.

11. NFS Path-Name Translation과 캐싱

NFS에서 /usr/local/dir1/file.txt 같은 경로는 한 번에 해석되는 것이 아니라 컴포넌트 단위로 해석된다. 즉 usr, local, dir1, file.txt 순서로 lookup이 일어난다.

mount point를 지나면 각 컴포넌트마다 서버에 RPC lookup 요청이 발생할 수 있다. 이 과정은 비용이 크기 때문에 클라이언트는 directory-name-lookup cache를 사용해 성능을 높인다.

NFS는 성능 향상을 위해 file-attribute cache와 file-block cache도 사용한다. 또한 read-ahead, delayed-write, attribute revalidation 같은 기법을 활용한다.

하지만 캐싱은 일관성 문제를 만들 수 있다. 예를 들어 한 클라이언트가 새 파일을 만들었더라도, 다른 클라이언트는 캐시 때문에 몇 초 동안 그 파일을 보지 못할 수 있다. 즉, NFS는 성능을 위해 캐싱을 사용하지만 UNIX semantics를 완전히 보장하지는 못한다.

마무리

Chapter 15의 핵심은 파일 시스템을 단순한 저장 구조가 아니라 운영체제 전체와 연결된 추상화 계층으로 이해하는 것이다.

파일 시스템은 디스크 위에만 존재하지 않는다. 운영체제는 VFS를 통해 서로 다른 파일 시스템을 하나의 인터페이스로 묶고, 마운트를 통해 여러 저장 공간을 하나의 디렉터리 트리 안에 통합한다. 또한 원격 파일 시스템을 통해 네트워크 너머의 파일도 로컬 파일처럼 사용할 수 있게 한다.

특히 NFS는 원격 파일 시스템이 실제로 어떻게 동작하는지 보여주는 좋은 예시다. mount protocol, file handle, RPC, caching, consistency semantics 같은 개념을 함께 이해하면 원격 파일 시스템의 장점과 한계를 더 명확히 볼 수 있다.

'운영체제' 카테고리의 다른 글

컨테이너 가상화가 무엇이고 사용하는 이유  (0) 2026.07.06