بنقرة واحدة
linstor-migration
LINSTOR/DRBD マルチリージョン VM マイグレーション。ライブマイグレーション、コールドマイグレーション、リージョン廃止・追加を行う。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
LINSTOR/DRBD マルチリージョン VM マイグレーション。ライブマイグレーション、コールドマイグレーション、リージョン廃止・追加を行う。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
別の tmux ペインで動いている Claude Code インスタンスを、このセッションから tmux send-keys / capture-pane で駆動するオーケストレーション。プランモード投入 → プラン再点検 (1 回目の検証) → ユーザ承認ゲート → auto mode 実装 → レポート未記載追記 → レポート矛盾再チェック (2 回目の検証) の定型フロー。長時間タスクをもう 1 体の claude に「ダブルチェック付きで」実行させ、要所だけ自分が監督したいときに使う。
PXE/netboot 経由で Debian + HW RAID10 を自動インストール (OpenWrt ローカル TFTP + embed ipxe.efi + IPv4 リテラル mirror)。BMC USB redirector が累積劣化した機種 (TX1320 M3 等) や、 cross-site 拠点の install に使う。phase 19 で training-tx1320 で完遂、 物理操作なしで自力 SSH まで到達。
Fujitsu iRMC S4 (TX1320 M3 等) の電源・BIOS・RAID 操作 + BIOS 設定リファレンス。Redfish (HTTPS + SECLEVEL=0) 経由の電源/ブート操作 + iRMC Web UI/KVM 経由の手動 BIOS/RAID 操作手順 + 全 BIOS 設定項目の網羅リファレンス (bios/)。training-tx1320 対応。
Debian + Proxmox VE OS自動セットアップ。BMC VirtualMedia経由でpreseedインストール、PVEインストールまでを実行する。
Supermicro X11DPU/X10DRT-P BIOS Setup 操作。KVM スクリーンショット + キーストロークで BIOS メニューを操作する。BIOS 設定変更、確認、保存を行う。4-6号機 + 10号機対応。
iDRAC7 基本操作。SSH 経由で racadm コマンドを実行し、サーバ管理を行う。
| name | linstor-migration |
| description | LINSTOR/DRBD マルチリージョン VM マイグレーション。ライブマイグレーション、コールドマイグレーション、リージョン廃止・追加を行う。 |
| argument-hint | <subcommand: live-migrate|cold-migrate|decommission-region|add-region|setup-dr> |
LINSTOR/DRBD マルチリージョン環境での VM マイグレーション操作を行う。
| サブコマンド | 用途 |
|---|---|
live-migrate <vmid> <target_node> | リージョン内ライブマイグレーション (Protocol C, ゼロダウンタイム) |
cold-migrate <vmid> <source_region> <target_region> | リージョン間コールドマイグレーション (VM 停止必要) |
decommission-region <region> | リージョン廃止 (全 VM 移行 + ノード削除) |
add-region <region> | リージョン追加 + DR レプリカ設定 |
setup-dr <vmid> <dr_node> | DR レプリカの追加 (2+1 構成) |
scripts/linstor-multiregion-setup.sh 実行済み)Aux/site プロパティが設定済みYQ="${PROJECT_DIR}/bin/yq"
CONFIG="config/linstor.yml"
CONTROLLER_IP=$("$YQ" '.controller_ip' "$CONFIG")
Region A (Protocol C) Region B (Protocol C)
[Node 4] ←→ [Node 5] ←→ [Node 6] [Node 7] ←→ [Node 8] ←→ [Node 9]
←──── Protocol A (DR) ────→
リージョン内のノード間で VM をゼロダウンタイムで移行する。
pve-lock: 必須
kvm64 (異種ハードウェア間の場合)事前状態記録:
ssh root@$SOURCE_IP "qm status $VMID"
ssh root@$CONTROLLER_IP "drbdsetup status --verbose"
ssh $VM_USER@$VM_MGMT_IP "uptime"
ライブマイグレーション実行:
./pve-lock.sh run ./oplog.sh ssh root@$SOURCE_IP "qm migrate $VMID $TARGET_NODE --online"
事後検証:
ssh root@$SOURCE_IP "qm status $VMID" # running (移行先で)
ssh $VM_USER@$VM_MGMT_IP "uptime" # 連続 (リブートなし)
ssh $VM_USER@$VM_MGMT_IP "md5sum -c checksums.txt" # データ整合性
ssh root@$CONTROLLER_IP "drbdsetup status --verbose" # Primary が移行先に
| 方向 | ダウンタイム (1回目) | ダウンタイム (2回目) | 備考 |
|---|---|---|---|
| 6号機 → 7号機 | 73ms / 911 MiB / 18秒 | 37ms / 834 MiB / 17秒 | 平均 55ms |
| 7号機 → 6号機 | 33ms / 349 MiB / 11秒 | 74ms / 844 MiB / 15秒 | 平均 53.5ms |
注記: 旧リージョン構成 (Region B: 6+7号機) 時の実測値。
リージョン間で VM を移行する (VM 停止が必要)。
pve-lock: 必須
移行先リージョンに2レプリカを確保:
# DR レプリカが1つある場合、もう1つ追加
ssh root@$CONTROLLER_IP "linstor resource create $TARGET_NODE2 $RESOURCE_NAME"
# cross-region パスが必要な場合は作成
ssh root@$CONTROLLER_IP "linstor node-connection path create $SOURCE_NODE $TARGET_NODE cross-region default default"
# Protocol A 設定
./scripts/linstor-multiregion-setup.sh setup config/linstor.yml
# DRBD 同期待ち (32GiB over 1GbE: ~6分)
VM 停止:
./pve-lock.sh run ./oplog.sh ssh root@$SOURCE_NODE_IP "qm stop $VMID"
移行元リージョンのレプリカ削除:
ssh root@$CONTROLLER_IP "linstor resource delete $SOURCE_NODE1 $RESOURCE_NAME"
ssh root@$CONTROLLER_IP "linstor resource delete $SOURCE_NODE2 $RESOURCE_NAME"
# cloudinit リソースも同様
VM config を移行先 PVE クラスタに再作成:
# 移行元の VM config を削除 (qm destroy は LINSTOR リソースも消すので使わない)
ssh root@$SOURCE_NODE_IP "rm /etc/pve/qemu-server/$VMID.conf"
# 移行先で VM 再作成
ssh root@$TARGET_NODE_IP "qm create $VMID --name $VM_NAME --memory $MEM --cores $CORES --cpu kvm64 --net0 virtio=$MAC0,bridge=vmbr1 --net1 virtio=$MAC1,bridge=vmbr0 --ostype l26 --scsihw virtio-scsi-single"
# 既存 LINSTOR リソースをアタッチ (★核心: これが PVE クロスクラスタで動作する)
ssh root@$TARGET_NODE_IP "qm set $VMID --scsi0 linstor-storage:${RESOURCE_NAME}_${VMID},discard=on,iothread=1,size=$DISK_SIZE"
ssh root@$TARGET_NODE_IP "qm set $VMID --boot order=scsi0"
ssh root@$TARGET_NODE_IP "qm set $VMID --ipconfig1 ip=$VM_MGMT_IP/$PREFIX,gw=$GW"
VM 起動 + 検証:
./pve-lock.sh run ./oplog.sh ssh root@$TARGET_NODE_IP "qm start $VMID"
ssh $VM_USER@$VM_MGMT_IP "md5sum -c checksums.txt" # データ整合性
DR レプリカの再設定 (移行元リージョンに):
ssh root@$CONTROLLER_IP "linstor resource create $DR_NODE $RESOURCE_NAME"
./scripts/linstor-multiregion-setup.sh setup config/linstor.yml
qm set --scsi0 linstor-storage:<resource_name> は PVE クロスクラスタで動作するqm destroy は LINSTOR リソースも削除するため使用禁止。rm /etc/pve/qemu-server/*.conf を使うリージョンの全 VM を移行し、ノードを LINSTOR から削除する。
pve-lock: 必須
./scripts/linstor-multiregion-node.sh remove $NODE config/linstor.yml
LINSTOR にリージョンを追加し、DR レプリカを設定する。
pve-lock: 必須
ノードを LINSTOR に登録:
ssh root@$CONTROLLER_IP "linstor node create $NODE $NODE_IP --node-type Satellite"
sleep 10 # satellite 接続待ち
ストレージプール作成 (ZFS):
ssh root@$CONTROLLER_IP "linstor storage-pool create zfs $NODE zfs-pool linstor_zpool"
注: satellite 再起動直後は ZFS プロバイダが検出されないことがある。数秒待ってリトライ。
リージョンプロパティ + auto-eviction 無効化:
ssh root@$CONTROLLER_IP "linstor node set-property $NODE Aux/site $REGION"
ssh root@$CONTROLLER_IP "linstor node set-property $NODE DrbdOptions/AutoEvictAllowEviction false"
cross-region パス作成:
# 既存リージョンの各ノードとパスを作成
ssh root@$CONTROLLER_IP "linstor node-connection path create $EXISTING_NODE $NEW_NODE cross-region default default"
DR レプリカ追加 + Protocol A 設定:
ssh root@$CONTROLLER_IP "linstor resource create $NODE $RESOURCE_NAME"
./scripts/linstor-multiregion-setup.sh setup config/linstor.yml
既存リソースに DR レプリカを追加し、2+1 構成にする。
pve-lock: 必須
cross-region パスの確認・作成:
ssh root@$CONTROLLER_IP "linstor node-connection path list $SOURCE_NODE $DR_NODE"
# 未設定なら作成
ssh root@$CONTROLLER_IP "linstor node-connection path create $SOURCE_NODE $DR_NODE cross-region default default"
DR レプリカ作成:
ssh root@$CONTROLLER_IP "linstor resource create $DR_NODE $RESOURCE_NAME"
Protocol A 設定:
./scripts/linstor-multiregion-setup.sh setup config/linstor.yml
DRBD 同期待ち:
# 32GiB over 1GbE: ~6分
ssh root@$CONTROLLER_IP "linstor resource list -r $RESOURCE_NAME"
| ID | 失敗 | サブコマンド | 検出方法 | 対策 |
|---|---|---|---|---|
| M1 | qm migrate --online が LINSTOR ディスクで失敗 | live-migrate | エラー出力 | 両ノードに diskful リソースが存在するか linstor resource list で確認 |
| M2 | メモリ転送タイムアウト | live-migrate | タイムアウトエラー | --migration_network で 10.x を指定 |
| M3 | CPU タイプ host で異種ハードウェア間マイグレーション失敗 | live-migrate | Failed to set special registers | CPU タイプを kvm64 に変更 |
| M4 | vendor snippet 未配置 | live-migrate | volume 'local:snippets/...' does not exist | 移行先ノードに snippet をコピー |
| M5 | DR レプリカが一時的に Outdated | live-migrate | drbdsetup status | Protocol A の非同期性により正常。自動復帰する |
| C1 | qm set --scsi0 linstor-storage:X がクロスクラスタで動作 | cold-migrate | - | 実証済み: vzdump 不要 |
| C2 | PrefNic=ib0 で DRBD がリージョン間接続を IB アドレスにバインド | cold-migrate/setup-dr | Connecting 状態が継続 | cross-region パスを default インターフェースで作成 |
| C3 | node remove/re-add 後にパスが stale | add-region | Network interface 'default' does not exist | パスを delete + recreate |
| C4 | replicas-on-same "Aux/site" が Aux/Aux/site に二重プレフィックス | - | resource-group list-properties | --replicas-on-same site (Aux/ なし) を使用 |
| C5 | cloudinit ディスクのアタッチ不要 | cold-migrate | - | 初回起動済みのため cloudinit スキップ可 |
| C6 | DRBD フルシンクがネットワーク帯域を飽和 | cold-migrate | SSH 遅延 | c-max-rate で帯域制限 |
| C7 | パス作成時の PeerClosingConnectionException | add-region | exit code 10 + エラー出力 | パスを delete + recreate (2回目の create で安定) |
| C8 | ストライプ/非ストライプ間の LV サイズ不一致 | add-region, cold-migrate | The peer's disk size is too small! + StandAlone | リソース削除 → 手動 LV 作成 (正しい PE 数) → 再作成 |
両リージョンとも PrefNic が IB インターフェースに設定済み (Region A: ibp134s0, Region B: ibp10s0)。 DRBD はデフォルトで IB アドレス (192.168.100.x) にバインドする。 cross-region 接続は IB ではなくデフォルトインターフェース (10.x Ethernet) 経由で行う。
注: LINSTOR に登録するインターフェース名は OS のデバイス名を使う (
ip link show type ipoibで確認)。ib0ではない。
解決策: node-connection path create で cross-region ペアに default インターフェースを指定:
# Region A の各ノード ↔ Region B の各ノードにパスを作成
ssh root@$CONTROLLER_IP "linstor node-connection path create nodeA nodeB cross-region default default"
default は LINSTOR のデフォルトネットワークインターフェース (10.x) を使う。IB ではなく Ethernet で接続される。
LINSTOR からノードを削除して再追加すると、ノードの UUID が変わる。既存のパスは古い UUID を参照しており、
Network interface 'default' of node 'X' does not exist! エラーが発生する。
解決策: パスを削除して再作成:
ssh root@$CONTROLLER_IP "linstor node-connection path delete nodeA nodeB cross-region"
ssh root@$CONTROLLER_IP "linstor node-connection path create nodeA nodeB cross-region default default"
ノード remove/re-add 直後に node-connection path create を実行すると、PeerClosingConnectionException が発生することがある。
パス自体は作成されるが、衛星ノードへの DRBD adjust が失敗し、後続のリソース作成で C3 エラーが発生する。
発生条件: ノード再登録直後のパス作成 (衛星ノードとの通信が不安定な場合) 再現性: 2回のテストで確認。発生するパスは一定ではない (条件依存)
確定対策手順:
# 1. path create を実行 (エラーが出る可能性あり)
ssh root@$CONTROLLER_IP "linstor node-connection path create nodeA nodeB cross-region default default"
# 2. path delete で一旦削除
ssh root@$CONTROLLER_IP "linstor node-connection path delete nodeA nodeB cross-region"
# 3. path create で再作成 (今度は成功)
ssh root@$CONTROLLER_IP "linstor node-connection path create nodeA nodeB cross-region default default"
(注: 2026-03-30 に全ノード ZFS raidz1 に統一したため、LVM ストライプ/非ストライプ間のサイズ不一致問題は解消。ZFS 統一構成では --storage-pool zfs-pool を指定すれば正常にリソース作成可能。)
qm resize で DRBD 上の ZFS zvol をリサイズすると、一部ノードで DRBD adjust が失敗し Resizing 状態でスタックすることがある。
対策: VM ディスクサイズは作成時に確定する。ライブリサイズが必要な場合は新しいディスクを追加してデータ移行する。
状態変更操作は ./oplog.sh で記録する:
全サブコマンドで状態変更操作に ./pve-lock.sh を使用する:
./pve-lock.sh run <command...> # 即座に実行(ロック中ならエラー)
./pve-lock.sh wait <command...> # ロック待ち→実行
| スクリプト | 用途 |
|---|---|
scripts/linstor-multiregion-setup.sh setup | Aux/site 設定 + リージョン間 Protocol A 設定 |
scripts/linstor-multiregion-node.sh add/remove | ノードのリージョン追加/削除 |
scripts/linstor-multiregion-status.sh | マルチリージョン状態表示 |