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 できました。

2016年6月26日日曜日

中古 HDD の初期確認、3個目(2016年6月)

中古 HDD の初期確認。前回に続き、某ショップより3個目を入手しましたので、今回も備忘録です。

今回入手した中古 HDD も、前回と同じく Seagate Barracuda ES.2 1TB です。前回入手したものは S.M.A.R.T. エラーがある状態とのことで、かなり安い値段でしたが、今回の個体は、前回の値段+600円程度で入手できました。

まず、S.M.A.R.T. の確認です。
[root@hoge ~]# smartctl -A /dev/sdf
smartctl 5.43 2012-06-30 r3573 [x86_64-linux-2.6.32-642.1.1.el6.x86_64] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   082   063   044    Pre-fail  Always       -       187036203
  3 Spin_Up_Time            0x0003   099   092   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   099   099   020    Old_age   Always       -       1247
  5 Reallocated_Sector_Ct   0x0033   093   093   036    Pre-fail  Always       -       150
  7 Seek_Error_Rate         0x000f   061   053   030    Pre-fail  Always       -       343714111331
  9 Power_On_Hours          0x0032   076   076   000    Old_age   Always       -       21800
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   037   020    Old_age   Always       -       125
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   096   096   000    Old_age   Always       -       4
188 Command_Timeout         0x0032   100   092   000    Old_age   Always       -       472453611632
189 High_Fly_Writes         0x003a   087   087   000    Old_age   Always       -       13
190 Airflow_Temperature_Cel 0x0022   062   046   045    Old_age   Always       -       38 (Min/Max 34/39)
194 Temperature_Celsius     0x0022   038   054   000    Old_age   Always       -       38 (0 15 0 0 0)
195 Hardware_ECC_Recovered  0x001a   043   026   000    Old_age   Always       -       187036203
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   170   000    Old_age   Always       -       119834
188 Command_Timeout がとんでもなく大きな値ですが、5 Reallocated_Sector_Ct が、1個目と2個目の半分ぐらいの値です。前回までの経験値からすると、十分に使えそうな感触です。
運用時間(9 Power_On_Hours)は、
[root@hoge ~]# echo "21800 / 24 / 365" | bc -l
2.48858447488584474885
2年半程度でした。なお、HDD のラベルに Date Code: 08385 とあり、2008年3月製造のようです。

次は hdparm -i の出力です。
[root@hoge ~]# hdparm -i /dev/sdf

/dev/sdf:

 Model=ST31000340NS, FwRev=SN06, SerialNo=5xxxxxxC
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=unknown, BuffSize=unknown, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=1953525168
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
 AdvancedPM=no WriteCache=enabled
 Drive conforms to: unknown:  ATA/ATAPI-4,5,6,7

 * signifies the current active mode

ファームウェアのバージョンが、1個目は NA02、2個目が FSC9 でしたが、この3個目は SN06 でした。

次は、smartctl -a の出力です。
[root@hoge ~]# smartctl -a /dev/sdf
smartctl 5.43 2012-06-30 r3573 [x86_64-linux-2.6.32-642.1.1.el6.x86_64] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda ES.2
Device Model:     ST31000340NS
Serial Number:    5xxxxxxC
LU WWN Device Id: 5 000c50 0yyyyyyy4
Firmware Version: SN06
User Capacity:    1,000,204,886,016 bytes [1.00 TB]
Sector Size:      512 bytes logical/physical
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   8
ATA Standard is:  ATA-8-ACS revision 4
Local Time is:    Thu Jun 23 17:54:27 2016 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x82) Offline data collection activity
     was completed without error.
     Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
     without error or no self-test has ever 
     been run.
Total time to complete Offline 
data collection:   (  642) seconds.
Offline data collection
capabilities:     (0x7b) SMART execute Offline immediate.
     Auto Offline data collection on/off support.
     Suspend Offline collection upon new
     command.
     Offline surface scan supported.
     Self-test supported.
     Conveyance Self-test supported.
     Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
     power-saving mode.
     Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
     General Purpose Logging supported.
