読者です 読者をやめる 読者になる 読者になる

私をペロペロするがよい

lazy_dog のブログです。

CentOS 7 + ZFS でファイルサーバを作成

を、作った。

前置き

以前から、Arch Linux + ZFS でファイルサーバを動かしてたけど、諸々あって CentOS 7 で再作成する運びになった。

理由

  • Arch LinuxZFS パッケージ周りが、しょっちゅう Kernel とコンフリクトおこして、まともに Kernel アップデートもできない。
  • パッケージ名も "zfs" から "zfs-git" になったりと、バタバタしている印象を覚えた。アップデートについていくので精一杯。
    • 大変な思いされてるパッケージメンテナの方々には申し訳ないが。。。
    • コンフリクトおこして、しょっちゅう pacman -Syu 失敗するわで、その度に切り分けやってたらきりがなかった。なので、Arch Linuxzfs で安定はしてても、先行き不安になった。
  • ローリングリリースならではの、「なにかあったときの怖さ」
    • Arch Linux 全否定ですが。。。
    • できる限り安定性求めるなら、CentOS しかないと思った。

以上より、KVM/qemu やその他は安定していたので不安は感じないものの、ZFS だけは Arch Linux じゃ厳しいと思った。

環境

  • HP Micorserver (non Gen8)
  • システム領域用 HDD (250 GB) *1
  • ZFS 用 HDD (3 TB) *3

メモリ 2GB。お値段が安くなったら追加したいですね。

これを RAID 5 同等の信頼性を持ったファイルサーバにする。

基礎知識

そもそも ZFS ってなんなのか。

複数の HDD を束ねて RAID するファイルシステム

ファイルシステムとしては XFS、ext4/3/2 と同じ土俵、Software RAID としては md と同じ土俵らしい。RAID としての機能を持ちながらも、作成した時点で、デバイスはファイルシステムとしてフォーマット済みとなる。

md の場合、mkfs などでファイルシステムとしてフォーマットしなければならない、つまり LUN の提供までを担うが、ZFS はさらにファイルシステムとしてボリュームを見せてくれる。

高機能な RAID 5 が作れる

RAID 5 と同等の RAIDZ (RAID-Z) を作成できる。RAIDZ は RAID 5 の弱点を克服したものになる。

RAID 5 は、サーバに対する突然の停電に弱く、何も対策がされていない場合、データの不整合 → つまりファイル破損などが起きる危険性がある。そのため、ハードウェア RAID の場合、キャッシュやバッテリーが装備される。

詳しく説明すると、ディスクごとに分散させつつ冗長させてデータ (パリティブロック) を書き込んでいる。その冗長させた各パリティブロック同士が同じ値にならないといけないのにもかかわらず、突然の停電などで書き込みがストップし、書き込みタイムラグにより同じデータにならない危険性がある。ハードウェア RAID は、それに対応するため、キャッシュやバッテリーを使い、最後までデータの書き込みを担保し、破損させないようにしている。

