ZFS Fun
목차
주의 및 한계
주의: | 이 가이드는 작성이 완료되지 않았다. 따라서 많은 내용이 변동 될 수 있다. |
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 -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 명령을 사용한다.
참고문서
- http://www.funtoo.org/ZFS_Install_Guide 이 곳에 ZFS root 설치전반을 설명하는 동영상이 있다.
- http://www.funtoo.org/ZFS_Fun