메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Linux에서 ZFS 실행

M. Tim Jones, 컨설턴트 엔지니어, Emulex Corp.
M. Tim Jones는 임베디드 펌웨어 아키텍트이자 Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming(2판이 나왔다), AI Application Programming(2판이 나왔다), BSD Sockets Programming from a Multilanguage Perspective의 저자이기도 하다. Jones의 공학 배경은 정지 위성을 위한 커널 개발에서 시작해 임베디드 시스템 아키텍처와 네트워크 프로토콜 개발에 이르기까지 다양한 분야를 아우른다. Jones는 콜로라도 주, 롱몬트 소재 Emulex 사에서 컨설턴트 엔지니어로 활약한다.

요약:  ZFS가 앞으로는 위험에 처한 운영 체제에서 존재한다고 하더라도 이는 거의 현존하는 가장 진보적이고 기능이 풍부한 파일 시스템 중 하나입니다. 가변적인 블록 크기, 압축, 암호화, 복제 방지, 스냅샷, 클론 및 (이름이 암시하는 대로) 방대한 기능의 지원을 통합합니다. ZFS 이면의 개념을 알아보고 오늘날 FUSE(Filesystem in Userspace)를 사용하여 Linux에서 ZFS를 어떻게 사용할 수 있는지 배워봅시다.

원문 게재일:  2011 년 6 월 17 일
난이도: 중급 원문:  보기 PDF:  A4 and Letter (53KB | 12 pages)Get Adobe® Reader®
페이지뷰:  2719 회
의견:  


Tim과 연락하기

Tim은 developerWorks의 가장 유명한 다작 저자 중 한 명이다. developerWorks에 실린 Tim의 모든 기사를 살펴보자. Tim의 프로파일을 확인하고 Tim과 다른 저자 및 My developerWorks의 동료 독자와 연락을 해보자.

Linux는 파일 시스템과 흥미로운 관계가 있다. Linux는 오픈이므로, 이는 차세대 파일 시스템과 새롭고 혁신적인 파일 시스템 개념을 위한 핵심 개발 플랫폼이 되는 경향이 있다. 최근의 흥미로운 두 개의 예제는 방대하게 확장 가능한 Ceph 및 지속적인 스냅샷하는 파일 시스템 nilfs2(그리고 물론, 네 번째 확장된 파일 시스템[ext4]과 같은 열심히 작업하는 파일 시스템에서의 진화)를 포함한다. 이는 또한 과거의 파일 시스템에 대한 인류학적인 사이트 —DOS VFAT, Macintosh(HPFS), VMS ODS-2 및 Plan-9의 원격 파일 시스템 프로토콜—이기도 하다. 하지만 모든 파일 시스템을 통해 Linux에서 지원되도록 하겠지만, 이를 구현하는 기능으로 인해 주목할 만한 관심을 생성하는 것 중 하나는 Oracle의 ZFS(Zettabyte File System)이다.

ZFS는 Sun Microsystems가 설계 및 개발하여(Jeff Bonwick 주도 하에), 2004년에 최초로 발표되고 2005년에 Sun Solaris로 통합되었다. 비록 가장 많이 회자되고 기능이 풍부한 파일 시스템과 가장 대중적인 오픈 운영 체제가 쌍을 이루는 것이 이상적인 조화라고 하더라도, 라이센싱 문제로 인해 통합이 제한되었다. Linux는 GNU GPL(General Public License)로 보호되는 반면, ZFS는 Sun의 CDDL(Common Development and Distribution License)로 처리된다. 이러한 라이센스 계약은 다른 목표가 있고, 이로 인해 제안이 충돌하게 된다. 다행히도 이는 Linux 사용자가 ZFS 및 그 제공하는 기능을 즐길 수 없다는 것을 의미하지는 않는다.

이 기사는 Linux에서 ZFS를 사용하기 위한 두 가지 메소드를 탐색한다. 첫 번째는 FUSE(Filesystem in Userspace) 시스템을 사용하여 ZFS 파일 시스템을 사용자 공간으로 밀어 넣어 라이센싱 문제를 방지한다. 두 번째 메소드는 Linux 커널로 통합하기 위한 ZFS의 기본 포트인 동시에, 지적 재산권 문제를 방지한다.

어디에서 ZFS를 찾을 수 있습니까?

