[Account] user / 建立 user 的正確流程應為何?
===
###### tags: `Slurm / Account`
###### tags: `Slurm`, `HPC`, `Linux`, `Slinky`, `SlinkyProject`, `Account`, `User`, `Association`, `Partition`, `QOS`
<br>
[TOC]
<br>
## 🎯 標準教學範例
> 本教學範例示範如何**正確建立 Slurm 使用者**。整體原則是:
> 1. **先建立作業系統(OS)帳號**
> 2. **再建立 Slurm 帳務(Accounts / Users / Associations)**
> 3. **驗證**
> 4. **送出最小測試作業**
---
### ✅ 目標
為新成員建立:
* 同步一致的 **OS 帳號**(所有可執行作業的節點都能辨識同一個 UID / GID)
* 對應的 **Slurm 帳務**(Account / User / Partition / QOS 等關聯)
* 完成驗證與最小作業測試
---
### 🧰 事前約定(請自行替換)
為了教學清晰,先定義一組教學變數(你可以直接複製,或改成你的實際名稱):
```bash
# === 你可以在 shell 先 export 這些變數,後面指令直接貼上使用 ===
export CLUSTER="slurm1" # Slurm 叢集名稱
export ACCOUNT="cloud-team" # Slurm 帳務 Account 名稱
export ORG="cloud-org" # Account 所屬組織(備註用,可自訂)
export GROUP="$ACCOUNT" # 建議 Linux 群組同名,便於管理
export USERNAME="alice" # 新使用者帳號
export UID_NUM="20001" # 固定 UID,確保各節點一致
export GID_NUM="20001" # 固定 GID(可用同一值或依實際規劃)
export SHELL="/bin/bash"
export HOME_DIR="/home/$USERNAME"
export PARTITIONS=("debug" "tn") # 允許使用的 partition 清單
export QOS_NAME="normal" # 允許的 QOS (Quality of Service)
```
---
### ① 建立 **作業系統** 帳號(先做這步,最重要)
> Slurm 最終會以使用者的 **UID/GID** 執行作業;若計算節點找不到該 UID,作業派發會失敗。
在所有需要「提交/執行」的環境(login 節點與所有 compute 節點)確保能辨識到相同的 UID/GID。常見做法:
* **集中式**:LDAP/SSSD(建議)
* **本地同步**:在每個節點建立相同的帳號與群組
* **家目錄**:用 NFS 或共享儲存,確保同一路徑(例如 `/home/alice`)
範例(Debian/Ubuntu 類):
(已存在就跳過對應指令)
```bash
# 1) 新增群組(同名方便對應 Slurm Account)
sudo groupadd -g "$GID_NUM" "$GROUP"
# 2) 新增使用者(固定 UID/GID;建立家目錄)
sudo useradd -m -u "$UID_NUM" -g "$GROUP" -s "$SHELL" -d "$HOME_DIR" "$USERNAME"
sudo passwd "$USERNAME"
# 3) 驗證(在每台需要的節點都要能通過)
getent passwd "$USERNAME"
id "$USERNAME"
ls -ld "$HOME_DIR"
```
- **執行結果**
```
$ getent passwd "$USERNAME"
alice:x:20001:20001::/home/alice:/bin/bash
$ id "$USERNAME"
uid=20001(alice) gid=20001(cloud-team) groups=20001(cloud-team)
$ ls -ld "$HOME_DIR"
drwxr-x--- 2 alice cloud-team 4096 Aug 28 09:13 /home/alice
```
> **Tips**:
> - 若用 LDAP/SSSD,請在目錄服務中建立相同的使用者與群組;
> - 節點端僅需驗證 `getent passwd USERNAME` 能解析成功。
<br>
---
### ② 建立 **Slurm 帳務** 與使用者關聯
> 這一步才是 `sacctmgr`,但請務必在 OS 帳號準備妥當後再做。
```bash
# 2-1) 建立/確認 Account
sacctmgr show account name="$ACCOUNT"
# 若沒有,建立一個 Account(Organization 可自訂備註)
sacctmgr create account name="$ACCOUNT" Organization="$ORG" cluster="$CLUSTER"
# 確認 Account
sacctmgr show account name="$ACCOUNT"
# 2-2) 建立 User,指定預設帳戶與叢集
sacctmgr create user name="$USERNAME" DefaultAccount="$ACCOUNT" Cluster="$CLUSTER"
# 確認 User
sacctmgr show user name="$USERNAME"
# 2-3) 加上允許使用的 partition 關聯(可多個;逐一新增)
for p in "${PARTITIONS[@]}"; do
sacctmgr add user name="$USERNAME" account="$ACCOUNT" cluster="$CLUSTER" partition="$p"
done
# 2-4) 指定/開放 QOS(以下將 QOS 設為單一 normal;若要附加可用 `qos+=`)
sacctmgr modify user name="$USERNAME" set qos="$QOS_NAME"
# 2-5) (選用)資源上限/配額範例
sacctmgr modify user name="$USERNAME" set MaxJobs=10
sacctmgr modify user name="$USERNAME" set MaxSubmitJobs=50
sacctmgr modify user name="$USERNAME" set MaxTRESPerJob=cpu=32,mem=64G
```
- **2-1) account 執行結果**
```
# 簡單的 account 資訊
$ sacctmgr show account name="$ACCOUNT"
Account Descr Org
---------- -------------------- --------------------
cloud-team cloud-team cloud-org
```
```
# 更詳細的 account 資訊
$ sacctmgr show account name="$ACCOUNT" withassoc
$ sacctmgr show account name="$ACCOUNT" withassoc \
format=account,Descr,Org,Cluster,ParentName,User,QOS
Account Descr Org Cluster ParentName User QOS
---------- -------------------- -------------------- ---------- ---------- ---------- --------------------
cloud-team cloud-team cloud-org slurm1 root normal
cloud-team cloud-team cloud-org slurm1 alice normal
```
- **2-2) user 執行結果**
```
# 簡單的 user 資訊
$ sacctmgr show user name="$USERNAME"
User Def Acct Admin
---------- ---------- ---------
alice cloud-team None
```
```
# 更詳細的 account 資訊
$ sacctmgr show user name="$USERNAME" withassoc
$ sacctmgr show user name="$USERNAME" withassoc \
format=User,DefaultAccount,Admin,Cluster,Account,Partition,QOS
User Def Acct Admin Cluster Account Partition QOS
---------- ---------- --------- ---------- ---------- ---------- --------------------
alice cloud-team None slurm1 cloud-team normal
```
- **2-3) partition 關聯的執行結果**
```
$ sacctmgr show user name="$USERNAME" withassoc \
format=User,DefaultAccount,Admin,Cluster,Account,Partition,QOS
User Def Acct Admin Cluster Account Partition QOS
---------- ---------- --------- ---------- ---------- ---------- --------------------
alice cloud-team None slurm1 cloud-team normal
alice cloud-team None slurm1 cloud-team debug normal
alice cloud-team None slurm1 cloud-team tn normal
```
- **2-5) 「資源上限/配額」的執行結果**
```
$ sacctmgr show user name="$USERNAME" withassoc
User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS
---------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- ---------
alice cloud-team None slurm1 cloud-team 1 10 32 50 normal
alice cloud-team None slurm1 cloud-team debug 1 10 32 50 normal
alice cloud-team None slurm1 cloud-team tn 1 10 32 50 normal
```
<br>
---
### ③ 驗證關聯是否正確
```bash
# 簡潔檢視(含關聯)
sacctmgr list user name="$USERNAME" withassoc \
format=User,DefaultAccount,Cluster,Account,Partition,QOS,MaxJobs,MaxSubmit,MaxTRES
```
- **期待看到**:
* 使用者 `$USERNAME` 的 `DefaultAccount` = `$ACCOUNT`
* 有你剛加上的 partitions(例如 debug / tn)
* `QOS` 包含你設定的 `$QOS_NAME`
* 上限項目與預期相符
- **執行結果**
```
sacctmgr list user name="$USERNAME" withassoc \
format=User,DefaultAccount,Cluster,Account,Partition,QOS,MaxJobs,MaxSubmit,MaxTRES
User Def Acct Cluster Account Partition QOS MaxJobs MaxSubmit MaxTRES
---------- ---------- ---------- ---------- ---------- -------------------- ------- --------- -------------
alice cloud-team slurm1 cloud-team normal 10 50 cpu=32,mem=6+
alice cloud-team slurm1 cloud-team debug normal 10 50 cpu=32,mem=6+
alice cloud-team slurm1 cloud-team tn normal 10 50 cpu=32,mem=6+
```
<br>
---
### ④ 以該使用者送出最小測試作業
在 login 節點(或提交環境)切換成該使用者測試:
```bash
# 切換身份(或用該使用者直接登入)
sudo -iu "$USERNAME" # 或:su - "$USERNAME"
# 以 srun 做最小測試(請挑一個你剛允許的 partition)
# 注意:新環境,需重新導入環境變數
srun -A "$ACCOUNT" -p "${PARTITIONS[0]}" -N1 -n1 bash -lc 'whoami; id; hostname'
# 或用 sbatch(會產生 .out 檔)
sbatch -A "$ACCOUNT" -p "${PARTITIONS[0]}" -N1 -n1 --wrap='hostname && whoami && id'
```
- **指令說明**
- **`srun -A "$ACCOUNT" -p "${PARTITIONS[0]}" -N1 -n1 bash -lc 'whoami; id; hostname'`**
用 `srun` 開一個最小工作步驟,檢查你跑到哪台機器、用誰的身分
**參數說明**:
- **`-A "$ACCOUNT"` / `--account`**:
- 指定要用的 Slurm 帳號(Account)。
- 決定計費/權限,須與該分區有關聯。
- **`-p "${PARTITIONS[0]}"` / `--partition`**:
- 指定要投遞的分區(佇列)。
- `"${PARTITIONS[0]}"` 是 Bash 陣列 `PARTITIONS` 的第 0 個元素。
- **`-N1` / `--nodes=1`**:
- 要求 1 個節點(至少)。
- **`-n1` / `--ntasks=1`**:
- 總任務數 1(通常=1 個 MPI rank)。
- 若要多執行緒,再搭配 `-c <cpus-per-task>`。
- **`bash -lc '…'`**:
- 啟動 bash,`-l` 以 login shell 讀取環境設定,`-c` 執行引號內指令。
- `hostname`:顯示實際執行的節點名稱
- `whoami`:顯示使用者
- `id`:顯示 UID/GID 與群組
若執行後:
* `whoami` 顯示 `$USERNAME`
* `id` 顯示你的 UID/GID
* 能成功回傳 `hostname`
→ 即為成功。
> **Tips**:
> - [[HackMD] sbatch 指令除錯](/e3p9okKeRsmqZgvkZ33DWA)
> - 如何查看 sbatch 的執行結果?
> - 沒有看到 sbatch 的執行結果?
<br>
---
### 🩹 常見錯誤速查
| 症狀/訊息 | 可能原因 | 處理方式 |
| --------------------------------------------------------- | ------------------------------------- | ---------------------------------------------------------------------------- |
| `There is no uid for user 'xxx'`(或作業派發時出現 user not found) | 計算節點/執行環境無法解析該 OS 帳號(UID/GID 不存在或不一致) | **回到步驟 ①**:在所有需要的節點建立相同 UID/GID,或改用 LDAP/SSSD;確認 `getent passwd USERNAME` 可用 |
| `sbatch`/`srun` 找不到預設帳戶 | Slurm DefaultAccount 未設或設錯 | 重新執行 `sacctmgr create/modify user ... DefaultAccount=...` |
| 沒看到預期的 partition | 未建立對應的使用者關聯 | 重新執行 `sacctmgr add user name=... account=... cluster=... partition=...` |
| QOS 不生效/列表不對 | QOS 未掛到使用者 | `sacctmgr modify user name=... set qos=normal`(或 `qos+=normal` 以附加) |
| `.out` 檔不出現 | 作業快速失敗或輸出目錄權限問題 | 用 `scontrol show job <jobid>` 看 `Reason`;確認家目錄可寫,或在 `--wrap` 中指定絕對輸出路徑 |
---
### 🧼(可選)清理與重建
若先前建立關聯有誤,建議用「移除關聯 → 重新新增」方式修正(以下僅示意,請小心使用):
```bash
# 列出關聯後,再選擇性移除(務必先確認)
sacctmgr show assoc user="$USERNAME" cluster="$CLUSTER"
# 例如移除特定 partition 的關聯
sacctmgr delete user name="$USERNAME" account="$ACCOUNT" cluster="$CLUSTER" partition="${PARTITIONS[0]}"
# 需要時再 add 回去
sacctmgr add user name="$USERNAME" account="$ACCOUNT" cluster="$CLUSTER" partition="${PARTITIONS[0]}"
```
---
### 小結
1. **先 OS 帳號**(所有節點能看到相同 UID/GID,家目錄可用)
2. **再 Slurm 帳務**(Account / User / Partition / QOS / 配額)
3. **查驗 withassoc**
4. **最小作業測試**(`whoami; id; hostname`)
照此流程建立,之後新增新成員會穩定且可預期。若你提供目前環境的 partition 與 QOS 命名,我也可以幫你把上面腳本客製成「一鍵建立新使用者」的版本。
<br>
---
---
<br>
## Troubleshooting
### 設定好 account ,卻無法派送 job
- ### 常見原因
1. **`DeafultAccount` 和 partition 所設定的 `AllowAccounts` 沒有匹配**
- 透過 `sacctmgr list user withassoc` 可查詢 `DeafultAccount`
2. **因為 `DeafultAccount` 和 partition 所設定的 `AllowAccounts` 沒有匹配,且 `srun` or `sbatch` 又沒有添加 `-A` (`--acount`) 參數來指定特定 account**
- 透過 `srun -p debug --acount=<ACCOUNT> hostname` 可指定特定 account 來派送 job
- 即使 user 是 `root` 或 user 具有 Admin 屬性,`DeafultAccount` 和 partition 所設定的 `AllowAccounts` 沒有匹配的情況下,仍依舊無法派送 job
錯誤訊息:`srun: error: Unable to allocate resources: Invalid account or account/partition combination specified`
- ### 不明原因 (未能重製,待觀察)
- ### Case: 設定其他 account 作為 `DeafultAccount`
```bash=
# login node/pod
sacctmgr list account
sacctmgr list user
# 建立使用者 admin2
useradd admin2 -m -s /bin/bash
sacctmgr create user name=admin2 account=admin # 1st account, DefaultAccount=admin
sacctmgr create user name=admin2 account=tj-account # 2nd account
sacctmgr list user
# 變更 defaultaccount
sacctmgr modify user name=admin2 set defaultaccount=tj-account
sacctmgr list user withassoc
# 切換使用者:root -> admin2,執行 srun
su - admin2
srun -p debug hostname
```
<br>
---
### `error: couldn't chdir to `/home/admin': No such file or directory: going to /tmp instead`
- ### log
```
$ srun -p debug hostname
[2025-08-29T02:26:46.820] error: couldn't chdir to `/home/admin': No such file or directory: going to /tmp instead
[2025-08-29T02:26:46.824] error: couldn't chdir to `/home/admin': No such file or directory: going to /tmp instead
e900-0
```
- ### 問題根源
計算節點沒有 admin 帳號
- ### 解決方式
在計算節點上,新增 admin 帳號
```
useradd -m -s /bin/bash admin
```
- ### 完整解法
```bash
export ACCOUNT="cloud-team" # Slurm 帳務 Account 名稱
export GROUP="$ACCOUNT" # 建議 Linux 群組同名,便於管理
export USERNAME="admin" # 新使用者帳號
export UID_NUM="20000" # 固定 UID,確保各節點一致
export GID_NUM="20000" # 固定 GID(可用同一值或依實際規劃)
export SHELL="/bin/bash"
export HOME_DIR="/home/$USERNAME"
# 1) 新增群組(同名方便對應 Slurm Account)
sudo groupadd -g "$GID_NUM" "$GROUP"
# 2) 新增使用者(固定 UID/GID;建立家目錄)
sudo useradd -m -u "$UID_NUM" -g "$GROUP" -s "$SHELL" -d "$HOME_DIR" "$USERNAME"
sudo passwd "$USERNAME"
# 3) 驗證(在計算節點要能通過)
getent passwd "$USERNAME"
id "$USERNAME"
ls -ld "$HOME_DIR"
```
<br>
---
### `error: couldn't chdir to `/home/admin': Permission denied: going to /tmp instead`
- ### 快速理解
派送 job 時,會使用登入帳號的 uid (例如測試帳號 admin) ,然後派送到計算節點上執行,於是出現 uid 不一致,導致 Permission denied
- ### 現象(Symptoms)(log)
執行互動或批次工作時看到:
```
$ srun -p debug hostname
[2025-08-29T02:29:52.977] error: couldn't chdir to `/home/admin': Permission denied: going to /tmp instead
[2025-08-29T02:29:52.979] error: couldn't chdir to `/home/admin': Permission denied: going to /tmp instead
e900-0
```
> Slurm 在啟動工作時會嘗試 `chdir($HOME)`;若家目錄權限/擁有者不一致,就會退回 `/tmp`。
- ### 問題根源(Root Cause)
- **UID 不一致**:Login 節點與計算節點上,同名使用者(如 `admin`)的 **UID 不同**。
- **備註**:GID 可不同。GID 不同不影響執行
- 家目錄(通常是 NFS 或預先建立的本機目錄)在計算節點被視為「別的 UID 擁有」,因此 `chdir` 觸發 `Permission denied`。
- ### 問題觸發流程
> by gpt-5, reviewed by DeepWiki
- **提交 (submit)**:使用者在 **login 節點 (submit host)** 透過 `srun` 提交作業;Slurm 會把**提交當下的數字 UID/GID (numeric UID/GID)** 記錄到作業描述中(由 `slurmctld` 持有),**controller 不需要本機使用者條目**。
- **派送 (dispatch)**:`slurmctld` 排程到目標 **compute 節點** 後,該節點的 `slurmd` 產生 `slurmstepd` 來執行作業。
- **切換身分 (setuid)**:`slurmstepd` 依作業描述中的 **numeric UID** 執行 `setuid()`/`seteuid()`;此動作**不依賴 controller 的 `/etc/passwd`**,也**不一定需要**本機有相同的使用者名稱(重點是數字 UID)。


- **決定與進入工作目錄 (chdir)**:`slurmstepd` 嘗試 `chdir(step->cwd)`(`step->cwd` 來自提交端的工作目錄設定,預設為執行 `srun` 時的當前目錄,可透過 `--chdir` 選項修改)。
> 
> cite: https://deepwiki.com/search/-log-srun-p-debug-hostname-202_e856b1f9-1502-4ba7-84f6-c465a6dddf6f
- **權限判定 (permission check)**:檔案系統以 **numeric UID/GID** 判斷權限;若該 compute 節點上 `/home/<user>` 的實際擁有者 UID 與提交端記錄的 UID 不一致,核心回傳 **`EACCES`**。
- **回退 (fallback)**:Slurm 記錄
`error: couldn't chdir to '/home/<user>': Permission denied: going to /tmp instead`,並改以 **`/tmp`** 作為工作目錄繼續執行。

