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 %}