Itmom's blog

Linux File System과 Virtual File System 본문

Development/Backend

Linux File System과 Virtual File System

Itmom 2022. 2. 26. 21:49

1. Linux File System

1) EXT

  • EXT는 Linux의 가장 대표적인 파일 시스템
  • 단점: EXT는 data modification timestamp와 inode 수정을 지원하지 않으며, linked list를 통해 free block과 inode를 추적하기 때문에 성능이 저하된다.

2) EXT2

EXT2

  • Super block은 파일시스템 구성에 대한 모든 정보를 포함
  • bitmap: inode table과 data blocks 내에서 빈 공간을 관리하기 위해 사용
  • inode table/ data blocks: inode table과 data blocks 영역은 실제 inode 정보와 파일의 data 정보가 저장

Block Group

  • 단점: 디스크에 data를 쓰는 동안 시스템 충돌이 발생하거나 전원이 끊어지면 심각한 손상을 입는다.

3) EXT3

  • directory 검색 성능을 높이기 위해 hash 기반 HTree 기술이 도입
  • journaling(저널링) - 시스템 충돌이나 정전과 같은 이벤트로 인해 발생할 수 있는 파일시스템 손상을 신속하게 복구하는 기능 도입
    • 데이터를 파일시스템의 실제 영역에 기록하기 전에 해당 정보를 log 영역에 기록

EXT3

단점: 파일시스템과 파일의 최대 크기가 작고 연속적인 데이터 블록에 대해 비효율적인 인덱싱 방식을 사용

 

4) EXT4

  • 대용량 파일시스템과 파일 크기 지원
  • Pre-allocation: 파일 생성 시 미리 일정 개수의 블록을 보장
  • Delayed allocation: free block count만 갱신하고 실제 블록 할당은 뒤로 미루는 방식 → block allocator가 블록 할당을 최적화할 수 있기 때문에 성능이 향상되고 fragmentation을 개선
  • Extent: 대용량 파일의 메타데이터를 줄이고 성능을 향상시키기 위한 기법 (lz77과 같은 기법)

EXT4

 

5) XFS

  • 고성능의 64bit 저널링 파일시스템
  • B+tree를 사용하여 우수한 I/O 확장성을 제공하고 모든 사용자 데이터 및 메타데이터를 인덱싱
  • data section, log section, real-time section 등으로 구성
  • 각 AG(Allocation Group)마다 B+tree를 이용하여 free space를 관리
  • 단점: 작은 사이즈의 파일에서는 실행이 느리며 파일시스템 축소는 불가능함

6) Btrfs

  • 유연한 inode 할당 방식을 가지고 있으므로 필요한 만큼 inode의 개수를 추가
  • Btrfs는 블록의 변경 사항을 journaling 하는 대신 새로운 위치에 기록한 다음 link를 변경 → write 도중 시스템 충돌이나 정전이 발생하더라도 기존 데이터는 손상되지 않음
  • 파일시스템 snapshot을 지원
  • extent 기반
  • 가변 블록 크기를 지원

7) ZFS

  • 정전, 시스템 충돌 등으로부터 사용자의 데이터를 보호함으로써 데이터 무결성에 중점을 두고 설계
    • SHA-256를 이용해 checksum을 만들고 이를 이용해 데이터 복구
  • 하드웨어 RAID 대신에 disk mirroring과 RAID-Z라는 기능을 제공
    • Disk mirroring: 데이터를 별도의 디스크에 복사하여 저장하는 방식으로 디스크 장애 발생 시 복사본을 이용하여 데이터를 복구
    • RAID-Z: 최소 3개 이상의 디스크로 분리하여 데이터 손상을 방지 (vdev 개념)

2. Virtual Filesystem

1) VFS란?

애플리케이션과 파일시스템 사이의 가상적인(virtual) 층으로 애플리케이션이 다양한 파일시스템에 일관된 방식으로 접근할 수 있도록 함.

 

2) VFS 객체

VFS는 다양한 파일 시스템과 데이터를 주고받기 위해 4개의 객체(super block, inode, file, dentry)를 이용

(1) Super Block

마운트 된 파일 시스템 구조에 관한 정보를 제공하며 파일시스템당 하나씩 제공

 

(2) Inode

특정 파일에 관한 메타데이터 정보를 제공하며 파일당 하나씩 제공 (EXT 파일시스템의 inode와는 다르다.)

 

(3) File

file 객체는 open 한 파일과 연관된 정보를 제공하며 해당 파일을 open 한 task 당 하나씩 주어짐.

  • 두 개 이상의 task가 하나의 파일에 접근하는 경우 inode 객체는 하나만 존재하지만, task들이 접근하는 위치(offset)와 같은 정보들은 task마다 다르게 유지되어야 함. 이때 task와 연관된 파일 정보를 담기 위해 file 객체가 사용

(4) Dentry

directory와 관련된 정보를 제공

  • dentry 객체는 일반 파일을 포함한 경로의 모든 파일에 대해 생성

Dentry

 

3) File open 시 동작

1. file descriptor 할당 : *alloc_fd()***

2. file 객체 할당 : *__alloc_file()***

3. file 객체 초기화 및 파일시스템 고유의 open 함수 호출 : *do_dentry_open()***

4. file descriptor table에 file descriptor 등록 : *fd_install()***

 

File Open

참고