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

среда, 17 марта 2021 г.

Удаление старых ядер и очистка системы в Linux Mint 20x

В настройках системы имеется пункт об удалении ненужных ядер, который доступ при обращении к менеджеру обновлений в разделе "Правка – Параметры – Автоматизация". Если в строке "Автоматическое обслуживание" положение движка установить в положение "Включено", то задание будет выполняться еженедельно от имени суперпользователя.

Однако мне более привычен старый способ удаления лишних ядер и очистки системы от ненужных файлов, который, как показала практика, в Linux Mint 20x не работает. Чтобы он работал в условии необходимо изменить значение vmlinuz* на config*

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

Задачу можно выполнять при каждой загрузке системы, для чего создаваемый сценарий sh поместить в автозагрузку. Файл sh должен иметь разрешение на запуск как программы.

Так как операции могут быть выполнены только с правами суперпользователя (напр., sudo /home/user/clean.sh), то самому скрипту ( clean.sh – так называется у меня. Вы можете ему назначить какое угодно имя ) можно назначить запуск от имени суперпользователя без ввода пароля. Для этого выполните в терминале sudo xed /etc/sudoers и добавьте в него строку:

user ALL=NOPASSWD: путь_к_вашему_скрипту (напр., /home/user/clean.sh)  

user – это ваш логин в системе.

При запуске сценария производится подсчёт ядер в системе. Если количество ядер будет больше 1, то будет осуществлено удаление всех ядер кроме текущего, а также выполнены команды автоочистки и автоудаления ненужных пакетов. Также в процессе будут удалены неиспользуемые модули ядра из каталога /lib/modules

Текст сценария (на примере моего).

#!/bin/bash
folder=/home/minter
kern=`find /boot -name config* | wc -l`
if [ $kern -gt 1 ];
  then
     apt purge -y $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)
     apt autoclean
     apt autoremove -y
     rm $folder/.bash_history
     > 
$folder/.bash_history
fi
exit

Обратите внимание на переменную folder, которая указывает на домашнюю папку пользователя, соответствующую логину пользователя в системе (в приводимом примере – minter). Не ошибитесь, иначе вы получите свой "самый чистый домашний каталог в мире".

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

#!/bin/bash
folder=/home/minter
log= ... указать расположение файла
kern=`find /boot -name config* | wc -l`
if [ $kern -gt 1 ];
   then
      echo "$(date '+%H-%M-%S') -- в системе ядер - $kern, удаление ядер." >> $log
      apt purge -y $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)
      echo "$(date '+%H-%M-%S') -- запуск автоочистки." >> $log
      apt autoclean
      echo "$(date '+%H-%M-%S') -- запуск автоудаления." >> $log
      apt autoremove -y
      rm $folder/.bash_history
      > $folder/.bash_history
      echo "$(date '+%H-%M-%S') -- история bash очищена." >> $log
   else
      echo "$(date '+%H-%M-%S') -- очистка системы не требуется." >> $log
fi
exit


Пример практического выполнения.

Листинг каталога /boot до работы clean.sh :

config-5.4.0-66-generic
config-5.4.0-67-generic
grub
initrd.img
initrd.img-5.4.0-66-generic
initrd.img-5.4.0-67-generic
initrd.img.old
System.map-5.4.0-66-generic
System.map-5.4.0-67-generic
vmlinuz
vmlinuz-5.4.0-66-generic
vmlinuz-5.4.0-67-generic
vmlinuz.old

Листинг каталога /boot после работы clean.sh :

config-5.4.0-67-generic
grub
initrd.img
initrd.img-5.4.0-67-generic
initrd.img.old
System.map-5.4.0-67-generic
vmlinuz
vmlinuz-5.4.0-67-generic
vmlinuz.old

среда, 15 января 2020 г.

Удалить неиспользуемые ядра и очистить систему в автоматическом режиме (выбор действия по сценарию)

Идея: создать сценарий (скрипт на bash), по результатам выполнения которого определялась бы необходимость осуществления операции удаления неиспользуемых в системе ядер с последующей очисткой системы от ненужных пакетов.

Примечание. Для Linux Mint 20 и выше смотрите здесь.

В отличие от Windows, Linux обладает меньшей "замусоренностью", но и он, с точки зрения перфекционализма, нуждается в периодической чистке. Пример освобождения системы от ненужных файлов читайте здесь. Что же касается ядер, то при установке новых ядер старые ядра не удаляются и, накапливаясь вместе с сопутствующими модулями (см. каталог /lib/modules), начинают занимать место, которое со временем может достигать солидных значений.

