Ubuntu 資料一覧
2016/05/03更新
対応バージョン: 0.6.5.6

ここでは3本のUSBメモリを使ってZFSプールとファイルシステムを作成し、あとからUSBメモリを1本追加して容量を動的に拡張する手順を示す。
ZFSカーネルモジュール有効化、関連ユーティリティインストール
ZFSカーネルモジュールはデフォルトでは無効になっているためmodprobeで有効にしつつ、OS起動時にも有効になるように/etc/modulesにも"zfs"を追加しておく。
# modprobe zfs # dmesg | grep -i zfs [ 5601.061318] ZFS: Loaded module v0.6.5.6-0ubuntu3, ZFS pool version 5000, ZFS filesystem version 5 # lsmod | grep zfs zfs 2813952 0 zunicode 331776 1 zfs zcommon 57344 1 zfs znvpair 90112 2 zfs,zcommon spl 102400 3 zfs,zcommon,znvpair zavl 16384 1 zfs # echo "zfs" >> /etc/modules
続いてZFS関連ユーティリティをインストールする。
# apt install zfsutils-linux
これでZFSが使用可能になる。
ストレージプール作成

まずそれぞれのUSBメモリをマシンに挿すと以下のようなデバイスファイルとして認識される。
/dev/sde1 (ELECOM 8GB)
/dev/sdf1 (ELECOM 8GB)
/dev/sdg1 (ELECOM 8GB)
このデバイスファイル名はOSが動的に割り当てるものなので他のデバイスとの兼ね合いなどから割り当てが変わる場合があってストレージプールの構成要素として使用するには不安定である。
そこでデバイス名として、10ディスク以下程度の小規模の構成であればby-id名での指定を、大規模用途であればby-path名をそれぞれ使うとよい。こうすることでデバイスファイル名に左右されず、同じデバイスであれば常に同じ名前が使える。
ここではby-id名を指定する。by-id名は以下の方法で確認できる。
# ls -l /dev/disk/by-id | egrep sd[e-g]1 ... usb-ELECOM_MF-BSU3_070844129E20AC46-0:0-part1 -> ../../sde1 ... usb-ELECOM_MF-JSU3_1550311382300006-0:0-part1 -> ../../sdf1 ... usb-ELECOM_MF-JSU3_2612923140060010-0:0-part1 -> ../../sdg1
このsdxxにシンボリックリンクが張られたファイルがby-id名である。ストレージプール作成時にはこのby-id名を指定する。
まずは中身をフォーマットする。ファイルシステムはxfsとする。なおxfsを使用するにはxfsprogsパッケージが必要になるのであわせてインストールする。
# umount /dev/sde1 # umount /dev/sdf1 # umount /dev/sdg1 # apt install xfsprogs # mkfs.xfs -f /dev/disk/by-id/usb-ELECOM_MF-BSU3_070844129E20AC46-0:0-part1 # mkfs.xfs -f /dev/disk/by-id/usb-ELECOM_MF-JSU3_1550311382300006-0:0-part1 # mkfs.xfs -f /dev/disk/by-id/usb-ELECOM_MF-JSU3_2612923140060010-0:0-part1
続いてストレージプールを作成する。ストレージプール名はrpoolとし、上記の3デバイスを指定する。
# zpool create -f rpool \ /dev/disk/by-id/usb-ELECOM_MF-BSU3_070844129E20AC46-0:0-part1 \ /dev/disk/by-id/usb-ELECOM_MF-JSU3_1550311382300006-0:0-part1 \ /dev/disk/by-id/usb-ELECOM_MF-JSU3_2612923140060010-0:0-part1
ストレージプールが作成され、3つのデバイスが含まれていることが確認できる。
# zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT rpool 21.6G 70K 21.6G - 0% 0% 1.00x ONLINE - # zpool status rpool pool: rpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 usb-ELECOM_MF-BSU3_070844129E20AC46-0:0-part1 ONLINE 0 0 0 usb-ELECOM_MF-JSU3_1550311382300006-0:0-part1 ONLINE 0 0 0 usb-ELECOM_MF-JSU3_2612923140060010-0:0-part1 ONLINE 0 0 0 errors: No known data errors
デフォルトでは単一スライスが作成されるが他にも以下のような構成が組める。
ミラー
# zpool create rpool mirror <デバイス1> <デバイス2> ...
(*)サイズの違うデバイス同士でミラーを作成した場合、ストレージプールのサイズは(当然ではあるが)一番小さいデバイスと同サイズになる。
RAID-Z
# zpool create rpool raidz <デバイス1> <デバイス2> ...
パリティ付RAID-Z(パリティはシングル、ダブル、トリプルの3種類)
# zpool create rpool raidz1 <デバイス1> <デバイス2> ... # zpool create rpool raidz2 <デバイス1> <デバイス2> ... # zpool create rpool raidz3 <デバイス1> <デバイス2> ...
他にスペアデバイス、ログデバイス、キャッシュデバイスなども明示的に指定できる。
# zpool create rpool mirror <デバイス1> <デバイス2> spare <デバイス3> log <デバイス4> cache <デバイス5>
作成したストレージプールは自動的に/配下にマウントされる。
# df -h /rpool Filesystem Size Used Avail Use% Mounted on rpool 21G 0 21G 0% /rpool
アンマウントする時は以下のようにする。
# zfs unmount rpool
ストレージプールを削除する場合は以下のようにする。
# zpool destroy rpool
ストレージプールからは別のストレージプールを切り出すことができる。
# zfs create rpool/sub # df -h -t zfs Filesystem Size Used Avail Use% Mounted on rpool 21G 0 21G 0% /rpool rpool/sub 21G 0 21G 0% /rpool/sub
こうすることで同じストレージプール内に独立したファイルシステムを作成することができる。
マウントポイントをデフォルト以外の場所にしたい場合は以下のようにする。
# zfs umount rpool/sub # mkdir /mnt/sub # zfs set mountpoint=/mnt/sub rpool/sub # zfs mount rpool/sub # df -h -t zfs Filesystem Size Used Avail Use% Mounted on rpool 21G 0 21G 0% /rpool rpool/sub 21G 0 21G 0% /mnt/sub
各種設定
プロパティ設定
ストレージプールには様々なプロパティが設定されており、これを操作することで細かい制御ができる。
現在のプロパティの設定情報を参照するにはgetサブコマンドに続いて参照したいプロパティ名を指定する。
# zfs get <プロパティ> <ストレージプール>
全てのプロパティを参照するにはプロパティ名に「all」を指定する。
# zfs get all rpool NAME PROPERTY VALUE SOURCE rpool type filesystem - rpool creation 火 5月 3 17:02 2016 - rpool used 95K - rpool available 20.9G - rpool referenced 19K - rpool compressratio 1.00x - rpool mounted yes - rpool quota none default rpool reservation none default rpool recordsize 128K default rpool mountpoint /rpool default rpool sharenfs off default rpool checksum on default rpool compression off default rpool atime on default rpool devices on default rpool exec on default rpool setuid on default rpool readonly off default rpool zoned off default rpool snapdir hidden default rpool aclinherit restricted default rpool canmount on default rpool xattr on default rpool copies 1 default rpool version 5 - rpool utf8only off - rpool normalization none - rpool casesensitivity sensitive - rpool vscan off default rpool nbmand off default rpool sharesmb off default rpool refquota none default rpool refreservation none default rpool primarycache all default rpool secondarycache all default rpool usedbysnapshots 0 - rpool usedbydataset 19K - rpool usedbychildren 76K - rpool usedbyrefreservation 0 - rpool logbias latency default rpool dedup off default rpool mlslabel none default rpool sync standard default rpool refcompressratio 1.00x - rpool written 19K - rpool logicalused 38K - rpool logicalreferenced 9.50K - rpool filesystem_limit none default rpool snapshot_limit none default rpool filesystem_count none default rpool snapshot_count none default rpool snapdev hidden default rpool acltype off default rpool context none default rpool fscontext none default rpool defcontext none default rpool rootcontext none default rpool relatime on temporary rpool redundant_metadata all default rpool overlay off default
プロパティはストレージプール毎に設定されるのでrpoolとrpool/subのプロパティは別物である。
# zfs get all rpool/sub NAME PROPERTY VALUE SOURCE rpool/sub type filesystem - rpool/sub creation 火 5月 3 17:02 2016 - rpool/sub used 19K - rpool/sub available 20.9G - rpool/sub referenced 19K - rpool/sub compressratio 1.00x - rpool/sub mounted yes - rpool/sub quota none default rpool/sub reservation none default rpool/sub recordsize 128K default rpool/sub mountpoint /mnt/sub local rpool/sub sharenfs off default rpool/sub checksum on default rpool/sub compression off default rpool/sub atime on default rpool/sub devices on default rpool/sub exec on default rpool/sub setuid on default rpool/sub readonly off default rpool/sub zoned off default rpool/sub snapdir hidden default rpool/sub aclinherit restricted default rpool/sub canmount on default rpool/sub xattr on default rpool/sub copies 1 default rpool/sub version 5 - rpool/sub utf8only off - rpool/sub normalization none - rpool/sub casesensitivity sensitive - rpool/sub vscan off default rpool/sub nbmand off default rpool/sub sharesmb off default rpool/sub refquota none default rpool/sub refreservation none default rpool/sub primarycache all default rpool/sub secondarycache all default rpool/sub usedbysnapshots 0 - rpool/sub usedbydataset 19K - rpool/sub usedbychildren 0 - rpool/sub usedbyrefreservation 0 - rpool/sub logbias latency default rpool/sub dedup off default rpool/sub mlslabel none default rpool/sub sync standard default rpool/sub refcompressratio 1.00x - rpool/sub written 19K - rpool/sub logicalused 9.50K - rpool/sub logicalreferenced 9.50K - rpool/sub filesystem_limit none default rpool/sub snapshot_limit none default rpool/sub filesystem_count none default rpool/sub snapshot_count none default rpool/sub snapdev hidden default rpool/sub acltype off default rpool/sub context none default rpool/sub fscontext none default rpool/sub defcontext none default rpool/sub rootcontext none default rpool/sub relatime on temporary rpool/sub redundant_metadata all default rpool/sub overlay off default
以下、いくつかのプロパティの設定手順を紹介する。
quota
ディスククォータを設定する。
例えば以下のように一つのストレージプールを複数のファイルシステムに分割して使用している場合を考える。
# zfs list NAME USED AVAIL REFER MOUNTPOINT rpool 95K 20.9G 19K /rpool rpool/sub 19K 20.9G 19K /mnt/sub
この中でrpool/subに対して1GBのクォータを設定する場合は以下のようにする。
# zfs set quota=1g rpool/sub
これによりrpool/subの使用可能サイズは1GBになる。それ以外は以前と同じままである。
# zfs list NAME USED AVAIL REFER MOUNTPOINT rpool 95K 20.9G 19K /rpool rpool/sub 19K 1024M 19K /mnt/sub
クォータの解除はサイズに「none」を指定して再設定すればよい。
# zfs set quota=none rpool/sub # zfs list NAME USED AVAIL REFER MOUNTPOINT rpool 95K 20.9G 19K /rpool rpool/sub 19K 20.9G 19K /mnt/sub
reservation
ディスク領域を予約する。
これは前述のクォータのようにファイルシステムの最大サイズを制限するのとは逆に、あらかじめ指定したサイズの領域を確保する方法である。
例えばrpool/subに対して4GBの領域を確保する場合は以下のようにする。
# zfs set reservation=4g rpool/sub
これによりrpool/sub以外の使用可能サイズが21GB中の17GBになり、結果的にrpool/subのために(最低)4GBが確保されたことになる。
% zfs list NAME USED AVAIL REFER MOUNTPOINT rpool 4.00G 16.9G 19K /rpool rpool/sub 19K 20.9G 19K /mnt/sub
領域の予約解除はサイズに「none」を指定して再設定すればよい。
# zfs set reservation=none rpool/sub # zfs list NAME USED AVAIL REFER MOUNTPOINT rpool 101K 20.9G 19K /rpool rpool/sub 19K 20.9G 19K /mnt/sub
compression
ファイルシステム内を圧縮モードにする。
# zfs set compression=on rpool/sub # zfs get compression NAME PROPERTY VALUE SOURCE rpool compression off default rpool/sub compression on local
圧縮モードの解除は「off」を指定して再設定すればよい。
# zfs set compression=off rpool/sub # zfs get compression NAME PROPERTY VALUE SOURCE rpool compression off default rpool/sub compression off local
その他、様々なプロパティが存在するがここでは割愛する。
OS起動時・停止時の挙動
/etc/default/zfsの以下の設定を変更することによってOS起動時・停止時の挙動を制御することができる。
OS起動時にプールメンバを自動的に追加しマウントするまでの待ち時間(秒)
5 ZFS_AUTOIMPORT_TIMEOUT='30'
OS起動時にshareするか(yes|no)
9 ZFS_SHARE='no'
OS停止時にunshareするか(yes|no)
12 ZFS_UNSHARE='no'
カーネルモジュール(zfs.ko)をビルドする際に--enable-debugオプション、--enable-debug-dmu-txオプションを付けるか(yes|no)
15 ZFS_DKMS_ENABLE_DEBUG='no' 18 ZFS_DKMS_ENABLE_DEBUG_DMU_TX='no'
カーネルモジュール(zfs.ko)をビルドする際にデバッグシンボルを残すか(yes|no)
21 ZFS_DKMS_DISABLE_STRIP='no'
ストレージプール拡張

