"ZFS Fun"의 두 판 사이의 차이

Gentoo Korea Wiki
둘러보기로 가기 검색하러 가기
 
87번째 줄: 87번째 줄:
 
Synchronous write 성능을 개선하려면 ZIL(ZFS Intent Log) device를 pool에 추가한다. ZIL device는 현재 pool을 구성하는 저장장치보다 빠른 저장장치일때 의미가 있다.
 
Synchronous write 성능을 개선하려면 ZIL(ZFS Intent Log) device를 pool에 추가한다. ZIL device는 현재 pool을 구성하는 저장장치보다 빠른 저장장치일때 의미가 있다.
 
<pre>
 
<pre>
# zpool add -o ashift=12 [-f] log <vdev>
+
# zpool add [-n] [-o ashift=12] [-f] log <vdev>
 
</pre>
 
</pre>
  

2014년 3월 16일 (일) 14:12 기준 최신판

주의 및 한계

주의: 이 가이드는 작성이 완료되지 않았다. 따라서 많은 내용이 변동 될 수 있다.

ZFS는 현재 최신 커널, 버전 3.13.6에 filesystem 옵션으로 포함되어있지 않다. 또한 현재 작성하는 시점에서 젠투 공식 포티지트리에서 배포되는 ebuild 스크립트로 커널 3.13.x 버전의 커널모듈을 빌드할 수 없다.

ZFS는 64비트 시스템을 염두하고 설계되었다. 따라서 32비트 플랫폼에서는 정상적으로 작동하지 않을 수 있다. 또한 RAM 2GB 미만의 저사양 컴퓨터에서는 시스템 전체적으로 심각한 성능저하를 가져올 수 있다.

문서 타이틀에서 알수 있듯이, 재미를 목적으로 작성되었고 따라서 안정적인 서비스 운용을 보장하지 않는다.

설치

다음 설치과정은 [3.13.x 버전의 커널에서 ZFS를 사용하고 싶다] 또한 [ZFS 커널모듈 소스를 리눅스 소스트리에 이식해서, ZFS를 built-in 커널모듈로 사용하고 싶다]를 가정했다.

리눅스 소스 설정

먼저 리눅스 소스부터 설치한다.

# emerge -av vanilla-sources
# eselect kernel list
# cd /usr/src/linux
# grep CRYPTO_DEFLATE=y arch/x86/configs/x86_64_defconfig || \
echo CONFIG_CRYPTO_DEFLATE=y >>arch/x86/configs/x86_64_defconfig
# grep DEVTMPFS=y arch/x86/configs/x86_64_defconfig || \
echo CONFIG_DEVTMPFS=y >>arch/x86/configs/x86_64_defconfig
# make x86_64_defconfig
# make scripts prepare
주의: 리눅스 소스빌드 변수 KBUILD_OUTPUT의 기본값을 사용하지 않는다면 다음 과정을 성공적으로 마칠 수 없다.

ZFS 소스이식

이제 ZFS 커널모듈 소스를 리눅스 소스트리에 이식하고, ZFS 유틸리티를 설치한다.

# echo ACCEPT_KEYWORDS=\"\~amd64\" >>/etc/portage/make.conf
# echo =sys-fs/zfs-9999 \*\* >>/etc/portage/package.accept_keywords
# echo =sys-fs/zfs-kmod-9999 \*\* >>/etc/portage/package.accept_keywords
# echo =sys-kernel/spl-9999 \*\* >>/etc/portage/package.accept_keywords
# echo sys-fs/zfs-kmod rootfs >>/etc/portage/package.use
# echo sys-fs/zfs rootfs kernel-builtin >>/etc/portage/package.use
# env EXTRA_ECONF='--enable-linux-builtin --with-linux=/usr/src/linux' \
ebuild /usr/portage/sys-kernel/spl/spl-9999.ebuild clean configure
# (cd /var/tmp/portage/sys-kernel/spl-9999/work/spl-9999 && ./copy-builtin /usr/src/linux)
# env EXTRA_ECONF='--enable-linux-builtin --with-linux=/usr/src/linux --with-spl=/usr/src/linux' \
ebuild /usr/portage/sys-fs/zfs-kmod/zfs-kmod-9999.ebuild clean configure
# (cd /var/tmp/portage/sys-fs/zfs-kmod-9999/work/zfs-kmod-9999 && ./copy-builtin /usr/src/linux)
# emerge -1av =sys-fs/zfs-9999

