среда, 28 марта 2018 г.

Удаление ядер в Linux Mint и Ubuntu без запроса подтверждения


Про удаление "ненужных "ядер в Интернет имеется много информации, да и на этом ресурсе имеется соответствующая публикация.

Но со временем меня перестала устраивать необходимость всё время нажимать в терминале  клавишу y после "Хотите продолжить? [Д/н]". Поэтому для своего удобства был создан текстовый файл с набором впоследствии вставляемых в окно терминала набором команд, в которых необходимо менять только цифры.


Составление списка удаляемых ядер

Перед удалением необходимо определиться, какие ядра из системы будут удаляться.

Перечень установленных ядер можно посмотреть через менеджер файлов, обратившись к каталогу /boot  Там будут расположены несколько файлов с разными именами. Общим у них являются цифры, следующие после знака - . Поэтому для составления списка цифр достаточно посмотреть первые файлы в списке, т.е. файлы с именами, начинающимися на  abi .


Пояснение. abi – application binary interface – это файлы, являющиеся частью двоичным интерфейсом приложения и включены в ядро в качестве одной из его составных частей. Как поясняют назначение abi на англоязычных форумах,

The ABI is included as part of the kernel version. If you run the command uname -r you will see something like 2.6.26-4-generic. The 4 in this example is the ABI. Numerically, it means nothing, except that it has changed since 3 and will be 5 when it changes again. 

abi is the application binary interface, which are the kernel "hooks" a program can call to process commands, system libraries, etc. Because these machine language addresses move from time to time, the abi provides a common directory for applications to reference. 

Хорошей практикой считается удаление всех ядер за исключением текущего и ему предшествующего. Но если Вы уверены в том, что система со свежим ядром функционирует должным образом, то удалить можно все предыдущие. В соответствии с этим критерием, в рассматриваемом примере удалению подлежат ядра 4.13.0-26, 4.13.0-31, 4.13.0-32, 4.13.0-36.

Дополнение. К имеющим отношения к ядрам также относятся и каталоги с файлами и вложенными каталогами, расположенные в /lib/modules



Составление команды для удаления выбранных ядер

Командами для удаления ядра являются sudo apt purge linux-image- и sudo apt purge linux-headers-  Например, для удаления ядра 4.13.0-32 указанные команды приобретут вид sudo apt purge linux-image-4.13.0-32 и sudo apt purge linux-headers-4.13.0-32  Чтобы не вводить эти команды по одной между нами пишутся два символа &&. Поэтому командой удаления ядра 4.13.0-32 в одну строку является

purge linux-image-4.13.0-32 && sudo apt purge linux-headers-4.13.0-32

Так как в примере моё намерение включает удаления ядер 4.13.0-26, 4.13.0-31, 4.13.0-32, 4.13.0-36, то командой для их удаления будет являться

sudo apt purge linux-image-4.13.0-26 && sudo apt purge linux-headers-4.13.0-26 && sudo apt purge linux-image-4.13.0-31 && sudo apt purge linux-headers-4.13.0-31 && sudo apt purge linux-image-4.13.0-32 && sudo apt purge linux-headers-4.13.0-32 && sudo apt purge linux-image-4.13.0-36 && sudo apt purge linux-headers-4.13.0-36

Примечание. 

Профессионалы, конечно, могут меня "тыкнуть носом" в то, что более грамотной командой будет являться sudo apt purge linux-image-4.13.0-{26,31,32,36} && sudo apt purge linux-headers-4.13.0-{26,31,32,36}. 

Однако у меня был случай, когда была допущена ошибка: вместо 4.10 было указано 4.4 Поэтому при составлении "грамотной" команды необходимо проявлять предельную внимательность. 

А поскольку мне проще в команды после image- и headers- дописывать номера ядер, то пишу в столбик

sudo apt purge linux-image-4.13.0-26 
sudo apt purge linux-headers-4.13.0-26
sudo apt purge linux-image-4.13.0-31
sudo apt purge linux-headers-4.13.0-31
sudo apt purge linux-image-4.13.0-32
sudo apt purge linux-headers-4.13.0-32
sudo apt purge linux-image-4.13.0-36
sudo apt purge linux-headers-4.13.0-36