오늘날, ZFS는 OpenSolaris(이 또한 CDDL로 처림됨) 내에서 기본으로 찾을 수 있지만, 보완적인 라이센스가 있는 다른 운영 체제에서도 찾을 수 있다. 예를 들어, FreeBSD에서 ZFS를 찾을 수 있다(2007년 이후로). ZFS는 한 때 Darwin(BSD[Berkeley Software Distrubution], NeXTSTEP 및 CMU의 Mach 3 마이크로커널의 파생물)의 일부였지만, 이후로 제거되었다.

ZFS 소개하기

ZFS를 파일 시스템이라고 하는 것은 기존의 상식으로 보면 그 이상이므로 다소 부적절한 명칭이다. ZFS는 논리적 볼륨 관리자의 개념과 기능이 매우 풍부하고 엄청나게 확장 가능한 파일 시스템을 결합한다. ZFS가 기반으로 하는 일부 원칙을 탐색하여 시작해보자. 먼저, ZFS는 기존의 볼륨 기반 모델이 아니라 풀링된 스토리지 모델을 사용한다. 이는 ZFS가 스토리지를 필요한 대로 동적으로 할당할(그리고 줄일) 수 있는 공유된 풀로 보는 것을 의미한다. 이는 파일 시스템이 볼륨에 존재하고 독립적인 볼륨 관리자가 이러한 자산을 관리하는 데 사용된다는 점에서 기존 모델에 비해 활용도가 높다. ZFS 내에 임베드되는 것은 스냅샷, 기록 시 복사(copy-on-write) 클론, 지속적인 무결성 검사 및 RAID-Z를 통한 데이터 보호와 같은 중요한 기능 세트의 구현이다. 한층 더 나아가서 ZFS 볼륨 위에 사용자가 선호하는 파일 시스템(예: ext4)을 사용할 수 있다. 이는 독립적인 파일 시스템(이를 직접 지원하지 않을 가능성이 높음)에서 스냅샷과 같은 ZFS의 이러한 기능을 얻게 되는 것을 의미한다.

하지만 ZFS는 유용한 파일 시스템을 형성하는 기능의 집합에 불과한 것이 아니다. 그 대신에, 이는 탁월한 파일 시스템을 만드는 통합되고 보완적인 기능의 집합이다. 이러한 기능을 일부 살펴보고 일부 이러한 작동에 대해 확인해보자.

스토리지 풀

이전에 논의한 대로, ZFS는 볼륨 관리 기능을 통합하여 내재된 실제 스토리지 디바이스를 파일 시스템으로 추상화한다. ZFS는 실제 블록 디바이스를 직접 보는 것이 아니라, 스토리지 풀(zpools라고 함)에서 운영하며, 이는 드라이브 또는 드라이브의 부분으로 실제로 표현할 수 있는 가상 드라이브에서부터 구축된다. 더 나아가, 이러한 풀은 활발히 사용되는 동안에도 동적으로 구축될 수 있다.

기록 시 복사(Copy-on-write)

ZFS는 스토리지에서 데이터를 관리하기 위해 기록 시 복사(copy-on-write) 모델을 사용한다. 이는 그 데이터가 적소에 절대 기록되지 않지만(절대 겹쳐쓰이지 않음), 그 대신에 새로운 블록이 기록되고 메타데이터가 이를 참조하도록 업데이트된다. Copy-on-write는 다양한 이유로(사용하는 스냅샷과 클론과 같은 일부 기능에 대해서만 아니라) 유리하다. 데이터를 절대 겹쳐쓰지 않으므로 스토리지가 비일관적인 상태로 절대 남아 있지 않게 보장하는 것이 더 간단하다(이전 데이터는 새로운 쓰기 작업이 완료된 후에 유지되므로). 이를 통해 ZFS가 트랜잭션 기반이 되도록 허용하므로, 훨씬 더 간단하게 원자적 조작과 같은 기능들을 구현한다.

copy-on-write 설계의 흥미로운 부작용은 파일 시스템으로의 쓰기가 모두 순차 쓰기가 된다는 점이다(항상 다시 맵핑하기가 발생하기 때문이다). 이 작동은 스토리지에서 핫 스팟을 방지하고 순차 쓰기의 성능을 활용한다(임의 쓰기보다 더 빠름).

데이터 보호