Short self-test routine 
recommended polling time:   (   1) minutes.
Extended self-test routine
recommended polling time:   ( 222) minutes.
Conveyance self-test routine
recommended polling time:   (   2) minutes.
SCT capabilities:         (0x103d) SCT Status supported.
     SCT Error Recovery Control supported.
     SCT Feature Control supported.
     SCT Data Table supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   082   063   044    Pre-fail  Always       -       187036203
  3 Spin_Up_Time            0x0003   099   092   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   099   099   020    Old_age   Always       -       1247
  5 Reallocated_Sector_Ct   0x0033   093   093   036    Pre-fail  Always       -       150
  7 Seek_Error_Rate         0x000f   061   053   030    Pre-fail  Always       -       343714111331
  9 Power_On_Hours          0x0032   076   076   000    Old_age   Always       -       21800
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   037   020    Old_age   Always       -       125
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   096   096   000    Old_age   Always       -       4
188 Command_Timeout         0x0032   100   092   000    Old_age   Always       -       472453611632
189 High_Fly_Writes         0x003a   087   087   000    Old_age   Always       -       13
190 Airflow_Temperature_Cel 0x0022   062   046   045    Old_age   Always       -       38 (Min/Max 34/39)
194 Temperature_Celsius     0x0022   038   054   000    Old_age   Always       -       38 (0 15 0 0 0)
195 Hardware_ECC_Recovered  0x001a   043   026   000    Old_age   Always       -       187036203
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   170   000    Old_age   Always       -       119834

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%     21566         -
# 2  Short offline       Completed without error       00%         7         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.
エラーログは無く (No Errors Logged)、Extended offline テスト (hdparm -t long) を行っても、エラーは検出されませんでした。

次は、hdparm -I の出力です。
[root@hoge ~]# hdparm -I /dev/sdf

/dev/sdf:

ATA device, with non-removable media
 Model Number:       ST31000340NS                            
 Serial Number:      5xxxxxxC
 Firmware Revision:  SN06    
 Transport:          Serial
Standards:
 Used: unknown (minor revision code 0x0029) 
 Supported: 8 7 6 5 
 Likely used: 8
Configuration:
 Logical  max current
 cylinders 16383 16383
 heads  16 16
 sectors/track 63 63
 --
 CHS current addressable sectors:   16514064
 LBA    user addressable sectors:  268435455
 LBA48  user addressable sectors: 1953525168
 Logical/Physical Sector size:           512 bytes
 device size with M = 1024*1024:      953869 MBytes
 device size with M = 1000*1000:     1000204 MBytes (1000 GB)
 cache/buffer size  = unknown
 Nominal Media Rotation Rate: 7200
Capabilities:
 LBA, IORDY(can be disabled)
 Queue depth: 32
 Standby timer values: spec'd by Standard, no device specific minimum
 R/W multiple sector transfer: Max = 16 Current = 16
 Recommended acoustic management value: 254, current value: 0
 DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
      Cycle time: min=120ns recommended=120ns
 PIO: pio0 pio1 pio2 pio3 pio4 
      Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
 Enabled Supported:
    * SMART feature set
      Security Mode feature set
    * Power Management feature set
    * Write cache
    * Look-ahead
    * Host Protected Area feature set
    * WRITE_BUFFER command
    * READ_BUFFER command
    * DOWNLOAD_MICROCODE
    * SET_MAX security extension
    * 48-bit Address feature set
    * Device Configuration Overlay feature set
    * Mandatory FLUSH_CACHE
    * FLUSH_CACHE_EXT
    * SMART error logging
    * SMART self-test
    * General Purpose Logging feature set
    * 64-bit World wide name
      Write-Read-Verify feature set
    * WRITE_UNCORRECTABLE_EXT command
    * {READ,WRITE}_DMA_EXT_GPL commands
    * Segmented DOWNLOAD_MICROCODE
    * Gen1 signaling speed (1.5Gb/s)
    * Gen2 signaling speed (3.0Gb/s)
    * Native Command Queueing (NCQ)
    * Phy event counters
    * Software settings preservation
    * SMART Command Transport (SCT) feature set
    * SCT Write Same (AC2)
    * SCT Error Recovery Control (AC3)
    * SCT Features Control (AC4)
    * SCT Data Tables (AC5)
      unknown 206[12] (vendor specific)
Security: 
 Master password revision code = 65534
  supported
 not enabled
 not locked
 not frozen
 not expired: security count
  supported: enhanced erase
 190min for SECURITY ERASE UNIT. 190min for ENHANCED SECURITY ERASE UNIT. 
Logical Unit WWN Device Identifier: 5000c500yyyyyyy4
 NAA  : 5
 IEEE OUI : 000c50
 Unique ID : 0yyyyyyy4
Checksum: correct

このあと、4台構成の RAIDZ に組み込みましたが、resilver と scrub でエラーが出ませんでしたので、十分に使えそうな感触です。

2016年6月7日火曜日

CentOS 向けに ZFS on Linux の kmod-zfs がリリースされていました