и затем преобразую написанное в одной строку так, чтобы между командами присутствовали символы пробел&&пробел.

Как указано выше, чтобы не вводить каждый раз y на вопрос "Хотите продолжить? [Д/н]", в команду удаления после sudo apt purge добавляется -y. При этом предполагается ответ Yes на все вопросы, а сами вопросы не выводятся. Команда – sudo apt purge -y

Таким образом, итоговой командой для удаления ядер 4.13.0-26, 4.13.0-31, 4.13.0-32, 4.13.0-36 без ввода подтверждения своих действий является

sudo apt purge -y linux-image-4.13.0-26 && sudo apt purge -y linux-headers-4.13.0-26 && sudo apt purge -y linux-image-4.13.0-31 && sudo apt purge -y linux-headers-4.13.0-31 && sudo apt purge -y linux-image-4.13.0-32 && sudo apt purge -y linux-headers-4.13.0-32 && sudo apt purge -y linux-image-4.13.0-36 && sudo apt purge -y linux-headers-4.13.0-36

Примечание. На многих ресурсах для удаления всех ядер кроме используемого приводится команда (в одну строку)

sudo apt-get purge $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)

Но мной она никогда не применялась, поэтому прокомментировать её никак не могу.

Важно. Не удаляйте ядро, которое активно в Вашей системе. Чтобы его узнать введите в терминале uname -r.  В противном случае Вы пополните круг пользователей, задающих вопрос: "я удалил все ядра, что мне делать?".

Теоретически, после удаления "ненужных" ядер у Вас останутся только те ядра, которые не были назначены к удалению. Как как в описываемом случае удалению подлежали все ядра кроме последнего, то в результате получилось:



Хотя у меня такого не возникло, но если вдруг в каталоге modules "лишние" каталоги не были удалены, то можно использовать команду, например,

sudo rm -R /lib/modules/4.13.0-26-generic && sudo rm -R /lib/modules/4.13.0-31-generic && sudo rm -R /lib/modules/4.13.0-32-generic && sudo rm -R /lib/modules/4.13.0-36-generic

Примечание. О неудалении относящихся к ядрам каталогов в /lib/modules свидетельствуют выводы в окне терминала, такие как, например, это

dpkg: предупреждение: при удалении linux-headers-4.13.0-32-generic каталог «/lib/modules/4.13.0-32-generic» не пуст, поэтому не удалён


Надо обновить GRUB!

Раньше такое действие мной и применялось, поэтому в конец команды удаления дописывалось  && sudo update-grub

Однако при визуальном контроле хода удаления ядер в терминале мной было обращено внимание на то, что после каждого удаления ядра отображается. Например, после удаления ядра 4.13.0-26

Найден образ linux: /boot/vmlinuz-4.13.0-37-generic
Найден образ initrd: /boot/initrd.img-4.13.0-37-generic
Найден образ linux: /boot/vmlinuz-4.13.0-36-generic
Найден образ initrd: /boot/initrd.img-4.13.0-36-generic
Найден образ linux: /boot/vmlinuz-4.13.0-32-generic
Найден образ initrd: /boot/initrd.img-4.13.0-32-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
завершено

А после завершения удаления ядра 4.13.0-36

Найден образ linux: /boot/vmlinuz-4.13.0-37-generic
Найден образ initrd: /boot/initrd.img-4.13.0-37-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
завершено

Поэтому необходимости в sudo update-grub не вижу.


Послесловие

Хочется надеяться, что к содержанию данной публикации не будет применим "печальный" комментарий участника одного из форумов:

Американский форум – задал вопрос, тебе обстоятельно и вежливо ответили.
Еврейский форум – задал вопрос, тебе задали вопрос.
Русский форум – задал вопрос, тебе объяснили какой же ты мудак.

1 комментарий:

  1. Спасибо за очень толковый и грамотный пост

    ОтветитьУдалить