Прискорення 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: встановлення, створення сесій, робота з вікнами та панелями, гарячі клавіші та захист тривалих процесів...