출처 : http://maca.egloos.com/5210298



최근에 저널링 파일 시스템이 신비의 대상으로 여겨져 연구 주제로 떠오르고 있습니다. 하지만 오늘날 저널링 파일 시스템(ext3)은 리눅스(Linux®)에 기본으로 탑재되어 있습니다. 저널링 파일 시스템 이면에 숨겨진 아이디어를 찾아 시스템 전원 문제나 비정상 종료 과정에서 더 나은 무결성을 제공하는 방법을 익힙시다. 현재 사용 중인 다양한 저널링 파일 시스템을 익히고 차세대 저널링 파일 시스템도 미리 살펴봅시다.


저널링 파일 시스템을 다양한 방식으로 정의할 수 있지만 요점만 간략하게 정리해보자. 저널링 파일 시스템은 부트 시점에서 파일 시스템 일관성 검사를 위해 fsck가 돌아가는 모습에 진절머리가 난 사람을 위한 고안물이다(저널링 파일 시스템은 결함에 회복력을 보이는 파일 시스템이라는 아이디어에서 나왔다). 저널링 기능이 없는 전통적인 파일 시스템을 부적절하게 종료하면, 운영체제가 이를 감지해 fsck 유틸리티를 사용해 일관성 검사를 수행한다. 이 유틸리티는 파일 시스템을 탐색해(상당히 오랜 시간이 걸릴 수도 있다) 안전하게 교정할 수 있는 문제점을 수정한다. 어떤 경우에는 파일 시스템이 심하게 망가졌기에, 운영체제가 알아서 단일 사용자 모드로 진입한 다음에 사용자가 복구 과정을 진행하도록 만드는 경우도 있다.










fsck 뒷담화

엎친 데 덮친 격으로 fsck 과정은 파일 시스템 메타자료가 올바른지 확인하기 위해 운영체제가 마운트 시점에서 자동으로 수행한다(심지어 손상이 감지되지 않을지라도). 따라서 파일 시스템 항상성 점검을 건너뛰도록 만드는 기술은 개선의 여지가 많다.


이제 저널링 파일 시스템이 누구를 위해 만들어졌는지 알았다. 그렇다면 fsck를 어떻게 없애버릴까? 일반적으로 저널링 파일 시스템은 저널을 관리하는 방법으로 파일 시스템 손상을 피한다. 저널은 특수한 파일로서 파일 시스템에 반영될 변경 사항을 원형 버퍼에 로그로 남긴다. 주기적으로, 저널은 파일 시스템에 커밋된다. 비정상 종료가 일어나면, 저널은 저장되지 않은 정보를 복구하기 위한 검사 지점으로 사용되며, 파일 시스템 메타자료 손상을 막아준다.


요약하자면, 저널링 파일 시스템은 결함에 회복력을 보이는 파일 시스템으로 메타자료 손상을 막기 위해 파일 시스템으로 기록되기 전에 저널을 사용해 변경 사항을 로그로 남긴다(그림 1 참조). 하지만 많은 리눅스 해법과 마찬가지로, 옵션이 여러 개 존재한다. 지금부터 저널링 파일 시스템 역사를 간단하게 살펴본 다음에 사용 가능한 파일 시스템과 차이점을 검토해보자.










메타자료가 무엇인가?

메타자료는 디스크에 존재하는 자료를 위한 구조체 관리용 자료다. 메타자료는 파일 생성과 삭제, 디렉터리 생성과 삭제, 파일 크기 증가, 파일 잘라내기 등을 표현한다.


그림 1. 전형적인 저널링 파일 시스템
전형적인 저널링 파일 시스템 

저널링 파일 시스템 역사


첫 번째 저널링 파일 시스템은 IBM® 저널링 파일 시스템(JFS)이었다. JFS는 1990년에 처음 출시되었지만, 현재 리눅스에서 지원되는 버전은 나중에 개발된 JFS2다. 1994년 실리콘 그래픽스 사는 고성능 XFS를 IRIX 운영체제에 도입했다. XFS는 2001년 리눅스로 이식되었다. 아미가를 위해 1998년에 SFS(Smart File System)가 개발되었고, 나중에 LGPL(GNU Lesser General Public License) 하에 공개되어 2005년부터 리눅스를 지원하기 시작했다. 가장 흔히 사용되는 저널링 파일 시스템인 ext3fs(third extended file system)는 ext2에 저널링 기능을 확장한 파일 시스템이다. ext3fs는 2001년 이후로 리눅스에서 지원되기 시작했다. 마지막으로 ReiserFS 저널링 파일 시스템은 처음 소개되었을 때 여러 가지 새로운 기능을 보여줬으며, 광범위하게 퍼져나갔다. ReiserFS의 혁신에 그림자가 드리운 이유는 원래 개발자가 법적인 소송에 휘말렸기 때문이다.

