ZFS on Linux のコミュニティメーリングリストをパラ見していて、CentOS 6 および 7 向けに、kmod-zfs がリリースされていることを知りました。これは朗報です。
http://list.zfsonlinux.org/pipermail/zfs-discuss/2016-June/025692.html
https://github.com/zfsonlinux/zfs/wiki/RHEL-%26-CentOS

今まで、DKMS にお世話になってましたが、DKMS の場合は、カーネルをアップデートするたびに、ソースからコンパイルするという方式なので、それなりに時間がかかる仕掛けでした。それと、kernel-devel (サイズが大きくてディスク消費量大です) を入れる必要がありました。
kmod 方式の場合は、提供されるパッケージ (kmod-zfs) の中に、コンパイル済みのモジュールが入っていて、そのまま利用出来るため、カーネルアップデートが楽になります。

DKMS からの切り替え方法は、前述の URL に書かれてますが、次のような手順です。
# zpool export tankX    ※まずは、いったん使用中のプールを export します
# yum remove spl-dkms libnvpair1 libuutil1 libzfs2 libzpool2    ※DKMS 方式のパッケージを削除
# yum clean all                       ※ここから3行はゴミ掃除です
# rm /lib/modules/*/extra/*           
# rm /lib/modules/*/weak-updates/*    ※特に、kmod モジュールは、このディレクトリを使うので注意
# shutdown -r now    ※ここでいったんリブート
/etc/yum.repos.d/zfs.repo を次のように修正します。
[zfs]
name=ZFS on Linux for EL7
#baseurl=http://archive.zfsonlinux.org/epel/7/$basearch/
baseurl=http://download.zfsonlinux.org/epel/7/kmod/$basearch/
...
あとは、kmod-zfs をインストールすれば良いです。次は、わたしのマシンの実際のログです。
[root@hoge ~]# yum install kmod-zfs --enablerepo=zfs
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * elrepo: ftp.ne.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package kmod-zfs.x86_64 0:0.6.5.7-1.el7.centos will be installed
--> Processing Dependency: zfs = 0.6.5.7 for package: kmod-zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: spl-kmod for package: kmod-zfs-0.6.5.7-1.el7.centos.x86_64
--> Running transaction check
---> Package kmod-spl.x86_64 0:0.6.5.7-1.el7.centos will be installed
--> Processing Dependency: spl = 0.6.5.7 for package: kmod-spl-0.6.5.7-1.el7.centos.x86_64
---> Package zfs.x86_64 0:0.6.5.7-1.el7.centos will be installed
--> Processing Dependency: libzpool2 = 0.6.5.7 for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libzfs2 = 0.6.5.7 for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libuutil1 = 0.6.5.7 for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libnvpair1 = 0.6.5.7 for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libzpool.so.2()(64bit) for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libzfs_core.so.1()(64bit) for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libzfs.so.2()(64bit) for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libuutil.so.1()(64bit) for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Processing Dependency: libnvpair.so.1()(64bit) for package: zfs-0.6.5.7-1.el7.centos.x86_64
--> Running transaction check
---> Package libnvpair1.x86_64 0:0.6.5.7-1.el7.centos will be installed
---> Package libuutil1.x86_64 0:0.6.5.7-1.el7.centos will be installed
---> Package libzfs2.x86_64 0:0.6.5.7-1.el7.centos will be installed
---> Package libzpool2.x86_64 0:0.6.5.7-1.el7.centos will be installed
---> Package spl.x86_64 0:0.6.5.7-1.el7.centos will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch          Version                       Repository  Size
================================================================================
Installing:
 kmod-zfs          x86_64        0.6.5.7-1.el7.centos          zfs        672 k
Installing for dependencies:
 kmod-spl          x86_64        0.6.5.7-1.el7.centos          zfs        112 k
 libnvpair1        x86_64        0.6.5.7-1.el7.centos          zfs         32 k
 libuutil1         x86_64        0.6.5.7-1.el7.centos          zfs         38 k
 libzfs2           x86_64        0.6.5.7-1.el7.centos          zfs        119 k
 libzpool2         x86_64        0.6.5.7-1.el7.centos          zfs        419 k
 spl               x86_64        0.6.5.7-1.el7.centos          zfs         28 k
 zfs               x86_64        0.6.5.7-1.el7.centos          zfs        330 k

Transaction Summary
================================================================================
Install  1 Package (+7 Dependent packages)

