# VMID 與 IP 配置

本頁說明安裝時未指定 `id` 的情況下，go-pve-qemu 如何挑出一個可用的 VMID，並以它決定 VM 的 IP。

## VMID 與 IP 的對應

```text
GATEWAY = 192.168.0.1
VMID    = 120
IP      = 192.168.0.120/24   (GATEWAY 前三段 + VMID)
```

因為 IP 末段就是 VMID，VMID 只能落在 `100`–`254`：低於 100 是 Proxmox 保留範圍，高於 254 不是合法的主機位址。

## 探測區間

| 變數 | 預設 | 修正規則 |
|---|---|---|
| `ASSIGN_IP_START` | `100` | `0` 或 < 100 → 100 |
| `ASSIGN_IP_END` | `254` | `0` 或 > 254 → 254 |

起訖顛倒時自動交換。

## 雙端並行探測

每一輪同時為 `start` 與 `end` 各開一個 goroutine，接著 `start++`、`end--`，直到兩端相遇。同時執行的探測以容量 10 的信號量（semaphore）限制。

每個候選 VMID 依序檢查，任一項命中即放棄：

| 順序 | 檢查 | 命中代表 |
|---|---|---|
| 1 | `/etc/pve/nodes/*/qemu-server/<vmid>.conf` 存在 | 任一節點已有此 VMID |
| 2 | `qm config <vmid>` 成功 | Proxmox 認得此 VMID |
| 3 | `192.168.0.<vmid>:22` 在 2 秒內可連線 | 該 IP 已有主機在用 |

第一個通過三項檢查的 VMID 會送進結果 channel，同時取消其他尚未完成的探測。

## 結果與限制

| 情況 | 結果 |
|---|---|
| 找到可用 VMID | 回傳並作為 VMID 與 IP 末段 |
| 全部被占用 | `cannot find available IP` |
| 10 秒內沒有結果 | `timeout: no available IP found` |

- 因為兩端同時探測，結果不保證是區間內最小的可用編號
- 第 3 項檢查的 IP 前綴在目前程式碼中固定為 `192.168.0.`，不跟隨 `GATEWAY`；網段不同時，此項會探測到錯誤主機
- 請求指定 `id` 時完全不經過這些檢查
