ZFSの使い方

先日、バックアップサーバを立てようと思い、色々構成を考えていた。
バックアップサーバであればDiskI/Oにそこまでこだわる必要はないし、
問題なのは容量。
仕事で使っている製品で、重複排除機能の凄さは知っていたので、
是非とも重複排除機能を使いたいと考えていた。
重複排除機能に対応したファイルシステムは有名どころでZFS、Btrfs。
ただBtrfsはまだ開発段階であり、ちょっと怖いので人気の高いZFSを使ってみることにした。
導入から使い方まで。

なお、環境はCentOS 7.1を用いている。

ZFSの導入

  • リポジトリ登録
rpm -Uvh http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm
  • zfsをインストール
# yum install zfs kernel-devel

zfs以外に、kernel-develも入れる。
インストール後、ZFSのモジュールをロードする必要がある。
動作確認も含めて一度リブートすると良い。
ちなみに、モジュールがロードされていないと以下のようなメッセージが出力される。

# zpool list
The ZFS modules are not loaded.
Try running '/sbin/modprobe zfs' as root to load them.

モジュールがロードされていればエラーメッセージが消える。

# zpool list
no pools available

プールをまだ作っていないのでプールが存在しないメッセージが表示される。

ストレージの設定

  • ラベルの確認
    3TBのHDDを用意した。
    2TB以上のHDDはGPTにする必要がある。
    GPTは"fdisk"では扱えないため、CentOS標準で入っている"parted"を用いる。
# parted -l

未フォーマットの場合、以下のメッセージが表示される

エラー: /dev/sdb: ディスクラベルが認識できません。
モデル: ATA WDC WD30EZRZ-00Z (scsi)                                       
ディスク /dev/sdb: 3001GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: unknown
ディスクフラグ: 
  • GTPの設定
    以下の通り、対話形式でGPTの設定を行う。
# parted /dev/sdb
GNU Parted 3.1
/dev/sdb を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
(parted) mklabel gpt
(parted) quit                                                             
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。

設定後、確認するとGPTになっていることがわかる。

# parted -l
モデル: ATA WDC WD30EZRZ-00Z (scsi)
ディスク /dev/sdb: 3001GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ: 
  • zfsのストレージプール作成
    zfsはストレージプールを作成し、保存領域を管理する。
    プールを作成するには以下の通りコマンドを実行する。
zpool create [-m マウント先] [プール名] [RAID設定] [デバイス1] [デバイス2] ...

なお、マウント先を指定しない場合はプール名のディレクトリが作成され、
ルート直下にマウントされる。

# zpool create zfs_volume /dev/sdb

RAIDはraid0(デフォルト),raidz,raidz2,mirror(raid1)などなどいろいろある。
ZFSはファイルシステムレベルでraidに対応したすごいやつだ。
(LVMやmdなどもRAIDには対応しているがZFSのほうが使いやすい印象)

プールを確認してみる。

# zpool list
NAME         SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zfs_volume  2.72T   284K  2.72T         -     0%     0%  1.00x  ONLINE  -
# zpool status
  pool: zfs_volume
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    zfs_volume  ONLINE       0     0     0
      sdb       ONLINE       0     0     0

errors: No known data errors
# df -h
zfs_volume                        2.7T     0  2.7T    0% /zfs_volume

※ちなみに、プール名は自由だがtankにするのが一般的らしい。

  • backup用領域を作る
    zfs_vlumeのプールの下に、backupという領域を作る。
    (なお、新たに領域を作らなくても/zfs_volumeに書き込むことはできる。
     後に出てくるスナップショットを作ったりするときのために用途に応じて
     分けておいたほうが良い)
# zfs create zfs_volume/backup
# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
zfs_volume          376K  2.63T   100K  /zfs_volume
zfs_volume/backup    96K  2.63T    96K  /zfs_volume/backup
# df -h
zfs_volume                        2.7T     0  2.7T    0% /zfs_volume
zfs_volume/backup                 2.7T     0  2.7T    0% /zfs_volume/backup

ZFSの色々な機能

  • 重複排除設定
    超強力な重複排除機能。
    特にバックアップ等の用途の場合、重複するファイルが多くなるため、
    実際の容量と比べ、10分の1程度まで容量が少なくなることもある。
    (まだZFSで試した結果ではないが、他の重複排除製品での経験から)
    ファイル単位ではなく、ブロック単位で重複排除を行うからすごい。
    書き込めば勝手に重複排除してくれるため、使うときにあまり気にかける必要もない。

設定の確認

# zfs get dedup zfs_volume
NAME        PROPERTY  VALUE          SOURCE
zfs_volume  dedup     off            default

VALUE=off なので重複排除機能は設定されていない。
設定する。

# zfs set dedup=on zfs_volume
# zfs get dedup 
NAME               PROPERTY  VALUE          SOURCE
zfs_volume         dedup     on             local
zfs_volume/backup  dedup     on             inherited from zfs_volume

VALUE=on なので重複排除機能は設定された。

  • 圧縮機能の有効化
    ZFSは他に圧縮機能も搭載されている。
    ファイルが書き込まれるたびに自動でファイルが圧縮される。
    DiskI/Oが重要なシステムでは使うべきではないが、
    ファイルサーバやバックアップ等の用途にはもってこいの機能。

設定の確認

# zfs get compression
NAME               PROPERTY     VALUE     SOURCE
zfs_volume         compression  off       local
zfs_volume/backup  compression  off       inherited from zfs_volume

VALUE=off なので圧縮機能は設定されていない。

圧縮方式にgzipを指定して有効化

