2016年6月28日火曜日

CentOS 6 の root ファイルシステムに ZFS を使う

2年ほど前に、CentOS 6 の root ファイルシステムに ZFS を使う方法について書きました。
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-2123
rollback は、デュアルブートの 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

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