CS Insights

운영체제의 VFS (Virtual File System) 계층화와 ext4 파일시스템의 저널링(Journaling) 기법

운영체제의 VFS (Virtual File System) 계층화와 ext4 파일시스템의 저널링(Journaling) 기법
현업에서 대규모 트래픽을 다루다 보니 결국 기본기로 돌아가게 되더군요. 교과서적인 지식에 그치지 않고 실제 운영 환경에서 느낀 점을 공유합니다. 사용자 공간의 프로그램이 텍스트 파일을 열고 쓰고 닫는 단순한 행위 이면에는 시스템 안정성과 성능을 지탱하기 위한 거대한 운영체제 서브시스템이 겹겹이 존재하고 있습니다. 다채로운 운영체제 중 특히 리눅스 커널은 여러 종류의 디스크 파티션(ext4, XFS, Btrfs)과 네트워크 공유 볼륨(NFS), 심지어 메모리로 구현된 의사 파일시스템(procfs, sysfs) 환경에서도 동일하게 open(), read(), write() 같은 POSIX 표준 시스템 콜이 에러 없이 호환 동작하도록 거대한 VFS(Virtual File System) 계층이라는 파사드(Facade) 아키텍처를 두고 있습니다. VFS는 커널 내부에서 구동되는 모든 하위 시스템이 준수해야 할 객체 지향적 구조체인 inode, dentry(디렉터리 엔트리), file, 그리고 superblock 서브 모델들을 엄격하게 규정하여 통제합니다. 덕분에 어플리케이션은 대상 매체의 블록 섹터 단위가 어떤 방식의 알고리즘으로 돌아가는지 몰라도 파일 포인터만 잡고 데이터를 자유자재로 다룰 수 있는 완벽한 투명성을 확보합니다. 이 VFS의 지붕 아래 리눅스의 영혼이라 할 수 있는 물리 디스크 구현체 ext4 파일시스템은 전통적 ext 계열의 한계를 보완하며 현대 컴퓨팅 환경에 단단히 스며들게 되었습니다. 데스크톱이나 서버에 불의의 전원 공급 차단이나 하드웨어 패닉(Kernel Oops)이 발생했을 때 데이터가 기록 중이었다면 디스크 블록 할당 정보인 비트맵 파일과 데이터를 저장하는 inode의 인덱싱 정보가 서로 불일치하는 메타데이터 손상 참사가 일어납니다. 과거에는 재부팅 시 fsck(파일 시스템 체크) 유틸리티가 수십 시간에 걸쳐 전체 디스크 섹터를 스캔하여 이를 복구해야 했으나, ext 계열 3버전부터 탑재되어 ext4에서 꽃핀 저널링(Journaling) 기술 덕택에 부팅 후 단 몇 초 만에 데이터의 무결성을 스스로 확증하게 되었습니다. 저널링의 본질은 데이터베이스의 트랜잭션 개념인 WAL(Write-Ahead Logging)을 운영체제 차원으로 확장시킨 것입니다. 파일의 메타데이터를 백엔드 디스크에 최종 반영하기 위해 ext4 커널 드라이버는 이 변경 사항들을 먼저 아주 조그마한 연속 공간인 저널 영역(Journal Ring Buffer)에 원자적(Atomic) 트랜잭션 형태로 직렬화하여 순차적으로 쏟아붓습니다(Commit 과정). 이 저널 기록이 완벽하게 디스크에 쓰여진 후에야 비로소 실제 대상 파일 위치에 데이터를 조각 맞추듯 반영하는 체크포인팅(Checkpointing) 과정을 비동기 백그라운드 워크 큐를 통해 지연 수행시킵니다. 시스템이 셧다운 되더라도 저널 링 버퍼에 완전히 작성된 로그 레코드는 보존되므로, 재부팅 시 VFS 계층이 마운트를 진행할 때 이 저널을 회수하여 못다 한 체크포인팅 과정을 고스란히 재연, 즉 리플레이(Replay)하기만 하면 어긋난 블록들을 완벽히 원상복구시켜 낼 수 있습니다. 이 과정에서 파생되는 디스크 이중 기록 오버헤드를 막기 위해 기본 설정인 메타데이터 저널링만 구사하여 최소한 파일 자체의 구조적 붕괴는 저지하는 설계는 리눅스 커널 개발자들의 극적인 트레이드오프 결정 사례로 남아 있습니다.