注文していたUSBメモリが届いたので,早速,USBメモリを使って,ZFSの実験を行いました.USBメモリは,SANDISKのULTRA FLAIR 64GB(SDCZ73-064G-G46)を4個使用しました.
今回はZFS(RAID-Z1)の実験ですが,最終的には,HDDに適用してファイルサーバにする予定です.そのため,少なくともHDDなみのパフォーマンスを持ったUSBメモリが必要だと考えました.そうなると,すぐに思いついたのはSANDISKのExtremeですが,以前よりは価格が下がったとはいえ(今だと64GBの最低価格が3千円ぐらい),4個購入するとなるとやはり高価です.
そこで,価格比較サイトを調べて見つけたのが,今年発売のSANDISK ULTRA FLAIRでした.Extremeよりは遅いですが,USBメモリの中では高速な方ですし(シーケンシャルリードが140MB/s程度,シーケンシャルライトが70MB/s程度,ランダムリードが5MB/s程度,ランダムリードが3MB/s程度でした),64GBのものが1個当たり千円台後半と,他の64GBのUSBメモリと比べると,価格性能比は良好な方です.また小型のため,4個同時に使用しても邪魔になりませんし,なによりSANDISKなので信頼できます.
SANDISK ULTRAですと,更に低価格になるのですが,こちらは速度が遅くなりますし,メモリが大型です.
4個のUSBメモリを,GB-BASE-3150に直接取り付けることはできませんので,USBハブが必要となります.幸い,間違って購入していた(笑),AnkerのUSB 3.0の4ポートハブ(約千円)がありましたので,それにUSBメモリを取り付けました.
それから,〇C DEPOTでDDR3L-1600の8GBのメモリ(CFDのD3N1600PS-L8G)が,4千円台前半になっていました.ようやく8GBのメモリが,どうにか許容できる価格に近づいてきたため,ZFSの実験用ということで(ZFSはメモリが多い方が良いらしいので),在庫がなくなる前に購入しました.
1.準備
ZFSのカーネルモジュールは,デフォルトでは無効になっているためmodprobeで有効にします.
$ sudo modprobe zfs
lsmodでZFSのカーネルモジュールが有効になっていることを確認します.
$ lsmod | grep zfs
次に,OS起動時にZFSのカーネルモジュールが有効になるように/etc/modulesに"zfs"を追加しておきます.これは,/etc/modulesを開いたのち,適当なところに
zfs
を追記するだけです.それから,ZFS関連のユーティリティをインストールします.
$ sudo apt install zfsutils-linux
2.ZFSで使うディスクの確認
普通,ディスクにアクセスするときは,
/dev/sda1
などとするのが一般的ですが,ここでは,
/dev/disk/by-id/~
で,ディスクにアクセスします.by-idは,インタフェース(今回はUSB)とディスクのモデル名とシリアル番号の一部から作成されるため,ディスクを交換する際に,交換が必要なディスクを識別しやすくなります.特に,複数のUSBメモリを使用していると,再起動のたびに,/dev/sdX1のXが変わるため,by-idを用いた方が安全です.
それでは,ディスクのby-idを取得します.今回,USBメモリは,/dev/sdb1~/dev/sde1にマウントされているため,次のコマンドで取得します.
$ ls -l /dev/disk/by-id | egrep sd[b-e]1
結果は,
USBメモリ1は,
usb-SanDisk_Ultra_USB_3.0_4C5300010~-0:0-part1 -> ../../sdd1
USBメモリ2は,
usb-SanDisk_Ultra_USB_3.0_4C5310013~-0:0-part1 -> ../../sdc1
USBメモリ3は,
usb-SanDisk_Ultra_USB_3.0_4C5310015~-0:0-part1 -> ../../sdb1
USBメモリ4は,
usb-SanDisk_Ultra_USB_3.0_4C5310016~-0:0-part1 -> ../../sde1
でした.リダイレクトを使って,
$ ls -l /dev/disk/by-id | egrep sd[b-e]1> by-id.txt
などのように,テキストファイルに出力しておくと,後々,便利だと思います.
3.USBメモリをフォーマット
購入したばかりのUSBメモリはFAT32でフォーマットされていましたので,これを再フォーマットします.先人の教えに従い,XFSでフォーマットしました.XFSはブートディスクには使えませんが,ext4より安定性(耐障害性)が高いそうなので,ZFSで使うには,最適なファイルシステムだと思います.
まず,ツールをインストールします.
$ sudo apt-get install xfsprogs
続いて,USBメモリをアンマウントします.
$ sudo umount /dev/sdb1
$ sudo umount /dev/sdc1
$ sudo umount /dev/sdd1
$ sudo umount /dev/sde1
それから,XFSでフォーマットします.
$ sudo mkfs.xfs -f /dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5300010~-0:0-part1
$ sudo mkfs.xfs -f /dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310013~-0:0-part1
$ sudo mkfs.xfs -f /dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310015~-0:0-part1
$ sudo mkfs.xfs -f /dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310016~-0:0-part1
4.ストレージプール(RAID-Z1)の作成
以上で全ての準備が整いましたので,ストレージプールを作成します.今回はRAID-Z1(RAID5相当)を作成します.ストレージプールの名前は,poolやtankが一般的なようです.今回はpoolとしました.
RAID-Z1のストレージプールを作成するコマンドは,
$ sudo zpool create pool raidz1 \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5300010~-0:0-part1 \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310013~-0:0-part1 \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310015~-0:0-part1 \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310016~-0:0-part1
です.状況によっては,createの後ろに,-fオプションが必要になるかもしれません.コマンド実行後,
$ df -h
とすると,新たに,poolというファイルシステムと,/poolというディレクトリが追加されたことが分かります.また,
$ sudo zpool create pool raidz2~
とすると,RAID-Z2(RAID6相当)を作成することができます.
64GB(実際のところは57GBぐらい)のUSBメモリ4個をRAID-Z1にしたので,poolの容量は170GBぐらいになると思ったのですが,XFSとZFSの影響か,167GBになっていました.
RAID-Zの注意点としては,後から,ストレージプールの拡張が大変難しいことです.ストレージプールを拡張するぐらいだったら,新たに大容量なストレージプールを作った方が簡単です.
ちなみに,異なる容量のストレージを,ZFSで1つのストレージプール(JBODみたいなもの)にすることもできます.その場合のコマンドは,
$ sudo zpool create pool \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5300010~-0:0-part1 \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310013~-0:0-part1 \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310015~-0:0-part1 \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310016~-0:0-part1
です.
この場合,新しいストレージを追加して,ストレージプールを拡張することができます.その時のコマンドは,
$ sudo zpool add -f pool /dev/disk/by-id/~
です.この方法で作成したストレージプールは,RAID-Z1のような冗長性はありません.しかし,システムを稼働させたまま,ストレージプールの容量を拡張することができるという特徴があります.
-----2016/11/12 追記
RAID10相当のストレージプールを作るコマンドは,
$ sudo zpool create pool mirror \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5300010~-0:0-part1 \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310013~-0:0-part1 \
mirror \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310015~-0:0-part1 \
/dev/disk/by-id/usb-SanDisk_Ultra_USB_3.0_4C5310016~-0:0-part1
です.
ストレージプールの状態を知るコマンドは,
$ sudo zpool status
です.
また,ストレージプールをアンマウントする場合のコマンドは,
$ sudo zfs unmount pool
ストレージプールを削除する場合のコマンドは,
$ sudo zpool destroy pool
です.他にも,色々なコマンドがあるのですが,とりあえず必要そうなものをピックアップしてみました.
-----
4./etc/default/zfsの編集
最後に,/etc/default/zfsを編集します.ファイルを開いたのち,OS起動時に共有するように,
ZFS_SHARE='NO'
を
ZFS_SHARE='YES'
に変更します.それ以外の設定項目は,変更の必要がないと思いましたので,手を付けていません.
5.共有ディレクトリの作成
せっかく作ったRAID-Z1のストレージなので,共有ディレクトリにしました.まず,/poolの下に,共有ディレクトリを作ります.
$ sudo mkdir /pool/share
$ sudo chmod 777 /pool/share
次に,/etc/samba/smb.confを編集します.ファイルを開いたのち,一番最後に以下を追加します.既に,shareという共有ディレクトリがありますので,新しい共有ディレクトリ名はshare-zとしました.
[share-z]
comment = Share Directories on RAID-Z1
path = /pool/share
read only = no
guest ok = yes
guest only = yes
share modes = yes
編集と保存が終わったら,sambaの再起動をします.
$ sudo systemctl restart smbd.service nmbd.service
先人の情報提供のおかげで,あっけなく,RAID-Z1のストレージプールを作ることができました.
参考にしたページは,主に以下の2つです.ZFSに触れるのは今回が初めてで,私の力だけでは何ともならなかったので,先人の努力と情報提供に感謝します.
http://l-w-i.net/t/ubuntu/zfs_002.txt
https://tech.nosuz.jp/2016/05/ubuntu-16-04-zfs/
0 件のコメント:
コメントを投稿