[Linux Kernel] File System of Linux

whatSup CheatSheet·2022년 10월 16일
0

Linux Kernel

목록 보기
6/7
post-thumbnail

이제 본격적으로 Linux의 File System에 대해 알아보자.

Virtual File System(VFS)

유닉스 파일 시스템에는 다음과 같이 4가지로 구성되어 있다고 배웠다.

  • Boot Block : 파일시스템에 UNIX 커널을 적재시키기 위해 부팅 시 필요한 코드를 저장하고 있는 영역
  • Super Block : 파일시스템에 있는 총 블록의 수, 블록 크기, 비어 있는 블록을 가리키는 포인터 등에 대한 정보(전체 파일시스템에 관한 메타데이터)를 가지고 있다.
  • i-node Block : 각 파일에 대한 대부분의 정보를 가지고 있는 레코드(각 파일에 관한 메타데이터)
  • Data Block : 실제 데이터가 저장되는 공간

이러한 파일시스템은 각 회사마다 다르기 때문에, 다른 회사의 파일시스템끼리는 호환성이 없다. 즉, 옛날 유닉스 환경에서는 오로지 유닉스 파일시스템만 마운트가 가능했었다.

하지만 리눅스는 다르다. 리눅스는 다른 종류의 파일시스템도 마운트가 가능하다. 이렇게 각기 다른 파일 시스템을 서포팅하기 위한 시스템이 바로 VFS Layer이다.

  • 리눅스에서는 어떤 파일시스템이 사용되든 간에 VFS Layer를 통하게 되어있다.
  • VFS란, 파일시스템 인터페이스를 유저 공간 프로그램에 제공하기 위해 구현된 커널의 서브 시스템(표준 인터페이스)이라고 볼 수 있다.
  • VFS에서는 서로 다른 디바이스의 서로 다른 파일 시스템에 대해 읽고 쓰는 작업을 하기 위해 표준 시스템 콜을 사용할 수 있게 해준다.
    • standard operation : read(), write(), open(), …
    • standard data structure : superblock, i-node, …
  • VFS추상화 계층이므로, 실제 구현은 Actual physical File System Layer에서 진행한다. 여기에는 각 파일시스템(Ext2, Solaris, Windows, …)에 따라 각기 다른 구현 로직이 들어있다.

VFS Standard Objects

리눅스는 파일시스템이 어떤 회사의 것이든 상관없이 다음 4가지의 Objects들을 정의한다.

  1. superblock object : 파일 시스템 전체에 대한 structure (file system control block)
  2. inode object : 각 파일에 대한 structure (file control block)
  3. file object : 실제 데이터 (offset and interaction between [open_file - precess])
  4. dentry object : path_name에 매핑된 i-node 정보가 담김 (pathname → inode)

1 ~ 3은 유닉스 파일시스템에서 배웠으니, dentry object에 대해서만 배워보도록 하자.

dentry object

  • (위 그림) 현재 /a/b/c/d/e를 읽으려고 한다.
  • 그럼 디스크에서 루트부터 시작해서 루트 inode를 가져오고, inode의 data block을 보고, 또 a inode를 가져오고, …. 를 반복하여 결국 e에 대한 inode를 얻게 된다.
    • 이러한 과정을 Path Components라고 한다.
  • 이러한 과정(반복)은 많은 오버헤드(수 많은 disk I/O)를 발생시켰기 때문에 엔지니어들은 이러한 단점을 해결해야 했다.
    • 예를 들어, 상위 루트로부터 path component를 하게 되면(그림에서 2번) ,
    • 이전에 / → /a → /ab → /abc라는 path conponent 작업을 했음에도, 다음 /a/b/c/d로 접근하기 위해서 또 / → /a → /a/b → /a/b/c → /a/b/c/d의 inode에 접근하는 과정을 반복해야한다.
  • 따라서 dentry structure가 등장하게 된다.

