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