CentOS 7 - ZFSを使いはじめる。

自宅サーバのHDD容量が残り少なくなったので、データ領域をZFSにします。

また、利用できるHDD容量を増やしたいので、ZFSの重複削除機能(dedup)を有効にします。
 

本投稿では、CentOS 7 に ZFS をインストールする方法と利用方法について紹介します。

 

目次

1.ZFSのインストール

2.ZFSの利用方法

3.重複削除機能(dedup)

4.RAIDの構築方法

5.プロパティ

 

作業環境
OS: CentOS 7.1.1503
- OSは、最小構成(minimal)でインストールしてます。 仮想環境: KVM
- ZFSのインストール練習のため、仮想サーバやります。

※同じ手順で物理サーバ(物理)も、問題なく動作しました。

 

 

1.ZFSのインストール

 

ZFSとは

ZFSとは、ファイルシステムの1つです。ファイルシステムといっても、ボリュームマネージャとしても機能するため、パーティション管理やRAIDサポート、データ破損の対策やスナップショットまでやってくれます。(他にも機能があります)

 

カーネルアップデート

ZFSのインストールには、サーバのカーネルバージョンが重要になります。 まず、サーバのカーネルバージョンを確認しましょう。※すでに最新版のカーネルをご利用の場合、カーネルアップデートの手順をスキップしてください。

# uname -r
3.10.0-123.el7.x86_64

 

次にサーバのカーネルバージョンを最新にするため、Yumアップデートを行います。

# yum -y update

「-y」オプションをつけることで、確認の問い合わせがなくなります。

 

Yumアップデートが終わったら、サーバを再起動しましょう。

# reboot
または
# shutdown -r now

 

再起動後のサーバでカーネルバージョンを確認しましょう。 再起動前とバージョンが変わっているはずです。

# uname -r
3.10.0-229.7.2.el7.x86_64

 

 

ZFSリポジトリの追加

ZFSをYumでインストールするためには、ZFS用のYumリポジトリが必要となるため、公式サイトからRPMコマンドを使ってインストールしましょう。

# rpm -Uvh http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm

 

ZFS用のYumリポジトリとは別に、もう一つYumリポジトリをインストールしましょう。

# yum install -y epel-release

 

 

ZFSをインストール

やっと、ZFSがインストールできるようになります。ZFSのインストールは、Yumコマンドで行います。 ZFSと一緒に「kernel-devel」もインストールしましょう。

# yum install -y kernel-devel zfs

 

ZFSのインストールが正常に完了しているか確認しましょう。

# zpool list
no pools available

上記コマンドの実行結果が「no pools available」ならインストールは正常に完了しています。

 

 

2.ZFSの利用方法

 

ディスクを作成

本来ならHDDをサーバに追加しますが、今回はddコマンドでイメージを作成しましょう。

# dd if=/dev/zero of=~/bigfile bs=1024M count=5
# ls -lh ~/bigfile
-rw-r--r--. 1 root root 5.0G  6月 26 11:04 /root/bigfile

 

実際にHDDを追加した場合、下記コマンドなどでHDDを確認しましょう。

# cat /proc/partitions
または
# fdisk -l

 

 

ZFSストレージプールを作成

ストレージプールを作成するには、zpoolコマンドを使います。

コマンドは、「zpool create -f [プール名] [ディスク名]」感じです。

# zpool create -f zfs ~/bigfile

 

ストレージプールが作成できているか確認しましょう。

# zpool status
  pool: zfs
 state: ONLINE
  scan: none requested
config:

        NAME             STATE     READ WRITE CKSUM
        zfs              ONLINE       0     0     0
          /root/bigfile  ONLINE       0     0     0

errors: No known data errors

zfsと名前のついたプールが作成されていることが分かります。もし、作成に失敗していればコマンドの結果に「no pools available」と出力されるはずです。

 

