system / apt-get
===
###### tags: `OS / Ubuntu / cmd / system`
###### tags: `OS`, `Ubuntu`, `linux`, `command`, `system`, `apt`, `apt-get`, `apt get`, `upgrade`, `dist-upgrade`, `apt search`, `apt list`, `dpkg`
<br>
[TOC]
<br>
## 查詢套件
### `apt search ...`
```
apt search key1 key2 ... | grep -i key1
```
- ### 查詢 `libnss-sss` 套件
```
apt search nss sss | grep -i nss
```
<br>
### `apt list <package-name>`
- ### 模糊查詢
```
apt list | grep -i sss
```
- ### 精準查詢(需完全匹配)
```
$ apt list sssd
Listing... Done
sssd/noble-updates,now 2.9.4-1.1ubuntu6.3 amd64 [installed]
N: There are 2 additional versions. Please use the '-a' switch to see them.
```
- ### `--installed` 參數
- **已安裝時** (沒有差異)
```
$ apt list sssd
sssd/... amd64 [installed]
$ apt list --installed sssd
sssd/... amd64 [installed]
```
- **未安裝時** (有差異)
```
$ apt list sssd
sssd/... amd64 ← 會顯示套件資訊,但沒有 [installed]
$ apt list --installed sssd
Listing... Done ← 沒任何列出
```
<br>
### `dpkg -s <package-name>`
- ### 查詢 `sssd` 套件
```
dpkg -s sssd >/dev/null 2>&1 && echo "installed" || echo "not installed"
```
- **`dpkg -s <package-name>` 的執行結果**
- **成功**:`echo $?` 回傳 0
- **失敗**:`echo $?` 回傳 1
<br>
---
## 移除 app
### 完整移除 Google Chrome,再重新安裝
1. 完整移除 Google Chrome
```bash
sudo apt remove --purge google-chrome-stable
sudo apt autoremove --purge
sudo apt clean
# 移除殘留的設定檔案與資料夾:
rm -rf ~/.config/google-chrome
rm -rf ~/.cache/google-chrome
# 如果不確定是否還有其它 Chrome 相關的殘留資料,可再檢查:
find ~ -name '*chrome*'
```
2. 重新下載並安裝 Google Chrome
```bash
# 如果你還沒有 .deb 檔案
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
# 安裝 .deb 檔案:
# 建議使用 apt 而非 dpkg,會自動處理依賴:
# $ sudo dpkg -i google-chrome-stable_current_amd64.deb (deprecated)
sudo apt install ./google-chrome-stable_current_amd64.deb
```
3. 確認安裝成功與啟動
```bash
google-chrome-stable
# 或者從應用程式選單中啟動 Google Chrome
```
<br>
---
## 查詢狀態
### 查看哪些指令被 hold 住
```
$ sudo apt-mark showhold
```
<br>
---
## 討論
### `apt upgrade -y` vs `apt dist-upgrade -y`, 這兩個指令差在哪裡?
- ### gpt-o4-mini-high (2025/05/21)
### 指令差異比較
兩者都是用來更新已安裝套件,但行為上有幾點關鍵差異:
- `sudo apt upgrade -y`
- **不會**移除任何套件,也**不會**自動安裝新的相依套件。
- 僅對目前已安裝、且不會造成相依衝突的套件執行升級。
- 若遇到需安裝新套件或移除舊套件才能完成更新的情況,該套件就會被跳過。
- `sudo apt dist-upgrade -y`
- 允許在升級過程中 **安裝** 新套件,或 **移除** 與新版本不相容的舊套件。
- 會自動解決更複雜的相依關係,比 `upgrade` 更「激進」。
- 在進行整版發行版升級(如 20.04→22.04→24.04)時,通常建議用此指令,因為新的 LTS 需要新增或移除一些底層套件。
---
### 指令功能比較
| 指令 | 安裝新套件 | 移除舊套件 | 相依衝突處理能力 |
|--------------------|-----------|-----------|-----------------------------|
| `apt upgrade` | ❌ | ❌ | 僅升級不衝突套件 |
| `apt dist-upgrade` | ✅ | ✅ | 會調整套件(安裝/移除)以解決衝突 |
### 總結
簡而言之,若只是一般的小版本修補,可用 `apt upgrade`;但要做大版本或有複雜相依關係的更新,就用 `apt dist-upgrade`(或同義的 `apt full-upgrade`)。
<br>
<br>
### remove, autoremove, clean 三者指令差在哪裡?
- ### gpt-4o (2025/05/26)
這三個 `apt` 指令在功能上各有不同,用來清除安裝包及相關資料,下面是詳細差異說明:
---
### ✅ `sudo apt remove --purge <package>`
- **功能**:移除已安裝的軟體包。
- `--purge` 參數:除了移除軟體本體外,**也會刪除該軟體的設定檔案(如 /etc/ 下的設定)**。
- 📦 例如:`sudo apt remove --purge google-chrome-stable`
→ 會移除 Chrome 本身 + 系統層級的設定檔案。
---
### ✅ `sudo apt autoremove --purge`
- **功能**:自動移除**不再需要的套件**,這些通常是「被其他軟體依賴安裝的,但現在已無人使用」的套件。
- 加上 `--purge`:也會順便刪除這些套件的設定檔案。
- 📦 例如,如果 Chrome 安裝時拉了某些依賴,移除 Chrome 後這些依賴沒被別人用,就會被這個指令清掉。
---
### ✅ `sudo apt clean`
- **功能**:**清除本地下載快取**,也就是 `/var/cache/apt/archives/` 下儲存的 `.deb` 安裝檔。
- 不影響已安裝的程式或設定,只是節省硬碟空間。
- 📦 例如,當你下載 `.deb` 包安裝完後,這個指令可以把那個快取檔刪掉。
---
### 🧠 總結對比
| 指令 | 移除套件本體 | 移除設定檔 | 清除孤兒依賴 | 清除快取檔 |
|--------------------------|-----------|----------|-------------|---------|
| `apt remove` | ✅ | ❌ | ❌ | ❌ |
| `apt remove --purge` | ✅ | ✅ | ❌ | ❌ |
| `apt autoremove` | ✅(依賴) | ❌ | ✅ | ❌ |
| `apt autoremove --purge` | ✅(依賴) | ✅ | ✅ | ❌ |
| `apt clean` | ❌ | ❌ | ❌ | ✅ |
---
如你想要「徹底移除一個程式和它帶來的所有東西」的話:
```
sudo apt remove --purge <package>
sudo apt autoremove --purge
sudo apt clean
```
這三步搭配使用非常常見。
<br>
### 如何查 ubuntu 某個套件是否有安裝?比如查 libnss-sss?
- ### gpt-5 (2025/09/25)
以下用 Ubuntu 常見做法,快速判斷「某套件是否已安裝」(以 `libnss-sss` 為例)。指令都可直接複製貼上。
- ### (1) 最快查法(人看方便)
```bash
apt list --installed libnss-sss
```
* 若已安裝會列出版本;若顯示 `Listing... Done` 但沒有該行,代表未安裝。
- ### (2) 腳本友善(用退出碼判斷)
```bash
dpkg -s libnss-sss >/dev/null 2>&1 && echo "installed" || echo "not installed"
```
* `dpkg -s`:已安裝時回傳碼為 0,未安裝為非 0。
* 要看細節可直接:`dpkg -s libnss-sss`
- ### (3) 看版本與候選版本(同時判斷是否安裝)
```bash
apt-cache policy libnss-sss
```
* 會顯示 `Installed:` 與 `Candidate:`。`Installed:` 有版本號=已安裝。
- ### (4) 以檔案反查(適合像 `libnss-sss` 這種提供 .so 的函式庫)
列出此套件安裝了哪些檔案:
```bash
dpkg -L libnss-sss
```
查系統上是否存在其 NSS 模組檔:
```bash
ls -l /lib/*-linux-gnu/libnss_sss.so* 2>/dev/null
# 找不到任何檔案通常代表未安裝(或安裝在非標準路徑)
```
若知道某檔案路徑,想反查它屬於哪個套件:
```bash
dpkg -S /lib/x86_64-linux-gnu/libnss_sss.so.2
```
- ### (5) 不確定套件正確名稱時
```bash
apt search nss sss | grep -i nss
# 或 apt-cache search nss sss
```
---
### 專屬 `libnss-sss` 的實務檢查
`libnss-sss` 是 SSSD 的 NSS 模組,裝了不代表「有啟用」。可用下面兩步確認:
1. **檢查已在 NSS 啟用:**
```bash
grep -E '^(passwd|group|shadow):' /etc/nsswitch.conf
# 建議內容中要包含 sss,例如:
# passwd: files systemd sss
# group: files systemd sss
```
2. **實測 Name Service 查詢走 SSSD:**
```bash
getent passwd | head
# 或查一個預期在 LDAP/SSSD 才會出現的帳號:
getent passwd <ldap_username>
```
* 若能正確列出來,代表 NSS 透過 SSSD 取到資料,多半表示 `libnss-sss` 已安裝且生效。
* 若 `getent` 沒回應 LDAP 帳號,先檢查 `sssd` 是否在跑(`systemctl status sssd`;容器環境可能沒有 systemd,則用 `ps aux | grep sssd`)。
---
### 額外補充
* 只檢查是否安裝:`apt list --installed <pkg>` 或 `dpkg -s <pkg>` 就足夠。
* 若是可執行檔(不是函式庫),也可用 `which <binary>` 看路徑是否存在。
* 若你的環境用 Snap/Flatpak 安裝軟體,需分別用:
* Snap:`snap list`(`snap list <name>`)
* Flatpak:`flatpak list`
需要的話,我也可以幫你寫一個小腳本,一次檢查「是否安裝+是否在 nsswitch.conf 啟用+是否能用 getent 取到帳號」。
<br>
{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}