RAID-Z (Jeff Bonwick's Blog)
https://blogs.oracle.com/bonwick/entry/raid_z5

上記を RAIDZ は克服している。突然の停電などでも、データ破損は起こらない。対策の結果、「RAID」と「ファイルシステム」を組み合わせることになったらしいが、アーキテクチャ云々の詳しいことはおいらには理解できなかった。。。また、処理も高速らしい。パリティを可変長にした結果とのこと。

なお、ZFS on Linux では、下記のように定義されている。

  • RAID 5 と同等 → RAIDZ-1
  • RAID 6 と同等 → RAIDZ-2
  • RAID 6 に 1 つの冗長ディスクをさらに追加 (3 つの冗長ディスク) → RAIDZ-3

単語など

プール

ZFS で一つのファイルシステム (RAID でまとめられたもの) をこう呼ぶ。

zpool

ZFS もろもろはこのコマンドから行われる。

/tank

ZFS で作られたプールは、/tank というディレクトリ以下にマウントされるのが常っぽい。いわゆる慣例的な。

まとめ

ワンコマンドで、ディスクを束ねて RAID を作りつつ、ファイルシステムとしてフォーマットしてくれるすごい奴と覚えればいい。

ZFS 作成まで

下記のドキュメントを参照しつつ、構築した。

Aaron Toponce's user guide for ZFS on Linux.
https://pthree.org/2012/04/17/install-zfs-on-debian-gnulinux/

ZFS on Linux からリンクが貼られているページ。

CentOS 7 インストール

普通にインストールして、firewalld と selinux を無効にして (良くはないが)、最終的に yum update すれば問題なし。

唯一気をつけることがあるとすれば、HDD は BIOS からは ACHI で見せたほうがいい。ストレージや RAID コントローラを使っている場合は、JBOD を使用すべき。

Consider using JBOD-mode for storage arrays rather than hardware RAID so that ZFS can manage the storage and the redundancy. http://docs.oracle.com/cd/E23823_01/html/819-5461/zfspools-4.html

あたりまえだけど、ディスク 1 本 1 本を束ねず JBOD として LUN を見せないと駄目ですからね。。。

zfs 対象ディスクのパーティションテーブルを GPT に変更

2 TB 以上の HDD は GPT にする必要がある。ZFS でフォーマットされる場合も、もれなくひっかかる。

parted コマンドで変更・確認が可能である。

確認

 [root@palestine ~]# parted -l

(省略)

Error: /dev/sdb: unrecognised disk label
Model: ATA ST3000DM001-1ER1 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/4096B
Partition Table: unknown
Disk Flags:

未フォーマットというのもあり、Partition Table: unknown となっている。

変更

parted で対象のデバイスを選択したあと、シェルから mklabel gpt で変更する。

[root@palestine ~]# parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
(parted) quit
Information: You may need to update /etc/fstab.

[root@palestine ~]#

"parted -l" をして、GPT であることを確認する。

Model: ATA ST3000DM001-1ER1 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

"Partition Table" 行が gpt となっていれば OK。

RAIDZ (RAIDZ-1) 作成

下記の通りにコマンドを実行すれば、作成可能。

zpool create -m {マウント先} {プール名} {RAID レベル} {デバイス 1} {デバイス 2} ...

今回は、RAIDZ-1 になるので

zpool create -m /tank/zfs_pool/zfspool01/ zfs-pool1 raidz1 sdb sdc sdd

となる。コマンドを実行して、標準出力・エラー出力に何も表示されなければ、使用可能になる。なお、サーバを再起動しても、何も設定しなくとも自動でマウントされる。また、ファイルシステムが既にあったり、以前 RAIDZ を作成していたりすると、エラーが出る場合があるが、-f オプションで強制することで、回避できる。

ついでに、sambanfs 設定

備忘録として。

samba 設定

yumsamba をインストール。

# yum install samba

/etc/samba/smb.conf を編集。

[datashare_01]
        comment = datashare_01 (/tank/zfs_pool/zfspool01/datashare_01)
        path = /tank/zfs_pool/zfspool01/datashare_01
        public = no
        writeable = yes

[datashare_02]
        comment = datashare_02 (/tank/zfs_pool/zfspool01/datashare_02)
        path = /tank/zfs_pool/zfspool01/datashare_02
        public = no
        writeable = yes

プリントサーバにはしないので、Printing Options セクションの "load printers ="no にしておいた。

下記を実行し、ユーザ登録。

# useradd lazy_dog
# pdbedit -a -u lazy_dog

下記を実行し、起動。

# systemctl enable smb
# systemctl start smb

Windows 8.1 側で、ネットワークドライブ接続を確認した。

nfs 設定

yumnfs-utils をインストール。

yum install nfs-utils

/etc/exports を編集。一応、セキュリティを考慮して、裏のセグメントのみ接続可能に。

[root@israel /]# cat /etc/exports
/tank/zfs_pool/zfspool01/datashare_01 192.168.1.0/24(rw)

下記を実行し、起動。必要なときだけ起動する方針で。

# systemctl start rpcbind
# systemctl start nfslock
# systemctl start nfs

クライアント側から、下記コマンドで接続できることを確認した。

mount -t nfs 192.168.1.7:/tank/zfs_pool/zfspool01/datashare_01 /mnt/nfs

nfs なんて使わないだろうな、と思いきや、virt-install コマンドで iso イメージのパスを samba にすると NG なので、結構に使う。

Arch LinuxKVM/qemu (環境構築から VM の作成まで) - 私をペロペロするがよい
http://lazy-dog.hatenablog.com/entry/2014/07/13/015538

まとめ

エンジョイファイルサーバありの生活。

余談にはなるけど、HP のハードウェア RAID コントローラについての技術文書が面白そうだったから、後で読む。

HP SmartアレイコントローラーおよびRAIDの基本的なパフォーマンスファクター
http://h50146.www5.hp.com/products/servers/proliant/whitepaper/wp122_1008/