一键导入
linstor-node-ops
LINSTOR/DRBD ノードの離脱・復帰操作。障害シミュレーション、回復、正常離脱、再参加を行う。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
LINSTOR/DRBD ノードの離脱・復帰操作。障害シミュレーション、回復、正常離脱、再参加を行う。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
別の 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 コマンドを実行し、サーバ管理を行う。
基于 SOC 职业分类
| name | linstor-node-ops |
| description | LINSTOR/DRBD ノードの離脱・復帰操作。障害シミュレーション、回復、正常離脱、再参加を行う。 |
| argument-hint | <subcommand: fail|recover|depart|rejoin> <node: server4|server5|server6|server7|server8|server9> |
LINSTOR/DRBD クラスタのノード離脱・復帰操作を行う。
| サブコマンド | 用途 |
|---|---|
fail <node> | IPMI/iDRAC 電源断で障害シミュレーション |
recover <node> | 障害ノードの電源オン + DRBD resync 待機 |
depart <node> | LINSTOR から正常離脱 (リソース削除 → SP削除 → ノード削除) |
rejoin <node> | 離脱済みノードのクラスタ再参加 |
<node> は server4, server5, server6, server7 のいずれか。設定値は config/linstor.yml と各サーバの config/server<N>.yml から読み取る。
| ノード | BMC タイプ | 電源操作 |
|---|---|---|
| server4, server5, server6 | Supermicro IPMI | ipmitool -I lanplus -H $BMC_IP -U claude -P Claude123 chassis power ... |
| server7, server8, server9 | iDRAC7 | ipmitool -I lanplus -H $BMC_IP -U claude -P Claude123 chassis power ... (IPMI over LAN) |
YQ="${PROJECT_DIR}/bin/yq"
CONFIG="config/linstor.yml"
# コントローラ情報
CONTROLLER_NODE=$("$YQ" '.controller_node' "$CONFIG")
CONTROLLER_IP=$("$YQ" '.controller_ip' "$CONFIG")
# ノード番号からサーバ設定ファイルを特定
# server4 → config/server4.yml, server7 → config/server7.yml
SERVER_CONFIG="config/server${NODE_NUM}.yml"
TARGET_NODE=$("$YQ" '.hostname' "$SERVER_CONFIG")
TARGET_IP=$("$YQ" '.static_ip' "$SERVER_CONFIG")
TARGET_BMC=$("$YQ" '.bmc_ip' "$SERVER_CONFIG")
BMC_USER=$("$YQ" '.bmc_user' "$SERVER_CONFIG")
BMC_PASS=$("$YQ" '.bmc_pass' "$SERVER_CONFIG")
TARGET_IB_IP=$("$YQ" ".nodes[] | select(.name == \"$TARGET_NODE\") | .ib_ip" "$CONFIG")
VG_NAME=$("$YQ" '.vg_name' "$CONFIG")
RG_NAME=$("$YQ" '.resource_group' "$CONFIG")
PLACE_COUNT=$("$YQ" '.place_count' "$CONFIG")
全ノードの BMC IP は各サーバの設定ファイルから取得する:
BMC_IP=$(./bin/yq '.bmc_ip' config/server5.yml) # → 10.10.10.25
BMC_IP=$(./bin/yq '.bmc_ip' config/server7.yml) # → 10.10.10.27 (iDRAC)
BMC_IP=$(./bin/yq '.bmc_ip' config/server8.yml) # → 10.10.10.28 (iDRAC)
BMC_IP=$(./bin/yq '.bmc_ip' config/server9.yml) # → 10.10.10.29 (iDRAC)
| ID | 失敗 | サブコマンド | 検出方法 | 対策 |
|---|---|---|---|---|
| N1 | Auto-eviction がリソースを自動退去 (~60分) | fail | linstor node list に "Auto-eviction at ..." | 電源断直後に無効化 |
| N2 | place-count 変更忘れで depart 失敗 | depart | リソース削除時に LINSTOR エラー | depart 開始前に --place-count 1 に変更 |
| N3 | リソース削除順序違反 | depart | ストレージプールやノードの削除でエラー | リソース → SP → ノード の順で削除 |
| N4 | DRBD bitmap resync ポーリング見逃し | recover | 接続直後は Inconsistent だが数秒〜数十秒で完了 | 30秒間隔ポーリングで UpToDate を確認 |
| N5 | stale DRBD メタデータ残存 | rejoin | /etc/drbd.d/linstor-resources.res が残る | LINSTOR が自動管理するため手動削除不要 |
| N6 | minIoSize 不一致で rejoin 失敗 | rejoin | incompatible minimum I/O size エラー | VG 作成時に 512B PV を先頭に配置 |
| N7 | IPoIB インターフェースがリブート後に DOWN 状態 | recover | ip link show <ib_iface> で DOWN | 手動で ip link set up + ip addr add |
| N8 | SSH ホスト鍵がノードリブート後に変化 | recover | REMOTE HOST IDENTIFICATION HAS CHANGED | ssh-keygen -R <target_ip> -f ssh/known_hosts + StrictHostKeyChecking=no |
| N9 | DRBD 9 status に /proc/drbd (DRBD 8形式) を使用 | recover | 空出力またはタイムアウト | drbdsetup status または drbdadm status を使用 |
| N10 | node remove/re-add 後に cross-region パスが stale | rejoin | Network interface 'default' does not exist | パスを delete + recreate (詳細は linstor-migration スキル C3) |
LINSTOR はノードオフライン検出後、デフォルト約60分で Auto-eviction を発動する。 障害シミュレーション中に発動すると、リソースが意図せず退去される。
# 電源断直後に無効化
ssh root@$CONTROLLER_IP "linstor node set-property $TARGET_NODE DrbdOptions/AutoEvictAllowEviction false"
正常離脱前に place-count を 1 に下げないと、LINSTOR がレプリカ維持を要求してリソース削除が拒否される。
# depart 開始前に必須
ssh root@$CONTROLLER_IP "linstor resource-group modify $RG_NAME --place-count 1"
削除は必ず「リソース → ストレージプール → ノード」の順。逆順だと依存関係エラーになる。
障害回復後の DRBD resync はビットマップベースで高速 (障害中の変更ブロックのみ)。
接続直後は peer-disk:Inconsistent だが、通常15秒程度で UpToDate になる。
30秒ポーリング間隔で取りこぼさないよう注意。
LINSTOR は VG の最初の PV の physical block size を StorDriver/internal/minIoSize として使用する。
ノード間で minIoSize が異なると、DRBD リソース作成時に incompatible minimum I/O size エラーが発生する。
原因: 512e (512B) と 4Kn (4096B) のディスクが混在する環境で、VG 先頭の PV の block size がノード間で異なる。
確認手順:
# 各ディスクの physical block size を確認
ssh root@$TARGET_IP "blockdev --getpbsz /dev/sd{a,b,c,d}"
# LINSTOR の minIoSize を確認
ssh root@$CONTROLLER_IP "linstor storage-pool list-properties $TARGET_NODE striped-pool" | grep minIoSize
回避策 1 (主): VG 作成時に 512B block size のディスクを先頭に配置する。
# 512B のディスクを特定 (例: sdb=512B)
ssh root@$TARGET_IP "blockdev --getpbsz /dev/sdb" # → 512
# 512B ディスクを先頭にして VG を作成
ssh root@$TARGET_IP "vgcreate linstor_vg /dev/sdb /dev/sda /dev/sdc /dev/sdd"
512B を先頭に置く理由: minIoSize=512 は他ノードの minIoSize=512 と一致する。 4096B を先頭に置くと minIoSize=4096 になり、minIoSize=512 のノードとの互換性が失われる。
回避策 2 (セーフティネット): Linstor/Drbd/auto-block-size 512 を resource-group に設定する (LINSTOR >= 1.33.0)。
linstor resource-group set-property $RG_NAME Linstor/Drbd/auto-block-size 512
効果:
disk { block-size 512; } が追加され、underlying device の physical block size を上書きresource create で minIoSize 不一致でもリソース作成可能--place-count 変更) は minIoSize 不一致ノードを除外するため、手動 resource create が必要現環境では pve-rg に auto-block-size=512 を常時設定済み。
IPoIB は永続設定がない場合、リブート後に DOWN のまま(ib_ipoib モジュール未ロード)。
ib-setup-remote.sh --persist で設定と永続化を一括実行する:
# スクリプトを転送して実行 (connected mode, MTU 65520 推奨)
scp -F ssh/config scripts/ib-setup-remote.sh pve$N:/tmp/ib-setup-remote.sh
ssh -F ssh/config pve$N "sh /tmp/ib-setup-remote.sh --ip $TARGET_IB_IP/24 --mode connected --mtu 65520 --persist"
IB IP は config/linstor.yml の ib_ip を参照:
注: 初回
modprobe ib_ipoib時に udev リネームのタイミングでib0として検出されることがある。失敗した場合は再実行すればibp*名で検出される。
永続設定は /etc/network/interfaces.d/ib0 に書き込まれる:
auto ibp10s0
iface ibp10s0 inet static
address <IB_IP>/24
mtu 65520
pre-up modprobe ib_ipoib
pre-up echo connected > /sys/class/net/ibp10s0/mode || true
PVE ノードのリブートでは通常ホスト鍵は変わらない。 ただし OS 再インストールや初回接続時はホスト鍵が変わるため:
ssh-keygen -R $TARGET_IP -f ssh/known_hosts
ssh -o StrictHostKeyChecking=no root@$TARGET_IP hostname
DRBD 9 では /proc/drbd は空または形式が異なる。以下を使用:
# 全リソースのステータス
ssh root@$CONTROLLER_IP "drbdsetup status --verbose"
# 特定リソース
ssh root@$CONTROLLER_IP "drbdsetup status <resource> --verbose"
# drbdadm status も可 (ANSI カラーコード付き)
# ANSI カラーを除去する場合は TERM=dumb を設定
IPMI 電源断で対象ノードの障害をシミュレーションする。
pve-lock: 必須
事前状態を記録:
ssh root@$CONTROLLER_IP "drbdadm status"
ssh root@$CONTROLLER_IP "linstor node list"
ssh root@$CONTROLLER_IP "linstor resource list"
IPMI 電源オフ:
./pve-lock.sh run ./oplog.sh ipmitool -I lanplus -H $TARGET_BMC -U claude -P Claude123 chassis power off
30秒待機後、確認:
ssh root@$CONTROLLER_IP "drbdadm status" # connection:Connecting
ssh root@$CONTROLLER_IP "qm status $VM_ID" # running (VM が残存ノード上の場合)
ssh root@$CONTROLLER_IP "pvesm status" # active
ssh root@$CONTROLLER_IP "linstor node list" # TARGET_NODE: OFFLINE
Auto-eviction キャンセル (★ N1 対策):
ssh root@$CONTROLLER_IP "linstor node set-property $TARGET_NODE DrbdOptions/AutoEvictAllowEviction false"
データ整合性検証 (VM 内、10.x 管理用 IP に直接 SSH):
VM_MGMT_IP=$("$YQ" '.benchmark.vm_mgmt_ip' "$CONFIG")
ssh ${VM_USER}@${VM_MGMT_IP} 'md5sum -c checksums.txt'
障害ノードの電源をオンにし、DRBD resync 完了を待機する。
pve-lock: 必須 (電源オン操作)
IPMI 電源オン:
./pve-lock.sh run ./oplog.sh ipmitool -I lanplus -H $TARGET_BMC -U claude -P Claude123 chassis power on
SSH 復帰待機 (★ N8: ホスト鍵クリア + 30秒間隔ポーリング、最大5分):
ssh-keygen -R $TARGET_IP -f ssh/known_hosts
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@$TARGET_IP hostname
DRBD resync 待機 (★ N9: drbdsetup を使用、30秒間隔ポーリング):
ssh root@$CONTROLLER_IP "drbdsetup status --verbose"
# peer-disk:Inconsistent → peer-disk:UpToDate を待機
IPoIB 復旧確認 (★ N7: 全ノード IB 搭載):
# IB インターフェースが UP か確認
ssh root@$TARGET_IP "ip link show type ipoib"
# DOWN の場合は手動起動 (インターフェース名はリージョンにより異なる)
# Region A: ibp134s0, Region B: ibp10s0
ssh root@$TARGET_IP "ip link set $IB_IFACE up"
ssh root@$TARGET_IP "ip addr add $TARGET_IB_IP/24 dev $IB_IFACE"
完了確認:
ssh root@$CONTROLLER_IP "drbdsetup status --verbose" # UpToDate/UpToDate
ssh root@$CONTROLLER_IP "linstor node list" # 両ノード Online
ssh root@$CONTROLLER_IP "linstor resource list" # 両ノードにリソースあり
| イベント | 経過時間 |
|---|---|
| 電源オン | 0分 |
| SSH 復帰 | ~2分21秒 |
| DRBD 再接続 | ~2分37秒 |
| Bitmap resync 完了 | ~2分52秒 |
ビットマップ resync は障害中の変更ブロックのみを同期するため、フル同期 (~96 MiB/s) と比べて大幅に高速。
対象ノードを LINSTOR クラスタから正常に離脱させる。VM はダウンタイムなしで残存ノード上で稼働を継続する。
pve-lock: 必須
place-count を 1 に変更 (★ N2 対策):
./pve-lock.sh run ./oplog.sh ssh root@$CONTROLLER_IP "linstor resource-group modify $RG_NAME --place-count 1"
対象ノードのリソースを全て削除 (★ N3 対策: リソースから先に削除):
# リソース一覧取得
ssh root@$CONTROLLER_IP "linstor -m resource list"
# 各リソースを削除
./pve-lock.sh run ./oplog.sh ssh root@$CONTROLLER_IP "linstor resource delete $TARGET_NODE <resource-name>"
ストレージプール削除:
./pve-lock.sh run ./oplog.sh ssh root@$CONTROLLER_IP "linstor storage-pool delete $TARGET_NODE <pool-name>"
ノード削除:
./pve-lock.sh run ./oplog.sh ssh root@$CONTROLLER_IP "linstor node delete $TARGET_NODE"
確認:
ssh root@$CONTROLLER_IP "drbdadm status" # peer なし, disk:UpToDate
ssh root@$CONTROLLER_IP "linstor node list" # 残存ノードのみ
ssh root@$CONTROLLER_IP "linstor resource list" # 残存ノードのみ
ssh root@$CONTROLLER_IP "qm status $VM_ID" # running
以下のパラメータが全て設定されていること:
| パラメータ | 値 | 効果 |
|---|---|---|
quorum=off | DRBD | ノード数に関係なく Primary 昇格可能 |
auto-promote=yes | DRBD | I/O アクセス時に自動で Primary 昇格 |
two_node: 1 | PVE corosync | 1ノードでも quorate を維持 |
離脱済みノードを LINSTOR クラスタに再参加させる。DRBD フル同期が発生する。
pve-lock: 必須
linstor node delete で離脱済みであることlinstor_zpool) が存在することZFS プール状態確認:
ssh root@$TARGET_IP "zpool status linstor_zpool"
ssh root@$TARGET_IP "zpool list linstor_zpool"
ZFS プールが存在しない場合は作成:
# Region A (4-6号機): raidz1, /dev/sda-sdd
ssh root@$TARGET_IP "zpool create -f linstor_zpool raidz1 /dev/sda /dev/sdb /dev/sdc /dev/sdd"
# Region B (7-9号機): /dev/sdb-sde (sda は OS ディスク)
ssh root@$TARGET_IP "zpool create -f linstor_zpool /dev/sdb /dev/sdc /dev/sdd /dev/sde"
コントローラノードの minIoSize と一致していることを確認:
```sh
ssh root@$CONTROLLER_IP "linstor storage-pool list-properties $CONTROLLER_NODE zfs-pool"
注: ZFS 環境では
auto-block-size=512が resource-group に設定済みのため、minIoSize 不一致は自動解消される。
LINSTOR ノード登録:
./pve-lock.sh run ./oplog.sh ssh root@$CONTROLLER_IP "linstor node create $TARGET_NODE $TARGET_IP --node-type Satellite"
IB インターフェース + PrefNic 設定:
# IB_IFACE は OS のデバイス名を使う (`ip link show type ipoib` で確認)
# Region A (4+5+6号機): ibp134s0, Region B (7+8+9号機): ibp10s0
./pve-lock.sh run ./oplog.sh ssh root@$CONTROLLER_IP "linstor node interface create $TARGET_NODE $IB_IFACE $TARGET_IB_IP"
./pve-lock.sh run ./oplog.sh ssh root@$CONTROLLER_IP "linstor node set-property $TARGET_NODE PrefNic $IB_IFACE"
ZFS ストレージプール作成:
./pve-lock.sh run ./oplog.sh ssh root@$CONTROLLER_IP "linstor storage-pool create zfs $TARGET_NODE zfs-pool linstor_zpool"
Auto-eviction 無効化 (★ N1 対策):
ssh root@$CONTROLLER_IP "linstor node set-property $CONTROLLER_NODE DrbdOptions/AutoEvictAllowEviction false"
ssh root@$CONTROLLER_IP "linstor node set-property $TARGET_NODE DrbdOptions/AutoEvictAllowEviction false"
place-count 復元 → リソース配置 (→ DRBD フル同期トリガー):
./pve-lock.sh run ./oplog.sh ssh root@$CONTROLLER_IP "linstor resource-group modify $RG_NAME --place-count $PLACE_COUNT"
auto-place が「Not enough available nodes」で失敗した場合 (★ N6 minIoSize 不一致時):
手動でリソースを個別に作成する (auto-block-size=512 が RG に設定済みであること):
# リソース一覧を取得して各リソースを手動配置
ssh root@$CONTROLLER_IP "linstor -m resource list"
./pve-lock.sh run ./oplog.sh ssh root@$CONTROLLER_IP "linstor resource create $TARGET_NODE <resource-name>"
DRBD フル同期待機 (60秒ポーリング):
# ~99分 (550 GiB, ~94 MiB/s)
ssh root@$CONTROLLER_IP "drbdadm status"
# peer-disk:Inconsistent → peer-disk:UpToDate を待機
cross-region パスの再作成 (マルチリージョン構成の場合のみ):
node delete → node create でノード UUID が変わるため、既存の cross-region パスが stale になる。
Network interface 'default' of node 'X' does not exist! エラーが出た場合はパスを再作成する:
# 対向リージョンの各ノードとのパスを delete + recreate
ssh root@$CONTROLLER_IP "linstor node-connection path delete $TARGET_NODE $REMOTE_NODE cross-region"
ssh root@$CONTROLLER_IP "linstor node-connection path create $TARGET_NODE $REMOTE_NODE cross-region default default"
# Protocol A 再適用
./scripts/linstor-multiregion-setup.sh setup config/linstor.yml
詳細は linstor-migration スキル (C3: stale パス) を参照。
完了確認:
ssh root@$CONTROLLER_IP "drbdadm status" # UpToDate/UpToDate
ssh root@$CONTROLLER_IP "linstor node list" # 両ノード Online
ssh root@$CONTROLLER_IP "linstor resource list" # 両ノードにリソースあり
ZFS raidz1 (現環境):
| 操作 | 所要時間 | 備考 |
|---|---|---|
| depart (リソース+SP+ノード削除) | ~10-19秒 | リソース有無で変動 |
| rejoin (ノード登録〜SP作成) | ~2-3分 | satellite 接続待ち含む |
| DRBD フル同期 (小データ) | ~30-54秒 | VM 1台分 |
| cross-region パス作成 | ~30秒 | 3本/ノード |
| multiregion setup | ~10秒 | Protocol A 設定 |
| 合計 (depart→rejoin完了) | ~3-5分 | 小データ時 |
旧 LVM striped (参考):
| データ量 | 所要時間 | レート |
|---|---|---|
| ~550 GiB | ~99分 | ~94 MiB/s |
linstor node delete 後も /etc/drbd.d/linstor-resources.res が残るが、内容は include "/var/lib/linstor.d/*.res"; のみ。LINSTOR が satellite 起動時に自動管理するため、手動削除は不要。
状態変更操作は ./oplog.sh で記録する:
読み取り専用操作 (drbdadm status, linstor node list, linstor resource list) は oplog 不要。
全サブコマンドで状態変更操作に ./pve-lock.sh を使用する:
./pve-lock.sh run <command...> # 即座に実行(ロック中ならエラー)
./pve-lock.sh wait <command...> # ロック待ち→実行
ロック中の場合は別の課題に着手し、ロック解放後に再開する。