XCP-ng の 3 台のホストのローカル ディスクを XOSTOR(LINSTOR/DRBD によるレプリケーション)で 1 つの共有 SR にまとめ、ハイパーコンバージド(HCI)構成にする手順と、仮想マシンの移行・ホストの停止・NIC の故障の動作を確認した結果です。DRBD の通信は、2 本の NIC のボンド(bond0)を通して冗長化します。
この記事の前提
参照した公式ドキュメント
構成
| 項目 | 内容 |
|---|---|
| プール | doc-pool(doc-xcp1〜3)。プールの設定手順で bond0(Storage-Migration、10.20.83.x)を作成済み |
| XOSTOR に使うディスク | 各ホストの /dev/sdb(40 GB、インストール時にローカル SR に含めなかったディスク) |
| レプリケーション | 2(データを 2 台のホストに 1 つずつ持つ) |
| プロビジョニング | Thin |
| SR 名 | xostor-sr01 |
公式ドキュメントの主な前提条件です。
| 条件 | 内容 |
|---|---|
| ホストの台数 | 3 台以上(DRBD のクォーラムのため)。1 つのプールで最大 7 台 |
| 管理ネットワーク | パブリックな IP アドレスを使わない(LINSTOR のポートは認証なしで待ち受けるため) |
| DRBD のネットワーク | 10 Gbps 以上の専用の NIC を推奨(管理用と共用も可能) |
| レプリケーション数 | 1・2・3 のいずれか。作成後は変更できません |
| dom0 のメモリ | LINSTOR のサービスがメモリを使うので、十分に割り当てる |
XO での作成(XOA の登録が必要)
Xen Orchestra の [XOSTOR] → [New] で作成する方法が、公式の標準の手順です。
(1) 名前・説明・レプリケーション・プロビジョニング、プール、ネットワーク(任意)を入力します。

| 項目 | 説明 | 設定値 |
|---|---|---|
| Name/Description | SR の名前と説明 | xostor-sr01 |
| Replication | データのコピー数 | 2 |
| Provisioning | Thin(使った分だけ)/Thick | Thin |
| Pool | 対象のプール。必要なパッケージ(xcp-ng-release-linstor、xcp-ng-linstor)が各ホストに入ります | doc-pool |
| Network | DRBD に使うネットワーク(空なら管理用) | Storage-Migration |
(2) [Disks] でホストを選び、使うディスク(/dev/sdb)をホストごとに追加します。[Summary] に、概算の容量(Approximate SR capacity:60 GiB)が表示されます。[Create] をクリックし、「パッケージの導入でツールスタックが再起動する」という確認で [OK] をクリックします。

この検証環境の XOA は未登録(無償のアカウントで登録していない状態)だったため、作成は「unknown error from the peer」で失敗しました([Settings] → [Logs] に xostor.create のエラーとして記録されます)。XOA を登録してから実行してください。この検証では XOA を登録せず、次の CLI の手順で同じ構成を作りました。
CLI での作成
公式ドキュメントに記載のあるコマンドを組み合わせて作成しました。
(1) 全ホストで、LINSTOR のパッケージを入れます。
yum install -y xcp-ng-release-linstor
yum install -y xcp-ng-linstor
(2) 全ホストで、XOSTOR に使うディスクに LVM のボリューム グループとシン プールを作ります。
vgcreate linstor_group /dev/sdb
lvcreate -l 100%FREE -T linstor_group/thin_device
lvchange -ay linstor_group/thin_device
(3) 全ホストで、ツールスタックを再起動して LINSTOR のドライバーを読み込みます。xe sm-list type=linstor で、ドライバー(LINSTOR resources on XCP-ng)が表示されることを確認します。
xe-toolstack-restart
xe sm-list type=linstor params=type,name-label
(4) プールのマスターで、LINSTOR の SR を作ります。この検証環境では 44 秒で作成されました。
xe sr-create type=linstor name-label=xostor-sr01 shared=true \
host-uuid=$(xe host-list name-label=doc-xcp1 --minimal) \
device-config:group-name=linstor_group/thin_device \
device-config:redundancy=2 device-config:provisioning=thin
| device-config | 説明 |
|---|---|
| group-name | 手順 (2) で作ったボリューム グループ/シン プール |
| redundancy | レプリケーション数 |
| provisioning | thin または thick |
(5) DRBD の通信をストレージ用ネットワーク(bond0)に向けます。各ホストに LINSTOR のインターフェースを登録し、優先する NIC(PrefNic)に設定します。
linstor node interface create doc-xcp1 storage 10.20.83.131
linstor node set-property doc-xcp1 PrefNic storage
(doc-xcp2・doc-xcp3 も同じように実行)
linstorコマンドは、LINSTOR のコントローラーが動いているホストで実行します。どのホストか分からない場合は、linstor --controllers=192.168.1.131,192.168.1.132,192.168.1.133 node listのように全ホストを指定します。
(6) ノードとストレージ プールの状態を確認します。
linstor node list
linstor storage-pool list
3 台のノードが Online で、各ホストに LVM_THIN のストレージ プール(約 39.9 GiB)があることを確認します。
作成した SR の確認
(1) XO の [XOSTOR] に、作成した SR が表示されます(Size:59.88 GiB、Provisioning:thin)。

