Ubuntu 資料一覧

ZFS導入手順(Ubuntu 14.04)

2014/06/18更新

対応バージョン: 0.6.3

公式サイト

準備

導入OS

Ubuntu 14.04

インストール

リポジトリ追加

% sudo apt-add-repository --yes ppa:zfs-native/stable

/etc/apt/sources.list.d/zfs-native-stable-trusty.listが作成される。中身は以下の通り。

deb http://ppa.launchpad.net/zfs-native/stable/ubuntu trusty main
# deb-src http://ppa.launchpad.net/zfs-native/stable/ubuntu trusty main

ZFS on Linuxインストール

% sudo apt-get update
% sudo apt-get install debootstrap spl-dkms zfs-dkms ubuntu-zfs

インストール確認

zfsモジュールを組み込み、有効になったことを確認する。

% sudo modprobe zfs
% dmesg | grep zfs
ZFS: Loaded module v0.6.3-2~trusty, ZFS pool version 5000, ZFS filesystem version 5

ストレージプール作成

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

まずそれぞれのUSBメモリをマシンに挿すと以下のようなデバイスファイルとして認識される。

/dev/sde1 (SONY 1GB)
/dev/sdf1 (ELECOM 8GB)

このデバイスファイル名はOSが動的に割り当てるものなので他のデバイスとの兼ね合いなどから割り当てが変わる場合があってストレージプールの構成要素として使用するには不安定である。

そこでデバイス名として、10ディスク以下程度の小規模の構成であればby-id名での指定を、大規模用途であればby-path名をそれぞれ使うとよい。こうすることでデバイスファイル名に左右されず、同じデバイスであれば常に同じ名前が使える。

ここではby-id名を指定する。by-id名は以下の方法で確認できる。

% ls -l /dev/disk/by-id | grep sde1
... usb-Sony_Storage_Media_1A07031203610-0:0-part1 -> ../../sde1
% ls -l /dev/disk/by-id | grep sdf1
... usb-ELECOM_MF-BSU3_070844129E20AC46-0:0-part1 -> ../../sdf1

このsdxxにシンボリックリンクが張られたファイルがby-id名である。ストレージプール作成時にはこのby-id名を指定する。

まずは中身をフォーマットする。ファイルシステムはext4とする。

% sudo umount /dev/sde1
% sudo umount /dev/sdf1

% sudo mke2fs -t ext4 /dev/disk/by-id/usb-Sony_Storage_Media_1A07031203610-0:0-part1
% sudo mke2fs -t ext4 /dev/disk/by-id/usb-ELECOM_MF-BSU3_070844129E20AC46-0:0-part1

続いてストレージプールを作成する。ストレージプール名はrpoolとし、2つのデバイスを指定する。

% sudo zpool create rpool /dev/disk/by-id/usb-Sony_Storage_Media_1A07031203610-0:0-part1 \
/dev/disk/by-id/usb-ELECOM_MF-BSU3_070844129E20AC46-0:0-part1

ストレージプールが作成され、2つのデバイスが含まれていることが確認できる。

% sudo zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
rpool  8.12G   128K  8.12G     0%  1.00x  ONLINE  -

% sudo zpool status rpool
  pool: rpool
 state: ONLINE
  scan: none requested
config:

	NAME                                             STATE  READ WRITE CKSUM
	rpool                                            ONLINE    0     0     0
	  usb-Sony_Storage_Media_1A07031203610-0:0-part1 ONLINE    0     0     0
	  usb-ELECOM_MF-BSU3_070844129E20AC46-0:0-part1  ONLINE    0     0     0

errors: No known data errors

デフォルトでは単一スライスが作成されるが他にも以下のような構成が組める。

ミラー
% sudo zpool create rpool mirror <デバイス1> <デバイス2>

(*)サイズの違うデバイス同士でミラーを作成した場合、ストレージプールのサイズは(当然ではあるが)一番小さいデバイスと同サイズになる。

RAID-Z
% sudo zpool create rpool raidz <デバイス1> <デバイス2> ...
パリティ付RAID-Z(パリティはシングル、ダブル、トリプルの3種類)
% sudo zpool create rpool raidz1 <デバイス1> <デバイス2> ...
% sudo zpool create rpool raidz2 <デバイス1> <デバイス2> ...
% sudo zpool create rpool raidz3 <デバイス1> <デバイス2> ...

他にもキャッシュデバイスやログデバイスも指定できる。

