Ubuntu 資料一覧

ZFS導入手順(Ubuntu 16.04)

2016/05/03更新

対応バージョン: 0.6.5.6

Ubuntu 16.04には標準でZFSカーネルモジュール(zfs.ko)がバンドルされているので関連ユーティリティをインストールすればすぐに使えるようになる。

ここでは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が使用可能になる。

ストレージプール作成

ここでは写真の3つのUSBメモリを使用して一つのストレージプールを作り、そこにファイルシステムを作る。

まずそれぞれの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メモリを追加してストレージプールを拡張する手順を示す。

ここでは写真の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

このようにシステムを止めたりディスクのアンマウント/マウント操作をすることなくストレージ容量の拡張ができ、各種オプションも動的に変更できるのでストレージの柔軟な運用が可能になる。

参考サイト