Supermicro IPMI と Proxmox VE を操作して、分散ストレージの比較評価およびマルチリージョン VM 運用基盤の構築を行うツールキット。
Claude Code (AI エージェント) がローカルマシンから SSH 経由で物理サーバを操作し、OS インストールからストレージベンチマーク、LINSTOR/DRBD によるマルチリージョン VM マイグレーションまでを自動化する。
- BMC VirtualMedia による OS 自動インストール — Redfish API / CGI API / iDRAC racadm で ISO マウント、preseed による無人インストール
- マルチプラットフォーム BMC 対応 — Supermicro IPMI と Dell iDRAC7 の両方を統一的に操作
- 多段フェーズのオーケストレーション — ISO ダウンロード → preseed 生成 → ISO リマスタ → BMC マウント → インストール監視 → PVE セットアップまで状態追跡付きで実行
- 排他ロック —
pve-lock.shによる flock ベースのロックで、複数の Claude Code セッションが同じクラスタを安全に操作 - 課題管理・レポート追跡 —
issue.shによる課題管理と、作業完了時のレポート自動生成 - LINSTOR/DRBD ストレージベンチマーク — fio による性能計測、ノード障害シミュレーション・復旧
- LINSTOR/DRBD マルチリージョン VM 運用 — 2+1 トポロジー (リージョン内同期 + リージョン間非同期 DR)、ライブ/コールドマイグレーション、リージョンライフサイクル管理
- InfiniBand (SX6036) ネットワーク評価 — シリアルコンソール経由での Mellanox スイッチ設定・ベンチマーク
| カテゴリ | 技術 |
|---|---|
| メイン言語 | POSIX sh (#!/bin/sh, set -eu) |
| CLI ツール | Rust (tools/ Cargo workspace) |
| 補助スクリプト | Python (SOL モニタ, KVM スクリーンショット等) |
| サーバ管理 | Supermicro Redfish API / CGI API, Dell iDRAC racadm, ipmitool |
| 仮想化基盤 | Proxmox VE REST API + CLI (pvesh, qm, pct, pveceph) |
| OS インストール | Debian preseed, ISO リマスタ |
| AI エージェント | Claude Code (.claude/skills/ によるスキル定義) |
pvese/
├── scripts/ # 主要スクリプト群
│ ├── bmc-power.sh # BMC 電源管理 (on/off/reset/status)
│ ├── bmc-session.sh # BMC CGI セッション管理
│ ├── bmc-virtualmedia.sh # BMC VirtualMedia マウント/アンマウント
│ ├── bmc-screenshot.sh # BMC KVM スクリーンショット取得
│ ├── bmc-kvm-screenshot.py # BMC KVM スクリーンショット (Python版)
│ ├── idrac-virtualmedia.sh # iDRAC7 VirtualMedia マウント・ブート操作
│ ├── idrac-kvm-screenshot.py # iDRAC7 KVM スクリーンショット取得
│ ├── generate-preseed.sh # preseed.cfg 生成
│ ├── remaster-debian-iso.sh # Debian ISO リマスタ (preseed 埋め込み)
│ ├── os-setup-phase.sh # OS セットアップ フェーズ管理
│ ├── pre-pve-setup.sh # DHCP ネットワーク・apt ソースの事前設定
│ ├── pve-setup-remote.sh # PVE リモートセットアップ
│ ├── ssh-wait.sh # SSH 接続ポーリング待機
│ ├── ib-setup-remote.sh # InfiniBand リモートセットアップ
│ ├── sol-login.py # SOL (Serial Over LAN) 自動ログイン
│ ├── sol-monitor.py # SOL インストール進捗モニタ
│ ├── syslog-receiver.sh # UDP syslog 受信 (インストーラ診断用)
│ ├── sx6036-console.py # SX6036 IB スイッチ シリアルコンソール
│ ├── linstor-bench-preflight.sh # ベンチマーク前チェック (SMART 等)
│ ├── linstor-multiregion-setup.sh # LINSTOR マルチリージョンセットアップ
│ ├── linstor-multiregion-node.sh # LINSTOR マルチリージョンノード操作
│ ├── linstor-multiregion-status.sh # LINSTOR マルチリージョン状態確認
│ ├── linstor-migrate-live.sh # リージョン内ライブマイグレーション
│ ├── linstor-migrate-cold.sh # リージョン間コールドマイグレーション
│ └── linstor-drbd-sync-wait.sh # DRBD 同期完了待機
├── config/ # サーバ・スイッチ設定ファイル (YAML)
│ ├── server4.yml
│ ├── server5.yml
│ ├── server6.yml
│ ├── server7.yml
│ ├── server8.yml
│ ├── server9.yml
│ ├── linstor.yml
│ └── switch-sx6036.yml
├── docs/ # 運用ドキュメント
│ ├── linstor-multiregion-ops.md # マルチリージョン運用マニュアル
│ └── linstor-multiregion-tutorial.md # マルチリージョンチュートリアル
├── preseed/ # Debian preseed テンプレート・生成ファイル
├── state/ # フェーズ実行状態の永続化
├── issues/ # 課題管理データ (issues.yml)
├── report/ # 作業レポート (Markdown)
├── log/ # 操作ログ (oplog.log)
├── tools/ # Rust CLI ツール (Cargo workspace)
├── bin/ # プロジェクトローカルのバイナリ (yq 等)
├── tmp/ # セッション別一時ファイル
├── .claude/skills/ # Claude Code スキル定義
├── issue.sh # 課題管理 CLI
├── oplog.sh # 操作ログ記録
├── pve-lock.sh # PVE/IPMI 操作の排他ロック
├── CLAUDE.md # Claude Code へのルール・ガイダンス
├── ISSUE.md # 課題管理ルール
└── REPORT.md # レポート作成ルール
os-setup 自動化が対応済みのハードウェアプラットフォーム。
| 項目 | 仕様 |
|---|---|
| シャーシ | SYS-6019U-TN4R4T (1U) |
| マザーボード | X11DPU |
| CPU | 2x Intel Xeon |
| メモリ | 32 GiB |
| ブートデバイス | NVMe SSD (/dev/nvme0n1) |
| NIC | 4x 10GBase-T (eno1np0, eno2np1, eno3np2, eno4np3) |
| InfiniBand | ConnectX-3 CX354A (QSFP+, 40 Gbps QDR) |
| BMC | Supermicro IPMI (FW 01.73.06, Redfish v1.8.0) |
| ブートモード | UEFI |
| VirtualMedia | SMB 経由 (CGI API) |
| SOL | COM2 / ttyS1 (serial_unit: 1) |
| 項目 | 仕様 |
|---|---|
| マザーボード | X10DRT-P (Twin Server 用ハーフ幅) |
| ブートデバイス | NVMe SSD (/dev/nvme0n1 想定、実機確認要) |
| NIC | eno1np0, eno2np1 想定 (実機確認要) |
| BMC | Supermicro IPMI (Redfish + CGI API 想定) |
| ブートモード | UEFI 想定 |
| VirtualMedia | SMB 経由 (CGI API) |
| SOL | COM2 / ttyS1 (serial_unit: 1 想定、実機確認要) |
| LINSTOR | 未参加 (IB 接続性確認後に別タスクで構成決定) |
| 項目 | 仕様 |
|---|---|
| シャーシ | PowerEdge R320 (1U) |
| CPU | Intel Xeon (1-socket) |
| ブートデバイス | PERC H710 Mini RAID (/dev/sda, VD0 RAID-1 278 GB) |
| NIC | eno1 (管理), eno2 (DHCP) |
| BMC | iDRAC7 (FW 2.65.65.65) |
| ブートモード | UEFI (Legacy BIOS + GPT は非対応) |
| VirtualMedia | SMB 経由 (racadm remoteimage) |
| SOL | COM1 / ttyS0 (serial_unit: 0) |
| 認証 | SSH 鍵認証 (~/.ssh/idrac_rsa, RSA 2048) |
| 項目 | 仕様 |
|---|---|
| モデル | Mellanox SX6036 (MSX6036F-1SFS) |
| ポート | 36x QSFP+ FDR InfiniBand |
| FW | MLNX-OS 3.6.8012 |
| 管理 IP | 10.10.10.100 |
| 操作 | シリアルコンソール (/dev/ttyUSB0) |
| サーバ | BMC IP | 静的 IP | ホスト名 | ハードウェア |
|---|---|---|---|---|
| 4号機 | 10.10.10.24 |
10.10.10.204 |
ayase-web-service-4 | Supermicro X11DPU |
| 5号機 | 10.10.10.25 |
10.10.10.205 |
ayase-web-service-5 | Supermicro X11DPU |
| 6号機 | 10.10.10.26 |
10.10.10.206 |
ayase-web-service-6 | Supermicro X11DPU |
| 7号機 | 10.10.10.27 (iDRAC) |
10.10.10.207 |
ayase-web-service-7 | DELL PowerEdge R320 |
| 8号機 | 10.10.10.28 (iDRAC) |
10.10.10.208 |
ayase-web-service-8 | DELL PowerEdge R320 |
| 9号機 | 10.10.10.29 (iDRAC) |
10.10.10.209 |
ayase-web-service-9 | DELL PowerEdge R320 |
| 10号機 | 10.10.10.30 |
10.10.10.210 |
ayase-web-service-10 | Supermicro X10DRT-P |
| 11号機 | 10.10.10.31 |
10.10.10.211 |
ayase-web-service-11 | Supermicro X10DRT-P |
| 12号機 | 10.10.10.32 |
10.10.10.212 |
ayase-web-service-12 | Supermicro X10DRT-P |
| 13号機 | 10.10.10.33 |
10.10.10.213 |
ayase-web-service-13 | Supermicro X10DRT-P |
- 4-6号機: Supermicro X11DPU / BMC: IPMI (Redfish + CGI API)
- 7-9号機: DELL PowerEdge R320 / BMC: iDRAC7 SSH 鍵認証
- 10-13号機: Supermicro X10DRT-P (Twin Server, Nutanix OEM) / BMC: IPMI (Redfish + CGI API) / 別拠点 + VLAN trunk (1120/1083) / LINSTOR 未参加
- OS: Debian 13 (Trixie) + Proxmox VE 9
- PVE クラスタ: 1リージョン1クラスタ構成 (Region A: 4+5+6号機, Region B: 7+8+9号機)
graph LR
CC["Claude Code<br/>(ローカルマシン)"]
subgraph mgmt["管理ネットワーク (10.10.10.0/8)"]
subgraph srv4["4号機"]
BMC4["BMC<br/>10.10.10.24"]
PVE4["PVE<br/>10.10.10.204"]
end
subgraph srv5["5号機"]
BMC5["BMC<br/>10.10.10.25"]
PVE5["PVE<br/>10.10.10.205"]
end
subgraph srv6["6号機"]
BMC6["BMC<br/>10.10.10.26"]
PVE6["PVE<br/>10.10.10.206"]
end
subgraph srv7["7号機"]
iDRAC7["iDRAC7<br/>10.10.10.27"]
PVE7["PVE<br/>10.10.10.207"]
end
subgraph srv8["8号機"]
iDRAC8["iDRAC8<br/>10.10.10.28"]
PVE8["PVE<br/>10.10.10.208"]
end
subgraph srv9["9号機"]
iDRAC9["iDRAC9<br/>10.10.10.29"]
PVE9["PVE<br/>10.10.10.209"]
end
subgraph srv10["10号機"]
BMC10["BMC<br/>10.10.10.30"]
PVE10["PVE<br/>10.10.10.210"]
end
subgraph srv11["11号機"]
BMC11["BMC<br/>10.10.10.31"]
PVE11["PVE<br/>10.10.10.211"]
end
subgraph srv12["12号機"]
BMC12["BMC<br/>10.10.10.32"]
PVE12["PVE<br/>10.10.10.212"]
end
subgraph srv13["13号機"]
BMC13["BMC<br/>10.10.10.33"]
PVE13["PVE<br/>10.10.10.213"]
end
SMB["ISO ホスティング<br/>10.1.6.1"]
IB["SX6036 IB スイッチ<br/>10.10.10.100"]
end
CC -- "SSH" --> PVE4
CC -- "SSH" --> PVE5
CC -- "SSH" --> PVE6
CC -- "SSH" --> PVE7
CC -- "IPMI" --> BMC4
CC -- "IPMI" --> BMC5
CC -- "IPMI" --> BMC6
CC -- "SSH/racadm" --> iDRAC7
CC -- "SSH" --> PVE8
CC -- "SSH" --> PVE9
CC -- "SSH/racadm" --> iDRAC8
CC -- "SSH/racadm" --> iDRAC9
CC -- "SSH" --> PVE10
CC -- "IPMI" --> BMC10
CC -- "SSH" --> PVE11
CC -- "IPMI" --> BMC11
CC -- "SSH" --> PVE12
CC -- "IPMI" --> BMC12
CC -- "SSH" --> PVE13
CC -- "IPMI" --> BMC13
BMC4 -- "SMB" --> SMB
BMC5 -- "SMB" --> SMB
BMC6 -- "SMB" --> SMB
iDRAC7 -- "SMB" --> SMB
iDRAC8 -- "SMB" --> SMB
iDRAC9 -- "SMB" --> SMB
BMC10 -- "SMB" --> SMB
BMC11 -- "SMB" --> SMB
BMC12 -- "SMB" --> SMB
BMC13 -- "SMB" --> SMB
PVE4 -- "InfiniBand" --- IB
PVE5 -- "InfiniBand" --- IB
PVE6 -- "InfiniBand" --- IB
PVE7 -- "InfiniBand" --- IB
PVE8 -- "InfiniBand" --- IB
PVE9 -- "InfiniBand" --- IB
| スクリプト | 用途 |
|---|---|
scripts/bmc-power.sh |
電源管理 (on, off, reset, status, bios-setup) |
scripts/bmc-session.sh |
BMC CGI API セッション取得・解放 |
scripts/bmc-virtualmedia.sh |
VirtualMedia ISO マウント・アンマウント・状態確認 |
scripts/bmc-screenshot.sh |
KVM コンソールのスクリーンショット取得 |
| スクリプト | 用途 |
|---|---|
scripts/idrac-virtualmedia.sh |
iDRAC7 VirtualMedia マウント・ブート操作 |
scripts/idrac-kvm-screenshot.py |
iDRAC7 KVM スクリーンショット取得 |
| スクリプト | 用途 |
|---|---|
scripts/generate-preseed.sh |
config YAML から preseed.cfg を生成 |
scripts/remaster-debian-iso.sh |
Debian ISO に preseed を埋め込んでリマスタ |
scripts/os-setup-phase.sh |
セットアップフェーズの状態管理 (init/start/check/mark/fail/reset/status) |
scripts/pre-pve-setup.sh |
DHCP ネットワーク・apt ソースの事前設定 |
scripts/pve-setup-remote.sh |
SSH 経由で PVE リポジトリ追加・パッケージインストール |
scripts/ssh-wait.sh |
SSH 接続ポーリング待機 |
| スクリプト | 用途 |
|---|---|
scripts/sol-login.py |
SOL 経由の自動ログイン・ブートステージ検出 |
scripts/sol-monitor.py |
SOL 経由のインストール進捗モニタリング |
scripts/bmc-kvm-screenshot.py |
KVM スクリーンショット取得 (Python版、POST コード判定付き) |
scripts/syslog-receiver.sh |
UDP syslog 受信 (インストーラ診断用) |
| スクリプト | 用途 |
|---|---|
scripts/ib-setup-remote.sh |
InfiniBand ドライバ・ツールのリモートセットアップ |
scripts/sx6036-console.py |
SX6036 スイッチのシリアルコンソール操作 |
| スクリプト | 用途 |
|---|---|
scripts/linstor-bench-preflight.sh |
ベンチマーク前チェック (SMART ヘルス等) |
scripts/linstor-multiregion-setup.sh |
マルチリージョンセットアップ |
scripts/linstor-multiregion-node.sh |
マルチリージョンノード操作 |
scripts/linstor-multiregion-status.sh |
マルチリージョン状態確認 |
scripts/linstor-migrate-live.sh |
リージョン内ライブマイグレーション |
scripts/linstor-migrate-cold.sh |
リージョン間コールドマイグレーション |
scripts/linstor-drbd-sync-wait.sh |
DRBD 同期完了待機 |
LINSTOR/DRBD の 2+1 トポロジーで、リージョン内はゼロダウンタイムのライブマイグレーション、リージョン間は構造化されたコールドマイグレーションと DR を実現する、宣言的マルチリージョン VM 運用基盤。
2+1 トポロジー概要:
Region A (IPoIB) Region B (IPoIB)
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 4号機 │←→│ 5号機 │←→│ 6号機 │ │ 7号機 │←→│ 8号機 │←→│ 9号機 │
│ Primary │ │ Primary │ │ Primary │ │ Primary │ │ Primary │ │ Primary │
│ Replica │ │ Replica │ │ Replica │ │ Replica │ │ Replica │ │ Replica │
└────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘
│ Protocol C │ │ │ Protocol C │ │
│ (同期) │ │ │ (同期) │ │
└──────┬──────┘──────────┘ └──────┬──────┘──────────┘
│ Protocol A │
└──────────── (非同期DR) ────────────────┘
| 項目 | リージョン内 | リージョン間 |
|---|---|---|
| DRBD プロトコル | C (同期) | A (非同期) |
| マイグレーション | ライブ (ゼロダウンタイム) | コールド (VM 停止→転送→起動) |
| ネットワーク | IPoIB | Ethernet (10GbE) |
リージョン構成 (config/linstor.yml):
| リージョン | ノード | 接続 |
|---|---|---|
| Region A | 4号機 + 5号機 + 6号機 | InfiniBand (IPoIB) |
| Region B | 7号機 + 8号機 + 9号機 | InfiniBand (IPoIB) |
運用シナリオ:
- ライブマイグレーション — リージョン内のノード間で VM をゼロダウンタイム移動 (DRBD Protocol C 同期済み)
- コールドマイグレーション — リージョン間で VM を停止→DRBD 同期待ち→起動で移動
- リージョン追加 — 新ノードペアを LINSTOR に登録し、DR レプリカを配置
- リージョン廃止 — VM をコールドマイグレーションで退避後、ノード・リソースを削除
- DR フェイルオーバー — リージョン障害時に DR レプリカから VM を起動
詳細ドキュメント:
./issue.sh list # 未完了課題の一覧
./issue.sh show <id> # 課題の詳細表示
./issue.sh add "タイトル" --label infra # 新規課題作成
./issue.sh start <id> # 課題を active に遷移
./issue.sh done <id> # 課題を完了状態変更を伴う操作をタイムスタンプ・終了コード・実行時間付きで記録する。
./oplog.sh <command...> # コマンドを実行しログに記録ログは log/oplog.log に蓄積される。
PVE クラスタや IPMI の状態変更操作を排他制御する。
./pve-lock.sh status # ロック状態を確認
./pve-lock.sh run <command...> # ロック取得して実行 (取得できなければエラー)
./pve-lock.sh wait <command...> # ロック待ちして実行OS インストールは以下の 8 フェーズで段階的に実行される:
- iso-download — Debian ISO のダウンロード・SHA256 検証
- preseed-generate — config YAML から preseed.cfg を生成
- iso-remaster — preseed を埋め込んだカスタム ISO を作成
- bmc-mount-boot — BMC VirtualMedia で ISO をマウントし起動
- install-monitor — SOL モニタでインストール進捗を監視
- post-install-config — SSH 経由で初期設定 (ネットワーク, locale 等)
- pve-install — Proxmox VE リポジトリ追加・パッケージインストール
- cleanup — VirtualMedia アンマウント・一時ファイル削除
各フェーズの状態は state/os-setup/ に永続化され、失敗時の途中再開が可能。
このプロジェクトは Claude Code (AI エージェント) による操作を前提としている。
.claude/skills/— 以下のスキルが定義されており、Claude Code が複雑な手順を自律的に実行できる:os-setup— OS セットアップ (Debian + PVE 自動インストール)ib-switch— IB スイッチ操作 (SX6036 シリアルコンソール)linstor-bench— LINSTOR/DRBD ストレージベンチマークlinstor-node-ops— LINSTOR ノード障害シミュレーション・復旧linstor-migration— LINSTOR マルチリージョン VM マイグレーションidrac7— iDRAC7 基本操作 (racadm SSH)idrac7-fw-update— iDRAC7 ファームウェアアップデートdell-fw-download— Dell ファームウェアダウンロード (Playwright)tftp-server— Docker TFTP サーバ (FW アップデート用)playwright— Playwright セットアップ・ブラウザ自動化
CLAUDE.md— スクリプト規約、パーミッション設定、操作ルール等を Claude Code に指示ISSUE.md— 課題の状態遷移ルールを定義REPORT.md— レポートのフォーマットを定義
Claude Code セッションを開始した後、以下のように話しかけると各操作を実行できる。
4号機に Debian + Proxmox VE を自動インストールする(8フェーズを順次実行)。
/os-setup config/server4.yml
自然言語での指示例:
- 「4号機に OS をインストールして」
- 「5号機の OS セットアップを Phase 5 から再開して」
- 「4号機のインストール状態を確認して」
7-9号機 (DELL R320) の iDRAC7 経由での操作。
| コマンド | 用途 |
|---|---|
/idrac7 status |
iDRAC7 基本ステータス確認 |
/idrac7-fw-update |
iDRAC7 ファームウェアアップデート |
/dell-fw-download |
Dell FW バイナリのダウンロード・抽出 |
自然言語での指示例:
- 「7号機の iDRAC ステータスを確認して」
- 「iDRAC7 のファームウェアをアップデートして」
- 「Dell のファームウェアをダウンロードして」
Mellanox SX6036 スイッチの状態確認・設定変更を行う。
| コマンド | 用途 |
|---|---|
/ib-switch status |
バージョン・温度・ファン・ポート状態の一括表示 |
/ib-switch ports |
36 ポートの IB 接続状態を表示 |
/ib-switch show <cmd> |
任意の show コマンドを実行 (例: show interfaces brief) |
/ib-switch enable-cmd <cmd> |
enable モードでコマンド実行 (例: show running-config) |
/ib-switch configure <file> |
ファイルから設定を投入 |
自然言語での指示例:
- 「IB スイッチのポート状態を見せて」
- 「IB スイッチの running-config を確認して」
- 「IB スイッチの Subnet Manager の状態を確認して」
LINSTOR ストレージ上に VM を作成し、fio ベンチマーク(7テスト)を実行する。
/linstor-bench thin
/linstor-bench thick-stripe
自然言語での指示例:
- 「thin プロビジョニングでストレージベンチマークを実行して」
- 「thick-stripe と thin の性能を比較したい」
- 「前回のベンチマーク結果をレポートにまとめて」
ノード障害シミュレーション・復旧・離脱・再参加の実験を行う。
| コマンド | 用途 |
|---|---|
/linstor-node-ops fail server4 |
4号機を強制電源断して障害をシミュレート |
/linstor-node-ops recover server4 |
電源投入 + DRBD ビットマップ再同期 |
/linstor-node-ops depart server4 |
クラスタから正常離脱 (リソース・SP・ノード削除) |
/linstor-node-ops rejoin server4 |
離脱ノードをクラスタに再参加 |
自然言語での指示例:
- 「4号機を落として障害時の挙動を確認して」
- 「4号機を復旧して DRBD の再同期を待って」
- 「5号機をクラスタから離脱させて」
VM のリージョン内ライブマイグレーション、リージョン間コールドマイグレーション、リージョンの追加・廃止を行う。
| コマンド | 用途 |
|---|---|
/linstor-migration live-migrate vm200 server5 |
VM をリージョン内の別ノードへライブマイグレーション |
/linstor-migration cold-migrate vm200 region-b |
VM をリージョン間でコールドマイグレーション |
/linstor-migration decommission-region region-a |
リージョンの全 VM を退避して廃止 |
/linstor-migration add-region region-a |
リージョンを再構築して追加 |
自然言語での指示例:
- 「vm200 を 5号機にライブマイグレーションして」
- 「vm200 を region-b にコールドマイグレーションして」
- 「region-a を廃止して全 VM を退避して」
./issue.sh list # 未完了課題の一覧
./issue.sh show <id> # 課題の詳細表示自然言語での指示例:
- 「未完了の課題を一覧して」
- 「課題 #18 の状態を確認して」
- 「"BMC セッションタイムアウト対策" で課題を作成して」
- 「4号機の電源状態を確認して」
- 「PVE クラスタの状態を確認して」
- 「ロックが取れないので別の課題に着手して」
未定