위로



다양한 저널링 기법










developerWorks에 팀이 쓴 … 분석 연재물


저널링 파일 시스템은 저널을 사용해 파일 시스템에 가해지는 변경을 버퍼링한다(또한 비정상 종료 복구에도 사용된다). 하지만 언제 무엇을 저널로 기록할지는 시스템마다 전략이 다양하다. 가장 흔한 세 가지 전략은 쓰기저장(writeback), 순서(ordered), 자료(data)다.


쓰기저장 모드에서, 메타자료만 저널에 기록되며, 자료 블록은 디스크 해당 위치에 직접 기록된다. 이렇게 하면 파일 시스템 구조를 보존해 손상을 방지하지만, 자료 손상이 일어나기 마련이다(예를 들어, 메타자료를 저장하고 나서 자료 블록 기록 전에 시스템이 비정상 종료를 일으킬 때). 이런 문제를 해결하는 데 순서 모드를 사용할 수 있다. 순서 모드는 자료를 기록한 다음에야 메타자료를 저널에 기록한다. 이런 방식으로 복구 이후에 자료와 파일 시스템 일관성을 보장한다. 마지막으로 자료 저널링도 지원이 가능하다. 자료 모드에서는 메타자료와 자료가 모두 저널에 기록된다. 자료 모드는 파일 시스템 손상과 자료 손실에 대한 가장 강력한 방어 기법이지만 성능 저하 문제가 생긴다. 모든 자료가 두 번에 걸쳐 기록되기 때문이다(처음에는 저널에, 다음으로 디스크에).


저널 커밋 정책 또한 접근 방법에서 다양성을 보인다. 예를 들어, 저널이 거의 다 찼을 때 커밋될까? 아니면 타임아웃을 사용해 커밋될까?

















위로



저널링 파일 시스템의 현재


현재 여러 저널링 파일 시스템이 활발하게 사용된다. 각 파일 시스템마다 장단점이 있다. 여기에 현재 사용 가능한 가장 인기 있는 저널링 파일 시스템을 네 가지로 나눠 정리했다.


JFS2


(향상된 저널링 파일 시스템이라고 알려진) JFS2는 리눅스로 이식되기 앞서 IBM AIX 운영체제에서 여러 해 동안 사용된 첫 번째 저널링 파일 시스템이다. JFS2는 64비트 파일 시스템이며, 원본 JFS에 기반을 두고 있지만 좀 더 확장성이 좋아졌고 다중 프로세서 아키텍처를 지원하도록 개선되었다.


JFS2는 부가적인 파일 시스템 복구와 함께 고성능을 발휘하도록 순서 저널링 기법을 지원한다. JFS2는 또한 성능 향상을 위해 익스텐트 기반 파일 할당을 제공한다. 익스텐트 기반 할당은 단일 블록을 할당하는 대신에 연속적인 블록 집합을 할당한다. 이런 블록은 디스크에 연속적으로 배치되므로, 읽기와 쓰기 성능이 좋아진다. 익스텐트 기반 할당에 있어 또 다른 장점은 메타자료 관리 최소화다. 블록 단위 공간 할당은 블록 단위 메타자료 갱신을 의미한다. 익스텐트 기능으로 말미암아, (여러 블록을 대표하는) 익스텐트에 대해서만 메타자료를 갱신하면 된다.


JFS2는 또한 B+ 트리를 사용해 빠른 디렉터리 탐색과 익스텐트 기술자를 관리한다. JFS2는 내부적인 저널 커밋 정책이 없으며, kupdate 데몬의 타임아웃에 의존한다.


XFS


XFS는 1995년에 실리콘 그래픽스 사가 IRIX 운영체제 용으로 원래 개발한 초창기 저널링 파일 시스템 중 하나다. XFS는 2001년에 리눅스로 이식되었기에 이미 성숙되고 안정성이 입증되었다.


