開発者ドキュメント

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

Introduction

Warning: As of July 1, 2022, DigitalOcean no longer supports the creation of new FreeBSD Droplets through the Control Panel or API. However, you can still spin up FreeBSD Droplets using a custom image. Learn how to import a custom image to DigitalOcean by following our product documentation.

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

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

前提条件

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

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

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

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

  1. ssh freebsd@your_server_ip

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

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

  1. dmesg | grep ^da0

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

Output
da0 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形式を使用してパーティションマップを作成します。 次のコマンドを実行します。

  1. sudo gpart create -s gpt da0

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

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

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

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

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

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

  1. sudo kldload aesni

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

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

The -l オプションは、キーの長さを指定します。これは、AES-XTSアルゴリズムの場合は128ビットまたは256ビットのいずれかである必要があります。 以前に指定したラベルを使用してパーティションを参照します。

コマンドを実行すると、パスフレーズの入力を求められます。

Output
Enter 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

ドロップレットを再起動するたびに、このパスフレーズを入力して、暗号化されたパーティションを再接続する必要があります。 これは、セキュリティの向上と引き換えに小さな不便です。

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

  1. sudo geli attach /dev/gpt/volume-nyc1-01

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

Output
Enter passphrase:

これは設定します /dev/gpt/volume-nyc1-01.eli、これはパーティションの復号化されたバージョンです。 そのブロックデバイスに書き込まれるデータは暗号化され、基盤となるデバイスに書き出されます。 これは、次に作成するストレージプールに接続するパスです。

ステップ3—ZFSプールのセットアップ

ZFSストレージプール(zpool)はボリュームのコレクションであり、ZFSがファイルシステムを管理する方法です。 そして、それらは簡単に作成できます。 DigitalOceanボリュームは独自のデータ冗長性を実装しているため、複数のボリュームを作成してミラーリングしたり、RAID-Z構成で実行したりする必要はありません。 個々のボリュームをプールで直接使用できます。

The zpool create コマンドは新しいzpoolを作成します。 プールの名前と、プールに追加するボリュームを取り込みます。

  1. sudo zpool create tank /dev/gpt/volume-nyc1-01.eli

の総称を使用しています tank 私たちのプールのために、しかしあなたはあなたが好きな名前を使うことができます。

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

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

  1. sudo zfs set compression=lz4 tank

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

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

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

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

  1. zfs list
Output
NAME USED AVAIL REFER MOUNTPOINT tank 61K 96.4G 19K /tank

またはと df 指図:

  1. df -h
Output
Filesystem 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:

  1. sudo vi /etc/rc.conf

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

/etc/rc.conf
zfs_enable="YES"

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

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

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

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

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

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

  1. dmesg | grep ^da1
Output
da1 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)

次に、最初のボリュームで使用したのと同じプロセスを使用して、新しいボリュームをパーティション分割してラベルを付けます。 最初にパーティションを作成します。

  1. sudo gpart create -s gpt da1

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

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

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

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

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

Output
Enter 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

次に、この新しいボリュームを添付し、プロンプトが表示されたらパスフレーズを入力します。

  1. sudo geli attach /dev/gpt/volume-nyc1-02

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

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

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

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

そして、私たちはで再確認することができます zfs list 指図:

  1. zfs list

出力は tank ボリュームと正しいスペース量:

Output
NAME USED AVAIL REFER MOUNTPOINT tank 62.5K 193G 19K /tank

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

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

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

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

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

  1. sudo shutdown -r now

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

  1. ssh freebsd@your_server_ip

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

  1. sudo geli attach /dev/gpt/volume-nyc1-01
  1. sudo geli attach /dev/gpt/volume-nyc1-02

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

次に、を使用してプールの結果を確認します zpool:

  1. sudo zpool list

パーティションが接続されると、ZFSは自動的にプールを認識し、ファイルシステムをマウントします。

Output
NAME 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を参照してください。

モバイルバージョンを終了