> 重點:**controller 不需有使用者帳號**;關鍵是 **submit host 與所有會執行作業的 compute 節點** 必須有一致的 **numeric UID**(GID 是否一致則視你的目錄權限設計而定)。
- ### 快速確認(Quick Checks)
在 **所有節點**(login、compute)比對以下內容:
```bash
# 1) 使用者與群組條目
getent passwd admin
getent group admin
# 2) 目錄擁有者與權限(應該是同一個 UID/GID)
namei -l /home/admin
stat -c '%U:%G %a %n' /home/admin
# 3) NFS 情境下,確認導出與掛載一致(選做)
mount | grep ' /home '
```
- 若不同節點回傳的 UID/GID 不一致,即為本案。
- **執行範例**
```
root@slurm-login-6fb5d948d6-5mcvp:~# namei -l /home/admin
f: /home/admin
drwxr-xr-x root root /
drwxr-xr-x root root home
drwxr-x--- admin admin admin
root@slurm-login-6fb5d948d6-5mcvp:~# stat -c '%U:%G %a %n' /home/admin
admin:admin 750 /home/admin
```
- **指令解釋**
- **`namei -l /home/admin`**
這個指令把路徑逐層「拆解」,列出每一層的**權限 (permissions)**、**擁有者 (owner)**、**群組 (group)** 與**型態 (file type)**,用來找出哪一層目錄造成 `Permission denied`。
```bash
namei -l /home/admin
```
* `namei`:顯示路徑解析 (path resolution)。
* `-l`:長格式 (long), 類似 `ls -l`,會列出 permissions/owner/group。
**範例輸出與解讀**:
```
f: /home/admin
drwxr-xr-x root root /
drwxr-xr-x root root home
drwx------ admin admin admin
```
* 每一行代表路徑的一層:`/` → `home` → `admin`
* 欄位含意:
* `d/-/l`(directory/regular file/symlink) + `rwx` 權限
* `owner` 權限
* `group` 權限
* 名稱
* 若有符號連結 (symlink) 會顯示 `l... linkname -> target`
**小提醒**:
* 要能 `cd` 進 `/home/admin`,對每一層目錄至少需要 **execute (x) 權限**(又稱 search bit)。缺少任何一層的 `x`,就會出現 `Permission denied`。
- **`stat -c '%U:%G %a %n' /home/admin`**
這行指令用 `stat` 依自訂格式顯示 `/home/admin` 的 **擁有者 (owner)**、**群組 (group)**、**權限(permissions)** 與 **名稱/路徑 (filename/pathname)**
* `-c '...'`: 自訂輸出格式 (custom format)
* `%U`: 檔案擁有者的使用者名稱 (owner)
* `%G`: 檔案擁有者的群組名稱 (group)
* `%a`: 八進位權限 (numeric permissions, octal)(如 700、755)
* `%n`: 檔名/路徑 (filename/pathname)
- ### 解決方式
在計算節點上新增 admin 帳號時,需同時指定 login 節點上的 admin 帳號 uid
```
useradd -m -s /bin/bash -u 20000 admin
```
- 參數 `-u 20000` 是關鍵
- 假設 login 節點上的 admin 帳號 uid 為 20000
- 查詢方式
```
root@slurm-login-6fb5d948d6-5mcvp:~# id admin
uid=20000(admin) gid=20000(admin) groups=20000(admin)
```
- ### 臨時繞過(如果只想先把作業跑起來)
```bash
srun --chdir=/tmp -p debug hostname
# 或
srun -D /tmp -p debug hostname
```
> 僅作權宜之計;正式應 **統一 UID/GID**。
- ### 完整解法
```bash
export ACCOUNT="cloud-team" # Slurm 帳務 Account 名稱
export GROUP="$ACCOUNT" # 建議 Linux 群組同名,便於管理
export USERNAME="admin" # 新使用者帳號
export UID_NUM="20000" # 與 login 節點一致
export GID_NUM="20000" # 與 login 節點一致
export SHELL="/bin/bash"
export HOME_DIR="/home/$USERNAME"
# 1) 新增群組(同名方便對應 Slurm Account)
sudo groupadd -g "$GID_NUM" "$GROUP"
# 2) 新增使用者(固定 UID/GID;建立家目錄)
sudo useradd -m -u "$UID_NUM" -g "$GROUP" -s "$SHELL" -d "$HOME_DIR" "$USERNAME"
sudo passwd "$USERNAME"
# 3) 驗證(在計算節點要能通過)
getent passwd "$USERNAME"
id "$USERNAME"
ls -ld "$HOME_DIR"
```
- ### 長期建議(Best Practices)
- **集中身份管理**:使用 **LDAP / FreeIPA / AD + SSSD**,讓所有節點的 `getent passwd` 統一來源,從根本避免 UID 漂移。
- **共享家目錄**:以 NFS/並配合一致的 UID/GID。避免個別節點手動建家目錄造成落差。
- **自動建家目錄**(選做):可在 login/compute 啟用 `pam_mkhomedir`,首次登入自動建立;但**仍需**先解決 UID/GID 一致性。
- **變更前維護窗口**:在調 UID/GID 前,安排維護時間,確保沒有作業在跑與檔案被占用。
- ### 追加檢查清單(Checklist)
- [ ] `getent passwd admin` 在 **所有節點** 顯示相同 UID。
- [ ] `getent group admin`(或目標群組)在所有節點顯示相同 GID。
- [ ] `/home/admin` 擁有者為目標 UID\:GID,權限正確(`700` 起跳)。
- [ ] NFS 伺服器導出的家目錄與各節點掛載點一致(含 `root_squash` 等選項符合政策)。
- [ ] 重新測試:
```bash
srun -p debug hostname # 不應再出現 "going to /tmp"
srun --chdir=/home/admin pwd # 應回傳 /home/admin
```
<br>
---
---
<br>
## 討論
### 正確建立 user 的流程應為何?
- ### Question
```
root@slurm-login-6fb5d948d6-5mcvp:~# sacctmgr create user user=tmp1 account=tj-account cluster=slurm
There is no uid for user 'tmp1'
Are you sure you want to continue? (You have 30 seconds to decide)
(N/y): y
Adding User(s)
tmp1
Settings
Associations =
C = slurm A = tj-account U = tmp1
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
```
正確建立 user 的流程應為何?
- ### gpt-5 (2025/08/28)
你已經把 **Slurm 帳務(user/association)** 建起來了,但那個警告表示:系統裡沒有同名的 **作業系統帳號(UID)**。在 Slurm 裡,**作業最終是以該使用者的 UID/GID 在計算節點上執行**;若沒有 OS 帳號,提交或派發時通常會失敗(例如「user not found / no such uid」)。
正確又穩當的流程如下(先作業系統,再 Slurm):
---
### 建立使用者的標準流程
#### 1) 先建立作業系統帳號(所有執行/登入環境都要看得到同一個 UID)
* 裸機/VM(每台 login/compute 節點都要一致):
```bash
# 依你們的規劃選定固定 UID/GID,確保各節點一致
sudo groupadd -r tj-account # 選用;若已存在可略過
sudo useradd -m -u 20011 -g tj-account -s /bin/bash tmp1
sudo passwd tmp1
# 驗證
getent passwd tmp1
id tmp1
```
* 你目前是 Kubernetes + Slinky/Slurm:
* **login pod** 和 **所有 slurmd compute pods** 內都要能解析到同一個 `tmp1`(同一 UID/GID)。
* 常見做法:
1. 用 LDAP/SSSD 提供集中式身份(建議)
2. 或把 `/etc/passwd` & `/etc/group` 透過 ConfigMap / Secret / PVC 同步進 login + slurmd 映像/掛載。
* 使用者家目錄 `/home/tmp1` 放在共享儲存(NFS/PVC),並在 login 與 compute pods 掛載同一路徑。
> 重點:**不論哪種環境,提交端與執行端都必須看見同一個 UID**。
---
#### 2) 建立/確認 Slurm 帳務物件(Account / User / Assoc / QOS)
> 建議用以下順序檢查。
```bash
# 建立(或確認) Account
sacctmgr show account name=tj-account
# 若沒有:
# sacctmgr create account name=tj-account Organization=tj
# 建立 User 並指定預設帳戶(DefAcct)
sacctmgr create user name=tmp1 DefaultAccount=tj-account Cluster=slurm
# (選用) 限定可用的 partition 或補充關聯
sacctmgr add user name=tmp1 account=tj-account cluster=slurm partition=tn
sacctmgr add user name=tmp1 account=tj-account cluster=slurm partition=debug
# (選用) 指定/開放 QOS
# 先確認有 normal(或你們定義的 QOS)
sacctmgr show qos
# 將可用 QOS 掛給使用者
sacctmgr modify user name=tmp1 set qos=normal
# (選用) 設定資源上限/配額
sacctmgr modify user name=tmp1 set MaxJobs=10
sacctmgr modify user name=tmp1 set MaxSubmitJobs=50
sacctmgr modify user name=tmp1 set MaxTRESPerJob=cpu=32,mem=64G
```
---
#### 3) 驗證關聯是否正確
```bash
sacctmgr list user name=tmp1 withassoc format=User,DefAcct,Cluster,Account,Partition,QOS,MaxJobs,MaxTRES
```
- 執行範例
```
$ sacctmgr list user name=tmp1 withassoc format=User,DefaultAccount,Cluster,Account,Partition,QOS,MaxJobs,MaxTRES
User Def Acct Cluster Account Partition QOS MaxJobs MaxTRES
---------- ---------- ---------- ---------- ---------- -------------------- ------- -------------
tmp1 tj-account slurm tj-account normal 10 cpu=32,mem=6+
tmp1 tj-account slurm tj-account debug normal 10 cpu=32,mem=6+
tmp1 tj-account slurm tj-account tn normal 10 cpu=32,mem=6+
# ---
$ sacctmgr list user name=tmp1 withassoc
User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS
---------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- ---------
tmp1 tj-account None slurm tj-account 1 10 32 50 normal
tmp1 tj-account None slurm tj-account debug 1 10 32 50 normal
tmp1 tj-account None slurm tj-account tn 1 10 32 50 normal
```
---
#### 4) 以該使用者提交最小測試作業
(在 login 節點/Pod,**切到 tmp1 身份** 測)
```bash
# 切換身份(或用 ssh 登入 tmp1)
sudo -iu tmp1
# 沒有 sudo 或已經是 root 身份,則用 su 切換身份
su - tmp1
# 最小測試:指定帳戶與可用的分割區
srun -A tj-account -p tn -N1 -n1 bash -lc 'whoami; id; hostname'
# 或
sbatch -A tj-account -p tn -N1 -n1 --wrap='hostname && whoami'
```
若這步出錯、看到「user not found / uid 不存在」之類訊息,幾乎可確定是 **計算節點看不到該 OS 帳號/UID**(回到步驟 1 修正)。
---
### 常見問題與小抄
* **我已在 sacctmgr 建了 user,但系統仍報 no uid?**
sacctmgr 只管帳務/關聯;**真正執行需要 OS 帳號**。請先把 `tmp1` 的 OS 帳號與 UID/GID 在 login + 所有 compute 環境建好、且一致。
* **Account vs Linux group 要一樣嗎?**
不必,但很多團隊會「同名」方便管理(如 `tj-account` 同時當 Linux 群組與 Slurm Account)。
* **K8s/Slinky 要點**
1. 共享家目錄(PVC/NFS)
2. 身分一致性(LDAP/SSSD 或同步 `/etc/passwd`)
3. login 與 slurmd pods 的 **使用者資料一致**。
---
照這個順序(OS 帳號 → Slurm 帳務 → 驗證 → 測試)做,之後新增使用者就會順暢且可預期。需要的話我可以幫你寫一份「在 K8s/Slinky 下同步使用者 & 家目錄」的具體操作手冊。
<br>
{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}