ZFSは、高いストレージ容量をサポートし、圧縮をサポートし、データ破損を防ぐことができるファイルシステムおよびボリュームマネージャーです。 ZFSをDigitalOceanのhttps://www.digitalocean.com/features/storage/[block storage]と組み合わせると、セットアップと拡張が簡単なストレージソリューションが提供されます。
このガイドでは、データを安全に保つために暗号化されたFreeBSD上のZFSのブロックストレージボリュームを構成します。
前提条件
-
特にブロックの重複排除に関心がある場合、ZFSは非常に多くのメモリを消費する傾向があるため、4GB以上のRAMを備えたブロックストレージをサポートするデータセンターのFreeBSD Droplet。 FreeBSD Dropletの作成時に自動的に作成されるデフォルトの* freebsd *アカウントを使用します。 FreeBSD Dropletへのログインとその基本管理の詳細については、https://www.digitalocean.com/community/tutorial_series/getting-started-with-freebsd [Getting Started with FreeBSD]チュートリアルシリーズをご覧ください。
-
ドロップレットに接続された100 GBのボリューム。 Dropletを作成するときにこのボリュームを作成するか、https://www.digitalocean.com/community/tutorials/how-to-use-block-storage-on-digitalocean#creating-and-attaching-volumesを使用できます[このガイド]ボリュームを作成して接続します。
このチュートリアルでは、2番目の100GBボリュームを使用して、ボリュームをプールに追加する方法を示しますが、事前に設定する必要はありません。手順は手順5で説明します。
手順1-ボリュームのパーティション分割
ボリューム全体を単一のファイルシステムに使用しますが、通常はボリュームにパーティションマップを配置することをお勧めします。 これにより、作成した意味のあるラベルパーティションを適用できます。
最初に、ボリュームが接続されて使用可能であることを確認しましょう。 ドロップレットにログインします。
ssh freebsd@
ログインしたら、 `+ dmesg `コマンドの出力を見て、ボリュームが接続されていることを確認します。 FreeBSDドロップレットのローカルSSDは「 vtbd0 」として表示され、接続されているボリュームは「 da +」デバイスとして表示されます。
`+ grep `を使用して、接続されたボリュームである ` da0 `に対する ` dmesg `コマンドの結果をフィルタリングします。 「 grep +」の詳細については、チュートリアルhttps://www.digitalocean.com/community/tutorials/using-grep-regular-expressions-to-search-for-text-patterns-in-linux[Using Grep&Regular Linuxでテキストパターンを検索する式]。
dmesg | grep
次のような出力が表示されます。
Outputda0 at vtscsi0 bus 0 scbus2 target 0 lun 1
da0: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device
da0: 300.000MB/s transfers
da0: Command Queueing enabled
da0: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)
ボリュームが使用可能であることを確認したら、GPT形式を使用してパーティションマップを作成します。 次のコマンドを実行してください。
sudo gpart create -s gpt
次に、ZFS用の単一パーティションを作成します。
sudo gpart add -t -l
`+ -t `フラグはパーティションタイプを指定し、 ` -l +`オプションはパーティションにラベルを適用します。 ラベルは好きなものにできます。 この場合、物事をわかりやすくするために、ボリュームの名前と一致するようにします。
次に、このパーティションに配置するデータをpr索好きな目から保護しましょう。
ステップ2-暗号化のセットアップ
データの暗号化には多くの利点があり、設定は簡単です。 aesniドライバーをアクティブにして、ハードウェアアクセラレーションAES暗号化を使用できるようにします。
sudo kldload aesni
これで、パーティションでhttps://www.freebsd.org/cgi/man.cgi?query=geli[geli]暗号化を構成できます。 `+ geli +`コマンドを使用して、キーの長さと暗号化するパーティションを指定します。
sudo geli init -l /dev/gpt/
`+ -l +`オプションはキーの長さを指定します。これは、AES-XTSアルゴリズムの場合は128ビットまたは256ビットでなければなりません。 前に指定したラベルを使用してパーティションを参照します。
コマンドを実行すると、パスフレーズの入力を求められます:
OutputEnter new passphrase:
Reenter new passphrase:
Metadata backup can be found in /var/backups/gpt_volume-nyc1-01.eli and
can be restored with the following command:
# geli restore /var/backups/gpt_volume-nyc1-01.eli /dev/gpt/volume-nyc1-01
ドロップレットを再起動するたびに、このパスフレーズを入力して暗号化されたパーティションを再接続する必要があります。 セキュリティの向上と引き換えにささいな不便さがあります。
次に、暗号化されたパーティションを添付します。
sudo geli attach /dev/gpt/
パーティションを初期化したときに入力したパスフレーズの入力を求められます:
OutputEnter passphrase:
これにより、 `+ / dev / gpt / volume-nyc1-01.eli +`がセットアップされます。これは、パーティションの復号化されたバージョンです。 そのブロックデバイスに書き込まれたデータは暗号化され、基になるデバイスに書き込まれます。 これは、次に作成するストレージプールに接続するパスです。
手順3-ZFSプールのセットアップ
ZFSストレージプール(zpool)はボリュームのコレクションであり、ZFSがそのファイルシステムを管理する方法です。 そして、それらは簡単に作成できます。 DigitalOceanボリュームには独自のデータ冗長性が実装されているため、複数のボリュームを作成してミラーリングしたり、RAID-Z構成で実行したりする必要はありません。プール内で個々のボリュームを直接使用できます。
`+ zpool create +`コマンドは新しいzpoolを作成します。 プールの名前と、プールに追加するボリュームを受け取ります。
sudo zpool create tank /dev/gpt/
プールには「+ tank +」という一般名を使用していますが、好きな名前を使用できます。
ボリュームはネットワークを介して接続されているため、ファイルアクセスはローカルSSD上よりも遅くなります。 ネットワーク経由でデバイスに書き込まれるデータの量を最小限に抑えるために、ZFSファイルシステムレイヤーで圧縮を有効にしましょう。 これは完全にオプションであり、ファイルシステムごとに設定できます。
LZ4圧縮アルゴリズムを使用します。このアルゴリズムは、速度を最適化しながら、適切な圧縮を提供します。 他のオプションについては、https://www.freebsd.org/cgi/man.cgi?query = zfs [+ zfs +
] manページを参照してください。
sudo zfs set compression=lz4 tank
それでは、プールを見てみましょう。 `+ zpool list +`コマンドを使用して詳細な情報を取得できます。
zpool list
OutputNAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
パーティション化とフォーマットのオーバーヘッドにより、プールの合計サイズはボリュームの合計サイズよりわずかに小さくなります。
`+ zfs list +`コマンドを使用して、そのプールのZFSファイルシステムを表示することもできます。
zfs list
OutputNAME USED AVAIL REFER MOUNTPOINT
または、 `+ df +`コマンドで:
df -h
OutputFilesystem Size Used Avail Capacity Mounted on
/dev/gpt/rootfs 57G 2.2G 50G 4% /
devfs 1.0K 1.0K 0B 100% /dev
これらのコマンドを頻繁に使用して、新しいファイルシステムの状態を確認します。
先に進む前に、オペレーティングシステムの起動時にZFSカーネルモジュールが起動することを確認しましょう。 モジュールは、 `+ sudo `で ` zpool create +`コマンドを実行したときに自動的にロードされましたが、モジュールが自動的にロードされた方が良いでしょう。
これを行うには、ファイル `+ / etc / rc.conf +`を編集します:
sudo vi /etc/rc.conf
ファイル内の既存の行の後に次の行を追加します。
/etc/rc.conf
zfs_enable="YES"
次に、ファイルへの変更を保存します。 サーバーが再起動すると、ZFSカーネルモジュールがロードされます。
ZFSの利点の1つは、ニーズの増加に応じてプールにストレージを追加できることです。 それがどのように機能するかを探りましょう。
ステップ4-追加のボリュームをプールに追加する
さらにスペースが必要な場合は、追加のボリュームでプールを拡張できます。 ZFSを使用する場合、プールにデバイスを追加するだけです。
まず、別のデバイスが必要です。 新しい100GBボリュームをDropletに接続します。 これを行う方法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-use-block-storage-on-digitalocean#creating-and-attaching-volumes [このガイド]を参照してください。
ボリュームの準備ができたら、サーバーのターミナルに戻り、新しいボリュームが存在し、接続されていることを確認します。 新しいボリュームは「+ da1 +」として識別されます。
dmesg | grep
Outputda1 at vtscsi0 bus 0 scbus2 target 0 lun 2
da1: <DO Volume 1.5.> Fixed Direct Access SPC-3 SCSI device
da1: 300.000MB/s transfers
da1: Command Queueing enabled
da1: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C)
次に、最初のボリュームで使用したのと同じプロセスを使用して、新しいボリュームのパーティションを作成し、ラベルを付けます。 最初にパーティションを作成します。
sudo gpart create -s gpt
次に、ボリュームを作成します。
sudo gpart add -t freebsd-zfs -l
既存のボリュームは暗号化されているため、この新しいボリュームで暗号化を有効にします。
sudo geli init -l 256 /dev/gpt/
もう一度、パスフレーズの入力を求められるので、ボリュームを復号化して接続できます。
OutputEnter new passphrase:
Reenter new passphrase:
Metadata backup can be found in /var/backups/gpt_volume-nyc1-02.eli and
can be restored with the following command:
# geli restore /var/backups/gpt_volume-nyc1-02.eli /dev/gpt/volume-nyc1-02
次に、この新しいボリュームを接続し、プロンプトが表示されたらパスフレーズを提供します。
sudo geli attach /dev/gpt/
最後に、ZFSプールに追加します。
sudo zpool add tank /dev/gpt/
ファイルシステムは自動的にプールのサイズに拡張します。これは次のコマンドで確認できます。
zpool list
OutputNAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank - 0% 0% 1.00x ONLINE -
そして、 `+ zfs list`コマンドでダブルチェックできます:
zfs list
出力には、「+ tank +」ボリュームと正しい容量が表示されます。
OutputNAME USED AVAIL REFER MOUNTPOINT
tank 62.5K 19K /tank
さらにスペースが必要な場合は、このプロセスを繰り返して、プールにさらにボリュームを追加してください。
暗号化されたパーティションをプールに追加したので、サーバーの再起動後にパーティションを再接続する方法を見てみましょう。
ステップ5-再起動の処理
サーバーを再起動すると、暗号化されたパーティションは接続されなくなります。 手動で添付する必要があります。 練習のために、プロセスを確認できるようにリブートしてみましょう。
`+ shutdown +`コマンドを使用してサーバーを再起動すると、SSHセッションが切断されます。
sudo shutdown -r now
システムの再起動には約1分かかります。 マシンがオンラインに戻ったら、Dropletに再度ログインします。
ssh freebsd@
次に、暗号化されたパーティションを接続します。
sudo geli attach /dev/gpt/volume-nyc1-01
sudo geli attach /dev/gpt/volume-nyc1-02
各パーティションをアタッチすると、そのパーティションを初期化したときに入力したパスフレーズの入力を求められます。
次に、 `+ zpool +`を使用してプールの結果を確認します。
sudo zpool list
パーティションが接続されると、ZFSは自動的にプールを認識し、ファイルシステムをマウントします。
OutputNAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
ボリュームを暗号化していない場合は、再起動中にこれらの追加手順を心配する必要はありません。 セキュリティを高めるために利便性を犠牲にしています。誰もボリュームを添付してパスフレーズなしでコンテンツを見ることができません。
結論
ご覧のとおり、ZFSとDigitalOceanのブロックストレージを使用すると、ニーズに合わせてスケーラブルで暗号化されたファイルシステムを簡単に作成できます。 FreeBSDでのZFSの詳細については、https://www.freebsd.org/doc/handbook/zfs.html [FreeBSD Handbook]をご覧ください。