스토리지 풀은 ZFS의 수많은 보호 스킴 중 하나를 사용하여 보호할 수 있는 가상 디바이스로 구성된다. 두 개 이상의 디바이스에 걸쳐 풀을 미러링할 수 있고(RAID 1) 패리티로 보호하지만(RAID 5와 유사함) 동적 스트라이프 너비에 걸친다(나중에 자세히 나옴). ZFS는 풀에서 디바이스의 수를 기반으로 다양한 패리티 스킴을 지원한다. 예를 들어, RAID-Z(RAID-Z 1)로 세 개의 디바이스를 보호할 수 있고, 네 개의 디바이스로 RAID-Z 2(이중 패리티, RAID6과 유사함)를 사용할 수 있다. 보호를 더 강화하기 위해 삼중 패리티에 대해 더 많은 디스크로 RAID-Z 3을 사용할 수 있다.

속도를 위해(하지만 오류 인식을 제외하고 데이터 보호 없음) 디바이스에 걸쳐 스트라이핑을 이용할 수 있다(RAID 0). RAID 10과 유사하게 스트라이프된 미러(스트라이프된 드라이브를 미러링하는 용도)도 작성할 수 있다.

ZFS의 흥미로운 속성은 RAID-Z, copy-on-write 트랜잭션 및 동적 스트라이프 너비의 결합으로 나타난다. 기존 RAID 5 아키텍처에서 모든 디스크가 스트라이프 내에서 데이터를 보유해야만 하거나, 스트라이프가 비일관적이다. 모든 디스크를 원자적으로 업데이트하는 방법이 없기 때문에 잘 알려진 RAID 5 쓰기 구멍(write hole) 문제(스트라이프가 RAID 세트의 드라이브에 걸쳐 비일관적임)를 야기할 가능성이 있다. ZFS 트랜잭션이 주어지고 절대 적소에 기록되지 않으면 쓰기 구멍 문제는 제거된다. 이 접근방식의 또 다른 편리한 특징은 디스크가 실패하고 다시 빌드하는 것이 필요할 때에 발생하는 내용이다. 기존 RAID 5 시스템은 세트의 다른 디스크에서부터 데이터를 사용하여 새로운 드라이브에 대한 데이터를 다시 빌드한다. RAID-Z는 사용 가능한 메타데이터를 횡단하여 그 기하학과 연관된 데이터만 읽고 디스크에서 사용하지 않은 공간의 읽기를 방지한다. 이 작동은 디스크가 더 커지고 다시 빌드하는 시간이 늘어나면서 훨씬 더 중요해진다.

체크섬

비록 데이터 보호가 실패에 대한 데이터를 다시 생성하는 기능을 제공한다고 하더라도, 처음 위치에서 데이터의 유효성 검증에 대해 아무 정보도 전달하지 않는다. ZFS는 기록된 각 블록에 대한 메타데이터의 32비트 체크섬(또는 256비트 해시)를 생성하여 이 문제를 해결한다. 블록을 읽을 때에, 체크섬이 확인하여 자동(silent) 데이터 손상 문제를 방지한다. 데이터 보호(미러링 또는 RAID-Z)를 보유한 볼륨에서 대체 데이터를 자동으로 읽거나 다시 생성할 수 있다.

무결성에 대한 표준 접근방식

T10은 DIF(Data Integrity Field)라고 하는 엔드투엔드 무결성에 유사한 메커니즘을 제공한다. 이 메커니즘은 블록과 디스크에 저장된 다른 메타데이터의 주기적 중복성 확인을 포함하는 필드를 제안하여 자동(silent) 데이터 손상을 방지한다. DIF의 흥미로운 속성은 스토리지 제어기의 수 측면에서 이에 대한 하드웨어 지원을 발견하게 될 것이라는 점이며, 따라서 프로세스는 호스트 프로세서에서부터 완전히 오프로드된다.

체크섬은 ZFS에서 메타데이터로 저장되므로, 팬텀(phantom) 쓰기가 발견되고 —데이터 보호가 제공되는 경우(RAID-Z)— 수정될 수 있다.

스냅샷 및 클론

