15. File-System Internals

파일 시스템의 내부 구현 상세를 알아보자.

15.1. File Systems

파일 시스템은 대개 복수의 파일을 담는다. 또한 범용 컴퓨터는 복수의 저장소 기기를 가질 수 있고 이들 또한 파티션으로 분할된다. 파티션은 볼륨을 담고 이 볼륨 각각이 파일 시스템을 담는다. 컴퓨터 시스템은 여러 파일 시스템을 여러 개 담을 수도 있다. 여기서는 범용 파일 시스템만을 알아보도록 하자.

15.2. File-System Mounting

시스템의 프로세스가 파일 시스템을 쓰려면 우선 마운트해야 한다. 파일 시스템을 마운트하기 위해서는 운영 체제가 기기의 이름과 마운트 지점 (파일 시스템이 부착될 파일 구조의 장소)을 받은 뒤 기기가 올바른 파일 시스템을 포함하고 있는지를 검증한다. 시스템은 기능의 올바른 수행을 검증할 수도 있다. 가령, 파일을 포함하고 있는 디렉토리에 마운트하는 것을 거부할 수도 있다.

15.3. Partitions and Mounting

디스크의 레이아웃은 운영 체제와 볼륨 관리 소프트웨어에 따라 많이 변화할 수 있다. 각 파티션은 파일 시스템이 있을 수도 없을 수도 있는데 적합한 파일 시스템이 없으면 원시 디스크라 한다. 파티션이 부팅 가능한 파일 시스템을 갖고 있으면 그 파티션은 부트 정보를 필요로 한다. 이 정보는 대개 부트스트랩 로더라는 연속된 블록에 저장된다. 부트로더는 특정한 운영체제를 부팅하고 있는 명령어 이상을 담을 수도 있다. 예를 들어, 많은 시스템은 한 시스템에 복수의 운영 체제를 설치할 수 있도록 이중부트될 수도 있다. 부트로더에 의해 선택된 루트 파티션은 운영 체제 커널과 가끔은 부트 시점에 마운트되는 다른 시스템 파일을 포함한다. 루트 파티션이 마운트되면 운영 체제에 따라 다른 볼륨은 부트 시점에 자동적으로 마운트되거나 이후에 수동적으로 마운트된다.

15.4. File Sharing

컴퓨터의 연산과 사용자간 협력을 위해서는 파일 공유 기능이 필수적이다. 이 장에서는 파일 공유를 알아보자.

15.4.1. Multiple Users

운영 체제가 복수의 사용자를 지원할 때에는 파일 공유, 파일 명명, 파일 보호의 이슈가 중요해진다. 파일 공유와 보호를 구현하기 위해서는 파일의 소유자(사용자)와 그 그룹의 정보를 저장할 필요가 있다. 이는 파일 특성에 저장된다. 시스템간 외부 디스크가 이동될 수 있는 경우에는 시스템 내 파일의 사용자에 부여된 ID의 일관성을 보존하기 위한 조치가 필요하다.

15.5. Virtual File Systems

운영 체제는 어떻게 여러 타입의 파일 시스템을 한 디렉토리 구조로 통합시킬까? 단순하지만 비효율적인 방법은 파일 시스템들 각각에 대해 디렉토리 쓰기와 파일 루틴을 제공하는 것이다. 그 대신에 파일 시스템을 추상화해서 그 구현을 단순화하고, 체계화하고, 모듈화할 수도 있다. 이를 위해 세부 구현을 기본 시스템 호출과 분리하기 위한 자료구조와 과정들이 필요하다. 첫 번째 층은 파일 시스템 인터페이스이고 두 번째 층은 가상 파일 시스템(VFS) 층이다. 가상 파일 시스템은 여러 파일 시스템에 대해 일반적인 동작을 수행하는 명료한 인터페이스를 제공한다. 또한, 네트워크를 통틀어 파일을 유일하게 표현할 수 있는 메커니즘(vnode 등)을 갖는다. 즉, 가상 파일 시스템은 로컬 파일을 원격 파일과 구분하고 원격 파일은 그 파일 시스템에 따라 구분된다. 가상 파일 시스템은 로컬 요청을 수행할 때는 파일 시스템별 동작을 수행하고 원격 요청을 수행할 때는 NFS 프로토콜 절차를 호출한다. 이를 위해 Linux 가상 파일 시스템은 inode 오브젝트, 파일 오브젝트, 슈퍼블록 오브젝트, 덴트리 오브젝트를 정의해 이를 활용한다. 가상 파일 시스템 소프트웨어는 이런 오브젝트를 가상화된 채 다룸으로써 오브젝트의 구체적 유형을 알 필요 없이 적절한 함수를 호출한다.

