ZFS Fun

Gentoo Korea Wiki
둘러보기로 가기 검색하러 가기

주의 및 한계

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

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 명령을 사용한다.

참고문서