У одного из моих знакомых пользователей Linux таких ядер к настоящему времени уже имеется 17 шт. Ради любопытства мной была предпринята попытка подсчёта примерного суммарного места, занимаемого текущим ядром с сопутствующими ему модулями. Вышло 305,9 Мб. Экстраполируя данное значение на 17 неиспользуемых ядер, получается порядка 5-5,1 Гигабайт дискового пространства, выключенного из полезной деятельности.



Сценарий удаления неиспользуемых ядер

Необходимость осуществления заявленных действий будет определяться по результату подсчёта имеющихся в системе ядер. Подсчёт будет вестись по файлам, расположенным в каталоге /boot, имена которых относятся к той или иной версии ядра. К таким файлам относятся config* , initrd.img* , vmlinuz* .  В рассматриваемом примере подсчёт ведётся по файлам vmlinuz* .

Примечание. Следует иметь в виду, что удалению подлежат все ядра кроме используемого системой в настоящее время (то есть на момент выполнения сценария). Если имеется необходимость сохранения предыдущего ядра, то воспользуйтесь примерами команд, изложенными в этой публикации.

Если будет обнаружено, что число ядер больше 1, то будет выполнена команда удаления всех предыдущих ядер. Если будет обнаружено, что число ядер равно 1, то никаких действий предпринято не будет.

Сценарий оформляется как исполняемый файл sh

#!/bin/bash
a=`find /boot -name vmlinuz* | wc -l`
b=1
if [ $a -gt $b ];
  then
  apt purge -y $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)
 else
  :
fi
exit

Примечание: двоеточие соответствует команде "ничего не делать".

Поскольку выполняемые действия требуют полномочий суперпользователя, а выполнять созданный скрипт sh планируется от имени текущего пользователя системы, то в файл /etc/sudoers необходимо внести запись, разрешающую его выполнение (sudo clean.sh) без запроса ввода пароля. Откройте файл в текстовом редакторе, например:

sudo xed /etc/sudoers  или  sudo gedit /etc/sudoers

и внесите строку

имя_текущего_пользователя ALL=NOPASSWD: путь_к_скрипту

Сохраните внесённые изменения и перезагрузите систему. Если вдруг вами была допущена ошибка синтаксиса файл sudoers, то выполните действия, описанные здесь.

В своей системе мной была внесена строка

minter ALL=NOPASSWD: /home/minter/Tools/scripts/clean.sh


Объединение удаления ядер и очистки системы

В своей системе было принято решение об объединении процедур удаления неиспользуемых ядер и автоочистки системы от ненужных файлов в один сценарий. Результаты выполнения заносятся в краткий протокол.

#!/bin/bash
day=`date '+%m.%d'`
a=`find /boot -name vmlinuz* | wc -l`
b=1
log=/home/minter/Reports/system/$day.clean.txt
if [ $a -gt $b ];
 then
  time=`date '+%H-%M-%S'`
  echo "$time -- ядер в системе – $a, запуск удаления ядер." >> $log
  apt purge -y $(dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | head -n -1)
  sleep 5
  time=`date '+%H-%M-%S'`
  echo "$time -- запуск автоочистки." >> $log
  apt autoclean
  sleep 5
  time=`date '+%H-%M-%S'`
  echo "$time -- запуск автоудаления." >> $log
  apt autoremove -y
else
  time=`date '+%H-%M-%S'`
  echo "$time -- очистка системы не требуется." >> $log
fi
exit

Так как мой компьютер постоянно включён в определённый промежуток времени, то сценарий будет выполняться по пользовательскому заданию cron (у меня – раз в месяц). Если у Вас компьютер включается по случайному выбору временного промежутка, то выполнение сценария имеет смысл или включить в атозагрузку системы, или выполнять вручную, создав соответствующий значок (кнопку) запуска. При использовании пользовательского задания cron команда на выполнение должна быть sudo путь_к_скрипту.

При использовании задания cron данное задание можно оформить как запускаемое от имени root, запустив редактор sudo crontab -e  При этом нет необходимости вносить изменения в файл /etc/sudoers  Однако в этой публикации, в первую очередь, рассматривается возможность выполнения заявленных действий в рамках полномочий обычного пользователя.

Работа сценария была проверена на 3 системах Linux Mint версий 18.3 и 19.3

среда, 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 не вижу.


Послесловие

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

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