我執行了命令 apt autoremove 但這些資料夾仍然存在。
正如命令“du -h -x --max-depth=1 /usr/lib | sort -hr | head -n 10”向我展示的那樣,它們目前每個都使用了近 1G:
858M /usr/lib/modules
823M /usr/lib/x86_64-linux-gnu
我該如何清理這個?謝謝。
答案1
我需要這樣做,因為在 Chromebook 上使用 Linux 一年多了,/usr/lib/modules 佔用了超過 10GiB 的磁碟空間(這在這個設備上是非常寶貴的),而我只會運行無論如何,單個內核實例。磁碟空間必要的運行單一核心僅需約 500MiB,相較之下,實際使用的磁碟空間約為 5%。
我自己根據我的發行版(KDE Neon、基於 Ubuntu LTS)提出了一個解決方案,其中包含多個 Bash 命令來執行以下操作:
- 偵測目前運行的Linux版本
- 檢測
linux-modules-*
屬於Linux版本的軟體包不是目前正在運行 - 卸載所有未運行的
linux-modules-*
軟體包(以及依賴的軟體包)linux-image-*
請注意,我只測試過這個當已經運行時我的發行版上安裝了最新的 Linux 核心。您的發行版可能附帶依賴元軟體包的軟體包,例如linux-generic-hwe-20.04
基於 Ubuntu 20.04 LTS 的發行版,並且在安裝較新的 Linux 後運行較舊的 Linux 時,我尚未測試此腳本。
長話短說:
sudo apt remove $(dpkg-query --show 'linux-modules-*' | cut -f1 | grep -v "$(uname -r)")
好吧,但這意味著什麼?
要運行的第一個命令是uname -r
.這會列印目前運行的 Linux 核心的版本號,格式如下:
$ uname -r
5.15.0-48-generic
欲了解更多信息,請訪問man uname
。
要查看的第二個命令是dpkg-query
,它允許我們以不同的方式查詢已安裝的軟體包。您可以使用--list
漂亮的互動式顯示,但我選擇使用它--show
來使腳本編寫更簡單。
$ dpkg-query --show 'linux-modules-*'
linux-modules-5.11.0-44-generic 5.11.0-44.48~20.04.2
linux-modules-5.11.0-46-generic 5.11.0-46.51~20.04.1
# etc.
欲了解更多信息,請訪問man dpkg-query
。
堅定的讀者可能會弄清楚如何使用該--showformat
選項來跳過此步驟,但我更喜歡一種更熟悉的方法 -cut
命令。此cut
指令僅採用標準輸入、由 提供的可選分隔符號-d
(預設為製表符)以及由 提供的欄位參數-f
。在本例中,它會取得命令的輸出dpkg-query
並傳回第一列:
$ dpkg-query --show 'linux-modules-*' | cut -f1
linux-modules-5.11.0-44-generic
linux-modules-5.11.0-46-generic
# etc.
欲了解更多信息,請訪問man cut
。
我們透過管道輸出那進入grep
命令,它讓我們選擇與特定模式相符的行 - 或者,在本例中,選擇符合特定模式的行不使用選項來匹配特定的模式-v|--invert-match
。傳回"$(uname -r)"
類似 的行5.15.0-48-generic
,然後將其用作 的模式grep
。這就是我們選擇所有linux-modules
包的方式不是目前正在運行。
$ dpkg-query --show 'linux-modules-*' | cut -f1 | grep -v "$(uname -r)"
# = dpkg-query --show 'linux-modules-*' | cut -f1 | grep -v "5.15.0-48-generic"
linux-modules-5.11.0-44-generic
linux-modules-5.11.0-46-generic
# etc.
欲了解更多信息,請訪問man grep
。
最後,我們只是使用這個列表作為命令的參數sudo apt remove
,這對人們來說可能已經很熟悉了,不需要太多解釋:
$ sudo apt remove $(dpkg-query --show 'linux-modules-*' | cut -f1 | grep -v "$(uname -r)")
# = sudo apt remove linux-modules-5.11.0-44-generic linux-modules-5.11.0-46-generic [...]
……但是萬一那些是不是你所熟悉的,man sudo
允許您以 root、系統管理員(或理論上的另一個使用者)身分執行命令,這是使用所必需的man apt
,它管理基於 Debian(因此是 Ubuntu)的發行版上的套件和依賴項。
答案2
我試著清空 /usr/lib 並想出一個方法:
apt-show-versions |grep "No available version in archive"
將顯示目前任何sources.list(對於此Ubuntu版本)未提供的軟體包。如果您一直在進行升級,它包括例如從以前的 Ubuntu 版本手動安裝的軟體包。問題是,還有一些我想保留的包,例如 slack、draw.io 等,因此您需要手動檢查不再需要的包。
如果您從確實要刪除的軟體包中找到模式,例如 Ubuntu 22.04 上的 Ubuntu 16.04 軟體包,您可以運行:
apt-show-versions |grep "No available version in archive" |grep 16.04 |cut -d " " -f1 |xargs apt remove --purge
答案3
簡單的說:不。
理論上,您可以刪除您所在電腦上不需要的模組,但如果您在某個地方執行了錯誤的步驟,則可能會導致電腦無法再啟動。並且您必須為每個核心更新重複此操作。
這是一千兆位元組。盤很便宜。忍受它。