ZFS의 copy-on-write 특성을 고려하면 스냅샷과 클론과 같은 기능은 간단하게 제공하게 된다. ZFS가 절대 데이터를 겹쳐쓰지 않지만 그 대신에 새로운 위치에 쓰기 때문에, 이전 데이터는 보존될 수 있다(하지만, 공식적인 경우에 디스크 공간을 바꾸기 위해 제거하도록 표시된다). 스냅샷은 시간의 주어진 인스턴스에서 파일 시스템의 상태를 유지보수하는 이전 블록의 보존이다. 복사가 필요하지 않기 때문에 이 접근방식도 공간 효율적이다(파일 시스템의 모든 데이터가 다시 기록되는 경우 제외). 클론은 스냅샷이 쓰기 가능한 것을 고려하는 면에서 스냅샷의 형태이다. 이 경우에 기록되지 않은 원본 블록을 각 클론이 공유하고, 기록된 블록은 특정 파일 시스템 클론에만 사용 가능하다.

가변적인 블록 크기

기존 파일 시스템은 백엔드 스토리지(512바이트)와 일치하는 크기가 정적인 블록으로 구성된다. ZFS는 다양한 사용에 대해 가변적인 블록 크기를 구현한다(일반적으로 크기가 최대 128KB이지만, 이 값을 변경할 수 있음). 가변적인 블록 크기의 중요한 사용은 압축이다(왜냐하면 압축될 때에 블록 크기 결과는 이론적으로 원본보다 작을 것이기 때문이다). 이 기능은 스토리지 시스템에서 낭비를 최소화할 뿐만 아니라, 스토리지 네트워크의 더 우수한 활용을 제공한다(왜냐하면 스토리지로 방출하된 데이터가 줄어들면 전송 시간이 줄어들어야 하기 때문이다).

압축 외에도 가변적인 블록 크기를 지원하는 것은 개선된 성능을 위해 예상되는 특정 워크로드의 블록 크기를 조정할 수 있음을 의미한다.

기타 기능

ZFS는 중복 방지(데이터의 복사를 최소화하는 용도), 구성 가능한 복제, 암호화, 캐시 관리를 위한 적응형 대체 캐시 및 온라인 디스크 정화(scrubbing)(보호를 사용하지 않을 때에 수정될 수 있는 지연 오류를 식별하고 수정하는 용도)과 같은 기타 기능을 많이 통합한다. 이는 엄청난 확장 가능성으로 이를 수행하여, 주소를 가진 스토리지의 16 엑사바이트를 지원한다(264 바이트).


오늘날 Linux에서 ZFS 사용하기

이제 ZFS 이면의 추상 개념에 대해 일부 살펴 보았으니 이를 일부 실행해 보자. 이 시연은 ZFS-FUSE를 사용한다. FUSE는 커널 코드 없이(FUSE 커널 모듈 및 기존 파일 시스템 코드 제외) 사용자 공간에서 파일 시스템을 구현하도록 허용하는 메커니즘이다. 모듈은 커널 파일 시스템 인터페이스에서부터 사용자의 사용자 공간과 파일 시스템 구현으로의 브릿지를 제공한다. 먼저, ZFS-FUSE 패키지를 설치한다(다음 시연은 Ubuntu를 대상으로 함).

ZFS-FUSE 설치하기

ZFS-FUSE를 설치하는 것은 특히 apt를 사용하는 Ubuntu에서 간단하다. 다음 명령으로 ZFS-FUSE를 사용하는 데 필요한 것을 모두 설치할 수 있다.

$ sudo apt-get install zfs-fuse

이 명령행은 ZFS-FUSE 및 기타 의존하는 패키지를 설치할(필자의 것은 libaiol도 필요했음) 뿐만 아니라 새로운 패키지의 필수 설치를 수행하고 zfs-fuse 디먼을 시작한다.

ZFS-FUSE 사용하기

이 시연에서는 루프백 디바이스를 사용하여 디스크를 호스트 운영 체제 내에서 파일로 에뮬레이트한다. 시작하려면 dd 유틸리티로 이러한 파일들을 작성한다(목록 1 참조). 작성한 네 개의 디스크 이미지를 통해 losetup을 사용하여 디스크 이미지와 루프 디바이스를 연관시킨다.


목록 1. ZFS-FUSE로 작업하기 위한 설정
	
