Я выполнил команду 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
Проще говоря:Не.
Теоретически вы можете удалить модули, которые не нужны на машине, на которой вы работаете, но если вы где-то сделаете неправильный шаг, вы рискуете, что машина больше не загрузится. И вам придется повторять это для каждого обновления ядра.
Это гигабайт. Диск дешевый. Живите с этим.