# OS 初始化腳本

本頁說明支援的作業系統版本、映像來源，以及新 VM 在初始化階段執行的 `sh/<os>_<version>.sh`。

## 支援版本與映像

| `os` | `version` | 映像來源 | 支援至（`sh/pdvm_os.json`） |
|---|---|---|---|
| `debian` | `11` | `cloud.debian.org` `bullseye` generic amd64 | June 2026 |
| | `12` | `cloud.debian.org` `bookworm` generic amd64 | June 2028 |
| | `13` | `cloud.debian.org` `trixie` generic amd64 | June 2030 |
| `ubuntu` | `20.04` | `mirror.twds.com.tw` ubuntu-cloud-images server cloudimg amd64 | April 2030 |
| | `22.04` | 同上 | April 2032 |
| | `24.04` | 同上 | April 2036 |
| `rockylinux` | `8` | `dl.rockylinux.org` GenericCloud-Base latest x86_64 | May 2029 |
| | `9` | 同上 | May 2032 |
| | `10` | 同上 | May 2035 |

其他組合在 `getting OS image` 步驟以 `unsupported ... version` 失敗。

## 執行方式

VM 第一次可 SSH 登入後，主節點以 Cloud-Init 使用者身分登入 VM 並執行：

```bash
curl -fsSL http://<NODE_{MAIN_NODE}>:<PORT>/sh/<os>_<version>.sh | sudo bash -s <VM_ROOT_PASSWORD>
```

`VM_ROOT_PASSWORD` 為空時不帶參數，腳本改用內建值 `0123456789`。腳本輸出逐行轉成 SSE 事件，任一指令失敗（`set -e`）即視為 SSH 初始化失敗並清除 VM。

## 腳本內容

| 動作 | Debian | Ubuntu | Rocky Linux |
|---|---|---|---|
| 設定 root 密碼 | ✓ | ✓ | ✓ |
| 停用 `passwd`／`chpasswd` 並鎖定密碼期限 | ✓ | ✓ | ✓ |
| 切換套件來源 | `ftp.tw.debian.org` | `tw.archive.ubuntu.com` | 啟用 EPEL |
| 升級系統、安裝常用工具與 `qemu-guest-agent` | ✓ | ✓ | ✓ |
| 語系 `en_US.UTF-8` | ✓ | ✓ | — |
| 時區 `Asia/Taipei` | ✓ | ✓ | ✓ |
| sysctl：忽略 ICMP echo、提高 inotify 上限 | ✓ | ✓ | ✓ |
| 建立 2G `/swapfile` | ✓ | ✓ | ✓ |
| 安裝登入資訊腳本 `sysinfo` | ✓ | ✓ | ✓ |
| 清除套件快取、`/tmp` 與日誌 | ✓ | ✓ | ✓ |

腳本完成後服務會重開 VM 以套用 GRUB 與核心參數。

## 客製化

直接修改 `sh/` 下對應檔案即可，服務每次都以靜態檔案即時提供，不需重啟。新增版本則需同時修改 `internal/service/osImage.go` 的支援清單與映像網址。
