ProxmoxのTrueNASプラグインを使ってストレージをNVMe-oFで接続して、Proxmox Backup Server (PBS)でVMのバックアップ環境を構築したメモです。

はじめに

経緯

PBSを使うと2回目以降のバックアップが差分更新で速く、ディスク容量も節約できます。ストレージ全体で重複したデータを共用するので、ディスクの使用効率も高いです。バックアップの世代管理や集中管理も簡単になるので、これを使わないてはありませんね。そう思ってNFSでPBSを構築したら散々な結果になりました。

HDDは8台でRAIDZ2 (RAID6相当)を構築しています。素の状態では600MB/sくらいの性能がありますが、NFS経由のバックアップでは34MB/sまで落ちてしまいました。PBSでは大量のチャンクファイルを作成するのでNFSとは相性が悪いようです。また同期書き込みなのでとても遅いのです。

そこでiSCSIを試してみました。iSCSIは爆速で400MB/sくらい出ました。NFSの34MB/sとは全然違いますね。iSCSIは非同期書き込みなので、サーバーに一気にデータを送り込んでからディスクに書き込まれます。しかし、iSCSIはめんどくさい。わけのわからない用語がたくさん出てくるし、ほんとうにわけがわからない。こんなの使いたくない。

TrueNASプラグインがあるじゃないか!

TrueNASが提供している TrueNAS Proxmox VE Storage Plugin を使うと、Proxmox上でTrueNASのストレージ作成や接続を自動でやってくれます。対応しているプロトコルはiSCSIとNVMe-oFで、NVMe-oF (NVMe/TCP)はiSCSIよりもIOPSが高いらしい。それならNVMe/TCPにしてみよう。よくわかってないけど。

サーバー構成

1台の物理サーバーの中に、TrueNAS Scale、Proxmox VE (PVE)、Proxmox Backup Server (PBS)という3種類のサーバー(ソフトウェア)を稼働しています。最初に起動するのがPVEで、これがホストOSとなっています。PVEの上のゲストOSとして、TrueNASとPBSが稼働しています。HDDはSAS HBAカードをPCIパススルーしてTrueNASに接続しています。

このTrueNASのストレージをPBSに接続できたらよかったのですが、TrueNASプラグインはPVE用らしいので、PVEに接続して、その中に作成したストレージをPBSに接続するという形にしました。

これ、起動する順番が超大事です。TrueNASが起動しないとPBSのディスクにアクセスできないので、PBSが起動するタイミングを調整しています。

それにしてもこの構成、どこか一か所でも壊れたら詰みますね。

セットアップ

TrueNAS側の操作

データセットを作成

まずはTrueNASにデータの保存先となるデータセット作成します。Datasets → Add Datasetで作成しプリセットはGenericのままにします。このデータセットの下にZvolを作っていくのですが、これはプラグインがやってくれます。

NVMe-oFサービスを起動

「System → Services」で NVMe-oF を起動し、Start Automatically をオンにします。

APIキーを発行

「Credentials → Users」でrootを選び、Accessウィジェットの「Add API Key」から発行します。キーを控えておきます。

PVE側の操作 (CLI)

nvme-cliの導入とホストNQNの確認

apt update
apt install -y nvme-cli
cat /etc/nvme/hostnqn          # 何も出なければ下を実行
# nvme gen-hostnqn > /etc/nvme/hostnqn

大容量転送エラー対策のudevルール

バグ対策を入れておきます。

cat > /etc/udev/rules.d/60-nvme-tcp-max-sectors.rules <<'EOF'
ACTION=="add|change", SUBSYSTEM=="block", KERNEL=="nvme*n*", ENV{DEVTYPE}=="disk", \
  ATTRS{subsysnqn}=="nqn.*truenas*", ATTR{queue/max_sectors_kb}="1024"
EOF
udevadm control --reload
udevadm trigger --subsystem-match=block --action=change

プラグインのインストール

