[Account] Account
===
###### tags: `Slurm / Account`
###### tags: `Slurm`, `HPC`, `Linux`, `Slinky`, `SlinkyProject`, `slurmdb`, `Account`, `sacctmgr`, `scontrol`, `sinfo`, `srun`, `AllowGroups`, `AllowAccounts`, `Hidden`, `PrivateData`
<br>
[TOC]
<br>
# 介紹
## 簡介
**Slurm 的 account 是「專案/部門代號」**,拿來把作業資源用量「分帳、限額、排程加權、出報表」。它不是作業系統帳號,而是用來管理與統計的一層。
<br>
### 為什麼要設定 account
- **分帳與計費**:依專案/團隊彙總 CPU/GPU/記憶體耗用,做成本分攤或預算控管。
- **公平分配(FairShare)**:給不同 account 權重(Shares),排程時自動拉平長期資源使用差異。
- **配額與限制**:對 account 設 GrpTRES、MaxJobs、GrpTRESMins 等上限,避免單一團隊把機器吃光。
- **報表與稽核**:用 `sacct`/`sreport` 依 account 出月報、週報,追蹤效率與使用率。
- **權限與隔離**:限制某些 account 只能用特定 partition/QoS,或套用不同優先級。
- **生命週期管理**:專案開始/結束就開/關 account;人員移轉只要改其所屬 account。
<br>
### 最常見的操作:
```bash
# 建立專案帳(account)
sacctmgr add account eng Description="R&D Team" Organization="Company"
# 把使用者加到專案,並設預設專案帳
sacctmgr add user name=alice account=eng DefaultAccount=eng
# 設公平分配與群組資源上限(例:給 100 權重、10 萬 CPU 分鐘)
sacctmgr modify account name=eng set Fairshare=100 GrpTRESMins=cpu=100000
# 依專案看用量報表(8 月份)
sreport cluster AccountUtilization Start=2025-08-01 End=2025-08-31
# 查某專案作業細節
sacct -A eng -S 2025-08-01 -E now --format=JobID,User,Elapsed,CPUTime,TRESUsageInAve
```
**小提醒**:
- 要看到完整用量/報表,需同時正確設好 `AccountingStorageType=slurmdbd`、`JobAcctGatherType`(如 `linux` 或 `cgroup`),並讓 `slurmdbd` 正常連到資料庫。
<br>
---
<br>
## docs
- ### Accounting and Resource Limits
> https://slurm.schedmd.com/accounting.html
- [Account Options](https://slurm.schedmd.com/accounting.html#account-options)
- [User Options](https://slurm.schedmd.com/accounting.html#user-options)
- ### sacctmgr 指令
> https://slurm.schedmd.com/sacctmgr.html
- [[ENTITIES] association](https://slurm.schedmd.com/sacctmgr.html#OPT_association)
<br>
---
<br>
## [非常重要] 指令導讀
### [重要觀念] Slurm 的資料模型:
- **User 和 Account 是全域資源(不屬於特定 cluster)**
- 執行 add / modify / delete 指令不需加 `cluster=<cluster-name>` 參數
- 加了 `cluster=<cluster-name>` 參數,只是變成操作 association,全域的資料還在
- **Association 是 cluster-specific 的資源**
- 執行指令需加 `cluster=<cluster-name>` 參數
<br>
### 參數名稱和參數值,大小寫不敏感
```
$ sacctmgr list user
$ sacctmgr list USER
$ sacctmgr LIst usER
```

<br>
### auto-completion
> 按 `<tab>` 啟用自動完成
```
$ sacctmgr list + <tab>
account cluster event instance qos resource stat tres wckey
association configuration federation problem reservation runawayjobs transaction user
```

<br>
```
$ sacctmgr list a + <tab>
account association
```

<br>
### 支援同義詞:子指令(sub-command) 可互換
> **CRUD**: Create, Read, Update, Delete
- ### 建立:`sacctmgr [add|create]`
- `sacctmgr add` <-> `sacctmgr create`
- `sacctmgr [add|create] [account|cluster|coordinator|federation|qos|resource|user] ...`
- ### 查詢:`sacctmgr [list|show]`
- `sacctmgr list` <-> `sacctmgr show`
- `sacctmgr [list|show] [account|association|cluster|configuration|event|federation|instance|problem|qos|reservation|resource|runawayjobs|stat|transaction|tres|user|wckey] ...`
- ### 更新:`sacctmgr [modify|update]`
- `sacctmgr modify` <-> `sacctmgr update`
- `sacctmgr [modify|update] [account|cluster|federation|qos|resource|user] ...`
- 沒有 `association|coordinator|job` 表格
- ### 刪除:`sacctmgr [delete|remove]`
- `sacctmgr delete` <-> `sacctmgr remove`
- `sacctmgr [delete|remove] [account|cluster|coordinator|federation|qos|resource|user] ...`
- 沒有 `association` 表格
<br>
### 等效子指令
- 如果 auto-completion 只有一種結果,**參數**可直接省去後面的輸入
```
$ sacctmgr list as + <tab> # -> sacctmgr list association
```
底下指令都能正常執行 (i.e. 等效指令):
- `$ sacctmgr list as`
- `$ sacctmgr list ass`
- `$ sacctmgr list asso`
- `$ sacctmgr list assoc`
- `$ sacctmgr list associ`
- `$ sacctmgr list associa`
- `$ sacctmgr list associat`
- `$ sacctmgr list associati`
- `$ sacctmgr list associatio`
- `$ sacctmgr list association`
- 同理:
- `$ sacctmgr show user tj witha`
- `$ sacctmgr show user tj withas`
- `$ sacctmgr show user tj withass`
- `withassoc` 參數亦可改用 `--as`, `--ass` .. `--association` 參數
<br>
### 輸出設定
- ### 指定特定欄位輸出
- ### 指令用法
```
sacctmgr [list|show] ... format=欄位1,欄位2,欄位3
```
- ### 範例
```
$ sacctmgr show association where user=tj_tsai format=cluster,account,partition,user
# 可忽略 where 關鍵字
$ sacctmgr show association user=tj_tsai format=cluster,account,partition,user
```
- ### 放寬欄位寬度
- ### 指令用法
```
sacctmgr [list|show] ... format=欄位1%10,欄位2%20,欄位3%30
```
- ### 範例
```
$ sacctmgr show association where user=tj_tsai format=cluster%10,account%20,user%30
Cluster Account User
---------- -------------------- ------------------------------
slurm_slu+ administrator tj_tsai
slurm_slu+ tj1-project tj_tsai
slurm_slu+ tj2-project tj_tsai
slurm_slu+ tj3-project tj_tsai
```
- `Cluster` 寬度 10 個字元
- `Account` 寬度 20 個字元
- `User` 寬度 30 個字元
<br>
### 變更設定
> Modifying Entities
> > https://slurm.schedmd.com/accounting.html
- ### 指令用法
```
sacctmgr modify <entity> set <options> where <options>
```
- ### 範例
```
sacctmgr modify user set default=none where default=test
```
- 會將所有預設帳戶為「test」的使用者,其預設帳戶改為「none」。
- 一旦有實體被新增、修改或移除,變更會傳送到相應的 Slurm 守護行程(daemons),並可立即生效使用。
<br>
### sacctmgr 常用參數
- ### 情境:顯示 user 與 account 的關聯
- ### 使用 `--as` ~ `--associations`, `withas` ~ `withassoc`
- `-s` or `--associations`: equivalent to "associations" command
- ### command 形式
```
sacctmgr [show|list] associations
```
- when using show/list will list the associations associated with the entity.
- Accounts=, Clusters=, Flags=, Format=, ID=,
OnlyDefaults, Partitions=, Parent=, Tree, Users=,
WithSubAccounts, WithDeleted, WOLimits,
WOPInfo, and WOPLimits
- ### 情境:執行 `sacctmgr` 不需要做互動或確認,直接執行
- ### 關閉互動選項
> https://slurm.schedmd.com/sacctmgr.html#OPT_immediate
>
- `-i`, `--immediate`
Commit changes immediately without asking for confirmation.
- ### 情境:應用程式如何解讀 `sacctmgr` 所輸出的資料?
- ### 使用 `|` 分隔,供程式剖析用
> https://slurm.schedmd.com/sacctmgr.html#OPT_parsable
>
- `-p`, `--parsable`
Output will be '|' delimited with a '|' at the end.
- `-P`, `--parsable2`
Output will be '|' delimited without a '|' at the end.
- ### 執行範例
```
$ sacctmgr show account -p
Account|Descr|Org|
root|default root account|root|
tn|tn|tn|
tp|tp|tp|
$ sacctmgr show account -P
Account|Descr|Org
root|default root account|root
tn|tn|tn
tp|tp|tp
```
- ### 情境:不顯示標題
- ### 不顯示標題
> https://slurm.schedmd.com/sacctmgr.html#OPT_noheader
>
- `-n`, `--noheader`
no header will be added to the beginning of output
- ### 執行範例
```
$ sacctmgr show account
Account Descr Org
---------- -------------------- --------------------
root default root account root
```
```
$ sacctmgr show account -n
root default root account root
```
<br>
---
---
<br>
## cluster 指令
### 查 cluster name
- ### 透過 scontrol 指令
```
$ scontrol show config | egrep 'ClusterName|AccountingStorageType|AccountingStorageHost|AccountingStorageEnforce'
AccountingStorageEnforce = associations,limits,safe
AccountingStorageHost = slurm-accounting
AccountingStorageType = accounting_storage/slurmdbd
ClusterName = slurm_slurm
```
- ### 透過 sacctmgr 指令
```
$ sacctmgr list cluster
Cluster ControlHost ControlPort RPC Share GrpJobs GrpTRES GrpSubmit MaxJobs MaxTRES MaxSubmit MaxWall QOS Def QOS
---------- --------------- ------------ ----- --------- ------- ------------- --------- ------- ------------- --------- ----------- -------------------- ---------
slurm_slu+ 10.244.65.60 6817 11264 1 normal
```
```
$ sacctmgr list cluster format=Cluster%30
Cluster
------------------------------
slurm_slurm
```
<br>
### [案例] 如何將 account 新增到多個 cluster?
- ### error
```
$ sacctmgr create account xxx cluster=tj-namespace
error: Cluster 'tj-namespace' has not been added yet, please contact your admin before adding accounts to it
```
- ### 解決方法
根據錯誤訊息,您需要先將 cluster 新增到 Slurm 資料庫中,才能將 account 新增到該 cluster。
### 解決步驟
#### 1. 先新增 Cluster 到 SlurmDBD
```bash
# 新增單一 cluster
sacctmgr add cluster tj-namespace
# 或一次新增多個 clusters
sacctmgr add cluster cluster1,cluster2,cluster3
```
#### 2. 驗證 Cluster 是否已新增
```bash
sacctmgr show cluster
```
#### 3. 將 Account 新增到多個 Clusters
**方法一:一次新增到多個 clusters**
```bash
sacctmgr create account xxx cluster=cluster1,cluster2,cluster3
```
**方法二:分別新增到各個 cluster**
```bash
sacctmgr create account xxx cluster=cluster1
sacctmgr create account xxx cluster=cluster2
sacctmgr create account xxx cluster=cluster3
```
#### 4. 驗證 Account 已正確新增
```bash
sacctmgr show account xxx -s
```
### 完整範例
```bash
# 1. 新增所需的 clusters
sacctmgr add cluster tj-namespace
# 2. 確認 cluster 已新增
sacctmgr show cluster format=cluster,controlhost,controlport
# 3. 新增 account 到 cluster
sacctmgr create account xxx cluster=tj-namespace description="測試帳戶"
# 4. 如果要新增到多個 clusters
sacctmgr create account xxx cluster=tj-namespace,cluster2,cluster3
```
### 注意事項
- **Cluster 必須先存在於 SlurmDBD** 才能將 account 關聯到它
- 新增 cluster 通常需要 **root 或 slurm admin 權限**
- 確認 `slurmdbd.conf` 中的 `ClusterName` 與您要新增的 cluster 名稱一致
- 如果是多 cluster 環境,每個 cluster 的 `slurm.conf` 都應該正確配置並指向同一個 SlurmDBD
### 檢查現有 Clusters
```bash
# 查看所有已註冊的 clusters
sacctmgr list cluster format=cluster,controlhost,nodecount
# 查看特定 account 在哪些 clusters 中
sacctmagr list account xxx withassoc format=account,cluster,user
```
需要我協助檢查您目前的 Slurm 配置或提供更詳細的設定範例嗎?
<br>
---
<br>
## account 指令
### 列出 account
> 指令可互換:
> - `sacctmgr list account`
> - `sacctmgr show account`
```
$ sacctmgr list account
Account Descr Org
---------- -------------------- --------------------
admin admin group admin
eng engineering eng
games games games
res research res
root default root account root
tj-account tj exclusive tj-account
```
### 建立 account
> 指令可互換:
> - `sacctmgr add account`
> - `sacctmgr create account`
```
$ sacctmgr create account tj-account description='TJ Exclusive'
```
### 刪除 account
> 指令可互換:
> - `sacctmgr delete account`
> - `sacctmgr remove account`
```
$ sacctmgr delete account tj
$ sacctmgr delete account name=tj
```
<br>
### [刪除 account] 為何無法刪除某個 account?
- ### Question
```
$ sacctmgr show account where name=administrator cluster=slurm_slurm --as
Account Descr Org Cluster ParentName User
---------- -------------------- -------------------- ---------- ---------- ----------
administr+ 4d5fb274-059a-448a-+ ci.asus.com slurm_slu+ root
administr+ 4d5fb274-059a-448a-+ ci.asus.com slurm_slu+ xxx-1
administr+ 4d5fb274-059a-448a-+ ci.asus.com slurm_slu+ xxx-2
administr+ 4d5fb274-059a-448a-+ ci.asus.com slurm_slu+ xxx-3
$ sacctmgr -i delete account where name=administrator cluster=slurm_slurm
Error with request: You can not remove the default account of a user
C = slurm_slurm A = administrator U = xxx-1
C = slurm_slurm A = administrator U = xxx-2
C = slurm_slurm A = administrator U = xxx-3
Please either remove the accounts listed above from list and resubmit,
or change these users' default accounts to remove the account(s).
Changes Discarded
$ sacctmgr list user xxx-3
User Def Acct Admin
---------- ---------- ---------
xxx-3 None
$ sacctmgr list user xxx-3 --as
User Def Acct Admin Cluster Account Partition
---------- ---------- --------- ---------- ---------- ----------
xxx-3 administr+ None slurm_slu+ 26d15dcc-+
xxx-3 administr+ None slurm_slu+ 4d5fb274-+
xxx-3 administr+ None slurm_slu+ administr+
xxx-3 administr+ None slurm_slu+ d15dcc-98+
xxx-3 administr+ None slurm_slu+ d5fb274-0+
```
- ### `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/02/04)
<!-- http://10.78.26.44:30000/deepwiki/slurm/-/issues/41 -->
根據錯誤訊息分析,無法刪除 `administrator` account 的原因是:
### 問題根源
**Slurm 不允許刪除使用者的預設 account(default account)**
從輸出可以看到:
1. `xxx-3` 的預設 account 是 `administrator`
2. 其他 2 個使用者(xxx-1, xxx-2)也都將 `administrator` 設為預設 account
3. Slurm 保護機制:刪除預設 account 會導致這些使用者無法提交作業
### 解決方案
有兩種方式可以刪除 `administrator` account:
#### 方案 1:先移除使用者的關聯
```bash
# 將所有使用者從 administrator account 中移除
# 當 Account != DeafultAccount
sacctmgr -i remove user where account=administrator cluster=slurm_slurm
# 當 Account == DeafultAccount
sacctmgr -i remove user where defaultaccount=administrator cluster=slurm_slurm
# 然後再刪除 account
sacctmgr -i delete account where name=administrator cluster=slurm_slurm
```
#### 方案 2:變更使用者的預設 account
```bash
# 先為每個使用者指定新的預設 account(假設有其他可用 account)
sacctmgr -i modify user xxx-3 set defaultaccount=<其他account>
sacctmgr -i modify user jay_ho@asus.com set defaultaccount=<其他account>
# ... 其他使用者
# 然後刪除 administrator account
sacctmgr -i delete account where name=administrator cluster=slurm_slurm
```
### 觀察到的其他問題
從 `sacctmgr list user xxx-3 --as` 輸出可以看到:
```
xxx-3 administr+ None slurm_slu+ 26d15dcc-+
xxx-3 administr+ None slurm_slu+ 4d5fb274-+
xxx-3 administr+ None slurm_slu+ administr+
xxx-3 administr+ None slurm_slu+ d15dcc-98+
xxx-3 administr+ None slurm_slu+ d5fb274-0+
```
這位使用者關聯了 5 個 account,包括:
- `administrator` (完整名稱)
- `4d5fb274-...` (UUID 格式)
- 其他截斷顯示的 account
---
<br>
### [刪除 account] 為何刪除 account (Cluster 為空),不能攜帶 cluster='' 或 cluster= 參數?
- ### Question
```
$ sacctmgr -i delete account b245c1b-0ad3-43f8-9afd-0ccfb0eab3db cluster=''
Nothing deleted
$ sacctmgr -i delete account b245c1b-0ad3-43f8-9afd-0ccfb0eab3db cluster=
Nothing deleted
$ sacctmgr -i delete account b245c1b-0ad3-43f8-9afd-0ccfb0eab3db
Deleting accounts...
b245c1b-0ad3-43f8-9afd-0ccfb0eab3db
```
三者的差異?
- ### `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/02/04)
這是 Slurm `sacctmgr` 命令的設計行為,讓我解釋原因:
### 核心概念
在 Slurm 資料庫中,**Account 可以同時存在於多個層級**:
1. **全域層級 (Global)**: `Cluster` 欄位為空
2. **Cluster 層級**: `Cluster` 欄位有值(如 `slurm_slurm`)
### 為何 `cluster=''` 或 `cluster=` 無法刪除
當你使用 `cluster=''` 或 `cluster=` 時:
```bash
# 這兩個指令都無法刪除 Global Account
sacctmgr -i delete account b245c1b... cluster=''
sacctmgr -i delete account b245c1b... cluster=
```
**原因**:
- `sacctmgr` 的 `cluster=` 參數被設計為**過濾條件**,用來指定要刪除哪個 Cluster 的 Account
- 當你提供 `cluster=''` 或 `cluster=`,Slurm 會**嘗試尋找名稱為空字串的 Cluster**,而非「沒有 Cluster 的 Account」
- 因為不存在名為 `''` 的 Cluster,所以找不到任何符合條件的記錄
### 正確的刪除方式
```bash
# ✅ 不帶 cluster 參數 = 刪除「所有層級」的該 Account(包含 Global)
sacctmgr -i delete account b245c1b-0ad3-43f8-9afd-0ccfb0eab3db
# ✅ 指定特定 Cluster = 只刪除該 Cluster 的 Account
sacctmgr -i delete account b245c1b... cluster=slurm_slurm
```
### Slurm 的查詢邏輯
```bash
# 顯示所有層級(Global + 所有 Cluster)
sacctmgr show account where name=xxx
# 只顯示特定 Cluster 的 Account
sacctmgr show account where name=xxx cluster=slurm_slurm
# ❌ 無法直接查詢「只有 Global」的 Account
# 必須透過結果中 Cluster 欄位為空來判斷
```
### 設計理念
這種設計符合 Slurm 的分層架構:
1. **Global Account** = 預設值/範本,可被所有 Cluster 繼承
2. **Cluster-specific Account** = 覆寫特定 Cluster 的設定
3. **不帶 `cluster` 參數** = 操作所有層級(最徹底的刪除)
### 實務建議
如果你的程式需要**明確刪除 Global Account**:
```typescript
// 1. 先查詢該 Account 存在於哪些層級
const accounts = await queryAccounts({ name: accountName })
// 2. 判斷是否有 Global Account(cluster 欄位為空)
const hasGlobalAccount = accounts.some(a => !a.cluster)
// 3. 如果只有 Global Account,直接刪除(不帶 cluster 參數)
if (hasGlobalAccount && accounts.every(a => !a.cluster)) {
await exec(`sacctmgr -i delete account ${accountName}`)
}
// 4. 如果同時有多個層級,需要分別處理
for (const account of accounts) {
if (account.cluster) {
await exec(`sacctmgr -i delete account ${accountName} cluster=${account.cluster}`)
} else {
// 最後刪除 Global(確保 Cluster-specific 先刪除)
await exec(`sacctmgr -i delete account ${accountName}`)
}
}
```
**關鍵點**:`cluster=` 參數不支援「空值語義」,只能用來指定具體的 Cluster 名稱或完全省略。
<br>
### 更新 account 屬性
- ### Cluster 欄位是唯讀
```
$ sacctmgr list account aa10ab75-48e9-4bdc-b251-7cfd857bd5ab --as
Account Descr Org Cluster
---------- -------------------- -------------------- ----------
aa10ab75-+ tj-project personal
$ sacctmgr update account aa10ab75-48e9-4bdc-b251-7cfd857bd5ab set cluster=slurm_slurm
Can't modify the cluster of an account
```
- ### 正確的操作方式
```bash
# 將 account 新增到特定 cluster
sacctmgr add account aa10ab75-48e9-4bdc-b251-7cfd857bd5ab cluster=slurm_slurm
# ---
# 如果 account 已存在於該 cluster,可能需要先移除再新增
# 先從原 cluster 移除(如果需要)
sacctmgr delete account where account=aa10ab75-48e9-4bdc-b251-7cfd857bd5ab cluster=<old_cluster>
# 再新增到新 cluster
sacctmgr add account aa10ab75-48e9-4bdc-b251-7cfd857bd5ab cluster=slurm_slurm
```
- ### 重要概念
在 Slurm 中:
1. **Account 是全域的**,但需要與特定 cluster 建立關聯(association)
2. 一個 account 可以存在於多個 cluster 中
3. `cluster` 欄位空白表示該 account 尚未與任何 cluster 建立關聯
4. 必須透過 `add account ... cluster=<name>` 建立關聯,而不是 `update` 指令
<br>
<br>
## user 指令
### 列出 user
```
$ sacctmgr list user
$ sacctmgr show user
User Def Acct Admin
---------- ---------- ---------
admin1 admin Administ+
alice eng None
bob res None
root root Administ+
tj-1 None
```
<br>
### 列出 user (含關連資訊)
```
$ sacctmgr list user tj withassoc
$ sacctmgr show user tj withassoc
User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS
---------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- ---------
tj tj-account None slurm tj-account 1 normal
```
<br>
### 列出 user (自定義欄位)
```
$ sacctmgr list user format=user,defaultaccount,acct,admin,cluster,partition,share
User Def Acct Account Admin Cluster Partition Share
---------- ---------- ---------- --------- ---------- ---------- ---------
admin1 admin Administ+
alice eng None
bob res None
root root Administ+
tj tj-account None
```
<br>
### 建立 user
```bash
$ sacctmgr create user tj account=tj-account cluster=slurm
# 等效用法:
$ ... create user name=tj ...
$ ... create user user=tj ...
```
- ### 必要資訊,若有缺失會有相對應的錯誤訊息
- `name`
```
Need name of user to add.
```
- `account`
```
Need name of account or wckey to add.
```
- ### :warning: account 與 partition 建立關聯的必要步驟
### 說明
建立 account 時,需要攜帶 partition 參數,才會建立 account 與 partition 關聯,否則即便在 `slurm.conf` 中定義 `PartitionName ... AllowAccounts=tj-account` 資訊,仍然不會自動建立關聯
```
PartitionName=debug Nodes=e900 Default=NO MaxTime=UNLIMITED \
State=UP AllowAccounts=tj-account Hidden=YES
```
### 關聯設定過程:
```
$ sacctmgr add user name=tj account=tj-account partition=debug cluster=slurm
Adding User(s)
tj
Settings
Associations =
C = slurm A = tj-account U = tj P = debug
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
$ sacctmgr show user tj withassoc
User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS
---------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- ---------
tj tj-account None slurm tj-account debug 1 normal
```
<br>
### 建立登入帳號
```bash
# 在 login 節點 (或 login pod)
# 建立 Linux 帳號
# -m: 建立 home 目錄 -> /home/tj
# -s: 預設的 shell -> /bin/sh, /bin/bash ?
$ useradd tj -m -s /bin/bash
# 設定密碼
$ passwd tj
# 或直接導入密碼
$ echo "tj:123456" | chpasswd
```
<br>
### 刪除 user
```bash
$ sacctmgr delete user where user=tj
# 等效指令
$ sacctmgr delete user tj
# 備忘:相關用法
$ sacctmgr remove user name=tj account=tj-account cluster=slurm
```
<br>
### [刪除 user] 為何無法刪除某個關聯(user, account)?
- ### Question
```
$ sacctmgr list user xxx-5 --as
User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS
---------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- ---------
xxx-5 administr+ None slurm_slu+ 26d15dcc-+ 1 normal
xxx-5 administr+ None slurm_slu+ 4d5fb274-+ 1 normal
xxx-5 administr+ None slurm_slu+ administr+ 1 normal
xxx-5 administr+ None slurm_slu+ d15dcc-98+ 1 normal
xxx-5 administr+ None slurm_slu+ d5fb274-0+ 1 normal
$ sacctmgr -i remove user xxx-5 where account=administrator cluster=slurm_slurm
Error with request: You can not remove the default account of a user
C = slurm_slurm A = administrator U = xxx-5
You must change the default account of these users or remove the users completely from the affected clusters to allow these changes.
Changes Discarded
```
- ### `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/02/04)
<!-- http://10.78.26.44:30000/deepwiki/slurm/-/issues/42 -->
根據錯誤訊息,無法刪除該使用者關聯是因為 **`administrator` 是該使用者的預設帳戶(Default Account)**。Slurm 不允許刪除使用者的預設帳戶關聯,除非先變更預設帳戶或完全移除該使用者。
### 問題分析
從 `sacctmgr list user` 的輸出可以看到:
- `xxx-5` 在 `slurm_slurm` cluster 上有 5 個 account 關聯
- `Def Acct` 欄位顯示 `administr+`(被截斷的 `administrator`),表示 `administrator` 是預設帳戶
- 嘗試刪除預設帳戶時,sacctmgr 會拒絕操作
### 正確執行流程
有兩種解決方案:
#### 方案 1:先變更預設帳戶,再刪除
```bash
# 1. 將預設帳戶變更為其他 account(例如 26d15dcc-xxx)
sacctmgr -i modify user xxx-5 \
set defaultaccount=26d15dcc-9835-4d5f-b274-08bb4a26e836 \
where cluster=slurm_slurm
# 2. 確認變更成功
sacctmgr list user xxx-5 --as
# 3. 現在可以刪除 administrator 關聯
sacctmgr -i remove user xxx-5 \
where account=administrator cluster=slurm_slurm
```
#### 方案 2:直接從 cluster 完全移除使用者
如果目標是完全移除該使用者在此 cluster 的所有關聯:
```bash
# 直接從 cluster 移除使用者(會移除所有 account 關聯)
sacctmgr -i remove user xxx-5 where cluster=slurm_slurm
```
### 關鍵概念
1. **Default Account 保護機制**:Slurm 要求每個使用者在 cluster 上必須有一個預設帳戶,以確保提交作業時有明確的計費/資源分配目標
2. **刪除順序**:必須先處理預設帳戶(變更或移除使用者),才能刪除該帳戶關聯
3. **完整列表**:使用 `sacctmgr list user <username> --associations` 可以看到完整的 account 名稱(不會被截斷)
### 建議操作
根據您的需求選擇:
- 如果只想移除 `administrator` 關聯 → 使用**方案 1**
- 如果想清除該使用者在此 cluster 的所有資料 → 使用**方案 2**
---
<br>
### 更新 user 屬性
```
$ sacctmgr update user david account=sys set partition=giove
```
- [Ticket 2024 - How to restrict user access to partitions](https://support.schedmd.com/show_bug.cgi?id=2024#:~:text=sacctmgr%20update%20user%20david%20account%3Dsys,set%20partition%3Dgiove)
### 參考資料
- [[slurm-users] Changing a user's default account](https://groups.google.com/g/slurm-users/c/w_NVWH5Fi6c)
<br>
<br>
## associations 指令
### associations 基礎知識
根據 sacctmgr 文件,association 由四個參數組成:`user`、`cluster`、`account`、`partition`。
<br>
### associations 操作範例
> [EXAMPLES](https://slurm.schedmd.com/sacctmgr.html#SECTION_EXAMPLES)
```
$ sacctmgr list associations cluster=slurm format=Account,Cluster,User,Fairshare tree withd
Account Cluster User Share
-------------------- ---------- ---------- ---------
root slurm 1
root slurm root 1
admin slurm 1
admin slurm admin1 1
eng slurm 1
eng slurm alice 1
eng slurm tj 1
games slurm 1
res slurm 1
res slurm bob 1
tj-account slurm 1
tj-account slurm tj 1
```
<br>
### `sacctmgr list associations` vs `sacctmgr list user withassoc`
```
$ sacctmgr list associations user=admin1
Cluster Account User Partition Share Priority GrpJobs GrpTRES GrpSubmit GrpWall GrpTRESMins MaxJobs MaxTRES MaxTRESPerNode MaxSubmit MaxWall MaxTRESMins QOS Def QOS GrpTRESRunMin
---------- ---------- ---------- ---------- --------- ---------- ------- ------------- --------- ----------- ------------- ------- ------------- -------------- --------- ----------- ------------- -------------------- --------- -------------
slurm admin admin1 1 normal
---
$ sacctmgr list user name=admin1 withassoc
User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS
---------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- ---------
admin1 admin Administ+ slurm admin 1 normal
```
- `sacctmgr list associations` 不帶有 Def Acct 資訊 (Default Account)
<br>
### `sacctmgr modify association ...` --> 不支援
<br>
### `sacctmgr update association ...` --> 不支援
- ### 如何變更 deafult account?
> 更新 user 關聯:
> - old key=(user=tj, deafult_account=tn)
> - new key=(user=tj, deafult_account=tp)
>
- 當 `old.Account` == `DefaultAccount` 時,必須先建立新的關聯
```
$ sacctmgr show user --as
User Def Acct Admin Cluster Account
---------- ---------- --------- ---------- ----------
tj tn None slurm_slu+ tn
$ sacctmgr update user where name=tj set defaultaccount=tp
Modified users...
Can't modify because these users aren't associated with new default account 'tp'...
U = tj C = slurm_slurm
$ sacctmgr add user tj account=tp
There is no uid for user 'tj'
Are you sure you want to continue? (You have 30 seconds to decide)
(N/y): y
Associations =
C = slurm_slurm A = tp U = tj
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
$ sacctmgr show user --as
User Def Acct Admin Cluster Account
---------- ---------- --------- ---------- ----------
tj tn None slurm_slu+ tn
tj tn None slurm_slu+ tp
$ sacctmgr update user where name=tj set defaultaccount=tp
Modified users...
tj
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
$ sacctmgr show user --as
User Def Acct Admin Cluster Account
---------- ---------- --------- ---------- ----------
tj tp None slurm_slu+ tn
tj tp None slurm_slu+ tp
```
- ### 什麼時候可直接變更 deafult account?當變更後的關聯存在時,才可直接變更
```
$ sacctmgr show user --as
User Def Acct Admin Cluster Account
---------- ---------- --------- ---------- ----------
tj tp None slurm_slu+ tn
tj tp None slurm_slu+ tp
$ sacctmgr modify user where name=tj set DefaultAccount=tn
Modified users...
tj
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
```
<br>
### `sacctmgr delete association ...` --> 不支援
- ### 操作對象必須是 account 或 user,不支援 delete assoc (會有底下錯誤訊息)
```
sacctmgr delete assoc where user=tj cluster=slurm_slurm account=tn
No valid entity in delete command
Input line must include "Account", "Cluster", "Coordinator", "Federation", "QOS", "Resource", or "User"
```
- ### 刪除 user 關聯:key=(user=tj, account=tn)
```
$ sacctmgr delete user tj account=tn
Error with request: You can not remove the default account of a user
C = slurm_slurm A = tn U = tj
You must change the default account of these users or remove the users completely from the affected clusters to allow these changes.
Changes Discarded
```
- **當 `Account` == `DefaultAccount` 時,必須先將 `DefaultAccount` 變更為其他既有的 `account`**
```
$ sacctmgr update user where name=tj set DefaultAccount=administrator
# ----------------------------------------------
# 若寫成 set Account=administrator,會有底下的錯誤:
# Unknown option: account=tj-project
# Use keyword 'where' to modify condition
# ----------------------------------------------
# 檢查變更結果
$ sacctmgr show user tj --as
# 再執行
$ sacctmgr delete user tj account=tn
```
- **需留意必要 `--as` 參數**
```
$ sacctmgr show user tj_tsai format=User,DefaultAccount
User Def Acct
------- ----------
tj_tsai <-- 空值,
$ sacctmgr show user tj_tsai format=User,DefaultAccount --association
User Def Acct
------- ----------
tj_tsai administr+
tj_tsai administr+
tj_tsai administr+
tj_tsai administr+
tj_tsai administr+
```
<br>
### `sacctmgr remove association ...` --> 不支援
<br>
<br>
## QoS 指令
> [[HackMD] [Account] QoS](https://hackmd.io/VLbIXsIjTba9KAYejFVSjw)
### QoS 操作範例:建立與套用
> by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/21)
>
- ### Step 1: 建立 QOS (使用 sacctmgr)
```bash
# 建立名為 limit_3_jobs 的 QOS,限制每位 user 最多同時執行 3 個 job
sacctmgr add qos limit_3_jobs MaxJobsPerUser=3
# 驗證 QOS 是否建立成功
sacctmgr show qos format=Name,MaxJobsPerUser
```
**補充選項** (根據需求可添加更多限制):
```bash
# 建立更完整的 QOS 設定
sacctmgr add qos limit_3_jobs \
MaxJobsPerUser=3 \
MaxSubmitJobsPerUser=10 \
Priority=100
# 查看詳細 QOS 資訊
sacctmgr show qos limit_3_jobs -p
```
---
- ### Step 2: 套用 QOS
#### **策略 1: 針對 Partition 強制套用 (Hard Limit)**
所有在該 partition 執行的 job 都會受到此 QOS 限制。
```bash
# 假設 partition 名稱為 compute
scontrol update PartitionName=compute QOS=limit_3_jobs
# 驗證設定
scontrol show partition compute | grep QOS
# 或使用
sinfo -o "%P %l %D %N %Q" -p compute
```
**注意事項**:
- 此方法會強制所有使用該 partition 的 user 都受到 QOS 限制
- 無法針對特定 user 做例外處理
---
#### **策略 2: 針對特定 Account/User 套用 (Soft/Specific Limit) ⭐推薦**
更靈活的方式,可以針對特定 account 或 user 套用 QOS。
```bash
# 方法 A: 針對特定 Account 在特定 Partition 套用 QOS
sacctmgr modify account <account_name> \
set qos=limit_3_jobs \
where partition=<partition_name>
# 實際範例
sacctmgr modify account default_account \
set qos=limit_3_jobs \
where partition=compute
# 驗證
sacctmgr show assoc format=Account,Partition,QOS \
where partition=compute
```
```bash
# 方法 B: 針對特定 User 在特定 Partition 套用 QOS
sacctmgr modify user <username> \
set qos=limit_3_jobs \
where account=<account_name> partition=<partition_name>
# 實際範例
sacctmgr modify user john \
set qos=limit_3_jobs \
where account=default_account partition=compute
# 驗證
sacctmgr show assoc format=User,Account,Partition,QOS \
where user=john partition=compute
```
```bash
# 方法 C: 批次套用到整個 Cluster 的 Account (所有 partition)
sacctmgr modify account <account_name> \
set qos=limit_3_jobs
# 實際範例
sacctmgr modify account default_account \
set qos=limit_3_jobs
# 驗證
sacctmgr show assoc format=Account,Partition,QOS \
where account=default_account
```
**VIP User 例外處理範例**:
```bash
# 為 VIP user 建立不受限制的 QOS
sacctmgr add qos unlimited MaxJobsPerUser=-1
# 套用到特定 VIP user
sacctmgr modify user vip_user \
set qos=unlimited \
where account=default_account partition=compute
```
---
- ### 完整設定流程範例
假設需求:
- Partition 名稱: `compute`
- Account 名稱: `research_team`
- 限制: 每位 user 最多同時執行 3 個 job
- VIP user: `admin` 不受限制
```bash
# Step 1: 建立 QOS
sacctmgr add qos limit_3_jobs MaxJobsPerUser=3 -i
sacctmgr add qos unlimited MaxJobsPerUser=-1 -i
# Step 2: 套用到 account (策略 2)
sacctmgr modify account research_team \
set qos=limit_3_jobs \
where partition=compute -i
# Step 3: 設定 VIP 例外
sacctmgr modify user admin \
set qos=unlimited \
where account=research_team partition=compute -i
# Step 4: 驗證設定
sacctmgr show qos format=Name,MaxJobsPerUser
sacctmgr show assoc format=Account,User,Partition,QOS \
where partition=compute
# Step 5: 測試 (以一般 user 身份)
srun -p compute --qos=limit_3_jobs hostname
```
---
- ### 驗證與測試指令
```bash
# 查看所有 QOS
sacctmgr show qos
# 查看特定 partition 的 association 和 QOS
sacctmgr show assoc format=Cluster,Account,User,Partition,QOS \
where partition=compute
# 查看 user 的有效 QOS
sacctmgr show user <username> withassoc format=User,Account,Partition,QOS
# 測試 job 提交 (應該受到 QOS 限制)
for i in {1..5}; do
sbatch -p compute --wrap="sleep 300" &
done
# 查看正在執行的 job 數量
squeue -u $USER -p compute -t RUNNING | wc -l
# 應該不超過 3 個
```
---
- ### 移除/修改 QOS 指令
```bash
# 移除 account 的 QOS
sacctmgr modify account <account_name> \
set qos='' \
where partition=<partition_name>
# 刪除 QOS
sacctmgr delete qos limit_3_jobs
# 修改 QOS 參數
sacctmgr modify qos limit_3_jobs set MaxJobsPerUser=5
```
---
- ### 建議
**推薦使用策略 2 (針對 Account/User 套用)**,原因:
1. ✅ 靈活性高,可針對不同 user/account 設定不同限制
2. ✅ 可輕鬆設定 VIP user 例外
3. ✅ 不影響其他 partition
4. ✅ 符合多租戶環境的最佳實踐
策略 1 (Partition 層級) 適用於:
- 需要對所有 user 一視同仁的簡單環境
- 不需要例外處理的場景
所有指令中的 `-i` 參數代表 immediate (立即執行不詢問確認),生產環境建議移除此參數以進行人工確認。
根據我對 Slurm 原始碼和文檔的分析,我已經整理出 QoS 最常用的參數。讓我為您整理這些參數,依使用頻率由高到低排列:
<br>
### Slurm QoS 最常用參數(依使用頻率排序)
> by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/21)
#### **1. Priority(優先級)**
- **用途**:設定 QoS 的優先權,影響 job 排程優先順序
- **範例**:`Priority=100`
- **預設值**:未設定(無額外優先權)
#### **2. MaxJobsPerUser(每使用者最大執行作業數)**
- **用途**:限制單一使用者可同時執行的作業數量
- **範例**:`MaxJobsPerUser=3`
- **別名**:`MaxJobsPU`
#### **3. MaxSubmitJobsPerUser(每使用者最大提交作業數)**
- **用途**:限制單一使用者可同時處於待執行或執行中的作業總數
- **範例**:`MaxSubmitJobsPerUser=10`
- **別名**:`MaxSubmitJobsPU`
#### **4. GrpTRES(群組資源總量限制)**
- **用途**:限制此 QoS 所有執行中作業可使用的總資源量
- **範例**:`GrpTRES=cpu=24` 或 `GrpTRES=node=10,cpu=100,mem=500G`
- **常用資源**:cpu, mem, node, gres/gpu
#### **5. MaxTRESPerJob(每作業最大資源量)**
- **用途**:限制單一作業可使用的最大資源量
- **範例**:`MaxTRESPerJob=cpu=16,mem=64G`
- **別名**:`MaxTRES`, `MaxTRESPJ`
#### **6. MaxWall(每作業最大執行時間)**
- **用途**:限制單一作業的最長執行時間
- **範例**:`MaxWall=2:00:00`(2 小時)或 `MaxWall=7-00:00:00`(7 天)
- **格式**:`<min>` 或 `<hr>:<min>:<sec>` 或 `<days>-<hr>:<min>:<sec>`
- **別名**:`MaxWallDurationPerJob`
#### **7. GrpJobs(群組最大執行作業數)**
- **用途**:限制此 QoS 所有使用者可同時執行的作業總數
- **範例**:`GrpJobs=50`
#### **8. GrpSubmitJobs(群組最大提交作業數)**
- **用途**:限制此 QoS 所有作業(待執行+執行中)的總數
- **範例**:`GrpSubmitJobs=100`
- **別名**:`GrpSubmit`
#### **9. MaxTRESPerUser(每使用者最大資源量)**
- **用途**:限制單一使用者可同時使用的總資源量
- **範例**:`MaxTRESPerUser=cpu=48,mem=256G`
- **別名**:`MaxTRESPU`
#### **10. GrpTRESRunMins(群組資源執行分鐘數限制)**
- **用途**:限制執行中作業的資源時間總量(考慮 time limit)
- **範例**:`GrpTRESRunMins=cpu=10000`
- **說明**:達到限制時不會啟動新作業,直到有作業結束釋放時間
#### **11. MaxJobsPerAccount(每帳戶最大執行作業數)**
- **用途**:限制單一帳戶可同時執行的作業數量
- **範例**:`MaxJobsPerAccount=20`
- **別名**:`MaxJobsPA`
#### **12. MaxSubmitJobsPerAccount(每帳戶最大提交作業數)**
- **用途**:限制單一帳戶可同時處於待執行或執行中的作業總數
- **範例**:`MaxSubmitJobsPerAccount=50`
- **別名**:`MaxSubmitJobsPA`
#### **13. GrpWall(群組總執行時間限制)**
- **用途**:限制所有執行中作業的總執行時間,達到限制會拒絕新提交並終止執行中作業
- **範例**:`GrpWall=1000:00:00`
- **注意**:需啟用 Priority Multifactor plugin
#### **14. MaxTRESPerNode(每節點最大資源量)**
- **用途**:限制作業中每個節點可使用的資源量
- **範例**:`MaxTRESPerNode=cpu=32,mem=128G`
- **別名**:`MaxTRESPN`
#### **15. Flags(特殊標記)**
- **用途**:設定特殊行為標記
- **範例**:`Flags=DenyOnLimit,OverPartQOS`
- **常用標記**:
- `DenyOnLimit`:超過限制時直接拒絕提交
- `OverPartQOS`:覆蓋 Partition QoS 限制
- `NoReserve`:不在 backfill 中保留資源
- `RequiresReservation`:必須指定 reservation
#### **其他實用參數**
- **GrpTRESMins**:歷史累積資源分鐘數限制(會隨時間衰減)
- **MaxTRESMinsPerJob**:每作業最大資源分鐘數
- **Preempt**:可搶佔的其他 QoS 列表
- **PreemptMode**:搶佔模式(CANCEL, REQUEUE, SUSPEND)
- **GraceTime**:被搶佔時的寬限時間
- **UsageFactor**:使用量計算因子(影響 fairshare)
- **LimitFactor**:限制放大因子
#### **完整範例**
```bash
# 建立一般使用者 QoS
sacctmgr add qos normal \
Priority=50 \
MaxJobsPerUser=5 \
MaxSubmitJobsPerUser=20 \
MaxTRESPerJob=cpu=32,mem=128G \
MaxWall=24:00:00
# 建立高優先級 QoS(有限制)
sacctmgr add qos high_priority \
Priority=200 \
MaxJobsPerUser=2 \
MaxSubmitJobsPerUser=5 \
GrpTRES=cpu=100,mem=500G \
MaxWall=12:00:00 \
Flags=DenyOnLimit
# 建立測試用 QoS
sacctmgr add qos testing \
Priority=10 \
MaxJobsPerUser=10 \
GrpJobs=50 \
MaxTRESPerJob=cpu=4,mem=16G \
MaxWall=1:00:00 \
Preempt=normal
```
這份清單是根據 Slurm 測試套件中的使用頻率、文檔範例以及實際使用場景所整理。最常用的前五個參數(Priority, MaxJobsPerUser, MaxSubmitJobsPerUser, GrpTRES, MaxTRESPerJob)幾乎在所有 QoS 配置中都會使用。
<br>
### QoS 表格資訊快覽
> by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/21)
#### Slurm QoS 最常用參數表(依使用頻率排序)
| 排序 | 參數名稱 | 別名 | 用途說明 | 範例值 | 預設值 |
|------|---------|------|---------|--------|--------|
| 1 | **Priority** | - | 設定 QoS 優先權,影響作業排程順序 | `Priority=100` | 未設定 |
| 2 | **MaxJobsPerUser** | MaxJobsPU | 限制單一使用者可同時執行的作業數 | `MaxJobsPerUser=3` | 無限制 |
| 3 | **MaxSubmitJobsPerUser** | MaxSubmitJobsPU | 限制單一使用者可提交(待執行+執行中)的作業總數 | `MaxSubmitJobsPerUser=10` | 無限制 |
| 4 | **GrpTRES** | - | 限制此 QoS 所有執行中作業的總資源量 | `GrpTRES=cpu=24,mem=128G` | 無限制 |
| 5 | **MaxTRESPerJob** | MaxTRES, MaxTRESPJ | 限制單一作業可使用的最大資源量 | `MaxTRESPerJob=cpu=16,mem=64G` | 無限制 |
| 6 | **MaxWall** | MaxWallDurationPerJob | 限制單一作業的最長執行時間 | `MaxWall=2:00:00` 或 `7-00:00:00` | 無限制 |
| 7 | **GrpJobs** | - | 限制此 QoS 所有使用者可同時執行的作業總數 | `GrpJobs=50` | 無限制 |
| 8 | **GrpSubmitJobs** | GrpSubmit | 限制此 QoS 所有作業(待執行+執行中)的總數 | `GrpSubmitJobs=100` | 無限制 |
| 9 | **MaxTRESPerUser** | MaxTRESPU | 限制單一使用者可同時使用的總資源量 | `MaxTRESPerUser=cpu=48,mem=256G` | 無限制 |
| 10 | **GrpTRESRunMins** | - | 限制執行中作業的資源時間總量(考慮 time limit) | `GrpTRESRunMins=cpu=10000` | 無限制 |
| 11 | **MaxJobsPerAccount** | MaxJobsPA | 限制單一帳戶可同時執行的作業數量 | `MaxJobsPerAccount=20` | 無限制 |
| 12 | **MaxSubmitJobsPerAccount** | MaxSubmitJobsPA | 限制單一帳戶可提交的作業總數 | `MaxSubmitJobsPerAccount=50` | 無限制 |
| 13 | **GrpWall** | - | 限制所有執行中作業的總執行時間 | `GrpWall=1000:00:00` | 無限制 |
| 14 | **MaxTRESPerNode** | MaxTRESPN | 限制作業中每個節點可使用的資源量 | `MaxTRESPerNode=cpu=32,mem=128G` | 無限制 |
| 15 | **Flags** | - | 設定特殊行為標記 | `Flags=DenyOnLimit,OverPartQOS` | 無標記 |
#### MaxWall 時間格式說明
| 格式 | 範例 | 說明 |
|------|------|------|
| `<min>` | `60` | 60 分鐘 |
| `<hr>:<min>:<sec>` | `2:30:00` | 2 小時 30 分鐘 |
| `<days>-<hr>:<min>:<sec>` | `7-12:00:00` | 7 天 12 小時 |
#### 常用 Flags 標記
| 標記 | 功能說明 |
|------|---------|
| **DenyOnLimit** | 超過限制時直接拒絕作業提交(而非排隊等待) |
| **OverPartQOS** | 此 QoS 設定會覆蓋 Partition QoS 的限制 |
| **NoReserve** | 不在 backfill 排程中為此 QoS 作業保留資源 |
| **RequiresReservation** | 使用此 QoS 的作業必須指定 reservation |
| **PartitionMaxNodes** | 強制執行 partition 的 MaxNodes 限制 |
| **PartitionMinNodes** | 強制執行 partition 的 MinNodes 限制 |
| **PartitionTimeLimit** | 強制執行 partition 的 TimeLimit 限制 |
#### 其他實用參數
| 參數名稱 | 用途說明 | 範例 |
|---------|---------|------|
| **GrpTRESMins** | 歷史累積資源分鐘數限制(會隨時間衰減) | `GrpTRESMins=cpu=100000` |
| **MaxTRESMinsPerJob** | 單一作業最大資源分鐘數(資源量×時間) | `MaxTRESMinsPerJob=cpu=10000` |
| **Preempt** | 可搶佔的其他 QoS 列表 | `Preempt=normal,low` |
| **PreemptMode** | 搶佔模式 | `PreemptMode=REQUEUE` |
| **GraceTime** | 被搶佔時的寬限時間 | `GraceTime=00:05:00` |
| **UsageFactor** | 使用量計算因子(影響 fairshare) | `UsageFactor=2.0` |
| **LimitFactor** | 限制放大因子 | `LimitFactor=1.5` |
#### 常見使用情境範例
##### 情境 1:一般使用者 QoS
```bash
sacctmgr add qos normal \
Priority=50 \
MaxJobsPerUser=5 \
MaxSubmitJobsPerUser=20 \
MaxTRESPerJob=cpu=32,mem=128G \
MaxWall=24:00:00
```
##### 情境 2:高優先級 QoS(有資源限制)
```bash
sacctmgr add qos high_priority \
Priority=200 \
MaxJobsPerUser=2 \
MaxSubmitJobsPerUser=5 \
GrpTRES=cpu=100,mem=500G \
MaxWall=12:00:00 \
Flags=DenyOnLimit,OverPartQOS
```
##### 情境 3:測試用 QoS(可被搶佔)
```bash
sacctmgr add qos testing \
Priority=10 \
MaxJobsPerUser=10 \
GrpJobs=50 \
MaxTRESPerJob=cpu=4,mem=16G \
MaxWall=1:00:00 \
Preempt=normal
```
##### 情境 4:大型作業 QoS(需 Reservation)
```bash
sacctmgr add qos large_jobs \
Priority=150 \
MaxJobsPerUser=1 \
MaxTRESPerJob=node=20,cpu=800 \
MaxWall=7-00:00:00 \
Flags=RequiresReservation
```
這樣的表格格式讓參數對照更清楚明瞭!
<br>
---
---
<br>
# slurmdb 欄位
## SlurmDB 資料表欄位說明
### [前言] 欄位說明補充
- **時間戳記欄位** (`creation_time`, `mod_time`):使用 Unix timestamp(`bigint unsigned`)格式
- **軟刪除機制**:`deleted` 欄位允許邏輯刪除而不實際移除資料
- **Admin Level** (`admin_level`):定義使用者的管理權限層級(預設值為 1)
- **文字欄位長度限制**:
- `tinytext`:最大 255 bytes
- `text`:最大 65,535 bytes
- **資料來源**:https://github.com/SchedMD/slurm/blob/master/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c#L519-L677
<br>
---
### Account 表格 (acct_table)
| 欄位名稱 | 資料型別 | 限制條件 | 說明 |
|---------|---------|---------|------|
| `creation_time` | `bigint unsigned` | `not null` | 建立時間戳記 |
| `mod_time` | `bigint unsigned` | `default 0 not null` | 最後修改時間戳記 |
| `deleted` | `tinyint` | `default 0` | 軟刪除標記(0=未刪除,1=已刪除) |
| `flags` | `int unsigned` | `default 0` | 帳號旗標設定 |
| `name` | `tinytext` | `not null` | 帳號名稱(主鍵) |
| `description` | `text` | `not null` | 帳號描述 |
| `organization` | `text` | `not null` | 所屬組織 |
**索引鍵:** `PRIMARY KEY (name(42))`
<br>
---
### User 表格 (user_table)
| 欄位名稱 | 資料型別 | 限制條件 | 說明 |
|---------|---------|---------|------|
| `creation_time` | `bigint unsigned` | `not null` | 建立時間戳記 |
| `mod_time` | `bigint unsigned` | `default 0 not null` | 最後修改時間戳記 |
| `deleted` | `tinyint` | `default 0` | 軟刪除標記(0=未刪除,1=已刪除) |
| `name` | `tinytext` | `not null` | 使用者名稱(主鍵) |
| `admin_level` | `smallint` | `default 1 not null` | 管理者權限等級 |
- **索引鍵**: `PRIMARY KEY (name(42))`
- **更多資訊**:[[HackMD] [Account] Account / user table](https://hackmd.io/SCBBhOWKTYKZaZiw2kxAdQ)
<br>
---
### Account Coordinator 表格 (acct_coord_table)
這是關聯 account 和 user 的協調員表格:
| 欄位名稱 | 資料型別 | 限制條件 | 說明 |
|---------|---------|---------|------|
| `creation_time` | `bigint unsigned` | `not null` | 建立時間戳記 |
| `mod_time` | `bigint unsigned` | `default 0 not null` | 最後修改時間戳記 |
| `deleted` | `tinyint` | `default 0` | 軟刪除標記 |
| `acct` | `tinytext` | `not null` | 帳號名稱 |
| `user` | `tinytext` | `not null` | 使用者名稱 |
**索引鍵:**
- `PRIMARY KEY (acct(42), user(42))`
- `KEY user (user(42))`
<br>
---
### Association 表格 (assoc_table)
| 欄位名稱 | 資料型別 | 限制條件 | 說明 |
|---------|---------|---------|------|
| `creation_time` | `bigint unsigned` | `not null` | 建立時間戳記 |
| `mod_time` | `bigint unsigned` | `default 0 not null` | 最後修改時間戳記 |
| `deleted` | `tinyint` | `default 0 not null` | 軟刪除標記(0=未刪除,1=已刪除) |
| `comment` | `text` | - | 註解說明 |
| `flags` | `int unsigned` | `default 0 not null` | 旗標設定 |
| `is_def` | `tinyint` | `default 0 not null` | 是否為預設 association(0=否,1=是) |
| `id_assoc` | `int unsigned` | `not null auto_increment` | **Association ID(主鍵,自動遞增)** |
| `user` | `tinytext` | `not null default ''` | 使用者名稱(可為空=account association) |
| `acct` | `tinytext` | `not null` | 帳號名稱 |
| `partition` | `tinytext` | `not null default ''` | 分區名稱(可為空) |
| `parent_acct` | `tinytext` | `not null default ''` | 父帳號名稱 |
| `id_parent` | `int unsigned` | `not null` | 父 association 的 ID |
| `lineage` | `text` | - | 帳號層級譜系 |
| `shares` | `int` | `default 1 not null` | 公平共享份額(預設 1) |
| `max_jobs` | `int` | `default NULL` | 最大同時執行作業數 |
| `max_jobs_accrue` | `int` | `default NULL` | 最大累積優先權的作業數 |
| `min_prio_thresh` | `int` | `default NULL` | 最小優先權門檻 |
| `max_submit_jobs` | `int` | `default NULL` | 最大提交作業數 |
| `max_tres_pj` | `text` | `not null default ''` | 每作業最大 TRES(Trackable RESources) |
| `max_tres_pn` | `text` | `not null default ''` | 每節點最大 TRES |
| `max_tres_mins_pj` | `text` | `not null default ''` | 每作業最大 TRES 分鐘數 |
| `max_tres_run_mins` | `text` | `not null default ''` | 執行最大 TRES 分鐘數 |
| `max_wall_pj` | `int` | `default NULL` | 每作業最大執行時間(分鐘) |
| `grp_jobs` | `int` | `default NULL` | 群組最大同時執行作業數 |
| `grp_jobs_accrue` | `int` | `default NULL` | 群組最大累積優先權的作業數 |
| `grp_submit_jobs` | `int` | `default NULL` | 群組最大提交作業數 |
| `grp_tres` | `text` | `not null default ''` | 群組最大 TRES |
| `grp_tres_mins` | `text` | `not null default ''` | 群組最大 TRES 分鐘數 |
| `grp_tres_run_mins` | `text` | `not null default ''` | 群組執行最大 TRES 分鐘數 |
| `grp_wall` | `int` | `default NULL` | 群組最大執行時間(分鐘) |
| `priority` | `int unsigned` | `default NULL` | 優先權等級 |
| `def_qos_id` | `int` | `default NULL` | 預設 QoS(Quality of Service)ID |
| `qos` | `blob` | `not null default ''` | 允許的 QoS 列表(二進位格式) |
| `delta_qos` | `blob` | `not null default ''` | 增量 QoS 列表(二進位格式) |
- ### 索引鍵:
- `PRIMARY KEY (id_assoc)`
- `UNIQUE INDEX udex (user(42), acct(42), partition(42))`
- ### Association 表格關鍵概念
**Association** 是 Slurm 中最核心的權限與資源管理機制,它定義了:
1. **User ↔ Account 的關聯**:
- 當 `user` 欄位有值時,這是 **User Association**(使用者綁定到特定帳號)
- 當 `user` 欄位為空時,這是 **Account Association**(帳號本身的設定)
2. **階層式帳號結構**:
- `parent_acct` 和 `id_parent` 定義帳號的父子關係
- `lineage` 記錄完整的帳號層級路徑
3. **資源限制(Limits)**:
- **個人限制**:`max_*` 開頭的欄位(如 `max_jobs`, `max_wall_pj`)
- **群組限制**:`grp_*` 開頭的欄位(如 `grp_jobs`, `grp_tres`)
4. **TRES(Trackable RESources)**:
- 可追蹤的資源類型(CPU、Memory、GPU、Licenses 等)
- 以文字格式儲存資源配額(如 `cpu=100,mem=512G,gpu=4`)
5. **Partition 綁定**:
- 可以為特定 partition(分區)設定不同的 association
- `partition` 欄位為空表示適用於所有分區
- ### 資料來源
https://github.com/SchedMD/slurm/blob/master/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c#L1136-L1190
<br>
---
<br>
## SlurmDB 資料表 Q & A
### 為何 `sacctmgr [create|modify]` 沒辦法直接對 association 操作?
- ### `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/31)
答案是:**sacctmgr 可以操作 association,但不是直接使用 "association" 這個實體名稱,而是透過操作 "User" 和 "Account" 來間接管理 association**。
---
### 📌 關鍵原因分析
根據原始碼的實作(`src/sacctmgr/sacctmgr.c:649-935`),sacctmgr 的設計哲學是:
#### 1. **建立 (CREATE/ADD) 命令支援的實體**
```c
// sacctmgr.c:673-695
if (!xstrncasecmp(argv[0], "Account", MAX(command_len, 1))) {
error_code = sacctmgr_add_account((argc - 1), &argv[1]);
} else if (!xstrncasecmp(argv[0], "Cluster", MAX(command_len, 2))) {
error_code = sacctmgr_add_cluster((argc - 1), &argv[1]);
} else if (!xstrncasecmp(argv[0], "User", MAX(command_len, 1))) {
error_code = sacctmgr_add_user((argc - 1), &argv[1]);
}
// ❌ 沒有 "Association" 選項
```
#### 2. **修改 (MODIFY) 命令支援的實體**
```c
// sacctmgr.c:906-930
if (xstrncasecmp(argv[0], "Accounts", MAX(command_len, 1)) == 0) {
error_code = sacctmgr_modify_account((argc - 1), &argv[1]);
} else if (xstrncasecmp(argv[0], "Users", MAX(command_len, 1)) == 0) {
error_code = sacctmgr_modify_user((argc - 1), &argv[1]);
}
// ❌ 沒有 "Association" 選項
```
#### 3. **查詢 (LIST/SHOW) 命令則有支援 Association**
```c
// sacctmgr.c:816-818
} else if (xstrncasecmp(argv[0], "Associations", MAX(command_len, 2)) == 0) {
error_code = sacctmgr_list_assoc((argc - 1), &argv[1]);
}
// ✅ 可以 LIST Associations
```
---
### 🎯 正確的使用方式
#### ❌ **錯誤語法(不支援)**
```bash
# 這些命令不存在
sacctmgr create association ... # ❌ 不支援
sacctmgr modify association ... # ❌ 不支援
```
#### ✅ **正確語法(間接操作 Association)**
**1. 建立 Association:透過 `add user` 或 `add account`**
```bash
# 建立 User Association(user + account + cluster)
sacctmgr add user brian account=chemistry
# 為使用者新增到特定 cluster
sacctmgr add user adam account=physics cluster=tux
# 建立 Account(會自動建立 Account Association)
sacctmgr add account physics
```
**2. 修改 Association:透過 `modify user` 或 `modify account`**
```bash
# 修改 User Association 的資源限制
sacctmgr modify user where name=adam cluster=tux account=physics \
set maxjobs=2 maxwall=30:00
# 正確的語法結構(WHERE 子句很重要)
sacctmgr modify user name=adam cluster=tux set fairshare=10
sacctmgr modify user name=adam set fairshare=10 where cluster=tux
# 修改 QoS(使用 += 運算子)
sacctmgr modify user name=adam set qos+=expedite
```
**3. 查詢 Association:可以直接使用 `list associations`**
```bash
# 這個是可以的!
sacctmgr list associations cluster=tux format=Account,Cluster,User,Fairshare tree withd
```
---
### 🧠 設計理念
Slurm 的 Association 設計採用「**自動管理**」策略:
| 操作 | 自動建立的 Association |
|------|----------------------|
| `add account test` | 建立 Account Association(account=test) |
| `add user adam account=test` | 建立 User Association(user=adam, account=test) |
| `modify user name=adam ...` | 修改 User Association 的屬性 |
**為什麼這樣設計?**
1. **簡化操作**:避免使用者需要手動管理複雜的 association ID
2. **保持一致性**:User 和 Account 的關聯自動維護
3. **抽象層次**:使用者只需關注「將 user 加入 account」,而不需理解底層的 association 機制
---
### 📚 補充:Association 的三種類型
| Association 類型 | user 欄位 | acct 欄位 | 建立方式 |
|----------------|----------|----------|---------|
| **Root Association** | 空 | `root` | 系統自動建立 |
| **Account Association** | 空 | 有值 | `sacctmgr add account` |
| **User Association** | 有值 | 有值 | `sacctmgr add user` |
---
### 總結
**sacctmgr 沒有直接的 `create/modify association` 命令的原因:**
1. **設計哲學**:Association 是 User 與 Account 的關聯,透過操作 User/Account 自動管理 Association 更符合直覺
2. **降低複雜度**:避免使用者需要手動處理 association ID 和資料庫 schema
3. **保持一致性**:由系統自動維護 User-Account-Cluster 的關聯關係
正確做法是使用 `sacctmgr [add|modify] user` 或 `sacctmgr [add|modify] account` 來間接管理 association,只有在查詢時才使用 `sacctmgr list associations`。
參考檔案:
- `src/sacctmgr/sacctmgr.c:649-935`
- `doc/man/man1/sacctmgr.1:3736-3787`
<br>
---
---
<br>
# Q & A
## modify & update 指令
### 自動化注意事項
- `-i`, `--immediate`: commit changes immediately
直接跳過「**是否要提交變更?**」的互動確認,直接送出變更
- **簡單講**:**不確認有哪些變更,直接送出 commit**
- **用途**:適合自動化作業
- **備註**:
- 若本來就沒有需要提交的東西(例如 list/show、或 modify where ... 沒選到任何對象),加不加 -i 看起來就「沒差」。
<br>
## Troubleshooting
### [重要] 使用 modify & update 指令設定好,卻沒有效果?
- ### 問題:設定上沒有同步,或有延遲
- ### 解法1:讓控制器重讀設定與快取 (i.e. 把控制器強制刷新)
```bash
# 在實體機或 VM 中,重啟 controller
systemctl restart slurmctld
# 在 K8s 環境中,讓控制器重讀設定與快取
kubectl -n slurm exec pod/slurm-controller-0 -- scontrol reconfigure
# 在 pod / container 中執行:
scontrol reconfigure
```
- **Slurm-on-K8s / Slinky operator**
```bash
# 讓控制器重讀設定與快取
kubectl -n slurm exec pod/slurm-controller-0 -- scontrol reconfigure
```
或是:
- 在 control 節點、login 節點、compute 節點 (能執行 `scontrol` 指令的地方)
都適合執行 `scontrol reconfigure`
- **需要 Slurm 管理員權限**
- ### 解法2:
如果需要立即生效,加上 -i 選項:
```
sacctmgr -i ...
```
- `-i` or `--immediate`: commit changes immediately
<br>
---
<br>
### [重要] srun: error: Unable to allocate resources: Invalid account or account/partition combination specified --> negative cache 問題
- ### 問題:
- 沒有正確關聯下,執行 srun 失敗
- 管理者設定正確關聯後,執行 srun 依舊遇到失敗
- ### 解法1:讓控制器重讀設定與快取 (i.e. 把控制器強制刷新)
```bash
# 在實體機或 VM 中,重啟 controller
systemctl restart slurmctld
# 在 K8s 環境中,讓控制器重讀設定與快取
kubectl -n slurm exec pod/slurm-controller-0 -- scontrol reconfigure
# 在 pod / container 中執行:
scontrol reconfigure
```
- **Slurm-on-K8s / Slinky operator**
```bash
# 讓控制器重讀設定與快取
kubectl -n slurm exec pod/slurm-controller-0 -- scontrol reconfigure
```
或是:
- 在 control 節點、login 節點、compute 節點 (能執行 `scontrol` 指令的地方)
都適合執行 `scontrol reconfigure`
- **需要 Slurm 管理員權限**
- ### 解法2:
如果需要立即生效,加上 -i 選項:
```
sacctmgr -i ...
```
- `-i` or `--immediate`: commit changes immediately
- ### 備註:
- `sacctmgr delete user` 不會有 cache 問題
- ### 補充:
> codebase: https://github.com/SchedMD/slurm
> by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/21)
### **長期預防措施**
在您的程式碼中,當執行 `sacctmgr create user` 新增 partition association 後:
```python
# 新增 association
subprocess.run([
"sacctmgr", "-i", "create", "user", username,
"defaultaccount", account,
"partition", partition
])
# 立即觸發 controller 重新讀取 database
subprocess.run(["scontrol", "reconfigure"])
```
這樣可以確保:
1. Association 變更立即生效
2. User 不會遇到 cache 導致的失敗
3. 不需要重啟 slurmctld
---
### 總結
**失敗的原因**是:user 在 association 建立前執行了 `srun`,導致 Slurm controller 產生 negative cache,即使後續新增了正確的 association,cache 仍未更新。
**最佳解法**:在程式中自動執行 `scontrol reconfigure` 來強制更新 cache。
<br>
---
<br>
### [重要] 無法變更 account 資訊? --> Slurm 的設計限制:無法直接修改使用者的 account
- ### 問題:無法將 account=tp 變更為 account=tn?
```
$ sacctmgr show user --ass where user=tj_tsai@asus.com
User Def Acct Admin Cluster Account Partition Share Priority MaxJobs MaxNodes MaxCPUs MaxSubmit MaxWall MaxCPUMins QOS Def QOS
------- ---------- --------- ---------- ---------- ---------- --------- ---------- ------- -------- -------- --------- ----------- ----------- -------------------- ---------
tj_tsai tp None slurm_slu+ tp cpu-set 1 normal
$ sacctmgr modify user set account=tn where user=tj_tsai@asus.com
Unknown option: account=tn
Use keyword 'where' to modify condition
$ sacctmgr modify user set account=tn where user=tj_tsai@asus.com account=tp
Unknown option: account=tn
Use keyword 'where' to modify condition
```
- ### 快速解法
- 修改 account 欄位作法:
- 步驟 1: 建立新的 association
- 步驟 2: 更新 DefaultAccount
- 步驟 3: 刪除舊的 association
目的:確保 user 始終至少有一個有效的 association
- ### 詳細解法
> codebase: https://github.com/SchedMD/slurm
> by `us.anthropic.claude-sonnet-4-5-20250929-v1:0` (2026/01/21)
根據以上分析,我現在理解問題所在了。讓我總結一下:
### **問題根因分析**
根據 Slurm 原始碼和官方文件,**無法直接修改使用者的 account**。這是 Slurm 的設計限制。
### **關鍵發現**
從 `doc/man/man1/sacctmgr.1:3744-3746` 可以看到明確說明:
```
A user's account can not be changed directly. A new association needs to be
created for the user with the new account. Then the association with the old
account can be deleted.
```
**中文翻譯:**
「使用者的帳號無法直接變更。需要為使用者建立一個新的關聯(association)到新帳號,然後刪除與舊帳號的關聯。」
### **可修改的欄位**
從 `src/sacctmgr/user_functions.c:328-415` 的 `_set_rec` 函數可以看到,`sacctmgr modify user set` 只能修改以下欄位:
1. **AdminLevel** - 管理員權限層級
2. **DefaultAccount** - 預設帳號(但不是 association 的 account)
3. **DefaultWCKey** - 預設工作鍵
4. **NewName** - 重新命名使用者
5. **RawUsage** - 原始使用量
6. **Association 相關欄位** (如 fairshare, maxjobs, qos 等)
**注意:`account` 欄位不在可修改清單中!**
### **為何出現 "Unknown option: account=tn" 錯誤**
在 `src/sacctmgr/user_functions.c:405-408` 中:
```c
} else {
exit_code=1;
fprintf(stderr, " Unknown option: %s\n"
" Use keyword 'where' to modify condition\n",
argv[i]);
}
```
當你嘗試使用 `set account=tn` 時,因為 `account` 不是可修改的欄位,所以會觸發 "Unknown option" 錯誤。
---
## **正確的解決方案**
要將使用者從 `tp` 帳號變更為 `tn` 帳號,需要執行以下步驟:
### **步驟 1: 建立新的 association**
```bash
sacctmgr add user tj_tsai@asus.com account=tn cluster=slurm_slurm
```
### **步驟 2: 如果需要,更新 DefaultAccount**
```bash
sacctmgr modify user tj_tsai@asus.com set defaultaccount=tn
```
### **步驟 3: 刪除舊的 association**
```bash
sacctmgr delete user tj_tsai@asus.com account=tp cluster=slurm_slurm
```
### **驗證結果**
```bash
sacctmgr show user --ass where user=tj_tsai@asus.com
```
---
## **重要注意事項**
1. **執行順序很重要**:必須先建立新 association,再刪除舊的,以確保使用者始終有至少一個有效的 association
2. **如果使用者有執行中的任務**:可能需要等待任務完成後再刪除舊 association,避免影響現有任務
3. **權限限制**:這些操作需要 Slurm 管理員權限(admin level)
4. **Cluster 指定**:如果有多個 cluster,需要為每個 cluster 分別執行這些步驟
這個設計是 Slurm 刻意為之,因為 user-account 的關聯(association)是 Slurm 會計系統的核心概念,需要明確的建立和刪除操作來維護審計追蹤。
---
---
<br>
# 🎯 教學目標1
1. 為不同使用者設計可隔離的運算資源 (Partition)。
2. 透過 Slurm 的帳號(Account)機制將使用者與資源對應。
3. 實作管理者帳號,擁有全域可見與控制權限。
4. 驗證不同使用者看到的 partition 是否正確,並能否成功提交作業。
<br>
---
## 🧑🏫 教學場景設定
| 身份 | Slurm 使用者名<br>(name) | 所屬帳號<br>(account) | 權限角色<br>(AdminLevel) | 可用運算資源<br> (Partition) |
| ---- | ---------- | ------- | -------- | ------------- |
| 管理者1 | `admin1` | `admin` | AdminLevel=Admin | 所有 partitions |
| 管理者2 | `admin2` | `admin` | AdminLevel=Admin | 所有 partitions |
| 工程部門 | `alice` | `eng` | 一般使用者 | `eng`, `shared` |
| 研究部門 | `bob` | `res` | 一般使用者 | `res`, `shared` |
<br>
---
## 🧱 Partition 規劃
```slurm.conf(片段):
PartitionName=eng Nodes=node[0-1] Default=NO MaxTime=INFINITE State=UP AllowAccounts=eng
PartitionName=res Nodes=node[2-3] Default=NO MaxTime=INFINITE State=UP AllowAccounts=res
PartitionName=shared Nodes=node[0-3] Default=YES MaxTime=INFINITE State=UP AllowAccounts=ALL
```
- 留意新增參數 `AllowAccounts`
- [[doc] PARTITION CONFIGURATION](https://slurm.schedmd.com/slurm.conf.html#SECTION_PARTITION-CONFIGURATION)
> https://slurm.schedmd.com/slurm.conf.html
>
| 屬性 | 預設值 | 值清單 |
|-----|-------|-------|
| [PartitionName](https://slurm.schedmd.com/slurm.conf.html#OPT_PartitionName) |
| [Nodes](https://slurm.schedmd.com/slurm.conf.html#OPT_Nodes_1)
| [Default](https://slurm.schedmd.com/slurm.conf.html#OPT_Default) | `NO` | `YES`, `NO` |
| [MaxTime](https://slurm.schedmd.com/slurm.conf.html#OPT_MaxTime)
| [State](https://slurm.schedmd.com/slurm.conf.html#OPT_State_2) | `UP` | `UP`, `DOWN"`, `DRAIN`, `INACTIVE` |
| [AllowAccounts](https://slurm.schedmd.com/slurm.conf.html#OPT_AllowAccounts) | `ALL` | 允許多值,以逗號(`,`)區隔 |
<br>
---
<br>
## 🔧 設定步驟
> - `sacctmgr` 支援 tab auto-completion,按 `[tab]` 就能顯示可用參數
> 
<br>
### 步驟 1:建立帳號(Account)
> - 建立組織單位(或專案名稱),不是個人帳號
> - 每個 account 下,可在建立多個 user (小號, 個人帳號)
```bash
sacctmgr add account eng Description="Engineering"
sacctmgr add account res Description="Research"
sacctmgr add account admin Description="Admin Group"
```
- 子指令 `add account` or `create account` 可互換
- account 名稱,可包含 `-` (dash),如 `admin-1`, `admin-2`
- 建立完後,可用底下指令查看:
```bash
$ sacctmgr list account
$ sacctmgr show account
Account Descr Org
---------- -------------------- --------------------
admin admin group admin
eng engineering eng
res research res
root default root account root
```
- 子指令 `list account` or `show account` 可互換
<br>
---
### 步驟 2:建立使用者(user),並關聯到帳號(Account)
> - 定義某個組織單位(或專案名稱)中,有哪些成員?
```bash
sacctmgr add user name=admin1 cluster=slurm account=admin AdminLevel=Admin
sacctmgr add user name=admin2 cluster=slurm account=admin AdminLevel=Admin
sacctmgr add user name=alice cluster=slurm account=eng
sacctmgr add user name=bob cluster=slurm account=res
```
- 子指令 `add user` or `create user` 可互換
- 如果只有一個 cluster,`cluster` 參數可忽略
<br>
---
### 步驟 3:設定 Account 的計算資源(partition)
> - partition 的另類說法,就是「**資源池**」
> - 設定 partition 可以讓哪些 account (組織單位) 存取
```bash
# 確保這些內容存在於 slurm.conf 或 Helm 的 values.yaml 中
PartitionName=eng Nodes=node[0-1] AllowAccounts=eng Default=NO MaxTime=INFINITE State=UP
PartitionName=res Nodes=node[2-3] AllowAccounts=res Default=NO MaxTime=INFINITE State=UP
PartitionName=shared Nodes=node[0-3] AllowAccounts=ALL Default=YES MaxTime=INFINITE State=UP
```
- **關於 partition**
- 相關指令
```
$ sinfo
$ scontrol show partition [-a]
```
- `admin1`, `admin2` 是管理者帳號,擁有完整權限,可以看到所有 partition 和 job。
- user 可以看到其他 partition 資訊,只是無法提交任務
- **關於 SlinkyProject 的設定方式**
Slinky 中如使用 Helm,請透過 `compute.partitions[*].config.AllowAccounts` 欄位進行設定。
```
compute
partitions:
- name: all
...
# -- (map[string]string | map[string][]string)
# Extra Slurm partition configuration appended onto the partition line.
# Ref: https://slurm.schedmd.com/slurm.conf.html#lbAI
config:
State: UP
Default: "YES"
MaxTime: UNLIMITED
AllowAccounts: eng
```
- **關於隱藏 partition**
- `Hidden=[YES|NO]`
- 如果要隱藏某個 partition,可額外添加 `Hidden=YES` 設定。
```conf
# slurm.conf
PartitionName=eng Nodes=node[0-1] AllowAccounts=eng Hidden=YES Default=NO MaxTime=INFINITE State=UP
```
- **視覺上隔離,非物理上隔離**。
- 一般 user 可下 `-a` 參數顯示(看得到,吃不到)
```
$ scontrol show partition -a
```
- 對應的效果
| 指令 | 對於某個 partition ,沒有存取權限的 user ,其效果如下: |
|-----|-----|
| `$ sinfo` | 沒有存取權限的 partition -> 被隱藏起來 |
| `$ sinfo -a` | 沒有存取權限的 partition -> **可以看到** |
| `$ scontrol show partition` | 沒有存取權限的 partition -> 被隱藏起來 |
| `$ scontrol show partition -a` | 沒有存取權限的 partition -> **可以看到** |
| `$ cat /run/slurm/conf/slurm.conf` | 可看到 partition 設定
| `$ sacctmgr show account` | 仍然可看到其它 account |
| `$ sacctmgr show user` | 仍然可看到其他 user |
<br>
---
### 步驟 4:啟用限制檢查
在 `slurm.conf` 中加入:
```conf
AccountingStorageEnforce=associations
EnforcePartLimits=ALL
```
- 這樣 Slurm 才會根據 AllowAccounts/使用者帳號設定進行限制。
- `EnforcePartLimits=ALL`
讓 Slurm 在提交作業時就檢查 Partition 的各項限制,包括 `AllowAccounts`, `AllowGroups` 等
<br>
---
### 步驟 5:在 login 節點,建立對應 user 的 Linux 帳號
```bash
$ ssh root@127.0.0.1 -p 32222 # 進入到 login 節點
# -m: 建立 home 目錄 (/home/admin1)
# -s: 使用 `/bin/bash`,而不是 `/bin/sh`
root@slurm-login-6fb5d948d6-5mcvp:~# useradd admin1 -m -s /bin/bash
root@slurm-login-6fb5d948d6-5mcvp:~# passwd admin1
New password:
BAD PASSWORD: The password is shorter than 8 characters
# 同理:建立底下 user
# $ useradd admin2 -m -s /bin/bash
# $ passwd admin2
#
# $ useradd alice -m -s /bin/bash
# $ passwd alice
#
# $ useradd bob -m -s /bin/bash
# $ passwd bob
```
- 建立完 Linux 帳號後,使用 `admin1`, `alice` 帳號連線測試:
```
$ ssh admin1@127.0.0.1 -p 32222 # 進入到 login 節點
$ ssh alice@127.0.0.1 -p 32222 # 進入到 login 節點
```
- `admin1`

- `alice`

---
## ✅ 測試任務
| 測試人 | 指令 | 預期結果 |
| ------ | ---------------------- | -------------------------- |
| alice | `sinfo` | 只能看到 `eng`, `shared` |
| bob | `sinfo` | 只能看到 `res`, `shared` |
| admin1 | `sinfo` | 可以看到全部三個 partitions |
| bob | `sbatch -p eng job.sh` | **被拒絕**,因 bob 所屬帳號不是 eng |
| alice | `sbatch -p res job.sh` | **被拒絕**,因 alice 所屬帳號不是 res |
| admin1 | `sbatch -p res job.sh` | **成功**,管理員可繞過 partition 限制 |
---
## 🎓 延伸學習
* 利用 `sacctmgr list association format=user,account,adminlevel` 檢查權限分布
* 若結合 LDAP,可定期同步群組對應 Slurm 帳號
* 可用 `scontrol show job <jobid>` 來確認作業被分配的 Partition 和帳號
* 可設計 `shared` Partition 有限資源,鼓勵使用者使用自己專屬 Partition
<br>
---
---
<br>
# 延伸議題
## partition 可見性
### AdminLevel
- ### docs
- [AUTHORIZATION](https://slurm.schedmd.com/scontrol.html#SECTION_AUTHORIZATION)
> 提到三個角色 Operator, Admin, coordinators
- scontrol create partition: Admin
- scontrol show partition: Admin, Operator
- scontrol update partition: Admin
- scontrol delete partition: Admin
<br>
### [partition] attribute: Hidden?
- ### forums
- [[slurm-users] How to use partition option "Hidden"?](https://groups.google.com/g/slurm-users/c/31_C9tjmfY8)
<br>
### [partition] attribute: AllowGroups?
- ### forums
- [How does one configure SLURM groups to limit access to partitions?](https://ask.cyberinfrastructure.org/t/how-does-one-configure-slurm-groups-to-limit-access-to-partitions/39/1)
```
PartitionName=xyzPartition Nodes=compute[001-010] Priority=1000 AllowGroups=xxxMioNodes, yyyMioNodes, zzzMioNodes
```
- ### logs
- AllowGroups 如果不存在,有底下錯誤:
在 ‵slurm.conf‵ 中設定 ‵AllowGroups=eng‵
```
# slurm.conf
PartitionName=debug Nodes=e900 Default=NO MaxTime=UNLIMITED State=UP AllowGroups=eng AllowAccounts=eng Hidden=YES
```
controller node 中,groups 如果沒有 eng,會有底下錯誤:
```
ocisadmin@ocis-esc4000a-e11:~$ k logs pod/slurm-controller-0 | grep 'not find'
[2025-07-25T10:13:01.855] error: _get_group_members: Could not find configured group eng
[2025-07-25T10:13:04.788] error: _get_group_members: Could not find configured group eng
```
<br>
### [slurm.conf] attribute: PrivateData?
- ### docs
- [[scontrol] AUTHORIZATION](https://slurm.schedmd.com/scontrol.html#SECTION_AUTHORIZATION)
- [[slurm.conf] PrivateData](https://slurm.schedmd.com/slurm.conf.html#OPT_PrivateData)
- ### 設定方式
```
# slurm.conf
PrivateData=accounts,users,partitions,nodes
```
- ### logs
```
tj@slurm-login-6fb5d948d6-d9xh6:~$ scontrol show partitions
slurm_load_partitions error: Access/permission denied
tj@slurm-login-6fb5d948d6-d9xh6:~$ sacctmgr show account
Account Descr Org
---------- -------------------- --------------------
admin admin group admin
eng engineering eng
games games games
res research res
root default root account root
tj-account tj exclusive tj-account
tj@slurm-login-6fb5d948d6-d9xh6:~$ sacctmgr show user
User Def Acct Admin
---------- ---------- ---------
admin1 admin Administ+
alice eng None
bob res None
root root Administ+
tj tj-account None
```
<br>
{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}