% sudo zpool create rpool mirror <デバイス1> <デバイス2> cache <デバイス3> log <デバイス4>

作成したストレージプールは自動的に/配下にマウントされる。

% df -h /rpool
Filesystem      Size  Used Avail Use% Mounted on
rpool           8.0G     0  8.0G   0% /rpool

アンマウントする時は以下のようにする。

% sudo zfs unmount rpool

ストレージプールを削除する場合は以下のようにする。

% sudo zpool destroy rpool

ストレージプールからは別のストレージプールを切り出すことができる。

% sudo zfs create rpool/sub
% df -h -t zfs
Filesystem      Size  Used Avail Use% Mounted on
rpool           8.0G  128K  8.0G   1% /rpool
rpool/sub       8.0G  128K  8.0G   1% /rpool/sub

こうすることで同じストレージプール内に独立したファイルシステムを作成することができる。

マウントポイントをデフォルト以外の場所にしたい場合は以下のようにする。

% sudo zfs umount rpool/sub
% sudo mkdir /mnt/sub
% sudo zfs set mountpoint=/mnt/sub rpool/sub
% sudo zfs mount rpool/sub
% df -h -t zfs
Filesystem      Size  Used Avail Use% Mounted on
rpool           8.0G     0  8.0G   0% /rpool
rpool/sub       8.0G     0  8.0G   0% /mnt/sub

各種設定

OS起動時・停止時の挙動

/etc/default/zfsの以下の設定を変更することによってOS起動時・停止時の挙動を制御することができる。

OS起動時にmountするか(yes|no)
 5  ZFS_MOUNT='no'
OS停止時にunmountするか(yes|no)
 9  ZFS_UNMOUNT='no'
OS起動時にshareするか(yes|no)
13  ZFS_SHARE='no'
OS停止時にunshareするか(yes|no)
16  ZFS_UNSHARE='no'

プロパティ設定

ストレージプールに作成したファイルシステムには様々なプロパティが設定されており、これを操作することで細かい制御ができる。

現在のプロパティの設定情報を参照するにはgetサブコマンドに続いて参照したいプロパティ名を指定する。

% zfs get <プロパティ> <ファイルシステム>

全てのプロパティを参照するにはプロパティ名に「all」を指定する。

% sudo zfs get all rpool
NAME   PROPERTY              VALUE                  SOURCE
rpool  type                  filesystem             -
rpool  creation              水  6月 18  0:14 2014  -
rpool  used                  112K                   -
rpool  available             8.00G                  -
rpool  referenced            30K                    -
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         30K                    -
rpool  usedbychildren        82.5K                  -
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               30K                    -
rpool  logicalused           42.5K                  -
rpool  logicalreferenced     15K                    -
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              off                    default

% sudo zfs get all rpool/sub/dev
NAME           PROPERTY              VALUE                  SOURCE
rpool/sub/dev  type                  filesystem             -
rpool/sub/dev  creation              水  6月 18  0:30 2014  -
rpool/sub/dev  used                  30K                    -
rpool/sub/dev  available             8.00G                  -
rpool/sub/dev  referenced            30K                    -
rpool/sub/dev  compressratio         1.00x                  -
rpool/sub/dev  mounted               yes                    -
rpool/sub/dev  quota                 none                   default
rpool/sub/dev  reservation           none                   local
rpool/sub/dev  recordsize            128K                   default
rpool/sub/dev  mountpoint            /rpool/sub/dev         default
rpool/sub/dev  sharenfs              off                    default
rpool/sub/dev  checksum              on                     default
rpool/sub/dev  compression           off                    inherited from rpool
rpool/sub/dev  atime                 on                     default
rpool/sub/dev  devices               on                     default
rpool/sub/dev  exec                  on                     default
rpool/sub/dev  setuid                on                     default
rpool/sub/dev  readonly              off                    default
rpool/sub/dev  zoned                 off                    default
rpool/sub/dev  snapdir               hidden                 default
rpool/sub/dev  aclinherit            restricted             default
rpool/sub/dev  canmount              on                     default
rpool/sub/dev  xattr                 on                     default
rpool/sub/dev  copies                1                      default
rpool/sub/dev  version               5                      -
rpool/sub/dev  utf8only              off                    -
rpool/sub/dev  normalization         none                   -
rpool/sub/dev  casesensitivity       sensitive              -
rpool/sub/dev  vscan                 off                    default
rpool/sub/dev  nbmand                off                    default
rpool/sub/dev  sharesmb              off                    default
rpool/sub/dev  refquota              none                   default
rpool/sub/dev  refreservation        none                   default
rpool/sub/dev  primarycache          all                    default
rpool/sub/dev  secondarycache        all                    default
rpool/sub/dev  usedbysnapshots       0                      -
rpool/sub/dev  usedbydataset         30K                    -
rpool/sub/dev  usedbychildren        0                      -
rpool/sub/dev  usedbyrefreservation  0                      -
rpool/sub/dev  logbias               latency                default
rpool/sub/dev  dedup                 off                    default
rpool/sub/dev  mlslabel              none                   default
rpool/sub/dev  sync                  standard               default
rpool/sub/dev  refcompressratio      1.00x                  -
rpool/sub/dev  written               30K                    -
rpool/sub/dev  logicalused           15K                    -
rpool/sub/dev  logicalreferenced     15K                    -
rpool/sub/dev  snapdev               hidden                 default
rpool/sub/dev  acltype               off                    default
rpool/sub/dev  context               none                   default
rpool/sub/dev  fscontext             none                   default
rpool/sub/dev  defcontext            none                   default
rpool/sub/dev  rootcontext           none                   default
rpool/sub/dev  relatime              off                    default