9999의 불안전성이 불안하다면 [1]를 참고한다. 그런다 해도 현재 포티지트리에 등록된 ZFS 버전 전부가 unstable하기 때문에 ZFS를 사용하고 싶다면 ACCEPT_KEYWORDS에 ~amd64는 필요하다.

리눅스 빌드 및 initramfs

테스트

kexec을 사용하면 현재 실행중인 커널위에서 새로운 커널을 로드할 수 있다.

# kexec -l /boot/vmlinuz-3.13.6-LOCALVERSION --initrd=/boot/initramfs-genkernel-x86_64-3.13.6-LOCALVERSION --append="real_root=ZFS=rpool/ROOT/funtoo"
# kexec -e

또한 ZFS/커널 디버깅을 안전하고, 효율적으로 하려한다면 rpool/ROOT/funtoo와 별도의 파일시스템 rpool/ROOT/funtoox를 만들어서 작업하는 시나리오를 세울 수 있다. rpool/FUNTOO/portage fs와 그 descendent는 rpool/ROOT의 descendent와 별개로, 공유해서 사용해도 무방하다.

디스크 편집

ZVOL

흔히 ZFS를 소개하는 문서에서 ZFS는 파일시스템과 볼륨매니저가 통합되어 있다고 말한다. ZVOL이란 ZFS에서 제공하는 볼륨매니저가 관리하는 볼륨을 가리킨다고 할 수 있다. 따라서 ZFS에 내장된 ZVOL-layer는 LVM을 대체할 수 있다. 참고로 작성자는 LVM을 한번도 사용해 본 적이 없고, 오래된 문서를 통해서만 접할 수 있었다. ZFS 명령 한줄이 달성할 수 있는 내용에서 LVM은 보통 6-7줄 가량을 소요했다.

ZVOL을 생성하는 것은 보통 ZPOOL에 ZFS를 만들던 때 처럼 zfs command를 사용한다.

# zfs create -V 10G pool/ext4

따라서 ZFS에 발을 들여놨다면, 더 이상 LVM은 시스템 상에서 필요하지 않다.

# rc-update del lvm boot

ZVOL-layer를 통해 블록수준의 장치를 유연하게 제작할 수 있고, 따라서 virtual machine의 스토리지 병목현상을 해소할 수 있다.

IO 성능

zpool io 상황을 확인한다.

# zpool iostat [-v] pool [INTERVAL(sec)]

Synchronous write 성능을 개선하려면 ZIL(ZFS Intent Log) device를 pool에 추가한다. ZIL device는 현재 pool을 구성하는 저장장치보다 빠른 저장장치일때 의미가 있다.

# zpool add [-n] [-o ashift=12] [-f] log <vdev>

pool에 존재하는 vdev 구성을 편집하는것은 신중을 기해야하므로 가급적 -n 옵션을 첨가하여, zfs 명령 전후의 차이를 미리 확인해가면서 작업하는 것이 안전한다.

ZFS L2ARC(Level 2 Adjustable Replacement Cache)를 추가하면 pool의 읽기성능을 개선할 수 있다. ZFS L2ARC의 캐싱 알고리듬은 다른 많은 문서에서 자세하게 기술되어있다.

# zpool add cache <vdev>

ZPOOL version 18 이후부터는 ZIL removal 기능이 추가되었다. ZIL과 ZFS L2ARC device를 pool에서 제거하려면 zpool remove 명령을 사용한다.

참고문서