XFS는 완벽한 64비트 주소 체계를 지원하며, 디렉터리와 파일 할당에 B+ 트리를 사용함으로써 성능이 높아졌다. XFS는 또한 가변 블록 크기 지원(512바이트부터 64KB에 이르는) 익스텐트 기반 할당 기법을 사용한다. 익스텐트 이외에도, XFS는 지연 할당을 사용하므로, 디스크에 블록을 쓰기 전에 디스크 볼록 할당을 뒤로 미룰 수 있다. 이런 기능은 연속적인 디스크 블록을 할당할 가능성을 높인다. 필요한 전체 블록 개수를 미리 알기 떄문이다.


또 다른 흥미로운 XFS 특징으로 보장된 I/O 비율(파일 시스템 사용자를 위한 대역폭 예약)과 직접 I/O가 있다. 직접 I/O는 (여러 버퍼를 단계별로 거치는 대신) 자료를 디스크와 사용자 영역 버퍼 사이에서 직접 복사하는 기능이다. XFS는 쓰기저장(writeback) 저널링 정책을 사용한다.


ext3fs


ext3fs는 가장 인기있는 저널링 파일 시스템이며, 인기 있는 ext2 파일 시스템이 발전한 형태다. ext3fs는 실제로 ext2fs와 호환성이 있다. ext3fs는 ext2fs와 똑같은 구조를 사용하며, 단순히 저널만 추가했기 때문이다. 심지어 ext3fs 파티션을 ext2 파일 시스템으로 마운트해도 되며, (tune2fs 유틸리티를 사용해) ext2 파일 시스템을 ext3 파일 시스템으로 변환할 수 있다.


ext3fs는 세 가지 저널링 유형을 허용하지만(쓰기저장(writeback), 순서(ordered), 자료(data)), 순서 모드가 기본이다. 저널 커밋 정책은 설정 가능하지만 기본적으로 저널의 1/4이 차거나 커밋 타이머 중 하나가 타임 아웃되면 커밋을 수행한다.


ext3의 가장 큰 단점은 처음부터 저널링 파일 시스템을 염두에 두고 설계되지 않았다는 사실이다. ext2fs에 기반했기에, ext3는 (익스텐트와 같이) 다른 저널링 파일 시스템에서 등장하는 가장 최근에 발전된 몇 가지 기능이 빠져 있다. ext3fs는 또한 일반적으로 ReiserFS, JFS, XFS와 비교해 성능이 훨씬 떨어진다. 하지만 경쟁 파일 시스템에 비해 CPU와 메모리를 적게 사용한다.


ReiserFS










테일 꽉 채워넣기가 무엇인가?

대부분 파일 크기는 논리 블록 크기 미만이다. 아주 작은 파일마다 논리 블록을 할당함으로써 공간을 낭비하는 대신에(이를 테일이라고 부른다), 단일 논리 블록 내부에 여러 파일을 꽉 채워 넣는다. 이런 작업은 경쟁 저널링 파일 시스템에 비해 (성능을 희생해) 디스크 공간을 5% 정도 늘리는 효과를 얻는다.


ReiserFS는 처음부터 저널링을 염두에 두고 개발된 저널링 파일 시스템이다. ReiserFS는 2001년 2.4 주류 커널에 도입되었다(리눅스가 채택한 첫 저널링 파일 시스템이다). 기본 저널링 메서드는 순서이며, 파일 시스템이 커짐에 따라 온라인 크기 조정을 지원한다. ReiserFS는 또한 단편화를 동적으로 줄이기 위한 테일 꽉 채워넣기 기능을 포함한다. 작은 파일을 다룰 때 (테일 꽉 채워넣기 기능을 활성화한 상태에서) ReiserFS가 ext3fs에 비해 훨씬 더 빠르다.


ReiserFS(ReiserFS v3)는 B+ 트리와 같은 여러 가지 현대적인 특징을 포함한다. 파일 시스템의 기본 형식은 단일 B+ 트리에 기반을 두며, 탐색 연산을 효율적이며 확장성이 높게 만들어준다. 커밋 정책은 커밋한 블록 개수는 물론이고 저널 크기에 의존한다.


ReiserFS는 여러 가지 쟁점으로 말미암아 재앙에 부딪혔다. 가장 최근에 원래 개발자에 얽힌 법적 문제까지 생겼다(세부 사항은 참고자료를 살펴보자).

















위로



저널링 파일 시스템의 미래


지금까지 파일 시스템의 현재에 대해 살펴보았으니 이제 미래를 살펴볼 차례다.


Reiser4


