난이도 : 초급 Daniel Robbins, President/CEO, Gentoo Technologies, Inc
2001 년 11 월 01 일 Linux 2.4에는 Reiserfs, XFS, GFS와 같은 새로운 파일시스템 기능이 추가되었다. 파일시스템은 좋은 것이긴 하지만 실제 생산환경에 적용하는 방법에 대해서는 정확히 모르고 있는 것도 사실이다. 이 시리즈를 통해 필자는 Linux 2.4에 새롭게 향상된 파일시스템을 설치하는 과정을 설명한다. 이번에는 ext3에 대해 연구한다.
지난 글에서, tmpfs와 devfs 같은 "전통적이지 않은" 파일시스템을 살펴보았다. 이제는 디스크 기반의 파일시스템으로
다시 돌아와 ext3을 연구하는 시간을 갖도록 하자. Stephen Tweedie 박사가 설계한 ext3 파일시스템은 기존의
ext2 파일시스템의 프레임웍에 내장된다; 사실, ext3은 한가지 작은 차이점(저널링을 지원한다)을 제외하고는 ext2와 매우
유사하다. 하지만 이러한 차이가 ext3이 여러 가지의 놀랍고 매력적인 기능을 수행할 수 있도록 한다. 이 글에서, ext3과
다른 저널링 파일시스템과 비교하는 방법을 설명하겠다. 다음에는, ext3을 설치하여 실행하는 방법도 설명하겠다.
Ext3 이해하기
ext3과 ReiserFS를 어떻게 비교할까? 이전 글에서, ReiserFS가 작은 파일(4k 이하)을 다루는데 있어 적합한
이유를 설명했다. 특별한 상황에서 ReiserFS의 작은 파일 퍼포먼스가 ext2와 ext3보다 10~15배 정도 낫다는 것도
설명했다. 하지만 ReiserFS가 많은 강점을 가지고 있지만 약점 역시 있기 마련이다. 현재 ReiserFS (version
3.6)의 경우, 특정 파일 액세스 패턴은 실제로 ext2과 ext3보다 퍼포먼스가 현저하게 낮다. 특히 큰 메일 디렉토리를
읽을 경우 그렇다. 또한, ReiserFS는 NFS 호환과 관련하여 좋은 결과를 보인 적이 없었고 형편없는 퍼포먼스를 가지고
있다. 반대로, ext3은 평판이 좋은 파일시스템이다. ext2와 많은 부분 흡사하다; ReiserFS의 작은 파일
퍼포먼스 처럼 빠르지는 않지만 갑작스러운 퍼포먼스 또는 기능상의 오류는 없다.
ext3은 ext2 코드 기반이기 때문에, ext2와 ext3의 디스크 포맷이 동일하다는 점은 ext3이 가진 가장 큰 강점이다;
완전히 언마운트 된 ext3 파일시스템이 아무런 문제없이 ext2 파일시스템으로서 리마운트 될 수 있다는 것을 의미한다. ext2와
ext3가 동일한 메타데이터를 사용하기 때문에, ext2에서 ext3 파일시스템으로 그 자리에서 업그레이드를 수행하는 것이
가능하다. 몇 가지 중요한 시스템 유틸리티를 업그레이드하고, 2.4 커널을 설치하여 파일시스템 당 하나의 tune2fs
명령어를 타이핑하여, ext2 서버를 저널링 ext3 시스템으로 바꿀 수 있다. ext2 파일시스템이 마운트 되어있는 동안에도
이 작업을 수행할 수 있다. 변환 작업은 안전하고 유연하며 놀랍도록 쉽다. XFS, JFS, ReiserFS 등의 변환과는 다르다.
파일시스템을 백업하거나 다시 만들 필요가 없다.
ext3를 한마디로 표현한다면 "Comfortable"이라는 말이 적당할 것 같다. 기존의 ext2 시스템을
ext3을 가능하도록 하는 것은 쉽다. 예기치 않던 퍼포먼스 quirks가 없다. "comfortable"
수식에 걸맞는 ext3의 특징이 있다; ext3은 리눅스에서 사용할 수 있는 파일시스템 중 가장 신뢰할 수 있는 저널링 파일시스템
중 하나이다.
Ext3의 신뢰성
ext2와 호환된다는 특징 이외에도, ext3은 ext2의 메타데이터 포맷을 공유함으로써 다른 장점들을 상속 받는다. 그 중
한가지는, ext3 사용자들은 fsck 툴에 액세스 할 수 있다. 저널링 파일시스템을 사용할 때 염두해야 할 것은 소모적인 fsck를
피하는 것이다; 하지만 불안한 커널이나 불량한 하드 드라이브 등으로 인해서 메타데이터를 오염시켰다면 ext3이 ext2의 fsck를
상속 받는 사실에 대해 깊이 감사해야 한다.
메타데이터 전용 저널링
ext3은 ReiserFS과 기타 저널링 파일시스템 과는 다른 방식으로 저널링을 핸들 한다는 점은 매우 흥미로운 사실이다. ReiserFS,
XFS, JFS를 이용해서, 파일시스템 드라이버는 메타데이터를 저널링한다. 하지만 데이터를 저널링 하는 것에 대한
준비가 전혀 없다. 메타데이터 전용의 저널링을 이용하면, 파일시스템 메타데이터는 강력해지며 소모적인 fsck를 수행할
필요가 전혀 없다. 하지만 예상하지 않았던 재부팅이나 시스템 잠김 현상은 최근에 변경된 데이터에 심각한 손상을 입힐 수 있다.
ext3은 이러한 문제를 피하기 위해서 혁신적인 솔루션을 사용한다.
예를 들어, 머신이 다운되어 재부팅을 하게 될 때 /tmp/myfile.txt 파일을 수정하고 있었다고 해보자. ReiserFS,
XFS, JFS 같은 메타데이터 전용의 저널링 파일시스템을 사용하고 있다면 메타데이터 저널로 인해서 파일시스템 메타데이터는 쉽게
복구된다. 그리고 힘들게 fsck와 씨름할 필요가 없다.
하지만, /tmp/myfile.txt를 텍스트 에디터에 로딩할 때 파일에 최근 변경된 것이 없거나 상당량의 garbage 파일을
포함하고 있거나 심지어 읽을 수 없는 경우가 생길 수도 있다. 항상 발생하는 일은 아니지만 일어날 가능성은 충분히 있다.
ReiserFS, XFS, JFS 같은 일반적인 저널링 파일시스템들은 메타데이터를 특별히 관리하지만 데이터에 대해서는 주의를
기울이지 않는다. 위 예시에서 처럼 파일시스템 드라이버는 여러 개의 파일시스템 블록을 변경하는 과정에 있다. 파일시스템 드라이버는
적절한 메타데이터를 업데이트 하지만 데이터를 그것의 캐시에서부터 디스크상의 새로운 블록까지 지울 시간이 없다. 그래서 /tmp/myfile.txt를
텍스트 에디터에 로딩할 때, 전체 파일 또는 일부는 시스템이 다운되기 전에 제시간에 초기화 되지 않은 데이터 블록을 포함하게
된다.
ext3의 저널링 구현 방식
이제는 ext3이 저널링을 구현하는 방법을 살펴보자. ext3 에서, 저널링 코드는 Journaling Block Device
layer(JBD)라고 하는 특별한 API를 사용한다. JBD는 모든 종류의 블록 디바이스상의 저널을 구현하도록 설계되었다.
Ext3은 JBD API에 "hook-in" 함으로써 저널링을 구현한다. 예를 들어, ext3 파일시스템 코드는
JBD에 변경 정보를 준다. 그리고 디스크 상에서 특정 데이터를 수정하기 전에 JBD에서 권한을 요청할 것이다. 이렇게 해서,
JBD에는 ext3 파일시스템 드라이버를 대신하여 저널을 관리 할 수 있는 기회를 갖게 된다. JBD는 개별적인 고유의 엔터티로서
개발되었기 때문에 앞으로는 다른 파일시스템에 저널링 기능을 추가하는데 사용될 수 있다.
JBD로 관리되는 ext3 저널의 장점이 몇 가지 있다. ext3의 저널은 inode에 저장된다. 기본적으로 하나의 파일이다.
파일시스템을 "ext3-enable" 하는 방법에 따라서 /.journal 에 위치한 이 파일을 볼 수 있을 수도, 없을 수
도 있다. 물론 inode에 저널을 저장함으로서, ext3은 파일시스템에 필요한 저널을 추가할 수 있다. 이것은 ext3 파일시스템이
ext2 메타데이터와 ext2 파일시스템 드라이버와의 호환성을 유지하는 요인이다.
기타 저널링 방식
저널을 구현하는 여러가지 방법이 있다는 사실은 놀라운 것이 아니다. 예를 들어, 파일시스템 개발자는 호스트 파일시스템상에서 변경되어야
하는 바이트의 범위를 저장하는 저널을 만들 수 있다. 이러한 접근방식의 장점은 저널이 매우 효과적인 방법으로 파일시스템
상의 아주 작은 변경사항이라도 저장할 수 있다는 것이다. 단지 변경되어야 하는 개별 바이트를 기록하면 되기 때문이다.
JBD는 어떤 면에는 좀 더 나은 방식을 취한다. 변경되어야 하는 바이트 범위를 기록하는 것 보다, JBD는 변경된 전체 파일시스템
블록을 저장한다. ext3 파일시스템 드라이버는 이러한 접근방식을 사용하고 변경된 전체 블록의 복사본을 (1K, 2K, 4K)
메모리에 저장한다. 미완의 IO 작동을 트래킹하기 위해서이다. 언뜻 보면, 낭비하는 것 처럼 보인다. 결국, 전체 블록은 변경된
데이터를 포함하고, 변경되지 않는 (이미 디스크상에 존재) 데이터 역시 포함하고 있다.
JBD가 사용하는 접근방식은 물리적 저널링(physical journaling)이다. JBD는 저널을 구현하기
위한 기반으로 완벽한 물리적 블록을 사용한다. 반대로 전체 블록 보다는 변경된 바이트 범위만을 저장하는 방식인 논리적 저널링(logical
journaling)을 사용한다. 논리적 저널링은 XFS에서 사용하는 방식이다. ext3는 물리적 저널링을 사용하기 때문에,
XFS 보다 디스크상의 풋프린트가 더 클 것이다. 하지만 ext3는 전체 블록을 내부적으로 저널 안에서 사용하기
때문에, 논리적 저널링을 구현한다면 그다지 복잡하지 않을 것이다. 게다가, 전체 블록을 사용하기 때문에 ext3는 몇 가지 추가적인
최적화를 수행할 수 있다. 단일 블록 내에서 다중의 보류중인 IO 작동을 메모리 내의 데이터 구조로 넣을 수 있다. 이렇게 되면
ext3는 디스크 상의 이러한 다중의 변경을 작성할 수 있다.
Ext3, 데이터 보호자
지금까지, ext3 파일시스템이 데이터 손상 문제를 피해가면서 메타데이터와 데이터 저널링을 효율적으로 제공하는 방법을 설명했다.
사실, ext3의 경우 데이터와 메타데이터 통합하는데 있어서 두 가지 방법을 가지고 있다.
원래, ext3은 전체 데이터와 메타데이터 저널링을 수행하도록 설계되었다. 이 모드에서 ("data=journal"
mode), JBD는 파일시스템에 대한 모든 변경사항을 저널링한다. 변경이 데이터 또는 메타데이터에서 이루어 졌는지는 상관이
없다. 데이터와 메타데이터 모두 저널링 되기 때문에, JBD는 메타데이터와 데이터를 영속적인 상태로 가져오기 위해 저널을 사용할
수 있다. 전체 데이터 저널링은 느려질 수 있다는 단점이 있다.
최근에 ext3에 추가된 새로운 저널링 모드는 전체 저널링 효과를 제공한다. 심각한 퍼포먼스 장애를 가져오지 않는다. 이 새로운
모드는 메타데이터 만을 저널링하며 작동한다. 하지만 ext3 파일시스템 드라이버는 각 메타데이터 업데이트에 상응하는 특정 데이터
블록을 지속적으로 트래킹한다. 그들을 트랜잭션이라고 하는 단일 엔터티로 그룹화 시킨다. 트랜잭션이 파일시스템에 적절히 적용되면
데이터 블록은 디스크에 우선 작성된다. 일단 그들이 작성되면 메타데이터 변경은 저널에서 이루어진다. 이러한 방식으로 ("data=ordered"
mode)인해 메타데이터 변경만 저널에 기록되더라도 ext3는 데이터와 메타데이터의 일관성을 유지할 수 있는 것이다. ext3는
이러한 모드를 기본적으로 사용한다.
결론
오늘날 많은 사람들은 가장 좋은 리눅스 저널링 파일시스템을 찾길 원한다. 사실, 모든 애플리케이션에 딱 맞는 파일시스템은 존재하지
않는다. 각각 나름대로의 강점을 가지고 있다. 어떤 것을 선택하든지 장점을 충분히 활용할 수 있을 것이다. 그래서 무조건 최상의
파일시스템을 선택하여 애플리케이션에 적용하기 보다는 각 파일시스템의 장점과 단점을 제대로 파악하여 선택하는 것이 중요하다.
Ext3는 장점이 많다. 배치도 매우 간단하다. 강력한 ext2 파일시스템 코드 기반이며 fsck 툴을 사용한다. ext3의
저널링 기능의 특징은 메타데이터와 데이터의 확실한 통합이다. 전반적으로, ext3는 훌륭한 파일시스템 이고 ext2 파일시스템의
믿음직한 후계자라고 할 수 있다.
참고자료
필자소개  | 
| Daniel Robbins는 Gentoo Technologies, inc.의 사장/CEO이다. 또 PC용 고급 Linux인 Gentoo
Linux의 창설자이자, 차세대 Linux 포트 시스템인 Portage 시스템의 창시자이다. 또한 Macmillan사에서
출판하는 Caldera OpenLinux Unleashed, SuSE Linux Unleashed, Samba Unleashed에
집필활동을 하고 있다. |
기사에 대한 평가
|