長話短說:

長話短說:

我執行了命令 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

簡單的說:

理論上,您可以刪除您所在電腦上不需要的模組,但如果您在某個地方執行了錯誤的步驟,則可能會導致電腦無法再啟動。並且您必須為每個核心更新重複此操作。

這是一千兆位元組。盤很便宜。忍受它。

相關內容