$ mkdir zfstest
$ cd zfstest
$ dd if=/dev/zero of=disk1.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 1.235 s, 54.3 MB/s
$ dd if=/dev/zero of=disk2.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 0.531909 s, 126 MB/s
$ dd if=/dev/zero of=disk3.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 0.680588 s, 98.6 MB/s
$ dd if=/dev/zero of=disk4.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 0.429055 s, 156 MB/s
$ ls
disk1.img  disk2.img  disk3.img  disk4.img
$ sudo losetup /dev/loop0 ./disk1.img 
$ sudo losetup /dev/loop1 ./disk2.img 
$ sudo losetup /dev/loop2 ./disk3.img 
$ sudo losetup /dev/loop3 ./disk4.img 
$ 

ZFS에 대한 블록 디바이스로서 사용 가능한 네 개의 디바이스를 통해(합쳐서 크기가 256MB임) zpool 명령을 사용하여 풀을 작성한다. zpool 명령을 사용하여 ZFS 스토리지 풀을 관리하지만, 확인하는 대로 이를 다른 다양한 용도로도 사용할 수도 있다. 다음 명령은 ZFS 스토리지 풀이 네 개의 디바이스로 작성되도록 요청하고 RAID-Z로 데이터 보호를 제공한다. 이 명령을 풀에서 데이터를 제공하도록 요청하는 목록과 함께 따른다(목록 2 참조).


목록 2. ZFS 풀 작성하기
	
$ sudo zpool create myzpool raidz /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3
$ sudo zfs list
NAME      USED  AVAIL  REFER  MOUNTPOINT
myzpool  96.5K   146M  31.4K  /myzpool
$ 

또한 기본값을 표시하는 목록 3과 같이 풀의 일부 속성을 조사할 수도 있다. 다른 사항 중에서 사용 가능한 용량 및 사용된 부분을 확인할 수 있다. (이 코드는 간략하게 하기 위해 압축되었다.)


목록 3. 스토리지 풀의 속성 검토하기
	
$ sudo zfs get all myzpool
NAME     PROPERTY              VALUE                  SOURCE
myzpool  type                  filesystem             -
myzpool  creation              Sat Nov 13 22:43 2010  -
myzpool  used                  96.5K                  -
myzpool  available             146M                   -
myzpool  referenced            31.4K                  -
myzpool  compressratio         1.00x                  -
myzpool  mounted               yes                    -
myzpool  quota                 none                   default
myzpool  reservation           none                   default
myzpool  recordsize            128K                   default
myzpool  mountpoint            /myzpool               default
myzpool  sharenfs              off                    default
myzpool  checksum              on                     default
myzpool  compression           off                    default
myzpool  atime                 on                     default
myzpool  copies                1                      default
myzpool  version               4                      -
...
myzpool  primarycache          all                    default
myzpool  secondarycache        all                    default
myzpool  usedbysnapshots       0                      -
myzpool  usedbydataset         31.4K                  -
myzpool  usedbychildren        65.1K                  -
myzpool  usedbyrefreservation  0                      -
$ 

이제 실제로 ZFS 풀을 사용해보자. 우선, 풀 내에 디렉토리를 작성한 후에 그 안에 압축을 사용한다(zfs set 명령 사용). 그 다음에 파일을 그 위치에 복사한다. 약 120KB 크기의 파일을 선택하여 ZFS 압축의 효과를 확인하였다. 풀이 루트에 마운트된 것을 참고하여, 루트 파일 시스템 내에서 디렉토리와 같이 취급한다. 파일이 복사되면, 이를 나열하여 파일이 있는지 확인할 수 있다(하지만 이는 원본과 동일한 크기임). dh 명령을 사용하여 파일의 크기가 원본의 반임을 확인할 수 있으며, ZFS가 이를 압축했음을 표시한다. 또한 compressratio 특성도 살펴보고 풀이 얼마나 압축되었는지도 확인할 수 있다(기본 압축기 gzip 사용). 목록 4는 압축을 보여준다.


목록 4. ZFS로 압축 시연하기
	
$ sudo zfs create myzpool/myzdev
$ sudo zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
myzpool          139K   146M  31.4K  /myzpool
myzpool/myzdev  31.4K   146M  31.4K  /myzpool/myzdev
$ sudo zfs set compression=on myzpool/myzdev
$ ls /myzpool/myzdev/
$ sudo cp ../linux-2.6.34/Documentation/devices.txt /myzpool/myzdev/
$ ls -la ../linux-2.6.34/Documentation/devices.txt 
-rw-r--r-- 1 mtj mtj 118144 2010-05-16 14:17 ../linux-2.6.34/Documentation/devices.txt
$ ls -la /myzpool/myzdev/
total 5
drwxr-xr-x 2 root root      3 2010-11-20 22:59 .
drwxr-xr-x 3 root root      3 2010-11-20 22:55 ..
-rw-r--r-- 1 root root 118144 2010-11-20 22:59 devices.txt
$ du -ah /myzpool/myzdev/
60K	/myzpool/myzdev/devices.txt
62K	/myzpool/myzdev/
$ sudo zfs get compressratio myzpool
NAME     PROPERTY       VALUE  SOURCE
myzpool  compressratio  1.55x  -
$ 