Total download size: 1.7 M
Installed size: 5.7 M
Is this ok [y/d/N]: y
Downloading packages:
No Presto metadata available for zfs
(1/8): kmod-spl-0.6.5.7-1.el7.centos.x86_64.rpm            | 112 kB   00:01     
(2/8): libnvpair1-0.6.5.7-1.el7.centos.x86_64.rpm          |  32 kB   00:00     
(3/8): kmod-zfs-0.6.5.7-1.el7.centos.x86_64.rpm            | 672 kB   00:01     
(4/8): libuutil1-0.6.5.7-1.el7.centos.x86_64.rpm           |  38 kB   00:00     
(5/8): libzfs2-0.6.5.7-1.el7.centos.x86_64.rpm             | 119 kB   00:00     
(6/8): spl-0.6.5.7-1.el7.centos.x86_64.rpm                 |  28 kB   00:00     
(7/8): libzpool2-0.6.5.7-1.el7.centos.x86_64.rpm           | 419 kB   00:01     
(8/8): zfs-0.6.5.7-1.el7.centos.x86_64.rpm                 | 330 kB   00:02     
--------------------------------------------------------------------------------
Total                                              332 kB/s | 1.7 MB  00:05     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : libuutil1-0.6.5.7-1.el7.centos.x86_64                        1/8 
  Installing : libnvpair1-0.6.5.7-1.el7.centos.x86_64                       2/8 
  Installing : libzpool2-0.6.5.7-1.el7.centos.x86_64                        3/8 
  Installing : kmod-spl-0.6.5.7-1.el7.centos.x86_64                         4/8 
  Installing : spl-0.6.5.7-1.el7.centos.x86_64                              5/8 
  Installing : libzfs2-0.6.5.7-1.el7.centos.x86_64                          6/8 
  Installing : zfs-0.6.5.7-1.el7.centos.x86_64                              7/8 
  Installing : kmod-zfs-0.6.5.7-1.el7.centos.x86_64                         8/8 
  Verifying  : kmod-zfs-0.6.5.7-1.el7.centos.x86_64                         1/8 
  Verifying  : spl-0.6.5.7-1.el7.centos.x86_64                              2/8 
  Verifying  : zfs-0.6.5.7-1.el7.centos.x86_64                              3/8 
  Verifying  : libzfs2-0.6.5.7-1.el7.centos.x86_64                          4/8 
  Verifying  : libnvpair1-0.6.5.7-1.el7.centos.x86_64                       5/8 
  Verifying  : kmod-spl-0.6.5.7-1.el7.centos.x86_64                         6/8 
  Verifying  : libuutil1-0.6.5.7-1.el7.centos.x86_64                        7/8 
  Verifying  : libzpool2-0.6.5.7-1.el7.centos.x86_64                        8/8 

Installed:
  kmod-zfs.x86_64 0:0.6.5.7-1.el7.centos                                        

Dependency Installed:
  kmod-spl.x86_64 0:0.6.5.7-1.el7.centos                                        
  libnvpair1.x86_64 0:0.6.5.7-1.el7.centos                                      
  libuutil1.x86_64 0:0.6.5.7-1.el7.centos                                       
  libzfs2.x86_64 0:0.6.5.7-1.el7.centos                                         
  libzpool2.x86_64 0:0.6.5.7-1.el7.centos                                       
  spl.x86_64 0:0.6.5.7-1.el7.centos                                             
  zfs.x86_64 0:0.6.5.7-1.el7.centos                                             

Complete!
[root@hoge ~]# zpool import
The ZFS modules are not loaded.
Try running '/sbin/modprobe zfs' as root to load them.
[root@hoge ~]# modprobe zfs
[root@hoge ~]# zpool import     
   pool: tankM
     id: 17978947249853082376
  state: ONLINE
 status: Some supported features are not enabled on the pool.
 action: The pool can be imported using its name or numeric identifier, though
 some features will not be available without an explicit 'zpool upgrade'.
 config:

 tankM                                            ONLINE
   ata-SAMSUNG_MCCOE64G8MPP-0VA_SE809N0057-part1  ONLINE
[root@hoge ~]# zpool import tankM
[root@hoge ~]# df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sdb5       20480000 14936304   5303232  74% /
devtmpfs         8182796        0   8182796   0% /dev
tmpfs            8192824      256   8192568   1% /dev/shm
tmpfs            8192824     9292   8183532   1% /run
tmpfs            8192824        0   8192824   0% /sys/fs/cgroup
tmpfs            1638568        8   1638560   1% /run/user/0
tankM           60436352 38044288  22392064  63% /tankM
このあと、最新カーネルにアップデートしてみました。
[root@hoge ~]# uname -a
Linux hoge 3.10.0-327.13.1.el7.x86_64 #1 SMP Thu Mar 31 16:04:38 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# yum update kernel
Loaded plugins: fastestmirror, langpacks
base                                                     | 3.6 kB     00:00     
elrepo                                                   | 2.9 kB     00:00     
extras                                                   | 3.4 kB     00:00     
updates                                                  | 3.4 kB     00:00     
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * elrepo: ftp.ne.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:3.10.0-327.18.2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package       Arch          Version                       Repository      Size
================================================================================
Installing:
 kernel        x86_64        3.10.0-327.18.2.el7           updates         33 M