作成したストレージプールの容量を知りたい場合は、zfsコマンドとzpoolコマンドの2つで調べることができます。

# zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
zfs     55K  4.89G    19K  /zfs

または

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zfs   4.97G  56.5K  4.97G         -     0%     0%  1.00x  ONLINE  -

 

また、ストレージプールを作成すると自動的にプール名でマウントされます。

# df -h /zfs
ファイルシス   サイズ  使用  残り 使用% マウント位置
zfs              4.9G     0  4.9G    0% /zfs

実行結果の下に「/zfs」がマウントされていることが分かります。

 

 

動作確認

ここまでくれば、ZFSは使えます。試しに1GBのファイルを/zfsにddコマンドで作成してみましょう。

# dd if=/dev/zero of=/zfs/bigfile bs=1024M count=1

 

作成できたか確認してみましょう。

# ls -lh /zfs/bigfile
-rw-r--r--. 1 root root 1.0G  6月 26 11:04 /zfs/bigfile

 

zfsコマンドとzpoolコマンドでも容量を確認してみましょう。

# zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
zfs   1.00G  3.89G  1.00G  /zfs

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zfs   4.97G  1.00G  3.97G         -    13%    20%  1.00x  ONLINE  -

zfsコマンドとzpoolコマンドでも、1GBのファイル作成できていることが分かります。

 

 

3.重複削除機能(dedup)

 

重複削除機能(dedup)を有効化

まず、ストレージプールを確認しましょう。

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zfs   4.97G   222K  4.97G         -     5%     0%  1.00x  ONLINE  -

# ls -lh /zfs/
合計 0

/zfsディレクトに、何もないことも確認できました。

 

つぎに、zfsと名前のついたストレージプールの重複削除機能(dedup)の状態を確認しましょう。

確認には、zfsコマンドのgetオプションを使います

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

VALUEがoffになっていれば、重複削除機能(dedup)は無効な状態です。

 

重複削除機能(dedup)を有効にしましょう。

# zfs set dedup=on zfs

 

重複削除機能(dedup)が有効になっていることを確認しましょう。

# zfs get dedup zfs
NAME  PROPERTY  VALUE          SOURCE
zfs   dedup     on             local

VALUEがonになっていれば、重複削除機能(dedup)は有効な状態です。

 

 

動作検証

まず、ディスクサイズを確認しましょう。

# df -h /zfs
ファイルシス   サイズ  使用  残り 使用% マウント位置
zfs              4.9G     0  4.9G    0% /zfs

# zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
zfs    192K  4.89G    19K  /zfs

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zfs   4.97G   222K  4.97G         -     5%     0%  1.00x  ONLINE  -

 

ddコマンドでディスクサイズより、大きい6GBのファイルを作成しましょう。

# dd if=/dev/zero of=/zfs/bigfile bs=1024M count=6
# ls -lh /zfs/bigfile

重複削除機能(dedup)により、ディスクの実サイズよりも大きいファイルを作成することができました。

 

あらためて、ディスクサイズを確認しましょう。

# df -h /zfs
ファイルシス   サイズ  使用  残り 使用% マウント位置
zfs               11G  6.1G  4.8G   56% /zfs

# zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
zfs   6.00G  4.80G  6.00G  /zfs

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zfs   4.97G   886K  4.97G         -     6%     0%  48960.75x  ONLINE  -

zfsコマンドの結果だと、6GB/4.8GBを使っているように見えます。しかし、zpoolコマンドの結果だと、4.97/4.97と容量が減っていないようです。更に、dfコマンドの結果に関しては、サイズが増えていることがわかります。

要は、6GBのファイルを作成したがZFS的にはディスク使用率0%ですよとのこと。

 

 

4.RAIDの構築方法

 

RAIDとは

複数のハードディスクをひとつのドライブのように認識・表示させる技術のこと。

 

RAID1(ミラーリング)を組む

