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のブロックストレージボリュームを設定します。
前提条件
- 特にブロック重複排除を行うことに関心がある場合、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
結果をフィルタリングするには dmesg
のコマンド da0
、添付のボリュームです。 詳細については 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
The -t
フラグを使用すると、パーティションタイプを指定できます。 -l
オプションを使用すると、パーティションにラベルを適用できます。 ラベルは好きなものにすることができます。 この場合、物事をまっすぐに保つために、ボリュームの名前と一致するようにします。
次に、このパーティションに配置するデータを詮索好きな目から保護しましょう。
ステップ2—暗号化を設定する
データの暗号化には多くの利点があり、設定は簡単です。 aesni ドライバーをアクティブにして、ハードウェアアクセラレーションによるAES暗号化を使用できるようにします。
- sudo kldload aesni
これで、パーティションにgeli暗号化を構成できます。 を使用します geli
コマンドを実行し、暗号化するキーの長さとパーティションを指定します。
- sudo geli init -l 256 /dev/gpt/volume-nyc1-01
The -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構成で実行したりする必要はありません。 個々のボリュームをプールで直接使用できます。
The 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ファイルシステムを表示することもできます。 zfs list
指図:
- 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
ファイル内の既存の行の後に次の行を追加します。
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を参照してください。