以下、いくつかのプロパティの設定手順を紹介する。

quota

ディスククォータを設定する。

例えば以下のように一つのストレージプールを複数のファイルシステムに分割して使用している場合を考える。

% zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
rpool           228K  8.00G    31K  /rpool
rpool/sub        92K  8.00G    32K  /rpool/sub
rpool/sub/dev    30K  8.00G    30K  /rpool/sub/dev
rpool/sub/pub    30K  8.00G    30K  /rpool/sub/pub

この中でrpool/sub/pubに対して1GBのクォータを設定する場合は以下のようにする。

% sudo zfs set quota=1g rpool/sub/pub

これによりrpool/sub/pubの使用可能サイズは1GBになる。それ以外は以前と同じままである。

% zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
rpool           230K  8.00G    31K  /rpool
rpool/sub        92K  8.00G    32K  /rpool/sub
rpool/sub/dev    30K  8.00G    30K  /rpool/sub/dev
rpool/sub/pub    30K  1024M    30K  /rpool/sub/pub

クォータの解除はサイズに「none」を指定して再設定すればよい。

% sudo zfs set quota=none rpool/sub/pub
% zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
rpool           230K  8.00G    31K  /rpool
rpool/sub        92K  8.00G    32K  /rpool/sub
rpool/sub/dev    30K  8.00G    30K  /rpool/sub/dev
rpool/sub/pub    30K  8.00G    30K  /rpool/sub/pub
reservation

ディスク領域を予約する。

これは前述のクォータのようにファイルシステムの最大サイズを制限するのとは逆に、あらかじめ指定したサイズの領域を確保する方法である。

例えばrpool/sub/devに対して4GBの領域を確保する場合は以下のようにする。

% sudo zfs set reservation=4g rpool/sub/dev

これによりrpool/sub/dev以外の使用可能サイズが8GB中の4GBになり、結果的にrpool/sub/devのために(最低)4GBが確保されたことになる。

% zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
rpool          4.00G  4.00G    31K  /rpool
rpool/sub      4.00G  4.00G    32K  /rpool/sub
rpool/sub/dev    30K  8.00G    30K  /rpool/sub/dev
rpool/sub/pub    30K  4.00G    30K  /rpool/sub/pub

領域の予約解除はサイズに「none」を指定して再設定すればよい。

% sudo zfs set reservation=none rpool/sub/dev
% zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
rpool           226K  8.00G    31K  /rpool
rpool/sub        92K  8.00G    32K  /rpool/sub
rpool/sub/dev    30K  8.00G    30K  /rpool/sub/dev
rpool/sub/pub    30K  8.00G    30K  /rpool/sub/pub
compression

ファイルシステム内を圧縮モードにする。

% sudo zfs set compression=on rpool/sub/dev
% sudo zfs get compression
NAME           PROPERTY     VALUE     SOURCE
rpool          compression  off       local
rpool/sub      compression  off       inherited from rpool
rpool/sub/dev  compression  on        local
rpool/sub/pub  compression  off       inherited from rpool

圧縮モードの解除は「off」を指定して再設定すればよい。

% sudo zfs set compression=off rpool/sub/dev

その他、様々なプロパティが存在するが、ここでは割愛する。