Ускорение WordPress на уровне Nginx: правильные настройки PHP-FPM, try_files, статика, кеширование, Brotli, защита wp-login и безопасные заголовки для стабильно...
Блог компании 3v-Hosting
14 мин.
Любой Linux-сервер со временем накапливает следы прошлых обновлений. Каждая новая версия ядра устанавливается отдельно, а предыдущие обычно остаются в системе. Со временем раздел /boot постепенно заполняется, в результате чего очередное обновление может завершиться ошибкой, а после перезагрузки сервер может уже вовсе не подняться.
Решение кажется простым, ведь достаточно просто вовремя удалять старые версии ядра и освободить место на диске. Но дело это крайне ответственное и подходить к нему нужно с максимальной аккуратностью, так как если по ошибке удалить текущую или единственную рабочую версию ядра, то вместо нескольких сотен мегабайт свободного пространства можно получить сервер, который придётся восстанавливать через Live ISO, Rescue Mode или консоль виртуальной машины.
В этой статье давайте вместе с вами разберёмся, почему Linux вообще хранит несколько версий ядра, в каких случаях их действительно стоит удалять и как выполнить очистку так, чтобы после следующей перезагрузки сервер продолжил работать в штатном режиме.
При обновлении Linux новая версия ядра устанавливается как отдельный пакет. Предыдущая версия не заменяется, а остаётся в системе в неизменном виде. Делается это на тот случай, если после обновления возникнут проблемы с драйверами, RAID-контроллером, гипервизором или другим важным оборудованием. В таком случае всегда можно загрузиться с предыдущего ядра через GRUB меню и восстановить работу сервера максимально быстро.
Именно поэтому Ubuntu, Debian, AlmaLinux, Rocky Linux, CentOS и многие другие дистрибутивы не удаляют старые версии автоматически.
Как мы уже выяснили, со временем их становится всё больше и в какой-то момент на сервере, который регулярно обновляется несколько лет к ряду, легко обнаружить десяток или даже больше установленных ядер. Для пользователей VPS-серверов ситуация нередко оказывается критичной, так как раздел /boot там часто имеет объём всего 512 МБ или 1 ГБ, поэтому свободное место заканчивается гораздо быстрее.
Также стоит помнить ещё об одной особенности серверов - они могут работать без перезагрузки месяцами, а то и годами. За это время система успевает установить несколько новых ядер, хотя фактически продолжает использовать версию, загруженную давным давно.
Конечно, удалять старые ядра только ради порядка не стоит и пока места достаточно и обновления проходят без ошибок, то они выполняют роль страховки.
А вот поводом для очистки обычно становится почти заполненный раздел /boot. Проверить его состояние можно командой:
df -h /boot
Например:
Filesystem Size Used Avail Use% Mounted on /dev/sda2 974M 905M 19M 98% /boot
Если данный раздел заполнен более чем на 80-90%, то лучше заняться очисткой заранее, иначе очередное обновление ядра может завершиться ошибкой.
Есть и другие признаки того, что накопившиеся ядра уже пора удалить:
В общем к этой проблеме нужно подходить адекватно и удалять ядра только тогда, когда они начинают мешать работе системы, а не тогда, когда их стало слишком много. При этом несколько предыдущих версий лучше оставить, так как они могут пригодиться, если после очередного обновления что-то пойдёт не по плану, о чем мы упомянули выше.
Прежде чем что-либо удалять, стоит убедиться, что место в разделе /boot действительно занято старыми ядрами, а не какими либо другими файлами.
Сначала проверьте, сколько свободного места осталось в данном разделе:
df -h /boot
Затем посмотрите содержимое каталога:
ls -lh /boot
или оцените размер каждого файла:
du -sh /boot/*
Если проблема именно в старых ядрах, то вы увидите несколько похожих наборов файлов, например:
vmlinuz-6.8.0-64-generic initrd.img-6.8.0-64-generic System.map-6.8.0-64-generic config-6.8.0-64-generic
Каждая установленная версия ядра хранит собственный комплект таких файлов и несколько старых версий легко могут занимать сотни мегабайт. Если же раздел почти заполнен, а старых ядер немного, то причину стоит искать в другом месте - например, проверить журналы, дампы памяти или дополнительные загрузочные файлы. Когда и если мы выяснили, что проблема именно в старых ядрах, тогда можно переходить к самому важному и ответственному шагу.
ВАЖНО! Перед удалением обязательно выясните, какое ядро используется системой в данный момент. Именно его удалять ни в коем случае нельзя.
Текущую версию ядра можно узнать одной командой:
uname -r
Например:
6.8.0-64-generic
После этого стоит посмотреть список всех установленных ядер.
В Ubuntu и Debian:
dpkg --list | grep linux-image
Пример вывода:
ii linux-image-6.8.0-62-generic ii linux-image-6.8.0-63-generic ii linux-image-6.8.0-64-generic
В AlmaLinux, Rocky Linux, CentOS и других RPM-дистрибутивах используется другая команда:
rpm -qa | grep kernel
Например:
kernel-5.14.0-503.el9.x86_64 kernel-5.14.0-570.el9.x86_64 kernel-5.14.0-620.el9.x86_64
Всё, теперь картина полностью понятна. Мы видим, какое ядро загружено сейчас, какие версии остались от предыдущих обновлений и какие из них уже можно рассматривать для удаления. Однако напомним, что не стоит оставлять только текущее, рабочее ядро - всегда лучше оставить как минимум оно предыдущее ядро, которое может пригодиться как страховка на случай крушения текущего ядра или обновления на новое ядро.
Самая распространённая ошибка - это удалять файлы ядра вручную. Иногда можно встретить даже такие рекомендации, как удалить все файлы и директории из /boot раздела, ну или удалить отдельные файлы ядра. Так делать нельзя!!!
Файлы в каталоге /boot связаны с пакетной системой дистрибутива и если удалить их обычной командой rm, то пакетный менеджер продолжит считать ядро установленным. В результате можно получить повреждённую базу пакетов, ошибки при следующих обновлениях или проблемы с генерацией конфигурации GRUB.
Поэтому ядра удаляют только через пакетный менеджер. Он удаляет не только файлы, но и корректно обновляет информацию о пакетах, зависимостях и загрузчике.
В системах на базе Debian ядра устанавливаются через пакетный менеджер APT. Поэтому, если нужно удалить конкретную версию, то используйте команду:
sudo apt remove linux-image-6.8.0-62-generic
Правда эта команда используется нечасто и обычно достаточно выполнить команду:
sudo apt autoremove
В таком случае APT сам найдёт старые версии ядра, которые больше не используются, и предложит удалить их.
Если вместе с пакетами нужно очистить оставшиеся конфигурационные файлы, тогда выполните:
sudo apt autoremove --purge
Такой способ считается самым безопасным, поскольку APT учитывает зависимости и не позволит случайно удалить ядро, с которого сейчас работает система.
В этом семействе дистрибутивов ядра тоже устанавливаются как отдельные пакеты, но с использованием пакетного менеджера DNF. При необходимости, конкретную версию можно удалить командой:
sudo dnf remove kernel-5.14.0-503.el9.x86_64
Но чаще всего вмешательство администратора вообще не требуется, так как DNF умеет автоматически ограничивать количество установленных ядер. За это отвечает параметр installonly_limit, проверить значение которого можно так:
grep installonly_limit /etc/dnf/dnf.conf
Вывод выглядит следующим образом:
installonly_limit=3
Это означает, что система хранит три последних версии ядра. После установки нового обновления самая старая версия удаляется автоматически. Для большинства серверов такого запаса вполне достаточно, так как остаётся возможность откатиться в случае проблем, а раздел /boot не переполняется без необходимости.
/boot уже заполненИногда проблема обнаруживается слишком поздно, например при очередном обновлении система сообщает, что свободного места больше нет.
Например, APT в таком случае может вывести ошибку:
No space left on device
или:
cannot write compressed block
В этой ситуации не стоит пытаться быстро освободить место, удаляя файлы из каталога /boot вручную, это может только усугубить проблему.
Лучше действовать по порядку:
Такой порядок позволяет освободить место без риска повредить пакетную базу или нарушить работу загрузчика.
Вместе с ядром система хранит и его модули. Они находятся в каталоге:
/lib/modules/
Если ядро удаляется через APT, DNF или другой пакетный менеджер, то соответствующий каталог в /lib/modules обычно удаляется автоматически и дополнительно очищать его вручную уже не нужно.
Если после удаления ядра какие-то каталоги всё же остались, то сначала убедитесь, что сам пакет ядра действительно удалён. Лишь после этого имеет смысл разбираться, почему пакетный менеджер не выполнил очистку.
Отдельного внимания требуют серверы, где используются DKMS-модули. Они автоматически пересобираются при установке каждого нового ядра. Это относится, например, к ZFS, проприетарным драйверам NVIDIA, VirtualBox, некоторым файловым системам и отдельным сетевым драйверам.
После обновления желательно проверить, что пересборка завершилась без ошибок:
dkms status
Если модуль не собрался для нового ядра, то после перезагрузки могут перестать работать драйверы, оборудование или файловая система. По этой причине на серверах с DKMS сначала стоит убедиться, что новая версия ядра работает корректно, и только потом приступать к удалению предыдущих.
После удаления старых пакетов загрузчик обычно обновляется автоматически, но по тем или иным причинам иногда этого не происходит. Например, если система восстанавливалась после сбоя, удаление выполнялось нестандартным способом или во время обновления возникли ошибки. В таких случаях конфигурацию GRUB лучше пересоздать вручную.
В Ubuntu и Debian для этого используется команда:
sudo update-grub
В AlmaLinux, Rocky Linux, CentOS и других дистрибутивах семейства RHEL команда:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
После этого при следующей перезагрузке стоит открыть меню GRUB и проверить, что в списке остались только актуальные версии ядра.
Сразу после установки нового ядра с очисткой лучше не спешить, ведь успешная загрузка ещё не означает, что система полностью работоспособна. Новое ядро может содержать изменения, которые затрагивают драйверы устройств, сетевой стек, виртуализацию или файловые системы. Некоторые проблемы проявляются только спустя несколько часов или даже дней обычной работы.
Особенно осторожно стоит действовать на серверах, где простой недопустим, таких, например, как:
Представим такую ситуацию, когда после обновления Ubuntu на сервере с аппаратным RAID-контроллером устанавливается новое HWE-ядро. Система успешно перезагружается, но драйвер контроллера оказывается несовместим с новой версией. Если предыдущее ядро осталось в системе, то достаточно выбрать его в меню GRUB и сервер снова станет доступен, а обновление драйвера можно выполнить позже. Если же старая версия была удалена заранее, то восстановление уже потребует Rescue Mode, Live ISO или подключения через удалённую консоль провайдера.
По этой причине опытные администраторы обычно оставляют как минимум одно предыдущее рабочее ядро. Когда новая версия несколько дней отработает без ошибок, старые пакеты можно удалить уже без лишнего риска. Мы говорим об этом третий раз не просто так - это действительно важно!
Если у вас один домашний сервер, то удалять старые ядра вручную вполне нормально. Но в большой инфраструктуре такой подход быстро перестаёт работать. Когда серверов десятки или сотни, то очистку обычно автоматизируют с помощью unattended-upgrades в Ubuntu и Debian, dnf-automatic в системах семейства RHEL, Ansible или других систем управления конфигурацией, например Puppet и Salt. Полезно автоматизировать не только установку обновлений, но и контроль свободного места в разделе /boot. Это позволяет обнаружить проблему ещё до того, как очередное обновление завершится ошибкой.
Независимо от того, выполняется очистка вручную или автоматически, перед удалением стоит пройти несколько простых проверок:
uname -r;/boot;
Не стоит удалять сразу все старые версии. Гораздо безопаснее выполнять очистку постепенно, сохраняя возможность быстро откатиться к предыдущему рабочему ядру. Более того во всех штатных сценариях лучше использовать возможности пакетного менеджера. Он корректно удаляет ядро, обновляет базу пакетов, очищает связанные файлы и снижает риск получить проблемы после следующей перезагрузки.
Для большинства серверов достаточно хранить одну предыдущую рабочую версию. Во многих дистрибутивах автоматически сохраняются три последних ядра, и этого обычно вполне достаточно.
Да. Удаление не влияет на уже загруженное ядро. Изменения вступят в силу только после следующей перезагрузки.
/boot?Нет. Все операции следует выполнять исключительно через пакетный менеджер.
Использовать аварийную консоль провайдера (VNC, HTML5 Console, IPMI или Rescue Mode), загрузиться с доступной версии ядра либо восстановить систему через Live ISO.
/lib/modules?Нет. При корректном удалении пакета соответствующие модули удаляются автоматически.
Специального графика нет. Обычно достаточно проверять состояние системы после крупных обновлений ядра или при приближении заполнения раздела /boot к 80–90%.
Удаление старых ядер - это обычная процедура при обслуживании любого Linux-сервера. И если придерживаться простых правил - не трогать активное ядро и всегда оставлять одно запасное предыдущее ядро, то проблемы здесь встречаются редко.
Для очистки лучше использовать встроенный пакетный менеджер. APT и DNF корректно удаляют ядро, обновляют информацию о пакетах и поддерживают загрузчик в актуальном состоянии. А вот ручное удаление файлов из /boot таких гарантий не даёт и может привести к проблемам уже при следующем обновлении или перезагрузке.
Если сервер регулярно получает обновления, время от времени проверяйте состояние раздела /boot и не допускайте его переполнения. Для VPS и выделенных серверов это такая же часть регулярного обслуживания, как контроль резервных копий, мониторинг дисков или просмотр системных журналов. Несколько минут профилактики обычно обходятся намного дешевле, чем восстановление сервера после неудачной загрузки.
Поиск самых больших файлов и каталогов в Linux с помощью du, find и ncdu. Проверка логов, очистка Docker, анализ занятого места на диске и способы предотвратить...
Настройка bash-алиасов в Linux для быстрого администрирования серверов. Практические примеры, полезные команды, рекомендации по работе с ~/.bash_aliases и повыш...
Подробное руководство по tmux для Linux и VPS: установка, создание сессий, работа с окнами и панелями, горячие клавиши и защита длительных процессов от обрыва S...