# 多節點調度

本頁說明 go-pve-qemu 如何判斷 VM 所在節點，並決定在本機或經 SSH 執行 `qm`。

## 找出 VM 所在節點

服務掃描 `/etc/pve/nodes/*/qemu-server/*.conf`（Proxmox 叢集檔案系統，所有節點同步），由路徑取得 `節點 → VMID` 對應：

```text
/etc/pve/nodes/pve2/qemu-server/120.conf  →  VMID 120 在 pve2
```

## 執行位置

| 條件 | 執行方式 |
|---|---|
| VM 所在節點 = `MAIN_NODE` | 本機執行 `qm <args>` |
| 其他節點，且有對應 `NODE_<node>` | `ssh root@<NODE_node> qm <args>` |
| `MAIN_NODE` 未設定，或找不到 `NODE_<node>` | 以空主機執行 SSH，指令失敗 |

SSH 固定帶下列選項，避免互動提示阻塞 API：

```text
-o ConnectTimeout=10
-o StrictHostKeyChecking=no
-o UserKnownHostsFile=/dev/null
-o BatchMode=yes
```

## 使用此機制的操作

| 操作 | `qm` 子指令 |
|---|---|
| start | `qm start` |
| stop | `qm stop` |
| shutdown | `qm shutdown` |
| reboot | `qm reboot` |
| destroy | `qm destroy` |
| set/cpu | `qm set --cores` |
| set/memory | `qm set --memory [--numa --balloon]` |
| set/disk | `qm disk resize scsi0 +<size>` |
| set/node | `qm migrate <vmid> <node> --with-local-disks` |

## 例外

- **安裝**：`qm create`、`importdisk`、`qm set` 一律在主節點本機執行；指定 `node` 時建立完成後才遷移，開機與重開才走上述調度
- **`GET /vm/:id/status`**：只在主節點本機執行 `qm status`，查詢其他節點上的 VM 會失敗
- **VM 清單**：透過 `pvesh get /cluster/resources` 取得全叢集資料，不需調度

## 遷移

`POST /api/vm/:id/set/node` 要求 VM 為停止狀態，以 `--with-local-disks` 一併搬移本地磁碟，`qm migrate` 的輸出逐行以 SSE 回傳。