まず、RAIDを組むのに必要なディスクイメージをddコマンドで2つ作成しましょう。

# dd if=/dev/zero of=~/bigfile01 bs=1024M count=1
# cp -v ~/bigfile01 ~/bigfile02
`/root/bigfile01' -> `/root/bigfile02'

# ls -lh ~/
合計 2.0G
-rw-r--r--. 1 root root 1.0G  6月 26 11:50 bigfile01
-rw-r--r--. 1 root root 1.0G  6月 26 11:51 bigfile02

 

2つのディスクイメージを作成し終えたら、RAID1(ミラーリング)を組みます。

# zpool create -f zfs mirror ~/bigfile01 ~/bigfile02

RAID1を組むのに必要なのはこれだけ。それでは、正しく組めているか確認しましょう。

# zpool status
  pool: zfs
 state: ONLINE
  scan: none requested
config:

        NAME                 STATE     READ WRITE CKSUM
        zfs                  ONLINE       0     0     0
          mirror-0           ONLINE       0     0     0
            /root/bigfile01  ONLINE       0     0     0
            /root/bigfile02  ONLINE       0     0     0

errors: No known data errors

# zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
zfs     55K   984M    19K  /zfs

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zfs   1016M  56.5K  1016M         -     0%     0%  1.00x  ONLINE  -

正しく組めていることを確認できました。

ちなみにRAID1(ミラーリング)は、2つのディスクに1つのデータを同じように書き込みます。そのため、ディスクの片側が故障してもデータは守られます。

 

 

RAIDの種類と組み方

RAIDにも多くの種類があるので、組むためのコマンドだけを紹介します。

RAID0(ストライピング)

# zpool create -f zfs [ディスク名] [ディスク名]
例えば
# zpool create -f zfs /dev/sda /dev/sdb

 

RAID10

# zpool create -f zfs mirror [ディスク名] [ディスク名] mirror [ディスク名] [ディスク名]

 

RAIDZ

# zpool create -f zfs raidz [ディスク名] [ディスク名] [ディスク名] [ディスク名]

 

RAIDZ2

# zpool create -f zfs raidz2 [ディスク名] [ディスク名] [ディスク名] [ディスク名]

 

 

RAIDの組み直し方

RAID1をRAID10に組み直す方法を紹介します。

下記は、すでにRAID1が組まれている状態です。

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zfs   24.9G  56.5K  24.9G         -     0%     0%  1.00x  ONLINE  -
# zpool status
  pool: zfs
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zfs         ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sda     ONLINE       0     0     0
            sdb     ONLINE       0     0     0

errors: No known data errors

 

RAID1 -> RAID10 に組み直すためには、既存のzfsプールにRAID1を追加します。

# zpool add -f zfs mirror /dev/sdc /dev/sdd

zfsプールにRAID1の追加を終えたら確認してみましょう。

# zpool status
  pool: zfs
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zfs         ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sda     ONLINE       0     0     0
            sdb     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0

errors: No known data errors

上記のようになっていれば、RAID1 -> RAID10 への組み直しは完了です。

 

 

5.プロパティ

 

ZFSには、多くのプロパティがあります。プロパティを上手く使えばパフォーマンスが大幅に向上される可能性があるので試してみてください。

プロパティの説明は、 http://docs.oracle.com/cd/E19253-01/819-6260/gazss/index.html を見てください。

 

プロパティを確認

プロパティは、zfsコマンドのgetオプションで確認できます。

# zfs get [プロパティ名] [プール名]

例では
# zfs get atime zfs
NAME  PROPERTY  VALUE  SOURCE
zfs   atime     on     default

 

プロパティの変更

プロパティのステータスを変更するにはzfsコマンドのsetオプションで行えます。

# zfs set [プロパティ名]=[ステータス] [プール名]

例では
# zfs set atime=off zfs
# zfs get atime zfs
NAME  PROPERTY  VALUE  SOURCE
zfs   atime     off    local