среда, 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

Комментариев нет:

Отправить комментарий