15.6. Remote File Systems

원격 컴퓨터간 통신에서 파일을 공유하려면 어떻게 할까? 첫 번째 방법은 ftp 같은 프로그램을 통해 직접 파일을 전송하는 것이다. 두 번째 방법은 원격 디렉토리가 로컬 기기에 보일 수 있게 하는 분산형 파일 시스템(DFS)을 쓰는 것이다. 세 번째 방법은 월드 와이드 웹을 쓰는 것이다. ftp는 익명 접근과 증명된 접근에 모두 쓰인다.

15.6.1. The Client-User Model

컴퓨터는 원격 파일 시스템을 이용해 하나 이상의 원격 기기로부터 하나 이상의 파일 시스템을 마운트할 수 있다. 이 때 파일을 갖고 있는 기기는 서버, 파일에 접근하려는 기기는 클라이언트로 불린다. 클라이언트를 식별하기 위해서는 네트워크명이나 IP 주소같은 식별자가 필요한데 이는 스푸핑될 수도 있기 때문에 암호화 등으로 이를 해결한다. 원격 파일 시스템이 마운트되고 나서 파일 동작 요청은 네트워크의 DFS 프로토콜을 통해 사용자로부터 서버로 전달된다.

15.6.2. Distributed Information Systems

클라이언트-서버 시스템을 더 관리하기 쉽게 하기 위해 분산 정보 시스템(분산 명명 서비스)는 원격 컴퓨팅에 필요한 정보로의 통일된 접근을 제공한다. 도메인 명명 시스템(DNS)은 전체 인터넷에 대해 호스트명을 네트워크 주소로 번역한다. 다른 분산 정보 시스템은 사용자명/비밀번호/사용자 ID/그룹 ID를 지원한다. 선 마이크로시스템은 옐로 페이지(네트워크 정보 서비스(NIS)) 등을 지원한다. 마이크로소프트는 공통 인터넷 파일 시스템(CIFS)에서 활성화 디렉토리로 사용자에 대한 단일 이름공간을 지원한다. 마이크로소프트는 케르베로스 네트워크 인증 프로토콜을 사용한다. 업계는 안전한 분산 명명 메커니즘으로 경량 디렉토리 접근 프로토콜(LDAP)을 지향하고 있다.

15.6.3. Failure Modes

로컬 파일 시스템은 여러 이유로 실패할 수 있다. 드라이브 실패, 메타데이터 손상, 장치 손상 등. 원격 파일 시스템이 실패할 수 있는 이유는 더 많다. 이런 실패로부터의 복구를 구현하기 위해, 클라이언트와 서버 모두에 상태 정보를 유지해야 한다. NFS는 상태 없는 분산형 파일 시스템을 통해 이를 구현하는데, 이는 파일 시스템이 원격 마운트되고 파일이 미리 열리기 전까지는 파일 읽기/쓰기에 대한 클라이언트 요청이 이루어지지 않는다는 것을 가정한다. 이는 구현하기 쉽지만 보안상 문제도 있다.

15.7. Consistency Semantics

여러 사용자간 파일 공유시에 파일 일관성은 어떻게 유지할까? 이를 구현하기 위한 open(), close() 동작 사이의 일련의 접근은 파일 세션을 형성한다.

15.7.1. UNIX Semantics

UNIX 파일 시스템은 다음의 일관성 방식을 사용한다: 사용자가 열린 파일에 쓰는 동작은 그 파일을 연 다른 사용자에게 즉각적으로 보일 수 있다. 사용자들은 공유 모드를 통해 파일의 현 위치에 대한 포인터를 공유한다.

15.7.2. Session Semantics

Andrew 파일 시스템은 다음의 일관성 방식을 사용한다: 사용자가 열린 파일에 쓰는 동작은 그 파일을 연 다른 사용자에게 즉각적으로 보이지는 않는다. 변경 사항들은 파일이 닫히면 변경이 이루어진 이후 시작된 세션들에 보여진다.