Transaction Summary
================================================================================
Install  1 Package

Total download size: 33 M
Installed size: 136 M
Is this ok [y/d/N]: y
Downloading packages:
updates/7/x86_64/prestodelta                               | 502 kB   00:00     
kernel-3.10.0-327.18.2.el7.x86_64.rpm                      |  33 MB   00:03     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : kernel-3.10.0-327.18.2.el7.x86_64                            1/1 
  Verifying  : kernel-3.10.0-327.18.2.el7.x86_64                            1/1 

Installed:
  kernel.x86_64 0:3.10.0-327.18.2.el7                                           

Complete!
DKMS 方式と違い、あっという間に完了します。まさに Great job! ですね。kmod 化してくれた人たちに感謝です。

2016-06-09追記
別のマシンで CentOS 6.8 でも同様にインストールできることを確認しました。
なお、kmod は、kABI の互換性が維持されていることが前提になっているので、自分でカーネルに手を加えて再構築している環境 (オラクル UEK なども) では使えません (そのような環境では、旧来通り DKMS を使えば OK) 。

2016-09-19追記
v0.6.5.8 がリリースされたものの、yum に来ないなと思っていたら、リポジトリの指定が間違っていたようなので、修正しました。
http://download.zfsonlinux.org/epel/7/kmod/$basearch/ こちらが正解。

2016-12-05追記
CentOS 7 の cr リポジトリで kernel-3.10.0-514.el7.x86_64 へアップデートできるようになりましたが、残念ながら kmod-zfs の kABI 互換が保たれないようで、514.el7 にアップデートすると ZFS 領域にアクセスできなくなります。そのうち対応されると思うので、しばらく待っておいたほうがいいかもしれません。または、dkms を使うか。。
https://github.com/zfsonlinux/zfs/issues/5377

2016-12-18追記
7.3 対応 (カーネル 514.el7 系への対応) されてました。よかった。
http://list.zfsonlinux.org/pipermail/zfs-discuss/2016-December/026845.html

■関連記事
CentOS 6 の root ファイルシステムに ZFS を使う

2016年6月4日土曜日

SSD の突然死

ちょうど1年ほど前(2015-5-14)に、某ショップから購入した中古 SSD が突然死したので、備忘録です。
壊れた SSD は、Intel 313 Series SSD (SSDSA2UP020G3H) (SSD/20GB/2.5インチ/SATA) というもので、中古で 2000 円程度で購入したものです。20G と小容量で SLC タイプということで、Linux サーバの OS ディスク用にと思ったのですが、実際には殆ど使っておらず、サーバに接続して通電 (モバイルラックに挿していた) していました。
そのサーバ (CentOS 7) が、めずらしくフリーズ (この1年の運用で初めて) したのですが、そのフリーズ後から認識しなくなりました。モバイルラックから取り出す時は、かなりの高温 (かろうじて手に持つことが出来るが、焼き芋のようにアツアツな状態) になってましたので、何か暴走的なことが起きたのかも?
症状から察するに、冷えたらまた認識できるかもと思ったのですが、全く認識されなくなりました。所謂、突然死です。
SSD って、こういう壊れ方するかもしれない、という憶測はもってましたが、自分の手持ちの SSD で本当に突然死したのはこれが初めてです。
幸い、大事なデータや OS 環境すらも入っておらず、たしか空っぽだったので、良かったですが、こういったことを踏まえると、バックアップや冗長化 (RAIDなど) は大事だなと思ったのでした。

購入直後 (2015-05-16) の CDI キャプチャ画面です。新古品と言ってもよさそうな、ショップさんがゼロクリアした程度の値でした。 なお、その当時、安かったのでもう1個購入しているのですが、そちらはまだ動いてます (中身は突然死した個体と同様に空っぽ)。
今後、同様に壊れるかもしれないし、ZFS の L2ARC (キャッシュ) にでもして、酷使してみようかなと思っています。そうだ、そうしよう。

■関連記事
ThinkPad X300 のSSDで不良セクタを発見
人気ブログランキングへ にほんブログ村 IT技術ブログへ