FreeBSDでDigitalOceanブロックストレージを使用して暗号化されたZFSプールを構成する方法

提供:Dev Guides
移動先:案内検索

ZFSは、大容量のストレージをサポートし、圧縮をサポートし、データの破損を防ぐことができるファイルシステムおよびボリュームマネージャーです。 ZFSは、DigitalOceanのブロックストレージと組み合わせると、セットアップと拡張が簡単なストレージソリューションを提供します。

このガイドでは、データを安全に保つために暗号化されたFreeBSD上のZFSのブロックストレージボリュームを設定します。

前提条件

  • 特にブロック重複排除を行うことに関心がある場合、ZFSは非常にメモリを大量に消費する傾向があるため、4GB以上のRAMを備えたブロックストレージをサポートするデータセンターのFreeBSDドロップレット。 FreeBSDドロップレットを作成するときに自動的に作成されるデフォルトのfreebsdアカウントを使用します。 FreeBSD Dropletへのログインとその基本的な管理の詳細については、 Get Getting Started withFreeBSDチュートリアルシリーズをご覧ください。
  • ドロップレットに接続された100GBのボリューム。 ドロップレットを作成するときにこのボリュームを作成するか、このガイドを使用してボリュームを作成して添付することができます。

このチュートリアルでは、2番目の100 GBボリュームを使用して、ボリュームをプールに追加する方法を示しますが、事前にセットアップする必要はありません。 手順は、ステップ5のコンテキストで説明されます。

ステップ1—ボリュームのパーティション化

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

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

ssh freebsd@your_server_ip

ログインしたら、dmesgコマンドの出力を見て、ボリュームが接続されていることを確認します。 FreeBSDドロップレットのローカルSSDはvtbd0として表示され、接続されているボリュームはすべてdaデバイスとして表示されます。

grepを使用して、接続されているボリュームであるda0dmesgコマンドの結果をフィルタリングします。 詳細についてはgrep私たちのチュートリアルでは LinuxでGrepと正規表現を使用してテキストパターンを検索する

dmesg | grep ^da0

次のような出力が表示されます。

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 da0

次に、ZFS用の単一のパーティションを作成します。

sudo gpart add -t freebsd-zfs -l volume-nyc1-01 da0

-tフラグを使用すると、パーティションタイプを指定でき、-lオプションを使用すると、パーティションにラベルを適用できます。 ラベルは好きなものにすることができます。 この場合、物事をまっすぐに保つために、ボリュームの名前と一致するようにします。

次に、このパーティションに配置するデータを詮索好きな目から保護しましょう。

ステップ2—暗号化を設定する

データの暗号化には多くの利点があり、設定は簡単です。 aesni ドライバーをアクティブにして、ハードウェアアクセラレーションによるAES暗号化を使用できるようにします。

sudo kldload aesni

これで、パーティションにgeli暗号化を構成できます。 geliコマンドを使用して、暗号化するキーの長さとパーティションを指定します。

sudo geli init -l 256 /dev/gpt/volume-nyc1-01

-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/volume-nyc1-01

パーティションを初期化したときに入力したパスフレーズの入力を求められます。

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/volume-nyc1-01.eli

プールにはtankの総称名を使用していますが、任意の名前を使用できます。

ボリュームはネットワーク経由で接続されているため、ファイルアクセスはローカルSSDよりも遅くなります。 ネットワークを介してデバイスに書き込まれるデータの量を最小限に抑えるために、ZFSファイルシステム層で圧縮を有効にしましょう。 これは完全にオプションであり、ファイルシステムごとに設定できます。

LZ4圧縮アルゴリズムを使用します。これは、適切な圧縮を提供しながら、速度が最適化されています。 その他のオプションについては、zfsのマニュアルページを参照してください。

sudo zfs set compression=lz4 tank

それでは、プールを見てみましょう。 zpool listコマンドを使用して、いくつかの詳細情報を取得できます。

zpool list
OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank  99.5G  98.5K  99.5G         -     0%     0%  1.00x  ONLINE  -