bash <(curl -sSL https://raw.githubusercontent.com/truenas/truenas-proxmox-plugin/main/install.sh)

対話式インストーラーです。Install via APT (Recommended)でインストールします。そのあと設定途中で抜けちゃったので、再度インストーラーを実行しました。Configure storage→Create new storageから進みます。いろいろ聞いてきますが、こんな感じにしました。

  Configuration Progress:
  ✓ Configuration Mode:  Automated Provisioning
  ✓ Storage Name:        truenas-hdd-xx
  ✓ TrueNAS IP:          192.168.x.x
  ✓ API Key:             先ほど控えたキー
  ✓ Transport Mode:      NVMe/TCP
  ✓ ZFS Pool:            hdd-pool
  ✓ Dataset:             hdd-pool/pbs-xxx
  ✓ Subsystem NQN:       nqn.2005-10.org.freenas.ctl:truenas-pve-xxx
  ✓ Discovery:              10.x.x.x:4420
  ✓ Block Size:          16K
  ✓ Sparse Volumes:      Yes (thin)
  ▸ Host NQN:            (configuring...)

データセットの入力のところではプール名の入力が不要です。また、データセット名を入力するとexistsと表示されました。もしかしたらTrueNAS上で作る必要はなかったのかもしれません。作成済みなら作成済みのを使ってくれるので問題ないです。

Subsystem NQNの入力は罠みたいです。今回は nqn.2026-10.org.freenas.ctl:truenas-hdd-xx と入力しましたが、truenasという文字列が入っていないといけないらしいです。

セットアップが完了すると /etc/lvm/lvm.conf を更新してくれるようです。 /etc/pve/storage.cfg も更新されています。

動作確認

pvesm status | grep truenas-nvme   # active になっているか
nvme list-subsys                   # truenas-pve-single に live で接続されているか

なんかよくわからないけど認識してそうな雰囲気です。

PVE側の操作 (GUI)

起動・停止順序

この物理サーバーには3つのOSが同居しているので、起動順序に注意しなくてはなりません。

VM順序起動遅延タイムアウト
TrueNAS1180秒程度長め(例:300秒)
PBS2

起動遅延はそのVMの起動を待つ時間ではなく、起動してから次にいくまで待つ時間です。つまり上記のように設定するとPBSはTrueNAS起動の3分後になってから起動を開始します。これはTrueNASが起動してから、NVMe-oFサービスが安定して開始するまで待つという意味があります。

PVEがシャットダウンするときは逆の順序でシャットダウンしていきます。PBSのディスクはTrueNAS上にあるので、PBSが終了したあとにTrueNASを終了する必要があります。

ストレージが接続されているか確認

データセンター→ストレージで、TrueNASプラグインのディスクが接続されているか確認します。

種別 truenasplugin というのがそれです。

PBSのVMにディスクを追加

PBSのVMにハードディスクを追加します。ストレージの選択肢に先ほど確認したTrueNASプラグインのディスクがあるので、それを選択します。サイズは空き容量の範囲で自由に決めます。後から増やすことができます。またここでサイズを設定しても、即その容量が確保されてしまうことはありません。プラグインのインストール時にSparse VolumesをYにしたので、実際に保存した分だけしか消費されません。

Discard(日本語訳は中止になってるw)を必ずチェックします。IO threadはオンのまま。バックアップはチェックを外します。これでOKです。

PBS側の操作 (GUI)

データストアを作成

管理 → ストレージ/ディスクを開くと、データ保存用に追加したストレージが確認できると思います。

/dev/sdaが起動ディスクで、/dev/sdbが今回追加したディスクです。ディレクトリタブを開いて作成Directoryを押し、そのディスクを選択、ファイルシステムはext4またはxfs、名前は任意でデータストアとして追加をチェックして作成します。

データストアとして追加をチェックするとデータストアとして追加されます(進次郎構文)。これでストレージの準備は完了です。必要に応じてPuruneやGCの設定をしておきます。

APIキーの作成

rootを使ってもいいですが専用のアカウントを発行して、権限を限定し、APIキーでPBSにアクセスすると安全です。設定→アクセス制御を開きます。

ユーザー管理→追加でユーザー pve-backup 追加します。今回はパスワードは使いませんが強力なものを設定しておきます。次にAPIトークタブでAPIトークンを追加します。ユーザーはpve-backup@pbs、トークン名は接続元のPVEの名前にしておくと管理しやすいでしょう。発行されたトークンIDとシークレットを控えます。

次にアクセス権限タブで追加→ユーザのアクセス権限を選択し、パスは先ほどしたデータストアのもの、ユーザはpve-backup@…、ロールはDataStoreBackupを選択します。さらに追加→APIトークンのアクセス権限でAPIトークンにも同様に権限を設定します。

バックアップしたいPVEの操作

PBSの接続

データセンター→ストレージ→追加→Proxmox Backup Serverを選択し、ユーザー名とパスワードには先ほど作成したトークンIDとシークレットを入力します。あとは必要な項目を入力してPBSのデータストアを選択すれば、PVEからバックアップできるようになります。

他にやること

不要なディスク領域の解放

PBSの設定

PBSのPruneとGCが設定されているか確認し、未設定なら設定しておきます

PBSのTrim設定

未使用領域が自動的に解放されるようになっているか確認します。

systemctl status fstrim.timer

activeと表示されていれば定期的に実行されるので問題ありません。

TrueNASのNVMe DH-HMAC-CHAP認証を使うかどうか

現在はホストNQNの名前が一致するかどうかで認証しています。

cat /etc/nvme/hostnqn  #またはnvme list-subsysコマンド
nqn.2014-08.org.nvmexpress:uuid:1234xxxx-5678-xxxx-1111-222xxxx3333  # 例

これがバレない限りは大丈夫ですが、何らかの理由でコピーされたら、他のマシンからでもアクセスできてしまいます。パスワードと同じようなものですね。

このほかにも秘密鍵を使った認証もできるようです。しかしこれらは認証のみでデータそのものは暗号化されずに送信されます。データ専用の安全なネットワークを作ることが前提ですね。ホストNQNによる認証が弱いというわけではないので、ここまでガチでやらなくてもいいと思いました。