ストレージプールの作成
利用するディスクにパーティションを作成したら,zpool
コマンドで一つのプールとして利用する.
プールの作成は zpool create プール名 利用するディスク ...
コマンドを利用する.
利用するディスクについては,mirror
,raidz
,raidz2
,raidz3
などのオプションも利用することができる.
Oracle Solaris ZFS 管理ガイド "ZFS ストレージプールを作成する"
http://docs.oracle.com/cd/E19253-01/819-6260/gayob/index.html
紙面の都合上,複数行にわたってコマンドを記載しているが,当然一行で実行していただいて構わない.
単一のディスクから作成
zfs0
パーティションから pool0
というプールを作る場合には.
$ sudo zpool create pool0 /dev/disk/by-partlabel/zfs0
と実行することにより作成できる.
プールの構成確認
zpool status
コマンドで,ストレージプールの構成と健全性の確認ができる.
上記の例で,単一のディスクからプールを作成した場合は次のようになる.
$ sudo zpool status
pool: pool0
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
zfs0 ONLINE 0 0 0
errors: No known data errors
これにより,pool0
は zfs0
から構成されており,オンラインでエラーが検出されていないことが確認できる.
プールの削除
一度作ったプールを削除するには zpool destroy
コマンドを利用する.
$ sudo zpool destroy pool0
ストライピング
ディスクを複数指定することにより,ストライピングでディスクを束ねることができる. 単純に本数の数だけ容量が増えるが,一台が故障するだけで全てのデータを失うため,重要な用途では利用しないことを推奨する.
$ sudo zpool create pool0 /dev/disk/by-partlabel/zfs0 \
/dev/disk/by-partlabel/zfs1 \
/dev/disk/by-partlabel/zfs2
$ sudo zpool status
pool: pool0
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
zfs0 ONLINE 0 0 0
zfs1 ONLINE 0 0 0
zfs2 ONLINE 0 0 0
errors: No known data errors
ミラーリング
mirror
オプションを利用して,zfs0
, zfs1
, zfs2
からミラーリングを利用して作成する.
$ sudo zpool create pool0 mirror /dev/disk/by-partlabel/zfs0 \
/dev/disk/by-partlabel/zfs1 \
/dev/disk/by-partlabel/zfs2
$ sudo zpool status
pool: pool0
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
zfs0 ONLINE 0 0 0
zfs1 ONLINE 0 0 0
zfs2 ONLINE 0 0 0
errors: No known data errors
ストライピングと異なり,mirror-0
という名前のミラーリングデバイスの下に,zfs0
, zfs1
, zfs2
があることが確認できる.
RAID-Z
mirror
の代わりに,raidz
からraidz3
を指定することで,パリティ付きのプールが作成できる.
$ sudo zpool create pool0 raidz2 /dev/disk/by-partlabel/zfs0 \
/dev/disk/by-partlabel/zfs1 \
/dev/disk/by-partlabel/zfs2 \
/dev/disk/by-partlabel/zfs3 \
/dev/disk/by-partlabel/zfs4
$ sudo zpool status
pool: pool0
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
zfs0 ONLINE 0 0 0
zfs1 ONLINE 0 0 0
zfs2 ONLINE 0 0 0
zfs3 ONLINE 0 0 0
zfs4 ONLINE 0 0 0
errors: No known data errors
RAID機能を組み合わせる
ミラーリングやRAID-Zと,ストライピングを組み合わせることで,複雑な構成のプールも作成できる.
RAID1+0 (ミラーリングのストライピング)
$ sudo zpool create pool0 mirror /dev/disk/by-partlabel/zfs0 \
/dev/disk/by-partlabel/zfs1 \
mirror /dev/disk/by-partlabel/zfs2 \
/dev/disk/by-partlabel/zfs3
$ sudo zpool status
pool: pool0
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
zfs0 ONLINE 0 0 0
zfs1 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
zfs2 ONLINE 0 0 0
zfs3 ONLINE 0 0 0
errors: No known data errors
ディスク2台のミラーリングされたデバイス,mirror-0
とmirror-1
がストライピング構成になっていることが確認できる.
RAID-Zとストライピング
RAIDZ構成は本数が増えるとパフォーマンスが低下するため,ある程度の数でストライピングしたほうが良いと言われている(未確認).以下の例では5本からなるRAIDZ2をストライピングし,10台構成のプールを作成している.
$ sudo zpool create pool0 raidz2 /dev/disk/by-partlabel/zfs0 \
/dev/disk/by-partlabel/zfs1 \
/dev/disk/by-partlabel/zfs2 \
/dev/disk/by-partlabel/zfs3 \
/dev/disk/by-partlabel/zfs4 \
raidz2 /dev/disk/by-partlabel/zfs5 \
/dev/disk/by-partlabel/zfs6 \
/dev/disk/by-partlabel/zfs7 \
/dev/disk/by-partlabel/zfs8 \
/dev/disk/by-partlabel/zfs9
$ sudo zpool status
pool: pool0
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
zfs0 ONLINE 0 0 0
zfs1 ONLINE 0 0 0
zfs2 ONLINE 0 0 0
zfs3 ONLINE 0 0 0
zfs4 ONLINE 0 0 0
raidz2-1 ONLINE 0 0 0
zfs5 ONLINE 0 0 0
zfs6 ONLINE 0 0 0
zfs7 ONLINE 0 0 0
zfs8 ONLINE 0 0 0
zfs9 ONLINE 0 0 0
errors: No known data errors
特殊なデバイス
ZFSではデータを保存するディスク以外に,
- ログデバイス
- キャッシュデバイス
- スペアデバイス
を指定することができる.
これらはプール作成後に動的に追加したり削除したりすることも可能であるが,以下では作成時に指定する例を示す.
動的に扱うには,zpool add
,zpool remove
コマンドについてドキュメントを参照されたい.
ログデバイス
ZFSでは書き込み中の停電に備えて,実行中のトランザクションの情報をディスクに保持している. デフォルトではデータと同じディスクに保存されているが,これをアクセスが高速なSSDに設置することで,パフォーマンスの向上が期待できる.
ストレージプールの作成時に log
オプションを指定することで明示的にログデバイスを指定できる.
ログデバイスは安全のためミラーリングにすることを推奨する.
$ sudo zpool create pool0 raidz /dev/disk/by-partlabel/zfs0 \
/dev/disk/by-partlabel/zfs1 \
/dev/disk/by-partlabel/zfs2 \
log mirror /dev/disk/by-partlabel/log0 \
/dev/disk/by-partlabel/log1
ubuntu@zfs:~$ sudo zpool status
pool: pool0
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
zfs0 ONLINE 0 0 0
zfs1 ONLINE 0 0 0
zfs2 ONLINE 0 0 0
logs
mirror-1 ONLINE 0 0 0
log0 ONLINE 0 0 0
log1 ONLINE 0 0 0
errors: No known data errors
トランザクションログは最大でメモリ容量の半分である.
L2ARC (キャッシュ)
ZFSではキャッシュをメモリ上に持っているが,メモリから溢れた分を別のデバイスに保持することができる.この2次的キャッシュをL2ARCと呼ぶ.このL2ARCに高速なSSDを割り当てることで,読み込みパフォーマンスの向上が期待できる.
L2ARC上のデータは喪失しても問題ないため,ストライピングにしてもよい.
L2ARCはcache
オプションで指定できる.
$ sudo zpool create pool0 raidz /dev/disk/by-partlabel/zfs0 \
/dev/disk/by-partlabel/zfs1 \
/dev/disk/by-partlabel/zfs2 \
cache /dev/disk/by-partlabel/cache0 \
/dev/disk/by-partlabel/cache1
ubuntu@zfs:~$ sudo zpool status
pool: pool0
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
zfs0 ONLINE 0 0 0
zfs1 ONLINE 0 0 0
zfs2 ONLINE 0 0 0
cache
cache0 ONLINE 0 0 0
cache1 ONLINE 0 0 0
errors: No known data errors
ホットスペア
一部のディスクが破損したときのために,spare
オプションにて,予備のディスクを指定することができる.
$ sudo zpool create pool0 raidz /dev/disk/by-partlabel/zfs0 \
/dev/disk/by-partlabel/zfs1 \
/dev/disk/by-partlabel/zfs2 \
spare /dev/disk/by-partlabel/spare0 \
/dev/disk/by-partlabel/spare1
ubuntu@zfs:~$ sudo zpool status
pool: pool0
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool0 ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
zfs0 ONLINE 0 0 0
zfs1 ONLINE 0 0 0
zfs2 ONLINE 0 0 0
spares
spare0 ONLINE 0 0 0
spare1 ONLINE 0 0 0
errors: No known data errors
ホットスペアの扱いについては,公式ドキュメントを参照されたい.
Oracle Solaris ZFS 管理ガイド "ストレージプールにホットスペアを指定する"
http://docs.oracle.com/cd/E19253-01/819-6260/gcvcw/index.html
プールの移動
プールを取り外し,別のホストに接続することもあるだろう.その場合には,zpool export
コマンドと,zpool import
コマンドを利用する.
プールの取り外し
プールをホストから切り離すには,zpool export
コマンドを実行するだけである.
$ sudo zpool export pool0
$ sudo zpool list
no pools available
zpool export
の実行後,プールが検出されていないことが確認できる.
プールの接続
プールをホストに接続するには,zpool import
コマンドを利用する.
インポート可能なプールの検索
zpool import
コマンドを引数無しで実行すると,インポート可能なプールが表示される.
$ sudo zpool import
pool: pool0
id: 13553525836140096658
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
pool0 ONLINE
raidz1-0 ONLINE
vdb1 ONLINE
vdb2 ONLINE
vdb3 ONLINE
cache
vdb4
vdb5
しかしながら,デフォルトでは /dev
から検索されるため,GPTのラベルを利用していたにもかかわらず,生のデバイス名が利用されていることがわかる.
このような場合には,-d
オプションで検索ディレクトリを指定することで理想的な参照パスを利用することができる.
$ sudo zpool import -d /dev/disk/by-partlabel/
pool: pool0
id: 13553525836140096658
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
pool0 ONLINE
raidz1-0 ONLINE
zfs0 ONLINE
zfs1 ONLINE
zfs2 ONLINE
cache
zfs3
zfs4
プールのインポート
上記で正しくインポートできそうであると確認できたら,プール名を指定して zpool import
を実行する.
$ sudo zpool import -d /dev/disk/by-partlabel/ pool0
$ sudo zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
pool0 29.2G 373K 29.2G 0% 1.00x ONLINE -
もしも,元のホストでexport
をせずに取り外してしまった場合には,次のようなエラーが発生する.
cannot import 'pool0': pool may be in use on another system
use '-f' to import anyway
強制的にインポートするには,-f
オプションをつければよい.
ディスクの追加について
プールを利用中にあとからディスクを追加したくなることもあるだろう.そのような場合には zpool add
コマンドを利用する.
ただし,制約もあり,RAID-Zの構成にディスクを追加することはできない. どうしても追加が必要な場合にはストライピングとしてあらたにRAID-Zやミラーリング構成を追加する必要がある.
しかしながら,このような非対称な構成は推奨されていないため,可能な限りバックアップを作成し,一からプールを作り直すことをおすすめする.
ミラーリングやストライピング構成にディスクを追加することはこの限りではない.