이런 방식들을 쓰면 파일은 동시에 여러 이미지들에 대해 연관지어질 수 있다. 이를 통해 복수의 사용자들은 그 파일에 대한 그들의 이미지에 대한 읽기, 쓰기, 접근을 동시에 수행할 수 있다.

15.7.3. Immutable-Shared-Files Semantics

특수한 접근법으로 변경 불가능한 공유 파일이 있다.

15.8. NFS

네트워크 파일 시스템은 범용적이다. 이는 LAN/WAN을 통한 원격 파일 접근을 위한 소프트웨어 시스템의 특정과 구현을 포함한다. NFS에는 여러 버전이 있다.

15.8.1. Overview

NFS는 상호 연결된 워크스테이션들을 독립된 파일 시스템을 가진 독립된 기기로 인식한다. 목표는 이 파일 시스템간 어느 정도의 공유를 투명한 방식으로 가능케 하는 것이다. 이를 위해서는 원격 디렉토리를 로컬 파일 시스템의 디렉토리에 마운트해야 한다. 네트워크 파일 시스템의 설계 목적 중 하나는 서로 다른 기기, 운영 체제, 네트워크 아키텍쳐 내의 서로 다른 환경에 대해서도 동작하는 것이다. 이는 원격 프로시져 호출을 두 인터페이스간 외부 데이터 표현 프로토콜에 얹어 이루어진다. 네트워크 파일 시스템 사양은 마운트 메커니즘에 의해 제공되는 서비스와 실제 원격 파일 접근 서비스를 구분한다. 이를 위해 마운트 프로토콜과 NFS 프로토콜이 제공된다.

15.8.2. The Mount Protocol

마운트 프로토콜은 서버와 클라이언트간 최초의 논리적 연결을 수립한다. 이는 마운트될 원격 디렉토리의 이름과 그를 저장하는 서버 기기의 이름을 포함한다. 서버는 내보내기 목록을 유지하는데 이는 마운트 시에 내보내어질 로컬 파일 시스템과 마운트되도록 허용된 기기 이름들을 특정한다. 내보내어진 파일 시스템 내 임이의 디렉토리는 허가된 기기에 의해 원격으로 마운트될 수 있다. 서버는 또한 관리의 목적으로 클라이언트 기기의 목록과 대응하는 현재 마운트된 디렉토리를 유지한다.

15.8.3. The NFS Protocol

NFS 프로토콜은 원격 파일 동작을 위한 원격 프로시져 호출들을 제공한다. 이는 디렉토리 내 파일 검색, 디렉토리 엔트리 읽기, 연결과 디렉토리 조작, 특성 접근, 파일 읽기/쓰기 등을 제공한다. 이 때 상태에 의존하지 않기 위해 파일의 열기/닫기 동작은 포함되지 않는다. 클라이언트의 목록을 유지하는 것은 서버의 상태 비의존성을 깨는 것처럼 보일 수 있지만 그렇지 않다. 서버를 상태 비의존적으로 하기 위해서는 수정된 데이터에 대해서 그 결과가 클라이언트로 반환되기 전에 서버의 디스크에 반영되어야 할 필요가 있다. 이를 위해서는 캐싱의 이점이 사라지기 때문에 성능 하락이 클 수 있는데, 저장소가 고유의 비휘발성 캐시를 운용하도록 한 뒤 디스크 컨트롤러가 이를 인식하도록 해서 보완할 수 있다. 단일 NFS 쓰기 프로시져 호출은 원자적이도록 보장되어 있으며 같은 파일에 대한 쓰기 호출과 섞이지 않는다. 하지만 NFS 프로토콜은 동시성 제어 메커니즘을 제공하지는 않는다. 따라서 NFS 외부의 서비스는 락을 제공해야 한다. NFS는 VFS를 통해 운영 체제와 연결된다. 이러한 아키텍쳐는 서버와 클라이언트를 구분짓지 않는다.

15.8.4. Path-Name Translation

NFS 내의 경로-이름 전환은 경로명을 각각의 디렉토리 엔트리로 파싱한다. 이 때 검색을 빠르게 하기 위해 클라이언트 쪽의 디렉토리명 탐색 캐시는 원격 디렉토리 명에 대한 vnode를 저장한다. NFS의 어떤 구현들은 이미 마운트된 원격 파일 시스템 위에 또 다른 원격 파일 시스템을 마운트하는 것을 허용하기도 하는데 이 때에는 경로명 탐색에 복수의 서버가 포함된다.