(2) SR の [General] タブでは、種類が [linstor]、3 台のホストに接続されていることが分かります。容量は「最小のディスクの容量 × ホスト数 ÷ レプリケーション数」(40 × 3 ÷ 2 = 約 60 GiB)です。

SR の [XOSTOR] タブ(リソースの状態の表示)は、この検証環境の XOA では読み込み中のまま表示されませんでした。状態は
linstor resource listで確認しました。
仮想マシンのディスクの移動(ストレージのライブ マイグレーション)
3Tier 構成の手順で iSCSI の SR に作った rocky-xcp01 を、動かしたまま XOSTOR に移しました。
(1) 仮想マシンの [Migrate] で、移動先のホストと [Select a destination SR](xostor-sr01)を選んで [OK] をクリックします。

(2) 完了すると、[Disks] タブの SR が xostor-sr01 に変わります。

| 項目 | 結果 |
|---|---|
| 所要時間(20 GB のディスクとメモリ) | 208 秒 |
| ping の欠落(0.2 秒間隔) | 1,016 回中 44 回(約 8.8 秒) |
| ゲスト OS | 再起動なし |
linstor resource list で見ると、仮想ディスクの DRBD のリソースは、2 台に実データ(UpToDate)、残りの 1 台にクォーラム用の TieBreaker(データなし)が作られていました。
動作確認
ライブ マイグレーション(XOSTOR 上)
xe vm-migrate vm=rocky-xcp01 host=doc-xcp3 live=true
| 項目 | 結果 |
|---|---|
| 所要時間 | 27.5 秒(doc-xcp1 → doc-xcp3) |
| ping の欠落 | 126 回中 35 回(約 7 秒) |
ストレージ用の NIC の故障
仮想マシンが動いている doc-xcp2 で、bond0 のメンバーの eth3 のリンクを切りました。
| 確認したこと | 結果 |
|---|---|
ovs-appctl bond/show bond0 | eth3 が disabled、eth4 が active member(active-backup) |
| 他ホストの bond0 の IP アドレスへの疎通 | 応答あり |
linstor resource list | リソースはすべて Ok(UpToDate/Diskless/TieBreaker のまま) |
| 仮想マシンの ping(0.2 秒間隔、約 80 秒間) | 欠落 0 回 |
| 仮想マシンのディスク書き込み(200 MB) | 正常に完了 |
リンクを戻すと eth3 は enabled に戻り、この間も ping の欠落はありませんでした。
ホストの停止と再同期(HA)
仮想マシンが動いている doc-xcp3(実データの複製を持つホスト)の電源を強制的に切りました。プールの HA は有効(ハートビート SR は iscsi-sr01)、仮想マシンの HA は restart です。
| 時刻・経過 | 状態 |
|---|---|
| 17:49:39 | doc-xcp3 の電源を切る |
| 165 秒後 | 仮想マシンが doc-xcp2 で再起動し、ping が戻る |
| 停止中 | doc-xcp3 のノードは OFFLINE(1 時間後に自動で除外=Auto-eviction の予定と表示)。仮想ディスクは doc-xcp1 の複製(UpToDate)を使い、doc-xcp2 は Diskless(ネットワーク経由で読み書き)。ディスク書き込みは正常 |
| 17:52:53 | doc-xcp3 の電源を入れる |
| 17:56:39 | doc-xcp3 の複製の再同期(SyncTarget)が終わり、UpToDate に戻る(電源投入から約 3 分 46 秒) |
ホストが長時間停止すると、LINSTOR はそのノードを自動で除外(Auto-eviction)し、残りのホストで複製数を保とうとします。メンテナンスで長く止めるときは、公式ドキュメントの「DrbdOptions/AutoEvictAllowEviction」の説明を参照してください。
HA のハートビート SR を XOSTOR にする設定(
xe pool-ha-enable heartbeat-sr-uuids=<xostor-sr01 の UUID>)は、この検証環境では「SR_BACKEND_FAILURE_1200 Invalid image type: aio」で失敗しました(失敗すると HA は無効のまま残るので、ほかの SR で有効にし直しました)。そのため、ハートビートには iSCSI の SR を使っています。