Блог компанії 3v-Hosting

Як безпечно видалити старі ядра Linux

Адміністрування

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%, то краще зайнятися очищенням заздалегідь, інакше чергове оновлення ядра може завершитися помилкою.

 

Є й інші ознаки того, що накопичені ядра вже час видалити:

  • встановлено занадто багато старих версій;
  • оновлення через APT або DNF завершуються помилками;
  • меню GRUB стало помітно довшим;
  • резервні копії займають більше місця;
  • під час встановлення оновлень система повідомляє про брак вільного простору.

Загалом до цієї проблеми слід підходити адекватно й видаляти ядра лише тоді, коли вони починають заважати роботі системи, а не тоді, коли їх стало занадто багато. При цьому кілька попередніх версій краще залишити, оскільки вони можуть стати в нагоді, якщо після чергового оновлення щось піде не за планом, про що ми згадували вище.

 

 

 

 

Як перевірити, що можна видаляти

Перш ніж щось видаляти, варто переконатися, що місце в розділі /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.

Тому ядра видаляють лише через пакетний менеджер. Він видаляє не тільки файли, а й коректно оновлює інформацію про пакети, залежності та завантажувач.

 

Ubuntu та Debian

У системах на базі Debian ядра встановлюються через пакетний менеджер APT. Тому, якщо потрібно видалити конкретну версію, скористайтеся командою:

sudo apt remove linux-image-6.8.0-62-generic

Щоправда, ця команда використовується нечасто, і зазвичай достатньо виконати команду:

sudo apt autoremove

У такому випадку APT самостійно знайде старі версії ядра, які більше не використовуються, і запропонує видалити їх.

 

Якщо разом із пакетами потрібно очистити залишки конфігураційних файлів, тоді виконайте:

sudo apt autoremove --purge

Такий спосіб вважається найбезпечнішим, оскільки APT враховує залежності й не дозволить випадково видалити ядро, на якому зараз працює система.

 

AlmaLinux, Rocky Linux, CentOS та інші RHEL-дистрибутиви

У цій родині дистрибутивів ядра теж встановлюються як окремі пакети, але з використанням пакетного менеджера 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 вручну, це може лише погіршити проблему.

Краще діяти послідовно:

  1. Визначити, яке ядро використовується зараз, командою uname -r;
  2. Переглянути список встановлених ядер;
  3. Видалити одну або дві найстаріші версії через менеджер пакетів;
  4. Знову запустити оновлення системи.

Такий порядок дозволяє звільнити місце без ризику пошкодити базу пакетів або порушити роботу завантажувача.

 

 

 

 

Що робити з модулями ядра та DKMS

Разом із ядром система зберігає й його модулі. Вони знаходяться в каталозі:

/lib/modules/

Якщо ядро видаляється через APT, DNF або інший пакетний менеджер, то відповідний каталог у /lib/modules зазвичай видаляється автоматично, і додатково очищати його вручну вже не потрібно.

Якщо після видалення ядра якісь каталоги все ж залишилися, то спочатку переконайтеся, що сам пакет ядра дійсно видалено. Лише після цього має сенс з’ясовувати, чому пакетний менеджер не виконав очищення.

Окремої уваги потребують сервери, де використовуються DKMS-модулі. Вони автоматично перекомпілюються під час встановлення кожного нового ядра. Це стосується, наприклад, ZFS, пропрієтарних драйверів NVIDIA, VirtualBox, деяких файлових систем та окремих мережевих драйверів.

Після оновлення бажано перевірити, чи перекомпіляція завершилася без помилок:

dkms status

Якщо модуль не зібрався для нового ядра, то після перезавантаження можуть перестати працювати драйвери, обладнання або файлова система. З цієї причини на серверах із DKMS спочатку варто переконатися, що нова версія ядра працює коректно, і лише потім приступати до видалення попередніх.

 

Не забувайте про GRUB

Після видалення старих пакетів завантажувач зазвичай оновлюється автоматично, але з тих чи інших причин іноді цього не відбувається. Наприклад, якщо система відновлювалася після збою, видалення виконувалося нестандартним способом або під час оновлення виникли помилки. У таких випадках конфігурацію GRUB краще створити заново вручну.

У Ubuntu та Debian для цього використовується команда:

sudo update-grub

 

У AlmaLinux, Rocky Linux, CentOS та інших дистрибутивах сімейства RHEL команда:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

 

Після цього під час наступного перезавантаження варто відкрити меню GRUB і перевірити, чи у списку залишилися лише актуальні версії ядра.

 

 

 

 

Чому не варто видаляти старі ядра одразу після оновлення

Одразу після встановлення нового ядра з очищенням краще не поспішати, адже успішне завантаження ще не означає, що система повністю працездатна. Нове ядро може містити зміни, які зачіпають драйвери пристроїв, мережевий стек, віртуалізацію або файлові системи. Деякі проблеми проявляються лише через кілька годин або навіть днів звичайної роботи.

Особливо обережно слід діяти на серверах, де простої неприпустимі, таких, наприклад, як:

  • сервери баз даних;
  • поштові сервери;
  • Kubernetes-кластери;
  • вузли віртуалізації VMware або KVM;
  • виробничі веб-сервери;
  • сервери зберігання даних.

 

Уявімо таку ситуацію: після оновлення Ubuntu на сервері з апаратним RAID-контролером встановлюється нове ядро HWE. Система успішно перезавантажується, але драйвер контролера виявляється несумісним із новою версією.