마지막으로 ZFS의 자가 보수 기능에 대해 살펴보자. 풀을 작성했을 때, 네 개의 디바이스에 대해 RAID-Z를 요청했음을 상기하자. 목록 5와 같이 zpool status 명령을 사용하여 풀의 상태를 검사할 수 있다. 표시된 대로, 풀의 요소를 확인할 수 있다(네 개의 디바이스가 있는 RAID-Z 1).


목록 5. 풀 상태 검사하기
	
$ sudo zpool status myzpool
  pool: myzpool
 state: ONLINE
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	myzpool     ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    loop0   ONLINE       0     0     0
	    loop1   ONLINE       0     0     0
	    loop2   ONLINE       0     0     0
	    loop3   ONLINE       0     0     0

errors: No known data errors
$ 

이제 오류를 풀로 강제 실행해보자. 이 시연을 위해 그 배후를 조사하여 디바이스를 구성하는 디스크 파일에 오류를 발생시킨다(loop3 디바이스로 ZFS에 표현되는 disk4.img). dd 명령을 사용하여 전체 디바이스를 간단하게 제로 아웃(zero out)한다(목록 6 참조).


목록 6. ZFS 풀 손상하기
	
$ dd if=/dev/zero of=disk4.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 1.84791 s, 36.3 MB/s
$ 

ZFS가 현재로서는 손상을 인식하지 못하지만, 풀의 스크럽을 요청하여 문제를 확인하도록 이를 강제 실행할 수 있다. 목록 7과 같이, ZFS는 이제 손상을 인식하고(loop3 디바이스) 디바이스를 대체하는 조치를 제안한다. 또한 풀이 온라인 상태로 유지되는 것을 주목하자. ZFS가 RAID-Z를 통해 자가 수정하므로 여전히 데이터에 도달할 수 있다.


목록 7. 풀 정화(scrubbing) 및 검사하기
	
$ sudo zpool scrub myzpool
$ sudo zpool status myzpool
  pool: myzpool
 state: ONLINE
status: One or more devices could not be used because the label is missing or
	invalid.  Sufficient replicas exist for the pool to continue
	functioning in a degraded state.
action: Replace the device using 'zpool replace'.
   see: http://www.sun.com/msg/ZFS-8000-4J
 scrub: scrub completed after 0h0m with 0 errors on Sat Nov 20 23:15:03 2010
config:

	NAME        STATE     READ WRITE CKSUM
	myzpool     ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    loop0   ONLINE       0     0     0
	    loop1   ONLINE       0     0     0
	    loop2   ONLINE       0     0     0
	    loop3   UNAVAIL      0     0     0  corrupted data

errors: No known data errors
$ wc -l /myzpool/myzdev/devices.txt
3340 /myzpool/myzdev/devices.txt
$

권장하는 대로 새 디바이스를 새 컨테이너로 동작하도록 RAID-Z 세트에 도입한다. 새 디스크 이미지를 작성하고 이를 losetup으로 디바이스로 표현하여 시작한다. 이 프로세스가 새로운 실제 디스크를 세트에 추가하는 것과 유사함을 주목하자. 그러면 zpool replace를 사용하여 손상된 디바이스(loop3)를 새로운 디바이스(loop4)와 교환한다. 풀의 상태를 검사하면 데이터가 새 디바이스에서 다시 빌드되었음(재실버링(resilvering)이라고 함)을 표시하는 메시지와 함께 그 위치에서 이동된 데이터의 양을 확인할 수 있습니다. 또한 풀이 오류 없이 온라인 상태가 유지되는 것도 주목하자(사용자에 확인 가능). 마무리하기 위해 풀을 다시 정화(scrub)한다. 이 상태를 검사한 후에 목록 8과 같이 문제가 없음을 확인할 것이다.


