先日自宅で使用しているUbuntuで、ZFSを使う必要性があったが、ZFSについていまいち理解が及んでいなかったため、今回調べた結果をここに示す。
目次
1. このページで紹介する機能を試した環境
本ページの内容は、以下の環境での実験結果を基に作成している。
- OS: Ubuntu 20.04 LTS
- File System: ZFS
2. ZFSの概要
ZFSとは、いわゆるファイルシステムの1種である。Wikipediaには、「ZFSは、主にオラクルのSolaris上で実装されている128ビット・アドレッシングを特徴とするファイルシステム。」と記載されている。
ファイルシステムとは、USBのフォーマット(USB購入して一番初めにやるやつ)などの際に選択するアレである。基本的には、HDDなどの補助記憶媒体に対して、どのようにファイルの実体(つまり、01のバイナリコード)を記載するのか、どのようにディレクトリとファイルを関連づけるのかを決定するためのシステムである。有名なファイルシステムとしては、Windows,Linuxに互換性があるexFATや、Windows用のフォーマットのNTFS、Apple用のフォーマットのAPFSなどがある。
ZFSの特徴としては、
- チェックサムによるファイルの保護
- つまり、ファイルが破損し辛い
- i nodeの個数に制限が無い
- つまり、ファイルを無限に保存できる
- Copy on Write方式を使用している
- つまり、動作が軽い
- ストレージプール機能の使用
- RAIDを組みやすい
などがある.
3. ストレージプールとは
ストレージプールは一言でまとめると、N個のストレージ(~=SSD, HDD)をシステム上でM個のストレージとして扱う機能です。
ストレージプール機能があることで、RAIDなどのデータのバックアップ機能等をユーザが意識しなくて良くなるほか、ディスクのマウントなどを意識しなくて良くなります。
ストレージプールのイメージを以下に画像で示します。
より具体的に説明すると、ZFSではストレージプールにハードウェアを関連付け、プール内にファイルシステムとボリュームと呼ばれる、OSから確認できる仮想ストレージを複数個生成することができます。
これらの仮想ストレージに格納されるデータは、実際はストレージプールに関連付けられたデバイスに格納されることになります。
以下にイメージ図を示します。
ファイルシステムとボリュームは、それぞれにZFS以外のファイルフォーマット(e.g. ext4, FAT32)を行う必要があります。
フォーマット後は、基本的に具体的なパス(e.g. /media/mountpath)にマウントして扱うことになります.
なお,ファイルシステムとボリュームの違いは,前者が容量に制限が無いのに対し,後者は容量に制限が有ることです.
4. ZFSの操作に使用するコマンド
ZFSの操作は、基本的に
- zfs: ファイルシステムの操作
- zpool: ストレージプールの操作
で行います。
5. 「zfs」コマンド
以下にzfsコマンドでよく使うオプションを示します。
また、ボリュームとファイルシステムは、作成部分が異なるだけで、基本的には扱いは同じです。
- ファイルシステムの作成:
zfs create pool-name/filesystem-name[/filesystem-name]
- ファイルシステムの作成+マウント:
zfs create -o mount-path pool-name/filesystem-name[/filesystem-name]
- ファイルシステムの名前の変更:
zfs rename pool-name/filesystem-name[/filesystem-name]
pool-name/new-filesystem-name[/new-filesystem-name]
- ファイルシステムのマウントポイントの変更:
zfs set moutpoint=mount-path pool-name/filesystem-name[/filesystem-name]
- ファイルシステムの一覧を取得:
zfs list
- ファイルシステムの削除:
zfs destroy pool-name/filesystem-name[/filesystem-name]
- スナップショットの取得:
zfs snapshot
pool-name/filesystem-name[/filesystem-name]
- ボリュームの作成:
zfs create -V byte(e.g.1T,3G,2K)
pool-name/volume-name[/volume-name]
- ボリュームの大きさの変更:
zfs set volsize=byte(e.g.1T,3G,2K)
pool-name/volume-name[/volume-name]
- 実行前にunmountが必要
- 拡張後はボリューム内のファイルシステム(!?)の拡張が必要
sudo parted /dev/zvol/
pool-name/volume-name[/volume-name]
- fixしてもらう
- pを入力して拡張するパートを確認
resizeport part-number 100%
- partedから抜ける
sudo e2fsck -f
/dev/zvol/
pool-name/volume-name[/volume-name]-part(part-number)
6. 「zpool」コマンド
以下によく使うオプションを示します。
- プールの作成:
zpool pool-name device-path[ device-path...]
- プールの作成(RAID-Z化):
zpool pool-name raidz device-path[ device-path...]
- raidz[数字]とすると、パリティビットの数を増やせる
- プールの状態・数の確認:
zpool status
- プールのIO監視:
zpool iostat
pool-name
- プールのIO監視(一定間隔):
zpool iostat
pool-name
interval-time - プールのIO監視(詳細):
zpool iostat -v
epool-nam