プールの合計サイズは、パーティション分割とフォーマットのオーバーヘッドのため、合計ボリュームサイズよりもわずかに小さくなります。

zfs listコマンドを使用して、そのプール内のZFSファイルシステムを表示することもできます。

zfs list
OutputNAME   USED  AVAIL  REFER  MOUNTPOINT
tank    61K  96.4G    19K  /tank

または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
tank                96G     19K     96G     0%    /tank

これらのコマンドを頻繁に使用して、新しいファイルシステムの状態を確認します。

先に進む前に、オペレーティングシステムを起動するときにZFSカーネルモジュールが起動することを確認しましょう。 zpool createコマンドをsudoで実行すると、モジュールが自動的にロードされましたが、モジュールが自動的にロードされた方がよいでしょう。

これを行うには、ファイル/etc/rc.confを編集します。

sudo vi /etc/rc.conf

ファイル内の既存の行の後に次の行を追加します。

/etc/rc.conf

zfs_enable="YES"

次に、変更をファイルに保存します。 サーバーが再起動すると、ZFSカーネルモジュールがロードされます。

ZFSの利点の1つは、ニーズの増加に応じてプールにストレージを追加できることです。 それがどのように機能するかを調べてみましょう。

ステップ4—プールにボリュームを追加する

より多くのスペースが必要な場合は、追加のボリュームでプールを拡張できます。 ZFSでは、プールにデバイスを追加するだけです。

まず、別のデバイスが必要です。 ドロップレットに新しい100GBのボリュームを接続します。 これを行う方法の詳細については、このガイドを参照してください。

ボリュームの準備ができたら、サーバーの端末に戻り、新しいボリュームが存在して接続されていることを確認します。 新しいボリュームはda1として識別されます。

dmesg | grep ^da1
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 da1

次に、ボリュームを作成します。

sudo gpart add -t freebsd-zfs -l volume-nyc1-02 da1

既存のボリュームは暗号化されているため、この新しいボリュームで暗号化を有効にします。

sudo geli init -l 256 /dev/gpt/volume-nyc1-02

もう一度、パスフレーズの入力を求められるので、ボリュームを復号化して接続できます。

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/volume-nyc1-02

そして最後にそれをZFSプールに追加します。

sudo zpool add tank /dev/gpt/volume-nyc1-02.eli

ファイルシステムはプールのサイズに自動的に拡張されます。これは、次のコマンドで確認できます。

zpool list
OutputNAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
tank   199G   140K   199G         -     0%     0%  1.00x  ONLINE  -

そして、zfs listコマンドで再確認できます。

zfs list

出力には、tankボリュームと正しい容量のスペースが表示されます。

OutputNAME   USED  AVAIL  REFER  MOUNTPOINT
tank  62.5K   193G    19K  /tank

より多くのスペースが必要な場合は、このプロセスを繰り返して、プールにボリュームを追加してください。

暗号化されたパーティションをプールに追加したので、サーバーの再起動後にそれらを再接続する方法を見てみましょう。

ステップ5—再起動の処理

サーバーを再起動すると、暗号化されたパーティションは接続されなくなります。 手動で取り付ける必要があります。 練習のために、プロセスを確認できるように再起動してみましょう。

shutdownコマンドを使用してサーバーを再起動すると、SSHセッションが切断されます。

sudo shutdown -r now

システムが再起動するまでに約1分かかる場合があります。 マシンがオンラインに戻ったら、Dropletに再度ログインします。

ssh freebsd@your_server_ip

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

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
tank   199G  95.5K   199G         -     0%     0%  1.00x  ONLINE  -

ボリュームを暗号化していない場合は、再起動時にこれらの余分な手順について心配する必要はありません。 利便性とセキュリティの向上を交換しています。 パスフレーズがないと、誰もボリュームを添付してコンテンツを見ることができません。

結論

ご覧のとおり、ZFSとDigitalOceanのBlock Storageを使用すると、ニーズに合わせてスケーラブルで暗号化されたファイルシステムを簡単に作成できます。 FreeBSDでのZFSの詳細については、 FreeBSDHandbookを参照してください。