목록 8. zpool 대체를 사용하여 풀 보수하기
	
$ dd if=/dev/zero of=disk5.img bs=64M count=1
1+0 records in
1+0 records out
67108864 bytes (67 MB) copied, 0.925143 s, 72.5 MB/s
$ sudo losetup /dev/loop4 ./disk5.img 
$ sudo zpool replace myzpool loop3 loop4
$ sudo zpool status myzpool
  pool: myzpool
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Sat Nov 20 23:23:12 2010
config:

	NAME        STATE     READ WRITE CKSUM
	myzpool     ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    loop0   ONLINE       0     0     0
	    loop1   ONLINE       0     0     0
	    loop2   ONLINE       0     0     0
	    loop4   ONLINE       0     0     0  59.5K resilvered

errors: No known data errors
$ sudo zpool scrub myzpool
$ sudo zpool status myzpool
  pool: myzpool
 state: ONLINE
 scrub: scrub completed after 0h0m with 0 errors on Sat Nov 20 23:23:23 2010
config:

	NAME        STATE     READ WRITE CKSUM
	myzpool     ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    loop0   ONLINE       0     0     0
	    loop1   ONLINE       0     0     0
	    loop2   ONLINE       0     0     0
	    loop4   ONLINE       0     0     0

errors: No known data errors
$ 

이 짧은 시연은 파일 시스템을 통한 볼륨 관리의 통합을 탐색하고 ZFS를 관리하는 것이(실패에 직면한 상황에서도) 얼마나 간편한지 보여준다.


기타 Linux-ZFS 가능성

FUSE에서 ZFS의 활용은 ZFS의 사용을 시작하여 간단하지만, 이는 가능한 대로 효율적이지 않은 부작용도 가지고 있다. 이러한 효율성의 부재는 I/O당 필요한 복수 사용자 커널 변환의 결과이다. 하지만 ZFS의 대중성을 고려한다면 더 우수한 성능을 제공하는 또 다른 옵션이 있다.

Linux 커널로의 ZFS의 기본 포트는 Lawrence Livermore National Lab에서 잘 작업되고 있는 중이다. 이 포트는 여전히 ZFS Portable Operating System Interface(UNIX®용) 계층과 같은 일부 요소가 없지만, 여전히 개발 중이다. 그 포트는 특히, Lustre로 ZFS를 사용하는 것에 관심이 있다면 유용한 기능을 많이 제공한다. (세부사항은 참고자료를 참조한다.)


추가 주제

이 기사가 ZFS를 더 알아보고 싶은 욕구를 불러 일으키길 기대한다. 이전의 시연에서부터 ZFS를 간편하게 얻고 대부분의 Linux 배포에서 —커널에서조차도 일부 제한사항을 사용하여— 실행할 수 있다. 스냅샷과 클론과 같은 주제는 여기에서 시연되지 않았지만, 참고자료 섹션은 이 주제에 대한 흥미로운 기사로의 연결을 제공한다. 끝으로, Linux와 ZFS는 최첨단 기술이며, 이를 따로 떼어 놓기는 어려울 것이다.


참고자료

교육

제품 및 기술 얻기

  • 자신에게 가장한 적합한 방법으로 IBM 제품을 평가해 보자. 시험판 제품을 다운로드하거나, 온라인으로 제품을 사용해 보거나, 클라우드 환경에서 제품을 사용하거나, SOA Sandbox에서 SOA(Service Oriented Architecture)를 효과적으로 구현하는 방법을 배울 수 있다.

토론

  • developerWorks community에 참여한다. 개발자가 운영하고 있는 블로그, 포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.

필자소개

M. Tim Jones는 임베디드 펌웨어 아키텍트이자 Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming(2판이 나왔다), AI Application Programming(2판이 나왔다), BSD Sockets Programming from a Multilanguage Perspective의 저자이기도 하다. Jones의 공학 배경은 정지 위성을 위한 커널 개발에서 시작해 임베디드 시스템 아키텍처와 네트워크 프로토콜 개발에 이르기까지 다양한 분야를 아우른다. Jones는 콜로라도 주, 롱몬트 소재 Emulex 사에서 컨설턴트 엔지니어로 활약한다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=리눅스
ArticleID=681314
ArticleTitle=Linux에서 ZFS 실행
publish-date=06172011
author1-email=mtj@mtjones.com
author1-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.