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