TL;DR:

TL;DR:

Я выполнил команду apt autoremove, но эти папки остались.

Как показала мне команда «du -h -x --max-depth=1 /usr/lib | sort -hr | head -n 10», в настоящее время они используют почти 1 ГБ каждый:

858M    /usr/lib/modules
823M    /usr/lib/x86_64-linux-gnu

Как мне это убрать? Спасибо.

решение1

Мне это было необходимо, так как за год использования Linux на Chromebook /usr/lib/modules занял более 10 ГБ дискового пространства (что дорого на этом устройстве), а я в любом случае буду запускать только один экземпляр ядра. Дисковое пространствонеобходимыйдля запуска одного ядра требовалось всего ~500 МБ, для сравнения, фактически использовалось ~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 после установки нового.

TL;DR:

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"

покажет пакеты, которые в настоящее время не предоставляются ни одним из источников.list (для этой версии Ubuntu). Он включает, например, вручную установленные пакеты из предыдущих версий Ubuntu, если вы делали обновления. Проблема в том, что есть также пакеты, которые я хотел сохранить, такие как slack, draw.io и т. д., поэтому вам нужно вручную проверить пакеты, которые вам больше не нужны.

Если вы нашли шаблон среди пакетов, которые вы определенно хотите удалить, например, пакеты Ubuntu 16.04 в Ubuntu 22.04, вы можете выполнить:

apt-show-versions |grep "No available version in archive" |grep 16.04 |cut -d " " -f1 |xargs apt remove --purge

решение3

Проще говоря:Не.

Теоретически вы можете удалить модули, которые не нужны на машине, на которой вы работаете, но если вы где-то сделаете неправильный шаг, вы рискуете, что машина больше не загрузится. И вам придется повторять это для каждого обновления ядра.

Это гигабайт. Диск дешевый. Живите с этим.

Связанный контент