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-ボリュームのパーティション分割

ボリューム全体を単一のファイルシステムに使用しますが、通常はボリュームにパーティションマップを配置することをお勧めします。 これにより、作成した意味のあるラベルパーティションを適用できます。

最初に、ボリュームが接続されて使用可能であることを確認しましょう。 ドロップレットにログインします。

ログインしたら、 `+ 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に再度ログインします。

次に、暗号化されたパーティションを接続します。

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]をご覧ください。