Якщо попереднє ядро залишилося в системі, то достатньо вибрати його в меню GRUB, і сервер знову стане доступним, а оновлення драйвера можна виконати пізніше. Якщо ж стару версію було видалено заздалегідь, то для відновлення знадобиться Rescue Mode, Live ISO або підключення через віддалену консоль провайдера.

З цієї причини досвідчені адміністратори зазвичай залишають щонайменше одне попереднє робоче ядро. Коли нова версія кілька днів пропрацює без помилок, старі пакети можна видалити вже без зайвого ризику. Ми говоримо про це втретє не просто так - це дійсно важливо!

 

 

 

 

Практичні рекомендації щодо безпечного очищення

Якщо у вас один домашній сервер, то видаляти старі ядра вручну цілком нормально. Але у великій інфраструктурі такий підхід швидко перестає працювати. Коли серверів десятки або сотні, то очищення зазвичай автоматизують за допомогою unattended-upgrades в Ubuntu та Debian, dnf-automatic у системах сімейства RHEL, Ansible або інших систем управління конфігурацією, наприклад Puppet і Salt. Корисно автоматизувати не тільки встановлення оновлень, але й контроль вільного місця в розділі /boot. Це дозволяє виявити проблему ще до того, як чергове оновлення завершиться помилкою.

Незалежно від того, чи очищення виконується вручну чи автоматично, перед видаленням варто провести кілька простих перевірок:

  • визначити активне ядро за допомогою команди uname -r;
  • переконатися, що нове ядро вже деякий час працює без помилок;
  • перевірити, скільки вільного місця залишилося в розділі /boot;
  • залишити хоча б одну попередню робочу версію ядра;
  • видаляти пакети лише через APT, DNF або інший пакетний менеджер;
  • переконатися, що доступна аварійна консоль (HTML5 Console, VNC, IPMI або Rescue Mode);
  • перевірити наявність актуальної резервної копії;
  • за необхідності оновити конфігурацію GRUB;
  • виконати контрольний перезапуск і переконатися, що система завантажилася з потрібним ядром.

 

Не варто видаляти відразу всі старі версії. Набагато безпечніше виконувати очищення поступово, зберігаючи можливість швидко повернутися до попереднього робочого ядра. Більше того, у всіх стандартних сценаріях краще використовувати можливості пакетного менеджера. Він коректно видаляє ядро, оновлює базу пакетів, очищає пов’язані файли та знижує ризик виникнення проблем після наступного перезавантаження.

 

 

 

FAQ або Поширені запитання

 

Скільки старих ядер варто зберігати?

Для більшості серверів достатньо зберігати одну попередню робочу версію. У багатьох дистрибутивах автоматично зберігаються три останні ядра, і цього зазвичай цілком достатньо.

 

Чи можна видалити ядро без перезавантаження?

Так. Видалення не впливає на вже завантажене ядро. Зміни набудуть чинності лише після наступного перезавантаження.

 

Чи потрібно вручну видаляти файли з /boot?

Ні. Усі операції слід виконувати виключно через менеджер пакетів.

 

Що робити, якщо сервер перестав завантажуватися після видалення ядра?

Скористатися аварійною консоллю провайдера (VNC, HTML5 Console, IPMI або Rescue Mode), завантажитися з доступної версії ядра або відновити систему за допомогою Live ISO.

 

Чи потрібно окремо очищати /lib/modules?

Ні. При правильному видаленні пакета відповідні модулі видаляються автоматично.

 

Як часто потрібно виконувати очищення?

Спеціального графіку немає. Зазвичай достатньо перевіряти стан системи після великих оновлень ядра або коли заповнення розділу /boot наближається до 80-90%.

 

 

 

 

Висновок

Видалення старих ядер - це звичайна процедура під час обслуговування будь-якого Linux-сервера. І якщо дотримуватися простих правил - не чіпати активне ядро та завжди залишати одне запасне попереднє ядро, то проблеми тут трапляються рідко.

Для очищення краще використовувати вбудований менеджер пакетів. APT та DNF коректно видаляють ядро, оновлюють інформацію про пакети та підтримують завантажувач у актуальному стані. А ось ручне видалення файлів із /boot таких гарантій не дає і може призвести до проблем уже під час наступного оновлення або перезавантаження.

Якщо сервер регулярно отримує оновлення, час від часу перевіряйте стан розділу /boot і не допускайте його переповнення. Для VPS та виділених серверів це така ж частина регулярного обслуговування, як контроль резервних копій, моніторинг дисків або перегляд системних журналів. Кілька хвилин профілактики зазвичай обходяться набагато дешевше, ніж відновлення сервера після невдалого завантаження.

3v-Hosting Team

Автор

3v-Hosting Team

Команда 3v-Hosting складається з групи відданих своїй справі інженерів та операторів, які повністю присвятили себе створенню та підтримці основи наших сервісів. Щодня ми занурюємося у світ віртуальних та виділених серверів, займаючись усім, від розгортання та моніторингу до усунення реальних проблем, що виникають у виробничих середовищах. Більшість наших статей ґрунтуються на практичному досвіді, а не лише на теорії. Ми ділимося своїми думками щодо викликів, з якими стикаємося: перебоїв у роботі, помилок у налаштуваннях, складнощів мережевої взаємодії та архітектурних рішень, що впливають на стабільність і надійність. Наша місія проста - ми хочемо ділитися знаннями, які допоможуть вам керувати своїми проектами з меншою кількістю несподіванок та набагато більшою передбачуваністю.