15.8.5. Remote Operations

파일 열기와 닫기를 제외하면 파일 연산에 대한 정식 UNIX 시스템 호출과 NFS 프로토콜 RPC에 대해서는 일대일대응이 성립한다. 하지만 NFS는 성능을 위해 버퍼링과 캐싱을 차용하는데, 이에는 파일 특성 캐시와 파일 블록 캐시가 있다. 시스템의 성능을 튜닝하는 것은 NFS의 일관성 방식을 특정하기 어렵게 한다. 그래서 NFS는 UNIX 방식이나 Andrew의 방식을 엄격히 따르지는 않는다.

15.9. Summary

  • 범용 운영 체제는 특수 파일 시스템부터 일반 파일 시스템까지 여러 파일 시스템 유형을 제공한다.
  • 파일 시스템을 포함하는 볼륨은 컴퓨터의 파일 시스템 공간에 마운트될 수 있다.
  • 운영 체제에 따라, 파일 시스템 공간은 이음새가 없거나 (즉, 마운트된 파일 시스템이 디렉토리 구조에 통합되거나) 각각이 구별되거나 (즉, 마운트된 각 파일 시스템이 고유의 설계를 갖거나) 한다.
  • 시스템이 시작하려면 최소 하나 이상의 파일 시스템이 부팅 가능해야 한다. 즉, 운영 체제를 갖고 있어야 한다. 처음에는 부트 로더가 실행되는데, 이는 파일 시스템 내 커널을 찾고 로드해 그 실행을 시작할 수 있는 간단한 프로그램이다. 시스템은 복수의 부트 가능한 파티션을 포함해 관리자가 부트 시점에 무엇을 실행할지를 선택하도록 할 수 있다.
  • 대다수의 시스템은 복수 사용자를 지원하므로 파일 공유와 파일 보호를 할 수 있는 수단을 제공해야 한다. 자주, 파일과 디렉토리는 소유자, 사용자, 그룹 접근 허가 등의 메타데이터를 포함한다.
  • 대용량 저장소 파티션은 원시 블록 입출력이나 파일 시스템에 쓰인다. 각 파일 시스템은 볼륨 내에 자리잡는데 이 볼륨은 볼륨 관리자에 의해 협업하는 하나 이상의 파티션으로 이루어질 수 있다.
  • 복수의 파일 시스템의 구현을 단순화하기 위해, 운영 체제는 계층화된 접근 방식을 쓸 수 있다. 또한 가상 파일 시스템 인터페이스를 활용해 서로 다를 수도 있는 파일 시스템들에 대한 접근을 이음새 없이 제공할 수도 있다.
  • 원격 파일 시스템은 ftp 같은 프로그램이나 WWW 내 웹 서버와 클라이언트나 클라이언트-서버 모델을 이용해 더 기능을 많이 제공하는 식으로 구현할 수 있다. 허가되지 않은 접근을 막기 위해 마운트 요청과 사용자 ID를 검증해야 한다.
  • 클라이언트-서버 기능은 그 자체로 정보를 공유하지는 않지만 DNS 같은 분산 정보 시스템은 이러한 공유나 통합된 사용자 이름공간, 비밀번호 관리, 시스템 식별 등의 기능을 제공할 수 있다. 예를 들어 마이크로소프트 CIFS는 활성 디렉토리를 사용하는데, 이는 Kerberos 네트워크 인증 프로토콜의 버전을 차용해 네트워크 내 컴퓨터간 완전한 명명과 검증 서비스를 제공한다.
  • 파일 공유가 가능해지면 일관성 방식 모델을 선택하고 구현해서 같은 파일에 대한 동시 접근을 중재해야 한다. 이러한 방식 모델에는 UNIX, 세션, 변경 불가능한 공유 파일 방식이 있다.
  • NFS는 원격 파일 시스템의 예시로 클라이언트에 디렉토리, 파일, 그리고 심지어는 전체 파일 시스템에 대한 이음새 없는 접근을 제공한다. 완전 기능의 원격 파일 시스템은 통신 프로토콜, 원격 동작, 경로명 변환 등을 제공한다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중