# zfs set compression=gzip zfs_volume

gzipの圧縮レベルを指定できる[gzip-1〜gzip-9と入力し指定可能]
何も指定しないと、gzip-6が設定されるらしい。

# zfs get compression
NAME               PROPERTY     VALUE     SOURCE
zfs_volume         compression  gzip      local
zfs_volume/backup  compression  gzip      inherited from zfs_volume

書き込む際に圧縮処理が走るので圧縮レベルに応じてCPU負荷が上がる。I/O速度も下がる。
圧縮方式はgzipの他にはlzjbというものも指定できる。
(試していないが、デフォルトだとlzjbらしい)

  • スナップショット
    ZFSはスナップショット機能を持っている。
    スナップショットを作成するには以下の通りコマンドを入力する。
zfs snapshot [領域名]@[スナップショット名]
# zfs snapshot zfs_volume/backup@ss1
# zfs list -t all
NAME                    USED  AVAIL  REFER  MOUNTPOINT
zfs_volume              448K  2.63T   100K  /zfs_volume
zfs_volume/backup       120K  2.63T   120K  /zfs_volume/backup
zfs_volume/backup@ss1      0      -   120K  -

なお、スナップショットの削除は以下の通り。

# zfs destroy zfs_volume/backup@ss1
  • クローンの作成
    作成したスナップショットに対して、クローンを作成することができる。
    (スナップショットからでないとクローンができない)
    クローンを作成するには以下の通り入力する。
zfs clone [snapshot領域名] [クローン名]
# zfs clone zfs_volume/backup@ss1 zfs_volume/backup_clone
# zfs list -t all
NAME                      USED  AVAIL  REFER  MOUNTPOINT
zfs_volume                540K  2.63T   104K  /zfs_volume
zfs_volume/backup         120K  2.63T   120K  /zfs_volume/backup
zfs_volume/backup@ss1        0      -   120K  -
zfs_volume/backup_clone    64K  2.63T   112K  /zfs_volume/backup_clone

ちなみに、cloneがあるとcloneの元が消せないので注意。
以下の通りメッセージが出力される。

# zfs destroy zfs_volume/backup@ss1
cannot destroy 'zfs_volume/backup@ss1': snapshot has dependent clones
use '-R' to destroy the following datasets:
zfs_volume/backup_clone

-Rオプションでclone元とclone同時に消せる

# zfs destroy -R zfs_volume/backup@ss1
  • スナップショットのコピー
    スナップショットはコピーすることができる。
    クローンとの違いは、完全に別の領域としてコピーするところ。
    別の領域となるため、コピー元を削除することが可能となる。
    コピーは以下の通り。
zfs send [スナップショットした領域名] | zfs receive [コピー名]

クローンと同じく、スナップショットじゃないとコピーできない。
スナップショットではないものをコピーしよとすると以下の通りメッセージが表示された。

# zfs send zfs_volume/backup | zfs receive zfs_volume/backup_copy
warning: cannot send 'zfs_volume/backup': target is busy; if a filesystem, it must not be mounted

(メッセージ的にアンマウントすればコピーできる?)

# zfs send zfs_volume/backup@ss1 | zfs receive zfs_volume/backup_copy
# zfs list -t all
NAME                         USED  AVAIL  REFER  MOUNTPOINT
zfs_volume                   676K  2.63T   108K  /zfs_volume
zfs_volume/backup            120K  2.63T   120K  /zfs_volume/backup
zfs_volume/backup@ss1           0      -   120K  -
zfs_volume/backup_copy       184K  2.63T   100K  /zfs_volume/backup_copy
zfs_volume/backup_copy@ss1    84K      -   120K  -

zfs_volume/backup_copy@ss1は自動で作成されていた。
コピーしてしまえば元のスナップショットも消せる

# zfs destroy zfs_volume/backup@ss1
  • マウントポイントの変更
    マウントポイントはあとからでも変えることができる。
    マウントポイントの確認
# zfs get mountpoint zfs_volume/test
NAME             PROPERTY    VALUE             SOURCE
zfs_volume/test  mountpoint  /zfs_volume/test  default

設定するには以下の通り。

zfs set mountpoint=[マウント先] [対象の領域名]
# zfs set mountpoint=/mnt/test zfs_volume/test
# df -h
ファイルシステム                    サイズ  使用  残り 使用% マウント位置
zfs_volume/test                   2.7T  128K  2.7T    1% /mnt/test
# zfs get mountpoint zfs_volume/test
NAME             PROPERTY    VALUE       SOURCE
zfs_volume/test  mountpoint  /mnt/test   local

なお、mountpoint プロパティをlegacyに設定すると、mountコマンドやfstabで管理できる

# zfs set mountpoint=legacy zfs_volume/test
# zfs get mountpoint zfs_volume/test
NAME             PROPERTY    VALUE       SOURCE
zfs_volume/test  mountpoint  legacy      local

mountコマンドでマウントする。

# mount -t zfs zfs_volume/test /mnt/test
# df -h
ファイルシステム                    サイズ  使用  残り 使用% マウント位置
zfs_volume/test                   2.7T  128K  2.7T    1% /mnt/test

※なお、fstabを使う場合、zfsはfsckができないため、fsckのオプションに注意(0を指定すること)。

ZFSは簡単に扱えるので、一般家庭のファイルサーバのファイルシステムでもZFSを利用することができる。
ちなみに今までライセンスの関係でLinuxには標準でZFSが搭載されていないのだが、
Ubuntu16.04から標準で入っているらしい。(ライセンス問題でちょっと話題になった)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です