ReiserFS가 성공적으로 리눅스 커널에 통합되고 여러 리눅스 배포판에서 채택된 다음에 (ReiserFS를 만든) Namesys는 새로운 저널링 파일 시스템 개발을 시작했다. ReiserFS4는 여러 가지 고급 기능을 갖추고 있으며 처음부터 새로운 저널링 파일 시스템으로 설계되었다.


Reiser4는 (XFS와 마찬가지로) 저널이 커밋될 때까지 지연된 블록 할당 기능과 느긋한 로그 활용을 사용해 좀 더 나은 저널링 기능을 제공하도록 설게되었다. Reiser4는 또한 (압축이나 암호화와 같은 기능을 지원하도록) 유연한 플러그인 아키텍처로 설계되었지만 리눅스 공동체가 이를 거부했다. 이런 기능은 VFS(Virtual File System)에서 가장 잘 표현되기 때문이다.


Namesys 창업자가 유죄 판결을 받음으로써 Reiser4를 둘러싼 모든 상업적인 활동이 중단되었다.


ext4fs


ext4fs는 ext3fs가 발전한 형태다. ext4 파일 시스템은 ext3를 향후 대체할 상위/하위 호환성을 갖춘 파일 시스템으로 설계되었지만, 새롭게 개선된 고급 특징을 몇 가지 추가했다(몇 가지는 하위 호환성을 깨버린다). 이는 ext4fs 파티션을 ext3fs 파티션과 혼용해 마운트할 수 있음을 의미한다.


가장 먼저, ext4fs는 64비트 파일 시스템으로 아주 큰 볼륨(1엑사바이트)을 지원하도록 설계되었다. ext4fs는 또한 익스텐트를 사용하도록 설계되었다. 하지만 익스텐트 기능을 사용하면 ext3fs 호환성이 깨진다. XFS나 Reiser4와 마찬가지로 ext4fs는 필요할 때만 블록을 할당하는 지연 할당 기능을 포함한다(이렇게 되면 단편화를 줄인다). 저널 내용은 또한 체크섬으로 보호되므로 저널 모드를 좀 더 안정적으로 만든다. 표준 B+나 B* 트리를 대신해 ext4fs는 B 트리 변종인 H 트리를 사용한다. H 트리는 훨씬 더 큰 하위 디렉터리를 허용한다(ext3는 32KB라는 제약이 있었다).


지연된 할당 방식이 단편화를 줄이긴 하지만, 시간이 지남에 따라 대규모 파일 시스템에 단편화가 생길 수 있다. 온라인 단편화 제거 도구(e4defrag)는 이런 문제점을 해결하기 위해 등장했다. 이 도구를 사용해 개별 파일이나 전체 파일 시스템 단편화를 제거할 수 있다.


ext3fs와 ext4fs 사이에 일어난 흥미로운 또 다른 차이점은 파일을 위한 자료 해상도다. ext3에서 최소 타임스탬프 해상도는 1초였다. ext4fs는 미래를 내다보고 있다. 프로세스와 인터페이스 속력이 빨라짐에 따라 더 나은 해상도가 필요하다. 이런 이유 때문에, ext4에서 지원하는 최소 타임스탬프 해상도는 1나노초다.


ext4fs는 리눅스 커널 2.6.19부터 포함되었으며, 아직은 안정적이지 못하다. 차세대 파일 시스템을 위한 개발은 계속되고 있으며, 전통을 이어받아 ext4fs는 리눅스 저널링 파일 시스템을 이끄는 차세대 주자가 될 것이다.

















위로



한걸음 더 나가면


저널링 파일 시스템은 시스템 비정상 종료나 전원 문제가 발생했을 때 손상을 방지하고 안정성을 높여준다. 추가적으로, 저널링 파일 시스템을 사용하면 (fsck에 의존하는) 전통적인 파일 시스템과 비교해 비정상 종료 복구 시간이 엄청나게 줄어든다. 새로운 저널링 기능 개발을 거치면서 JFS와 XFS에서 제공하는 기능을 포함해 과거를 돌아보는 동시에 미래를 내다보고 새로운 알고리즘과 자료 구조가 지속적으로 등장한다. 저널링 파일 시스템이 미래에 어떤 모습으로 발전할지는 확실하지 않지만 확실히 유용하므로 저널링 파일 시스템이 새로운 파일 시스템 표준으로 자리잡을 것이다.




참고자료

교육

리눅스 저널링 파일 시스템 분석

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다