system / 指令不需加 `sudo` 的方式
===
###### tags: `OS / Ubuntu / cmd / system`
###### tags: `OS`, `Ubuntu`, `linux`, `command`, `system`, `sudo`, `usermod`, `docker`
<br>
[TOC]
<br>
## for Docker
### Error:
```
$ docker run hello-world
docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied
Run 'docker run --help' for more information
```
### Troubleshooting
```bash=
# 確認已經有 docker 群組
# getent: get entries from Name Service Switch libraries
$ getent group docker
docker:x:984:
# 如果什麼都沒印出來,就先建立它:
# $ sudo groupadd docker
# 把當前使用者加入 docker 群組
$ sudo usermod -aG docker $USER
$ getent group docker
docker:x:984:tj # <-- tj
# [驗證效果]
# - 讓群組設定立即生效(重新登入)
# $ logout
# - 不用登出的作法:在同一個 shell 開一個新的群組環境
$ newgrp docker
# 移除 sudo,直接執行 Docker 指令,應該就不會再跳「permission denied」
$ docker run hello-world
```
- #### 還是要用 sudo?
- 確認 id 輸出裡面包含了 docker 群組:
```
$ id
uid=1000(tj) gid=984(docker) groups=984(docker),4(adm),24(cdrom),
27(sudo),30(dip),46(plugdev),100(users),114(lpadmin),1000(tj)
```
<br>
## 討論
### Ubuntu 系統下,讓 `ctr` 指令不需加 `sudo` 的方式
- ### Question
在 Ubuntu 系統,要如何指令可以不用加sudo ?
`$ sudo ctr info # containerd CLI`
不是有類似 usrgroup 操作?
像 `$ sudo docker run` -> `$ docker run`
- ### gpt-4o (2025/05/29)
你可以像 Docker 一樣,透過設定使用者群組與 socket 權限,讓 `ctr` 指令不需加 `sudo` 執行。
---
### Docker 為什麼可以不用 sudo?
- Docker 安裝後會建立名為 `docker` 的群組。
- Docker Daemon 的 UNIX socket 權限如下:
```
srw-rw---- 1 root docker 0 May 29 10:00 /var/run/docker.sock
```
- 將使用者加入 `docker` 群組後,即可無需 sudo 執行 docker 命令:
```
sudo usermod -aG docker $USER
newgrp docker # 或重新登入
```
---
### 為什麼 `ctr` 指令無法直接照辦?
- `containerd` 的 socket 是:
```
/run/containerd/containerd.sock
```
- 權限通常為:
```
srw-rw---- 1 root root 0 May 29 10:00 /run/containerd/containerd.sock
```
- 沒有預設的群組可加入,因此必須自行設定。
---
### 自訂群組方式(推薦開發環境使用)
**步驟如下:**
1. 建立群組:
```
sudo groupadd containerd
```
2. 加入該群組:
```
sudo usermod -aG containerd $USER
```
3. 建立 systemd override 設定:
執行:
```
sudo systemctl edit containerd
```
加入內容:
```
[Service]
ExecStart=
ExecStart=/usr/bin/containerd --socket-group containerd
```
4. 讓 containerd.sock 權限正確:
containerd 啟動後會自動套用群組 `containerd`,權限為 `660`。
5. 重新啟動 containerd 並切換群組:
```
sudo systemctl daemon-reexec
sudo systemctl restart containerd
newgrp containerd
```
6. 測試是否可無 sudo 執行:
```
ctr info
```
---
### 安全性提醒
此設定會讓加入 `containerd` 群組的使用者擁有與 root 類似的控制權限(可掛載主機路徑、執行特權容器等),請避免在生產環境或多人共享的系統中使用。
---
是否需要我幫你自動產生完整的 systemd override 文件與指令清單?
<br>
{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}