dentry structure는 쉽게 말하면, 효율을 위해 Dentry Cache를 저장하는 것이다.

  • dcache(Dentry Cache)는 directory-entry (= dentry)의 cache를 말하는 것이다.
    • (dentry는 기본적으로 디렉터리 내의 요소들, 즉 파일 (및 하위 디렉터리의) 이름을 나타내는 것임)
    • 이름 외의 파일에 대한 정보는 inode 상에 저장된다. 물론 dentry에는 주어진 이름을 통해 해당하는 inode를 알아낼 수 있도록 inode 번호를 함께 저장한다.
    • 이러한 것은 기본적으로 파일 시스템 상의 디스크 블록에 저장되어 있게 되지만, 성능 향상을 위해 이를 메모리에 저장해 두는 것이 바로 dcache가 된다.
  • dcache는 부모 dentry와 파일 이름을 키로 하는 hash table로 구현되어 있다.
  • 시스템의 가용 메모리 크기에 따라 동적으로 크기를 조정하기 위해 LRU 리스트를 별도로 유지한다.
  • 예를 들어, /a/b/c/d를 접근하는 과정을 했다고 가정한다면, 다음 그림과 같이 5개의 dentries가 만들어지는 것이고, 이후 /a/b/c에 접근 할 때에는 해당 dentry를 이용하여 빠르게 접근할 수 있게 되는 것이다.

/proc file system

이번에는 VFS 하위에 존재하는 proc라는 파일 시스템에 대하여 설명한다.

  • /proc 파일 시스템은 소프트웨어적으로 생성되는 dynamic한 (특별한) 파일시스템이다.
  • 즉, 일종의 가상 파일 시스템이다(이 파일들은 실제 물리적인 디스크에 존재하는 것이 아닌, 메모리에 저장되어 있는 것이며, 특정 커널 함수를 호출시키는 파일임)
  • proc파일 시스템은 운영체제의 각종 정보(프로세스 정보, 다른 시스템 정보, ..)를 커널모드가 아닌 유저모드에서 쉽게 접근할 수 있도록 만들어 줌으로 시스템 정보를 일반 프로그래머가 쉽게 접근 할 수 있도록 도와준다.
  • Proc의 목적은 커널 자원과 컴포넌트를 쉽게 보여주는데에 있으며, 현재 시스템에서 실행 중인 프로세스 정보도 확인 가능하다. 특히 따로 API를 호출하지 않고 시스템 정보를 가져와 읽기 쉬운 형태로 나타내어 주는 점이 특징이다(파일시스템의 오버헤드를 줄일 수도 있음)

proc 파일에는 다음과 같은 종류가 있다.

파일설명
/proc/[PID]/maps프로세스가 mapping 된 메모리 주소 공간. 모든 프로세스에는 각자 주소 공간이 있으며, 이 주소 공간은 가상 메모리 관리자(VMM)가 제공하고 관리
/proc/[PID]/cmdline프로세스 인수(argv) 전체를 포함. Command Line에서 넘어온 argumnet를 포함하여 프로세스가 질생된 방식을 정확하고 신속하게 파악하는 수단으로 사용
/proc/[PID]/coredump_filter메모리 유형의 비트마스크를 포함하며 프로세스의 어떤 메모리 세그먼트를 덤프시킬 것인지 설정
/proc/[PID]/cwd/프로세스가 사용중인 디렉토리나 파일
/proc/[PID]/environ프로세스의 현재 환경을 저장. 프로세스 map에서 가장 아랫부분, 즉 커널이 프로세스 환경 정보를 저장하는 메모리 위치를 직접 가리키는 링크
/proc/[PID]/exe실행중인 프로그램 이름
/proc/[PID]/fd/proc/[PID]/fdinfo프로세스가 사용중인 File Descriptor 링크와 정보 저장
/proc/[PID]/limits프로세스에 적용된 resource 제한 사항
/proc/[PID]/loginuid해당 프로세스를 실행하는 login UID
/proc/[PID]/mem프로세스가 사용중인 메모리 상태
/proc/uptime시스템 가동 시간에 대한 정보를 기록한다.
/proc/meminfo물리적 메모리 및 스왑 메모리 정보가 들어 있는 파일이다.
/proc/cmdline부팅 시에 실행되는 커널 관련 옵션에 대한 정보를 담고 있다.
/proc/loadavg최근 1분, 5분. 15분 동안의 평균 부하율을 기록하는 파일이다.
/proc/modules현재 모듈로 로딩된 모듈 목록, lsmod 했을때 나오는 정보
/proc/mounts마운트된 파일시스템에 대한 정보
/proc/partitions현재 시스템의 파티션 정보
/proc/statCPU, 인터럽트, 컨텍스트 스위치 등 일반적인 시스템 통계 정보

Reference

profile
AI Engineer : Lv 0

0개의 댓글