2016年11月10日木曜日

USBメモリでZFS(RAID-Z1)

 注文していた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 件のコメント:

コメントを投稿