ここでは写真のUSBメモリを使用する。デバイスとしては以下のように認識されるので、先ほどと同様にby-id名を確認してフォーマットする。
/dev/sdh1 (SONY 1GB)
# ls -l /dev/disk/by-id | grep sdh1 ... usb-Sony_Storage_Media_1A07031203610-0:0-part1 -> ../../sdh1 # umount /dev/sdh1 # mkfs.xfs -f /dev/disk/by-id/usb-Sony_Storage_Media_1A07031203610-0:0-part1
続いてストレージプールrpoolに上記デバイスを追加する。
# zpool add -f rpool \ /dev/disk/by-id/usb-Sony_Storage_Media_1A07031203610-0:0-part1
ストレージプールが拡張され、1GB容量が増えていることが確認できる。
# zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT rpool 22.5G 138K 22.5G - 0% 0% 1.00x ONLINE - # zpool status rpool pool: rpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 usb-ELECOM_MF-BSU3_070844129E20AC46-0:0-part1 ONLINE 0 0 0 usb-ELECOM_MF-JSU3_1550311382300006-0:0-part1 ONLINE 0 0 0 usb-ELECOM_MF-JSU3_2612923140060010-0:0-part1 ONLINE 0 0 0 usb-Sony_Storage_Media_1A07031203610-0:0-part1 ONLINE 0 0 0 errors: No known data errors # df -h /rpool Filesystem Size Used Avail Use% Mounted on rpool 22G 0 22G 0% /rpool
(拡張前)
# zpool list NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT rpool 21.6G 70K 21.6G - 0% 0% 1.00x ONLINE - # zpool status rpool pool: rpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 usb-ELECOM_MF-BSU3_070844129E20AC46-0:0-part1 ONLINE 0 0 0 usb-ELECOM_MF-JSU3_1550311382300006-0:0-part1 ONLINE 0 0 0 usb-ELECOM_MF-JSU3_2612923140060010-0:0-part1 ONLINE 0 0 0 errors: No known data errors # df -h /rpool Filesystem Size Used Avail Use% Mounted on rpool 21G 0 21G 0% /rpool
このようにシステムを止めたりディスクのアンマウント/マウント操作をすることなくストレージ容量の拡張ができ、各種オプションも動的に変更できるのでストレージの柔軟な運用が可能になる。
参考サイト
ZFS技術情報 (Qiita)