CentOS 6 の root ファイルシステムに ZFS を使ってみた
しかし、当時は、実験的にやってみた程度であり、作成した環境を常用することはありませんでした。一番のネックは、カーネルや ZFS 自身をアップデートする際に、運用手順が煩雑となることでした。
最近になって、CentOS 7 および CentOS 6 向けに kmod-zfs が提供されるようになり、以前よりも運用し易くなったと考えられるので、常設環境を作ってみることにしました。
幸い、先人の方が、CentOS 7 向けの手順をまとめてくれており、こちらを参考にしています。
前回は、CentOS 6 向けの GRUB1 が、ZFS を直接扱えないので、/boot (fsはext4) を別パーティションにしていました。
今回は、ZFS にも対応している CentOS 7 の GRUB2 を使って、直接 ZFS 上の CentOS 6 カーネルを起動する構成にしてみました。
マシンは ThinkPad W520 で、セカンドハードディスクベイに SSD (Crucial MX200) を増設して、次のような構成になっています。
[root@hoge ~]# fdisk -l /dev/sd[ab] Disk /dev/sda: 500.1 GB, 500107862016 bytes, 976773168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk label type: dos Disk identifier: 0x153c11d0 Device Boot Start End Blocks Id System /dev/sda1 2048 3074047 1536000 7 HPFS/NTFS/exFAT ※この3つは Windows 環境 /dev/sda2 3074048 101378047 49152000 7 HPFS/NTFS/exFAT /dev/sda3 101378048 134146047 16384000 7 HPFS/NTFS/exFAT /dev/sda4 134146048 976773167 421313560 5 Extended /dev/sda5 134148096 175108095 20480000 83 Linux ※CentOS 7 をインストール済み(Btrfs ミラー) /dev/sda6 207878144 248838143 20480000 83 Linux ※CentOS 6 を ext4 にインストール済み Disk /dev/sdb: 500.1 GB, 500107862016 bytes, 976773168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk label type: dos Disk identifier: 0x869474c7 Device Boot Start End Blocks Id System /dev/sdb1 * 2048 3074047 1536000 7 HPFS/NTFS/exFAT ※この3つは Windows 環境 /dev/sdb2 3074048 101378047 49152000 7 HPFS/NTFS/exFAT /dev/sdb3 101378048 134146047 16384000 7 HPFS/NTFS/exFAT /dev/sdb4 134146048 976773167 421313560 5 Extended /dev/sdb5 134148096 175108095 20480000 83 Linux ※CentOS 7 の Btrfs ミラー /dev/sdb6 175110144 207878143 16384000 83 Linux ※空き、ここに CentOS 6 + ZFS を作成
まず、CentOS 7 および CentOS 6 に、この時点で最新の kmod-zfs-0.6.5.7-1 を、それぞれインストールします。
kmod-zfs のインストール方法は、こちらを参照。
ここで、CentOS 7 には、zfs-dracut をインストールして、
CentOS 6 には、zfs-dracut をインストールしないようにします。
次に、CentOS 7 環境から sdb6 に rpool を作成しました。このとき、GRUB2 が非対応の feature フラグを避ける必要があります。
[root@cent7 ~]# zpool create -d -o feature@async_destroy=enabled -o feature@empty_bpobj=enabled \ -o feature@lz4_compress=enabled -o ashift=12 -O compression=lz4 rpool /dev/sdb6 [root@cent7 ~]# zfs create rpool/ROOT [root@cent7 ~]# cd /rpool/ROOT [root@cent7 ROOT]# dump -0uf - /dev/sda6 | restore -rf - ※CentOS 6 環境を rpool/ROOT へコピー [root@cent7 ROOT]# rpm -ql zfs-dracut /usr/lib/dracut/modules.d/90zfs /usr/lib/dracut/modules.d/90zfs/export-zfs.sh /usr/lib/dracut/modules.d/90zfs/module-setup.sh /usr/lib/dracut/modules.d/90zfs/mount-zfs.sh /usr/lib/dracut/modules.d/90zfs/parse-zfs.sh /usr/lib/dracut/modules.d/90zfs/zfs-lib.sh ※これらをコピー /usr/share/doc/zfs-dracut-0.6.5.7 /usr/share/doc/zfs-dracut-0.6.5.7/README.dracut.markdown [root@cent7 ROOT]# cp -r /usr/lib/dracut/modules.d/90zfs ./usr/share/dracut/modules.d [root@cent7 ROOT]# cd [root@cent7 ~]# zfs set mountpoint=legacy rpool/ROOT [root@cent7 ~]# zpool export rpoolこのあと、sda6 上の CentOS 6 に起動しなおして、rpool を import して、作業を行います。
[root@cent6 ~]# zpool import rpool [root@cent6 ~]# mkdir /mnt_rpool_ROOT [root@cent6 ~]# mount -t zfs rpool/ROOT /mnt_rpool_ROOT [root@cent6 ~]# cd /mnt_rpool_ROOT/usr/share/dracut/modules.d/90zfs/ [root@cent6 90zfs]# cp module-setup.sh check [root@cent6 90zfs]# cp module-setup.sh install以前書いた記事と同様ですが、コピーしたスクリプトをちょっと加工します。差分は次の通りです。
--- module-setup.sh 2016-06-21 01:45:30.846098657 +0900 +++ check 2016-06-21 01:44:42.865095421 +0900 @@ -59,3 +59,5 @@ DD=`hostid | cut -b 7,8` printf "\x${DD}\x${CC}\x${BB}\x${AA}" > "${initdir}/etc/hostid" } + +check
--- module-setup.sh 2016-06-21 01:45:30.846098657 +0900 +++ install 2016-06-21 01:45:07.471099948 +0900 @@ -59,3 +59,5 @@ DD=`hostid | cut -b 7,8` printf "\x${DD}\x${CC}\x${BB}\x${AA}" > "${initdir}/etc/hostid" } + +install次に、3つのスクリプト zfs-lib.sh と parse-zfs.sh と module-setup.sh に修正を加えます。
--- ./zfs-lib.sh.org 2016-05-13 12:19:59.000000000 +0900 +++ ./zfs-lib.sh 2016-06-21 01:34:14.991037019 +0900 @@ -6,6 +6,22 @@ NEWLINE=" " +# copied from Fedora19's /usr/lib/dracut/modules.d/99base/dracut-lib.sh +getargbool() { + local _b + unset _b + local _default + _default=$1; shift + _b=$(getarg "$@") + [ $? -ne 0 -a -z "$_b" ] && _b=$_default + if [ -n "$_b" ]; then + [ $_b = "0" ] && return 1 + [ $_b = "no" ] && return 1 + [ $_b = "off" ] && return 1 + fi + return 0 +} + ZPOOL_IMPORT_OPTS="" if getargbool 0 zfs_force -y zfs.force -y zfsforce ; then warn "ZFS: Will force-import pools if necessary."
--- ./parse-zfs.sh.org 2016-05-13 12:19:59.000000000 +0900 +++ ./parse-zfs.sh 2016-06-21 01:36:26.200528591 +0900 @@ -55,5 +55,6 @@ # modules to settle before mounting. if [ ${wait_for_zfs} -eq 1 ]; then ln -s /dev/null /dev/root 2>/dev/null - echo '[ -e /dev/zfs ]' > "${hookdir}/initqueue/finished/zfs.sh" +# echo '[ -e /dev/zfs ]' > "${hookdir}/initqueue/finished/zfs.sh" + echo '[ -e /dev/zfs ]' > "/initqueue-finished/zfs.sh" fi
--- ./module-setup.sh.org 2016-05-13 12:19:59.000000000 +0900 +++ ./module-setup.sh 2016-06-21 01:45:30.846098657 +0900 @@ -28,20 +28,20 @@ } install() { - inst_rules /usr/lib/udev/rules.d/90-zfs.rules - inst_rules /usr/lib/udev/rules.d/69-vdev.rules - inst_rules /usr/lib/udev/rules.d/60-zvol.rules + inst_rules /lib/udev/rules.d/90-zfs.rules + inst_rules /lib/udev/rules.d/69-vdev.rules + inst_rules /lib/udev/rules.d/60-zvol.rules dracut_install /sbin/zfs dracut_install /sbin/zpool - dracut_install /usr/lib/udev/vdev_id - dracut_install /usr/lib/udev/zvol_id + dracut_install /lib/udev/vdev_id + dracut_install /lib/udev/zvol_id dracut_install mount.zfs dracut_install hostid dracut_install awk dracut_install head inst_hook cmdline 95 "${moddir}/parse-zfs.sh" inst_hook mount 98 "${moddir}/mount-zfs.sh" - inst_hook shutdown 30 "${moddir}/export-zfs.sh" +# inst_hook shutdown 30 "${moddir}/export-zfs.sh" inst_simple "${moddir}/zfs-lib.sh" "/lib/dracut-zfs-lib.sh" if [ -e /etc/zfs/zpool.cache ]; thenさらに、/mnt_rpool_ROOT/etc/fstab を次のように書き換えます。
#UUID=xxxxxxxx-yyyy-zzzz-uuuu-vvvvvvvvvvvv / ext4 defaults 1 1 rpool/ROOT / zfs defaults 1 0ここで、initramfs を再作成します。
[root@cent6 90zfs]# cd [root@cent6 ~]# mount -t devtmpfs devtmpfs /mnt_rpool_ROOT/dev [root@cent6 ~]# mount -t devpts devpts /mnt_rpool_ROOT/dev/pts [root@cent6 ~]# mount -t sysfs sysfs /mnt_rpool_ROOT/sys [root@cent6 ~]# mount -t proc proc /mnt_rpool_ROOT/proc [root@cent6 ~]# chroot /mnt_rpool_ROOT /bin/bash [root@cent6 /]# dracut -f /boot/initramfs-2.6.32-642.1.1.el6.x86_64.img 2.6.32-642.1.1.el6.x86_64このあと、GRUB2 に CentOS 6 向けの起動エントリーを追加する必要があるので、CentOS 7 に切り替えます。
[root@cent6 /]# exit exit [root@cent6 ~]# umount /mnt_rpool_ROOT/proc [root@cent6 ~]# umount /mnt_rpool_ROOT/sys [root@cent6 ~]# umount /mnt_rpool_ROOT/dev/pts [root@cent6 ~]# umount /mnt_rpool_ROOT/dev [root@cent6 ~]# umount /mnt_rpool_ROOT [root@cent6 ~]# zpool export rpoot [root@cent6 ~]# shutdown -r now/etc/grub.d/40_custom を編集して、次のようなエントリーを作成します。
#!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. menuentry 'CentOS 6 on ZFS' --class red --class gnu-linux --class gnu --class os $menuentry_id_option 'CentOS 6 on ZFS' { load_video insmod gzio insmod part_msdos insmod zfs set root='hd1,msdos6' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --label --set=root --hint='hd1,msdos6' rpool else search --no-floppy --label --set=root rpool fi linux16 /ROOT@/boot/vmlinuz-2.6.32-642.1.1.el6.x86_64 ro root=ZFS=rpool/ROOT rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=jp106 rd_NO_LVM rd_NO_DM elevator=deadline nouveau.modeset=0 rdblacklist=nouveau initrd16 /ROOT@/boot/initramfs-2.6.32-642.1.1.el6.x86_64.img }最後に、grub.cfg を更新します。
[root@cent7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-327.18.2.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-327.18.2.el7.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-327.13.1.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-327.13.1.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-17561ed66271e2f6923ff3c901624b3a Found initrd image: /boot/initramfs-0-rescue-17561ed66271e2f6923ff3c901624b3a.img Found memtest image: /boot/elf-memtest86+-4.20 doneリブートして CentOS 6 on ZFS エントリーを起動した状態です。
[root@cent6 ~]# date Tue Jun 28 01:11:19 JST 2016 [root@cent6 ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on rpool/ROOT zfs 16G 5.0G 11G 33% / tmpfs tmpfs 7.8G 76K 7.8G 1% /dev/shm rpool zfs 11G 128K 11G 1% /rpool [root@cent6 ~]# uname -r 2.6.32-642.1.1.el6.x86_64 [root@cent6 ~]# zpool status pool: rpool state: ONLINE status: Some supported features are not enabled on the pool. The pool can still be used, but some features are unavailable. action: Enable all features using 'zpool upgrade'. Once this is done, the pool may no longer be accessible by software that does not support the features. See zpool-features(5) for details. scan: scrub repaired 0 in 0h0m with 0 errors on Tue Jun 21 03:54:22 2016 config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 ata-Crucial_CT500MX200SSD3_xxxxxxxxxxxx-part6 ONLINE 0 0 0 errors: No known data errors
2016-06-30追記 (kdump 設定方法)
何か異常が発生した場合に、kdump を採取できるようにしておきたいと思ったのですが、ZFS の考慮などあるはずもなく、クイックハックしてみました。
まず、zvol を使って、ext4 にダンプ出力すれば良いだろうと考え、rpool/kdump を用意しました。
[root@hoge ~]# zfs create -s -V 8g rpool/kdump [root@hoge ~]# mkfs -t ext4 /dev/rpool/kdump [root@hoge ~]# tune2fs -i 0 /dev/rpool/kdump [root@hoge ~]# tune2fs -c 0 /dev/rpool/kdump [root@hoge ~]# tune2fs -l /dev/rpool/kdump | egrep "^(Max|Check)" Maximum mount count: -1 Check interval: 0 (<none>) [root@hoge ~]# blkid /dev/rpool/kdump /dev/rpool/kdump: UUID="a108ed6c-787d-40ff-9971-7db60962ebff" TYPE="ext4" [root@hoge ~]# vi /etc/fstab ... [root@hoge ~]# grep /var/crash /etc/fstab UUID=a108ed6c-787d-40ff-9971-7db60962ebff /var/crash ext4 defaults,discard 1 1 [root@hoge ~]# mount /var/crash [root@hoge ~]# mount | grep /var/crash /dev/zd0 on /var/crash type ext4 (rw,discard) [root@hoge ~]# df -hT /var/crash Filesystem Type Size Used Avail Use% Mounted on /dev/zd0 ext4 7.8G 18M 7.4G 1% /var/crashこれで、/etc/kdump.conf に次のように指定すれば、kdump サービスが起動するようになりました。
[root@hoge ~]# cat /etc/kdump.conf ext4 UUID=a108ed6c-787d-40ff-9971-7db60962ebff path / core_collector makedumpfile -l --message-level 23 -d 31 [root@hoge ~]# service kdump restart Stopping kdump: [ OK ] Detected change(s) the following file(s): /etc/kdump.conf Rebuilding /boot/initrd-2.6.32-642.1.1.el6.x86_64kdump.img Warning: There might not be enough space to save a vmcore. The size of UUID=a108ed6c-787d-40ff-9971-7db60962ebff should be greater than 16157076 kilo bytes. Starting kdump: [ OK ]しかしながら、この設定だけでは、セカンドカーネルが動作する際、zpool import などの ZFS を考慮する処理が不足しているため、ダンプ採取できませんでした。
「鳴かぬなら、鳴かしてみせよう、ホトトギス」っと、自分で kdump_pre を用意しました。
#! /sbin/busybox msh #modprobe zfs mknod /dev/zfs c `awk -F: '{print $1,$2}' /sys/devices/virtual/misc/zfs/dev` zpool import -f rpool sleep 3 #2016-07-16追記、sysfs エントリーが作成されるまで少し待たないと mknod が失敗する場合がある for D in `cd /sys/block ; echo zd*` do mknod /dev/$D b `awk -F: '{print $1,$2}' /sys/block/$D/dev` done exit 0必要なデバイス(/dev/zfs, /dev/zd0)を作成するため、sysfs から major:minor 番号を拾ってきています。
[root@hoge ~]# ls -l /root/bin/kdump-pre.sh -rwxr-xr-x 1 root root 246 Jun 29 07:21 /root/bin/kdump-pre.sh [root@hoge ~]# cat /etc/kdump.conf extra_bins /sbin/fsck.zfs /sbin/mount.zfs /sbin/zfs /sbin/zpool kdump_pre /root/bin/kdump-pre.sh ext4 UUID=a108ed6c-787d-40ff-9971-7db60962ebff path / core_collector makedumpfile -l --message-level 23 -d 31 blacklist nvidia ipv6 kvm e1000e [root@hoge ~]# service kdump restart Stopping kdump: [ OK ] Detected change(s) the following file(s): /etc/kdump.conf Rebuilding /boot/initrd-2.6.32-642.1.1.el6.x86_64kdump.img Warning: There might not be enough space to save a vmcore. The size of UUID=a108ed6c-787d-40ff-9971-7db60962ebff should be greater than 16157076 kilo bytes. Starting kdump: [ OK ] [root@hoge ~]#視点を変えて、セカンドカーネル環境では使えるメモリが少ない (わたしの ThinkPad では crashkernel=256M を指定) ので、ZFS のメモリ使用量を抑えるため、primarycache を none に設定しました。また、ダンプの圧縮は makedumpfile -l (LZO圧縮) を利用し、ZFS の圧縮は off にしました。
[root@hoge ~]# egrep -o crashkernel=...M /proc/cmdline crashkernel=256M [root@hoge ~]# zfs set primarycache=none rpool/kdump [root@hoge ~]# zfs set compression=off rpool/kdump [root@hoge ~]# zfs get all -s local NAME PROPERTY VALUE SOURCE rpool compression lz4 local rpool/ROOT mountpoint legacy local rpool/kdump volsize 8G local rpool/kdump compression off local rpool/kdump primarycache none localこれで、ダンプ採取 (echo c > /proc/sysrq-trigger でテスト) できました。所要時間は 2 分程度です。なお、メインメモリは 16G です。
[root@hoge ~]# ls -l /var/crash/ total 20 drwxr-xr-x 2 root root 4096 Jun 30 23:11 127.0.0.1-2016-06-30-23:09:50 drwx------ 2 root root 16384 Jun 29 05:19 lost+found [root@hoge ~]# ls -l --full-time /var/crash/127.0.0.1-2016-06-30-23\:09\:50/vmcore* -rw------- 1 root root 589946534 2016-06-30 23:11:50.981999996 +0900 /var/crash/127.0.0.1-2016-06-30-23:09:50/vmcore -rw-r--r-- 1 root root 62643 2016-06-30 23:09:51.006000001 +0900 /var/crash/127.0.0.1-2016-06-30-23:09:50/vmcore-dmesg.txt [root@hoge ~]# free -oom total used free shared buffers cached Mem: 15778 2300 13478 4 0 295 Swap: 0 0 0 [root@hoge ~]# df -h /var/crash Filesystem Size Used Avail Use% Mounted on /dev/zd0 7.8G 612M 6.8G 9% /var/crash [root@hoge ~]# zfs get compressratio NAME PROPERTY VALUE SOURCE rpool compressratio 1.56x - rpool/ROOT compressratio 1.65x - rpool/kdump compressratio 1.00x -
2016-07-03追記
kdump は採取できるようになったものの、ダンプ採取後に立ち上がってくると、次のように見えることがわかりました。
[root@hoge ~]# zpool status pool: rpool state: ONLINE status: Some supported features are not enabled on the pool. The pool can still be used, but some features are unavailable. action: Enable all features using 'zpool upgrade'. Once this is done, the pool may no longer be accessible by software that does not support the features. See zpool-features(5) for details. scan: scrub repaired 0 in 0h0m with 0 errors on Wed Jun 29 08:06:37 2016 config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 sdb6 ONLINE 0 0 0 errors: No known data errorsこれを直す方法を探ってみたところ、dracut のマニュアルに rdbreak=pre-mount というのがあり、これを指定して起動すると、rpool/ROOT がマウントされる直前で止めることができるようです。起動中断したところで、次のように import することで、元に戻りました。
# zpool import -d /dev/disk/by-id/ rpool
[root@hoge ~]# zpool status pool: rpool state: ONLINE status: Some supported features are not enabled on the pool. The pool can still be used, but some features are unavailable. action: Enable all features using 'zpool upgrade'. Once this is done, the pool may no longer be accessible by software that does not support the features. See zpool-features(5) for details. scan: scrub repaired 0 in 0h0m with 0 errors on Wed Jun 29 08:06:37 2016 config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 ata-Crucial_CT500MX200SSD3-xxxxxxxxxxxx-part6 ONLINE 0 0 0 errors: No known data errors
2016-07-23追記
[root@hoge ~]# grep ZPOOL_IMPORT_OPTS= /usr/share/dracut/modules.d/90zfs/zfs-lib.sh ZPOOL_IMPORT_OPTS="-d /dev/disk/by-id"90zfs/zfs-lib.sh をこのように修正(-d /dev/disk/by-id オプションを追加)して initramfs を再作成すれば、kdump 採取後にデバイスパスが sdb6 になってしまう現象を回避できました。
2016-07-24追記 (mirror 化)
一ヶ月ほど使用して、途中でカーネルアップデート (2.6.32-642.1.1.el6から2.6.32-642.3.1.el6) も問題なく実施できたので、最後に mirror 化を行いました。
[root@hoge ~]# zpool attach rpool ata-Crucial_CT500MX200SSD3_xxxxxxxxxxxx-part6 ata-Crucial_CT500MX200SSD3_yyyyyyyyyyyy-part6 [root@hoge ~]# zpool status pool: rpool state: ONLINE status: Some supported features are not enabled on the pool. The pool can still be used, but some features are unavailable. action: Enable all features using 'zpool upgrade'. Once this is done, the pool may no longer be accessible by software that does not support the features. See zpool-features(5) for details. scan: resilvered 9.64G in 0h11m with 0 errors on Sat Jul 23 18:49:15 2016 config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-Crucial_CT500MX200SSD3_xxxxxxxxxxxx-part6 ONLINE 0 0 0 ata-Crucial_CT500MX200SSD3_yyyyyyyyyyyy-part6 ONLINE 0 0 0 errors: No known data errors
2016-09-19追記 (zfs v0.6.5.8 へアップデート)
/ に ZFS を使った環境で、初めての ZFS アップデート(kmod-zfs v0.6.5.7 から v0.6.5.8)。
理論上は大丈夫なはずと思いましたが、利点を生かして snapshot を作成してからアップデート実行しました。
[root@hoge ~]# zfs snapshot rpool/ROOT@2016-09-19-1809 [root@hoge ~]# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT rpool/ROOT@2016-08-02-1052 105M - 4.91G - rpool/ROOT@2016-09-02-0541 55.7M - 4.90G - rpool/ROOT@2016-09-19-1809 0 - 4.89G - [root@hoge ~]# yum update --enablerepo=zfs Loaded plugins: fastestmirror, nvidia, priorities, refresh-packagekit, security Setting up Update Process Loading mirror speeds from cached hostfile * base: ftp.riken.jp * extras: ftp.riken.jp * updates: ftp.riken.jp Resolving Dependencies --> Running transaction check ---> Package kmod-spl.x86_64 0:0.6.5.7-1.el6 will be updated ---> Package kmod-spl.x86_64 0:0.6.5.8-1.el6 will be an update ---> Package kmod-zfs.x86_64 0:0.6.5.7-1.el6 will be updated ---> Package kmod-zfs.x86_64 0:0.6.5.8-1.el6 will be an update ---> Package libnvpair1.x86_64 0:0.6.5.7-1.el6 will be updated ---> Package libnvpair1.x86_64 0:0.6.5.8-1.el6 will be an update ---> Package libuutil1.x86_64 0:0.6.5.7-1.el6 will be updated ---> Package libuutil1.x86_64 0:0.6.5.8-1.el6 will be an update ---> Package libzfs2.x86_64 0:0.6.5.7-1.el6 will be updated ---> Package libzfs2.x86_64 0:0.6.5.8-1.el6 will be an update ---> Package libzpool2.x86_64 0:0.6.5.7-1.el6 will be updated ---> Package libzpool2.x86_64 0:0.6.5.8-1.el6 will be an update ---> Package spl.x86_64 0:0.6.5.7-1.el6 will be updated ---> Package spl.x86_64 0:0.6.5.8-1.el6 will be an update ---> Package zfs.x86_64 0:0.6.5.7-1.el6 will be updated ---> Package zfs.x86_64 0:0.6.5.8-1.el6 will be an update --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Updating: kmod-spl x86_64 0.6.5.8-1.el6 zfs 111 k kmod-zfs x86_64 0.6.5.8-1.el6 zfs 636 k libnvpair1 x86_64 0.6.5.8-1.el6 zfs 33 k libuutil1 x86_64 0.6.5.8-1.el6 zfs 38 k libzfs2 x86_64 0.6.5.8-1.el6 zfs 119 k libzpool2 x86_64 0.6.5.8-1.el6 zfs 408 k spl x86_64 0.6.5.8-1.el6 zfs 27 k zfs x86_64 0.6.5.8-1.el6 zfs 330 k Transaction Summary ================================================================================ Upgrade 8 Package(s) Total download size: 1.7 M Is this ok [y/N]: y Downloading Packages: (1/8): kmod-spl-0.6.5.8-1.el6.x86_64.rpm | 111 kB 00:00 (2/8): kmod-zfs-0.6.5.8-1.el6.x86_64.rpm | 636 kB 00:00 (3/8): libnvpair1-0.6.5.8-1.el6.x86_64.rpm | 33 kB 00:00 (4/8): libuutil1-0.6.5.8-1.el6.x86_64.rpm | 38 kB 00:00 (5/8): libzfs2-0.6.5.8-1.el6.x86_64.rpm | 119 kB 00:00 (6/8): libzpool2-0.6.5.8-1.el6.x86_64.rpm | 408 kB 00:00 (7/8): spl-0.6.5.8-1.el6.x86_64.rpm | 27 kB 00:00 (8/8): zfs-0.6.5.8-1.el6.x86_64.rpm | 330 kB 00:00 -------------------------------------------------------------------------------- Total 456 kB/s | 1.7 MB 00:03 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Updating : libuutil1-0.6.5.8-1.el6.x86_64 1/16 Updating : libnvpair1-0.6.5.8-1.el6.x86_64 2/16 Updating : libzpool2-0.6.5.8-1.el6.x86_64 3/16 Updating : kmod-spl-0.6.5.8-1.el6.x86_64 4/16 Updating : spl-0.6.5.8-1.el6.x86_64 5/16 Updating : libzfs2-0.6.5.8-1.el6.x86_64 6/16 Updating : kmod-zfs-0.6.5.8-1.el6.x86_64 7/16 Updating : zfs-0.6.5.8-1.el6.x86_64 8/16 Cleanup : kmod-zfs-0.6.5.7-1.el6.x86_64 9/16 Cleanup : zfs-0.6.5.7-1.el6.x86_64 10/16 Cleanup : libzfs2-0.6.5.7-1.el6.x86_64 11/16 Cleanup : libzpool2-0.6.5.7-1.el6.x86_64 12/16 Cleanup : libnvpair1-0.6.5.7-1.el6.x86_64 13/16 Cleanup : spl-0.6.5.7-1.el6.x86_64 14/16 Cleanup : kmod-spl-0.6.5.7-1.el6.x86_64 15/16 Cleanup : libuutil1-0.6.5.7-1.el6.x86_64 16/16 Verifying : libnvpair1-0.6.5.8-1.el6.x86_64 1/16 Verifying : libzfs2-0.6.5.8-1.el6.x86_64 2/16 Verifying : zfs-0.6.5.8-1.el6.x86_64 3/16 Verifying : spl-0.6.5.8-1.el6.x86_64 4/16 Verifying : kmod-zfs-0.6.5.8-1.el6.x86_64 5/16 Verifying : libuutil1-0.6.5.8-1.el6.x86_64 6/16 Verifying : libzpool2-0.6.5.8-1.el6.x86_64 7/16 Verifying : kmod-spl-0.6.5.8-1.el6.x86_64 8/16 Verifying : kmod-zfs-0.6.5.7-1.el6.x86_64 9/16 Verifying : spl-0.6.5.7-1.el6.x86_64 10/16 Verifying : libzpool2-0.6.5.7-1.el6.x86_64 11/16 Verifying : zfs-0.6.5.7-1.el6.x86_64 12/16 Verifying : libzfs2-0.6.5.7-1.el6.x86_64 13/16 Verifying : libnvpair1-0.6.5.7-1.el6.x86_64 14/16 Verifying : kmod-spl-0.6.5.7-1.el6.x86_64 15/16 Verifying : libuutil1-0.6.5.7-1.el6.x86_64 16/16 Updated: kmod-spl.x86_64 0:0.6.5.8-1.el6 kmod-zfs.x86_64 0:0.6.5.8-1.el6 libnvpair1.x86_64 0:0.6.5.8-1.el6 libuutil1.x86_64 0:0.6.5.8-1.el6 libzfs2.x86_64 0:0.6.5.8-1.el6 libzpool2.x86_64 0:0.6.5.8-1.el6 spl.x86_64 0:0.6.5.8-1.el6 zfs.x86_64 0:0.6.5.8-1.el6 Complete! [root@hoge ~]#カーネルアップデートとは少し異なり、既存環境のinitramfs再作成が行われたので、少し時間かかりました。
[root@hoge ~]# ls -l /boot/initramfs-2.6.32-* -rw------- 1 root root 21810840 Sep 19 18:11 /boot/initramfs-2.6.32-573.22.1.el6.x86_64.img -rw------- 1 root root 22336843 Sep 19 18:12 /boot/initramfs-2.6.32-642.4.2.el6.x86_64.imgその後、再起動して、問題なく立ち上がりました。
2017-04-06追記 (カーネルを CentOS 6.9 kernel-2.6.32-696.el6.x86_64 へアップデート・・・起動できず)
CentOS 6.9 が出たようで、なんともなしにカーネルを最新化してみたのですが、起動できませんでした。
旧カーネル 642.15.1.el6 で再起動して調べてみると、initramfs に zfs.ko が入ってませんでした。このため root ファイルシステムをマウントできず、起動できなかったようです。
で、無理矢理 initramfs に zfs.ko を挿入して起動してみたら、posix_acl_equiv_mode というシンボルの解決が出来ず、zfs.ko がロードできないという状況でした。この「posix_acl_equiv_mode」をキーワードに google 検索してみたところ、既にレポートが上がってました。
https://github.com/zfsonlinux/zfs/issues/5930
どうやら kABI 互換が崩れたようです。まあ、そのうち対応版が出るでしょうし、それまでは 642系 で過ごせばよいや。まさか、この blog を見て、マネしてる人は居ないとは思いますが、参考&備忘録でした。
2017-04-27追記
issue#5930 は、既に FIX されていました。報告を上げてくれた人&開発者の方に感謝です。さっそく kmod-zfs をアップデートして、kernel-2.6.32-696.1.1.el6.x86_64 でブートfrom ZFS できました。
2017-07-23追記、zfs-0.7.0-rc5を試したが失敗
Roadmap によると 0.7.0 も、もう一息 (99% complete) になっています。そこで、この環境で 0.7.0-rc5 を試してみたのですが、起動できなくなってしまいました。
[root@cent6 ~]# yum update --enablerepo=zfs-testing-kmod Loaded plugins: fastestmirror, nvidia, priorities, refresh-packagekit, security Setting up Update Process Loading mirror speeds from cached hostfile * base: mirror.0x.sg * extras: mirror.nus.edu.sg * updates: centos.usonyx.net zfs-testing-kmod | 2.9 kB 00:00 zfs-testing-kmod/primary_db | 168 kB 00:00 Resolving Dependencies --> Running transaction check ---> Package kmod-spl.x86_64 0:0.6.5.11-1.el6 will be updated ---> Package kmod-spl.x86_64 0:0.7.0-rc5.el6 will be an update ---> Package kmod-zfs.x86_64 0:0.6.5.11-1.el6 will be updated ---> Package kmod-zfs.x86_64 0:0.7.0-rc5.el6 will be an update ---> Package libnvpair1.x86_64 0:0.6.5.11-1.el6 will be updated ---> Package libnvpair1.x86_64 0:0.7.0-rc5.el6 will be an update ---> Package libuutil1.x86_64 0:0.6.5.11-1.el6 will be updated ---> Package libuutil1.x86_64 0:0.7.0-rc5.el6 will be an update ---> Package libzfs2.x86_64 0:0.6.5.11-1.el6 will be updated ---> Package libzfs2.x86_64 0:0.7.0-rc5.el6 will be an update ---> Package libzpool2.x86_64 0:0.6.5.11-1.el6 will be updated ---> Package libzpool2.x86_64 0:0.7.0-rc5.el6 will be an update ---> Package spl.x86_64 0:0.6.5.11-1.el6 will be updated ---> Package spl.x86_64 0:0.7.0-rc5.el6 will be an update ---> Package zfs.x86_64 0:0.6.5.11-1.el6 will be updated ---> Package zfs.x86_64 0:0.7.0-rc5.el6 will be an update --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Updating: kmod-spl x86_64 0.7.0-rc5.el6 zfs-testing-kmod 108 k kmod-zfs x86_64 0.7.0-rc5.el6 zfs-testing-kmod 804 k libnvpair1 x86_64 0.7.0-rc5.el6 zfs-testing-kmod 26 k libuutil1 x86_64 0.7.0-rc5.el6 zfs-testing-kmod 32 k libzfs2 x86_64 0.7.0-rc5.el6 zfs-testing-kmod 126 k libzpool2 x86_64 0.7.0-rc5.el6 zfs-testing-kmod 544 k spl x86_64 0.7.0-rc5.el6 zfs-testing-kmod 27 k zfs x86_64 0.7.0-rc5.el6 zfs-testing-kmod 402 k Transaction Summary ================================================================================ Upgrade 8 Package(s) Total download size: 2.0 M Is this ok [y/N]: y このあと rpool/ROOT をマウントできずブートできなくなりました。dracut のオプション rdshell で、マウントできないのがなぜか調べてみると、zpool コマンドが segfault になってしまってました。ひとまず、あきらめて zfs rollback しました。
[root@cent7 ~]# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT rpool/ROOT@2017-04-06-1022 891M - 4.82G - rpool/ROOT@2017-06-22-0013 445M - 4.90G - rpool/ROOT@2017-07-23-1841 69.2M - 4.97G - rpool/ROOT@2017-07-23-2123 22.5M - 5.10G - [root@cent7 ~]# zfs rollback rpool/ROOT@2017-07-23-2123rollback は、デュアルブートの CentOS 7 で行いました。ZFS の利点を享受しました。
2017-07-27追記、zfs-0.7.0-1 へのアップデートはあっさりと成功
0.7.0-1 がリリースされたので、アップデートしてみましたが、今度はあっさり成功しました。
[root@hoge ~]# rpm -qi kmod-zfs Name : kmod-zfs Relocations: (not relocatable) Version : 0.7.0 Vendor: (none) Release : 1.el6 Build Date: Thu 27 Jul 2017 08:02:31 AM JST Install Date: Thu 27 Jul 2017 11:26:42 PM JST Build Host: centos-6-repo Group : System Environment/Kernel Source RPM: zfs-kmod-0.7.0-1.el6.src.rpm Size : 3833208 License: CDDL Signature : RSA/SHA1, Thu 27 Jul 2017 08:04:56 AM JST, Key ID a9d5a1c0f14ab620 URL : http://zfsonlinux.org/ Summary : zfs kernel module(s) Description : This package provides the zfs kernel modules built for the Linux kernel 2.6.32-696.6.3.el6.x86_64 for the x86_64 family of processors. [root@hoge ~]# df -T Filesystem Type 1K-blocks Used Available Use% Mounted on rpool/ROOT zfs 13072896 5303040 7769856 41% / tmpfs tmpfs 8078524 43608 8034916 1% /dev/shm /dev/zd0 ext4 8125880 50432 7656020 1% /KDUMP rpool zfs 7774464 4608 7769856 1% /rpool同じワークロードでも、0.6 よりもメモリ使用量が少なくなったようでした。munin のデータから。
2017-12-17追記、zfs-0.7.4-1 へのアップデート
順次アップデートしながら、1年半ほど運用を続けていますが、特に問題なしです。
[root@hoge ~]# rpm -qi kmod-zfs Name : kmod-zfs Relocations: (not relocatable) Version : 0.7.4 Vendor: (none) Release : 1.el6 Build Date: Fri 08 Dec 2017 06:41:07 AM JST Install Date: Sun 17 Dec 2017 07:51:05 PM JST Build Host: centos-6-repo Group : System Environment/Kernel Source RPM: zfs-kmod-0.7.4-1.el6.src.rpm Size : 3841048 License: CDDL Signature : RSA/SHA1, Fri 08 Dec 2017 06:41:46 AM JST, Key ID a9d5a1c0f14ab620 URL : http://zfsonlinux.org/ Summary : zfs kernel module(s) Description : This package provides the zfs kernel modules built for the Linux kernel 2.6.32-696.16.1.el6.x86_64 for the x86_64 family of processors. [root@hoge ~]# df -T Filesystem Type 1K-blocks Used Available Use% Mounted on rpool/ROOT zfs 12766336 4995456 7770880 40% / tmpfs tmpfs 8078524 43368 8035156 1% /dev/shm /dev/zd0 ext4 8125880 50432 7656020 1% /KDUMP rpool zfs 7778432 7552 7770880 1% /rpool