Як видалити старі версії ядра, щоб очистити меню завантаження?


701

Кожен раз, коли я встановлюю нове ядро ​​Linux, воно залишається в grub_config, що робить меню завантаження щоразу довшим.

Я знаю, що можу вручну шукати встановлені пакети та видаляти їх.

Чи надає Ubuntu простіший спосіб їх очищення чи запобігає їх відображенню у списку завантаження?


10
Існує команда ubuntu під назвою очистити старі-ядра, щоб виконати роботу. Дивіться мою відповідь для отримання додаткової інформації.
jarno

29
sudo apt-get autoremoveслід зробити трюк на Ubuntu 14.04+
конфорки

1
Накопичення старих ядер - це помилка, з виправленням: bugs.launchpad.net/bugs/1357093 . Коли виправлено виправлення, старіші ядра за замовчуванням будуть автоматично змінені.
user535733

1
@hobs Команда не робить для мене хитрощів в Ubuntu Studio 14.04, якщо ядра встановлені не автоматично, а оновленими програмами.
jarno

1
Я продовжую повертатися на цю сторінку ... коментар від @hobs працює лише в тому випадку, якщо ваші ядра були встановлені автоматично - проте ви зробите sudo apt-get autoremove --purge відповідь , дотримуючись apt-markпорад https://help.ubuntu.com/community/RemoveOldKernels
earcam

Відповіді:


602

16.04 та новіші версії Ubuntu

sudo apt autoremove

Ця команда видаляє пакети, які були автоматично встановлені для вирішення залежності, але тепер більше не залежать від цього. Сюди входять старі версії linux-headers-*та linux-image-*. (Це також розумно щодо цього процесу, залишаючи одну запасну версію ядра навколо як резервну!)

11.10 та новіші версії Ubuntu

GRUB2 та його відображення всіх ядер

В останніх версіях Grub2, встановлених в Ubuntu, автоматично відображається останнє ядро ​​і приховані старіші ядра, які, можливо, ви встановили.

GNU GRUB

Якщо ви не бачите своєї груби - тоді не забудьте натиснути Shiftпід час завантаження.

Як бачите, відображається лише останнє ядро.

Якщо ви виберете показану опцію (натисніть Enter), то всі старі ядра стануть видимими та доступними для завантаження.

GNU GRUB Попередні версії

Як назавжди видалити старіші ядра

Перше завантаження з останнім доступним ядром.

Існує ряд способів видалення старих ядер. Особисто я б не торкнувся Computer Janitor, оскільки це визнано, щоб зламати ваш комп'ютер із його пропозиціями.

синаптичний

Альтернатива - Synaptic ( sudo apt install synaptic)

шукайте linux-образ , клацніть правою кнопкою миші ядро ​​та виберіть повне видалення та, нарешті, натисніть кнопку Застосувати, щоб видалити ядро.

Синаптичний менеджер пакунків

Повторіть пошук, але цього разу для заголовка linux - ви можете видалити пов'язані заголовки для обраного раніше ядра.

Synaptic, хоча не намагатиметься перевірити те, що ви намагаєтесь видалити ..., ви можете ненавмисно видалити своє новітнє ядро ​​- або навіть видалити всі ваші ядра за допомогою цього інструменту, залишивши вас без завантажуваного Ubuntu !.

Не забудьте перевірити, яке ядро ​​ви використовуєте:

uname -r

Результат буде подібний до:

Термінал <uname -r>

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

Рекомендація

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


3
Видалення старих пакетів "linux-image *" за допомогою синаптики, добре працювало і з 10.04. (Я згадую це, тому що назва передбачає, що це може бути лише для 11.10 і вище)
mivk

4
-yвимикач на кінці apt-getлінії необхідно, в іншому випадку APT-отримати тільки запитує підтвердження і так як вхід труби, він просто припиняє. Так і повинно закінчитися:| xargs sudo apt-get purge -y
Джош

37
Видалення приблизно 20 версій старих linux-imageта linux-headersзвільнених 4,5 Гб місця на моїй машині.
Ендрю Мао

16
Цей метод працює добре, але видалення кожного ядра надмірно відновлює grub.cfg, що вимагає часу. Чи є якийсь спосіб відключити це для пакетного видалення, а потім відновити його один раз?
космодивер

15
Я другий питання від @spacediver - це божевільний процес, коли у вас є 38 непотрібних ядер, оскільки, як кожне з них видалено, воно проходить через усі інші, створюючи новий grub.cfg. Саме так ми називаємо операцію N ^ 2 - вона обробляє ядро ​​приблизно (38 ^ 2/2) = 722 рази, і дуже повільно. Безумовно, Ubuntu може придумати щось краще ....
nealmcb

384

По-перше, перезавантажте систему, щоб переконатися, що вона використовує останнє ядро. Потім відкрийте термінал і перевірте своє поточне ядро:

uname -r 

НЕ ВИДАЙТЕ ЦЕ КЕРНЕЛЬ!

Далі введіть команду нижче для перегляду / списку всіх встановлених ядер у вашій системі.

dpkg --list 'linux-image-*'

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

sudo apt-get purge linux-image-x.x.x-x-generic 

Нарешті, запустіть команди нижче, щоб оновити grub2

sudo update-grub2 

Перезавантажте систему.


34
Роблячи це в 10.04 та 12.04, я виявив, що оновлення-grub було автоматично запущено під час процесу очищення.
помічник

93
може бути використана дужка розширення bash , наприклад sudo apt-get purge linux-image-3.2.0-3{0..5}-generic(видаляє 30,31, .., 35)
айо

12
Не потрібно перезавантажувати систему після цього. Насправді вам слід перезавантажити систему перед виконанням цих кроків, щоб переконатися, що ви використовуєте останню версію ядра, яку ви, ймовірно, тільки що завантажили та встановили (ви зробили оновлення apt-get & & apt-get перед цим, правда ??)
Ricket

4
Ви також можете видалити linux-signed-imageпакунки, які можуть бути встановлені в системах UEFI: з sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-genericяких буде видалено 12, 14 та 24
відхилення

1
@jarno Я не знаю, використовую я підписане ядро ​​чи ні, але в моїй системі uname -rнемає жодного signedрядка. Я , здається, встановлено знакове зображення і висновок цієї lsкоманди: /boot/vmlinuz-3.19.0-16-generic.efi.signed.
девіус

283

Мій одноклапник для видалення старих ядер (це також звільняє місце на диску)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

Пояснення (пам’ятайте, |використовується вихід попередньої команди як вхід до наступної)

  • dpkg --list перелічує всі встановлені пакети
  • grep linux-image шукає встановлені зображення Linux
  • awk '{ print $2 }' просто виводить другий стовпець (який назва пакета)
  • sort -V розміщує елементи в порядку за номером версії
  • sed -n '/'`uname -r`'/q;p' друкує рядки перед поточним ядром
  • xargs sudo apt-get -y purge очищає знайдені ядра

Відмотування sedвиклику:

  • -nкаже sedмовчати
  • `uname -r` виводить поточний встановлений випуск ядра - ми включаємо його в беккетки, щоб результат був включений як частина команди (ви також можете бачити це як $(uname -r)
  • /something/qговорить "стоп", коли ти відповідаєш "щось" (у цьому випадку щось виводиться uname -r) - /оточення регулярним виразом
  • p є друк
  • ;це команда separtor, так /something/q;pговорить кинути , коли ви підходите що - то, інакше друк

загалом, sed -n '/'`uname -r`'/q;p'друкує рядки, поки вони не збігаються з поточною назвою ядра.

Якщо ви параноїк (як я), ви можете зробити останню частину xargs echo sudo apt-get -y purgeтак, щоб команда для очищення старих ядер була надрукована, то ви можете перевірити, що нічого несподіваного не включено до запуску.


Змінена версія для видалення заголовків:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

Примітка: sedвиклик змінено. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"витягує лише версію (наприклад, "3.2.0-44"), без "-генеральної" або подібної зuname -r


Універсальна версія для видалення зображень та заголовків (поєднує дві версії вище):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge

1
Зауважте, що порівняти поточну версію ядра як звичайний вираз на зразок так: небезпечно: Точки відповідають будь-якому символу, а 3.1.2-23 відповідає 3.1.2-2 (або навпаки). Дивіться також мою відповідь .
jarno

19
Ось налаштована версія "все в одному": sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done)Дивіться також мою відповідь .
jarno

1
@jarno, що дуже допомогло мені ... Кудо ваш один лайнер
Clain Dsilva

5
Через невиконані залежності мені потрібно було використовувати це dkpg -Pзамість цього. Ось повна версія:dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo dpkg -P
Себастьян Састре

3
НЕ РОБИТИ ЦЕ! "Цей oneliner виглядає трохи небезпечно, але, безумовно, 220 учасників не можуть помилитися!" Я подумав про себе і сліпо копіював. Перезавантажено, прямо до GRUB. Ця команда витерла всі мої ядра, включаючи те, що я використовував. Можливо, я запускав ядро ​​в реальному часі, навіть не пам'ятаю. В даний час оглядаю мій будинок за USB-накопичувачем, щоб встановити Ubuntu Live CD на :(
Андреас Янссон,

60

Ubuntu 16.04+:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic

Ubuntu 15.10 і новіші версії:

Я вважаю це найпростішим і швидшим способом. Він зберігає останнє ядро, а також ще два:

sudo apt-get install bikeshed
sudo purge-old-kernels

Щоб змінити кількість додаткових ядер, які зберігаються:

sudo purge-old-kernels --keep 3

1
Ця команда - це сценарій оболонки, розташування якого ви можете знайти which purge-old-kernels.
jarno

Радий, що вони зробили це набагато простіше у 16.04! Сподіваюсь, ця відповідь продовжує пробиратися ...
Тобі J

У Ubuntu 16.04 у мене purge-old-kernelsбез велосипедів ( випадкові корисні інструменти, які ще не мають постійного дому ) пакет або будь-який конкретний. Уникнути використання apt-get -yопції, це як заплющити очі і сподіватися, що все буде добре. Також ось , як autoremove вирішує, скільки старих ядер зберегти.
Пабло А

2
У 16.04 очищення старого ядра надається пакетом byobu (підказка:) apt-file search purge-old-kernels. Домовився apt-get -y, я його зніму.
bmaupin

1
@Зоскільки я не використовую версії, які не є LTS, я не був впевнений, коли саме він почався. Але я можу точно сказати, що sudo apt-get autoremoveне видалить ядра в 14.04. Не соромтеся оновити відповідь конкретною версією, якщо ви знаєте, що це таке!
bmaupin

43

Видалення записів із Grub 2 Записи слід видалити, відредагувавши або видаливши файли у папці /etc/grub.d. Файл /boot/grub/grub.cfg доступний лише для читання і зазвичай не потребує редагування.

Занадто багато ядер?

  • Якщо ви не впевнені в ядрі, яке ви використовуєте в даний момент, в терміналі типу unme -r .

  • Ядра, вилучені за допомогою APT (Synaptic, "apt-get remove" тощо), автоматично оновлять grub.cfg і жодних дій користувача не потрібно.

  • Прекрасним інструментом для видалення ядер (та записів у меню) є Ubuntu-Tweak, безпечний і простий у користуванні графічний додаток.

  • Встановити налаштування ubuntu

  • Ubuntu-Tweak буде доступний у розділі Програми> Системні інструменти.

Видалити старі записи ядра

  • Виберіть "Очисник упаковки" зліва та "Очистити ядро" на правій панелі.

  • Натисніть кнопку "Розблокувати" внизу праворуч, введіть свій пароль.

  • Виберіть із відображеного списку зображення ядра та заголовки, які потрібно видалити. Ядро, яке використовується, не вказане.

  • Натисніть кнопку "Очищення" в нижньому правому куті, щоб видалити вибрані зображення ядра та заголовки.

Видаліть операційні системи з меню Grub

  • Інші операційні системи, які були вилучені з комп'ютера, також будуть видалені з меню, як тільки "update-grub" запуститься як root.

  • Елементи меню розміщуються в меню Grub2 за допомогою скриптів. Якщо ви не хочете, щоб інші операційні системи були введені в меню, відключіть /etc/grub.d/30_osprober

  • Запустіть цю команду, щоб зупинити запуск сценарію
    sudo chmod -x /etc/grub.d/30_os-prober

  • DISABLE_30_OS-PROBER = 'true' в / etc / default / grub

Видаліть Memtest86 + з меню Grub
sudo chmod -x /etc/grub.d/20_memtest86+

  • Запустіть команду update-grub, щоб зміни могли бути включені в grub.cfg

Джерело

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

Альтернативний спосіб видалення записів ядра (до 10.04)

для GRUB не GRUB2

startupmanager Встановіть startupmanager

Ви можете знайти його в розділі Система >> Адміністрація >> alt текст
alt текст
Ви бачите на другому екрані ви можете вибрати кількість ядер? Як правило, я просто підтримую його на 1, але коли я отримую оновлення ядра, я завжди змінюю його на 2 перед перезавантаженням, щоб я міг вибрати старе ядро, якщо у нового ядра є проблеми з моїм обладнанням. Як тільки я знаю, що нове ядро ​​працює добре, я його повертаю до 1.


2
Власне, dint startupmanager надає мені таке вікно на Ubuntu 10.04, замість цього він просто дав вікно з двома вкладками -> Опції завантаження та Додатково .., а в просунутій мазі є можливість обмежити кількість ядер. Отож, будь ласка, оновіть відповідь на Ubuntu 10.04. (І тому я заперечив це) ..
Сен

будь-яка ідея, як "кількість ядер для збереження" можна визначити на машині, на якій не встановлений графічний інтерфейс (сервер)?
sylvainulg

startupmanager застарів. Дивіться grup-customizer
muhasturk

39

Чисто командний рядок, це видалить усі, крім поточного та другого найбільш поточного (через "-2" в головній команді нижче):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge

9
однолінійний звідти :dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge
Дмитро Верхотуров

@DmitryPaskal, слід додати це як нову відповідь.
saji89

10
@DmitryPaskal Як завжди, не просто копіюйте їх та вставляйте, не розуміючи їх. На моїй машині ця одношарова частина також відповідає, linux-libc-dev:amd64яку не слід видаляти.
jamesadney

1
@Kees Cook, чи не повинен аргумент awk оточуватись лише цитатами? Якщо ваш намір полягає в тому, щоб додати "linux-image-" до трубопровідних рядків, це, здається, спрацює лише за умови використання awk '{print "linux-image-" $0}'.
Марк

це не працює для мене, воно включає моє встановлене ядро ​​(Ubuntu 14.04 з 3.17)
Alex R

35

Оновлення: purge-old-kernelsзараз застаріле .

Я створив сценарій для очищення ядер навіть у складних умовах. Він називається, linux-purgeі ви можете знайти його тут .

Якщо ви просто хочете очистити ядра (та пов'язані з ними пакети), які є старшими за використовуване в даний час ядро, коли система не порушена, ви можете використовувати цей скрипт .

Існує також сторінка документації Ubuntu , що я вніс свій внесок щодо видалення старих ядер тут .


Схоже, purge-old-kernelsце не в точній версії (1,22) мотоцикла. Чи є розумний / безпечний спосіб отримати більш свіжий велосипед для точного? Або було б простіше / безпечніше просто встановити сценарій? Я хотів би скористатись репо, хоча, незважаючи на довгий список залежностей ..
drevicko

1
@drevicko Дивіться тут .
jarno

1
@drevicko, звичайно,dlocate -lsbin bikeshed
jarno

1
@drevicko, дивіться також інше запитання
jarno

1
@ChrisW так є. Я щойно зробив невелике вдосконалення сценарію, тому найкраще використовувати останню версію.
jarno

29

Ви можете дотримуватися статті Використання розділу "без догляду за оновленнями" статті " Автоматичні оновлення безпеки" на Ubuntu Wiki для цього.

Вам потрібно змінити наступний рядок у файлі /etc/apt/apt.conf.d/50unattended-upgrades ;

//Unattended-Upgrade::Remove-Unused-Dependencies "false";

з

Unattended-Upgrade::Remove-Unused-Dependencies "true";

автоматично видаляти старі пакунки, включаючи ядра.

Також видаліть або прокоментуйте рядок

"^linux-image.*"; 

у розділі "NeverAutoRemove" у файлі /etc/apt/apt.conf.d/01autoremove.


2
Я зробив це, але все ще збирав 3+ старих ядер, що споживають 100 Мб. Тож я додав apt-get autoremoveдо своєї щоденної роботи з cron, яка насправді робить оновлення, оскільки вона не завжди проходить через вбудований менеджер оновлень.
Маркос

Я думаю, що це працює в Trusty лише для ядер, які були встановлені автоматично.
jarno

Це чудово, щоб запобігти накопиченню старих ядер під час автоматичного оновлення пакетів, наприклад, при безвідповідних оновленнях. Однак якщо ви не перезавантажуєтесь, ви можете виявити, що пакет для ядра, що працює в даний момент , був видалений! Ця проблема може спричинити: нові пристрої, які ви підключаєте, можуть не працювати, оскільки модуль для них не може бути гарячим завантаженим, оскільки він більше не знаходиться на вашому диску. (Швидке виправлення цього питання полягає лише в тому, щоб знову встановити пакет ядра, а потім відключіть і підключіть пристрій.)
joeytwiddle

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

27

Найшвидший / простіший спосіб (застосований принаймні з 12.04), можливий уже з Ubuntu apt-get. Виконайте наступне, якщо ви хочете видалити всі старіші версії ядра, які не використовуються (за винятком попередньої, яку ви не використовуєте. Це переконайтесь, що якщо поточна версія ядра якимось чином не працює, у вас є шлях назад до попереднього стану). Зробіть наступне:

sudo apt-get autoclean

Це дозволить усунути будь-які старі файли (включаючи версії ядра), які у вас можуть бути. Зауважте, що якщо у вас багато старих версій, це займе певний час, оскільки потрібно переконатися, що при видаленні версії ядра не виникне проблем. Для мене видалення останніх 12 версій ядра зайняло близько 2 хвилин. Ви також можете зробити наступне:

sudo apt-get clean

Що дозволить усунути все завантажене та збережене в папці кеша apt. Нарешті, у вас є:

sudo apt-get autoremove

який би перевірив наявність невикористаних пакетів та видалив їх у разі потреби. Це чудово підходить для тих бібліотек та пакунків залежностей, які більше не потрібні через будь-який встановлений додаток.


1
Я припускаю, що це змінилося в новіших випусках, оскільки в 14.04 це просто очищає кеш пакетів і не впливає на встановлені пакети чи grub.
jarno

2
Я можу підтвердити, що sudo apt-get autoremoveвидаляє старі (більше однієї версії тому) ядра в 14.04. Можливо, вам доведеться запустити його до та після оновлення ядра. Коли я працював перед оновленням, він видалив лише загальну версію старого ядра. Потім, після оновлення мого ядра, він також видалив стару версію низької затримки ядра.
tekNorah

Я мав на увазі sudo apt-get autocleanкоманду. @tekNorah Я встановив пару старих ядер і після цього запустив sudo apt-get autoremoveу Ubuntu Studio 14.04. Це не видалило жодних ядер. У мене встановлено лише ядра низької затримки. Чому у вас встановлені як загальні, так і ядра?
jarno

5
Так, це прекрасно працювало для мене, очистило всі старі ядра належним чином і не покладається на шалені однорядкові сценарії! Рекомендовано, бажаю, щоб я міг підтвердити це не раз!
Джефф Етвуд

1
@JeffAtwood добре, він може видалити більше безпечних ядер. Дивіться звіт про помилку
jarno

25

10.04 Метод графічного інтерфейсу

Комп'ютерний двірник може очистити старі ядра, і я вважаю, що він встановлений за замовчуванням в Ubuntu (але не Kubuntu).

GRUB 1, якщо ви використовуєте це, має можливість /boot/grub/menu.lstвказати, скільки ядер повинно бути показано максимум. GRUB 2, наскільки я можу сказати, ні.


4
Комп'ютерний двірник не слід використовувати - він баггі і тепер його відкинули як додаток за замовчуванням у natty / oneiric / точно.
fossfreedom

2
Швидше встановіть "Ubuntu Tweak", як описано в іншій відповіді (власному ppa), який має власний "комп'ютерний двірник" (не плутати з "комп'ютерним двірником", який тимчасово був доступний у старих версіях ubuntu)
michael

25

Щоб зрозуміти, які ядра та заголовки встановлені

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

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

Також є кілька зручних команд та сценаріїв для автоматичного видалення.

http://ubuntuforums.org/showthread.php?t=1658648

Вилучіть усі невикористані ядра та заголовки:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | grep -v hwe | xargs sudo apt-get purge

(використовувати apt-get -yдля видалення без запитання)

Ось що відбувається під час запуску 18.04.1:

~$ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]

\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | xargs sudo apt-get -y purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-4.15.0-33* linux-headers-4.15.0-33-generic* linux-headers-4.15.0-34* linux-headers-4.15.0-34-generic* linux-image-4.15.0-33-generic* linux-image-4.15.0-34-generic*
  linux-modules-4.15.0-33-generic* linux-modules-4.15.0-34-generic* linux-modules-extra-4.15.0-33-generic* linux-modules-extra-4.15.0-34-generic*
0 upgraded, 0 newly installed, 10 to remove and 1 not upgraded.
After this operation, 671 MB disk space will be freed.
(Reading database ... 227403 files and directories currently installed.)
Removing linux-headers-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-headers-4.15.0-33 (4.15.0-33.36) ...
Removing linux-headers-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-headers-4.15.0-34 (4.15.0-34.37) ...
Removing linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-image-4.15.0-33-generic (4.15.0-33.36) ...
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-33-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-image-4.15.0-34-generic (4.15.0-34.37) ...
I: /vmlinuz.old is now a symlink to boot/vmlinuz-4.15.0-36-generic
I: /initrd.img.old is now a symlink to boot/initrd.img-4.15.0-36-generic
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-34-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
(Reading database ... 156180 files and directories currently installed.)
Purging configuration files for linux-image-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
dpkg: warning: while removing linux-modules-4.15.0-33-generic, directory '/lib/modules/4.15.0-33-generic' not empty so not removed
Purging configuration files for linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-image-4.15.0-33-generic (4.15.0-33.36) ...
Purging configuration files for linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
~$ uname -r
4.15.0-36-generic

Сценарій, який ви знайшли на форумі, несправний. Він може не видалити потрібний пакунок заголовка (якщо трапиться старе ядро ​​-pae), а з іншого боку, він може видалити частину пакунків, які ви хочете зберегти.
jarno

Дякую за коментар Сценарій, можливо, не є ідеальним, однак, я його використовую роками, в основному 12.04 та 14.04, 32 та 64 біти, і не виникло жодних проблем. ... і так, linux-libc-devвстановлено.
mikew незалежно від того,

Я припускаю, що номер версії відповідає номеру linux-libc-devверсії поточного каналу тоді. Тут dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'друкується linux-libc-dev: amd64
jarno

Я все ще не можу відтворити ваші висновки, однак, щоб бути в безпечній стороні, я змінив команду, додавши додатковий фільтр - grep -E "(image|headers)".
щороку

1
Спершу спробуйте зняти -yпрапор із очищенням, будь ласка ..!
небезпека89

16

Щоб видалити старіші ядра зображень Linux, спочатку завантажте ядро, яке ви хочете зберегти.

Ви також можете перевірити версію ядра за допомогою команди, uname -rщоб не видалити помилкову помилку.

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

Тепер при перезапуску ви побачите більш чисте меню груб.


Це, мабуть, самий основний метод, який допоможе користувачам, у яких встановлено без комп’ютерного двірника.
Брам

1
У меню Ubuntu 11.04 меню grub відображає лише поточне ядро ​​за замовчуванням, старіші ядра ховаються у меню "Попередні ядра". Цей спосіб все ще буде працювати з очищенням старих.
Енді

14

Ви можете встановити ubuntu-tweak, а потім перейти до Програми -> Системний інструмент -> налаштування ubuntu та

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


8

Особисто мені подобається користуватися Synaptic. Це змушує мене відчувати себе більш захищеним щодо того, що відбувається. Єдине додаток, який я використав, який має можливість видалити старі ядра, це Ubuntu Tweak .

Як видалити ядра, які ви не використовуєте:

  • Відкрийте UbuntuTweak
  • Клацніть на «Очисник упаковки» у розділі «Програми» на панелі зліва
  • У правій частині "очищення" натисніть "Очистити ядра"
  • Виберіть усі ядра - я думаю, що те, що використовується, не вказане, але про всяк випадок, якщо перевірка працює uname -aв терміналі

У Synaptic ви можете фільтрувати на "Компоненти" -> "Ядро та модулі", які включають усі ядра. І сортуйте за першим стовпцем: 'S' (Статус), щоб ви отримали всі встановлені ядра зверху. Дійсно update-grubрадиться.
небезпека89

6

Ви можете видалити старі ядра ( linux-image-...пакети) за допомогою Synaptic, які видалять їх із меню завантаження. Слідкуйте за тим, щоб не видаляти запущене ядро ​​(ви можете перевірити його версію за допомогою uname -r).

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

Крім того, ви можете редагувати / видаляти записи вручну ( gksu gedit /boot/grub/grub.cfg), але вони будуть повторно генеровані під час оновлення до більш ядра. Якщо ви думаєте про видалення recovery modeваріантів - не робіть. Вони можуть стати в нагоді, якщо ви зламаєте щось, що заважає вам завантажуватися.


Перейдіть на цю сторінку.


Тепер Grub2 будує запис grub щоразу, коли встановлюється нове ядро. з update-grubяким перепишуть усі ці ядра.
Марко Цеппі

4

Це чисте рішення командного рядка.

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

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    grep -v $(uname -r | cut -d- -f1,2))

Альтернативно генеруйте список усіх встановлених версій ядра, крім двох останніх:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    sort -V | head -n -2)

Вивчіть список. Переконайтесь, що версії ядра, які ви хочете зберегти, не є частиною списку. Використовуйте команду, uname -rщоб переглянути версію поточно запущеного ядра.

Якщо ви задоволені результатами, ви можете використовувати apt-getдля видалення пакунків.

Спочатку сухий цикл (використовуючи перший генератор як приклад):

sudo apt-get --dry-run purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Тоді справжній пробіг:

sudo apt-get purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Якщо ви хочете автоматизувати процес, додайте --yesпараметр:

sudo apt-get --yes purge $(
  ...)

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

1
Це поєднує в собі дві цілі: Тримайте останні два ядра та підтримуйте новіші ядра, ніж поточні sudo apt-get purge -- $(ls -1U /boot/vmlinuz* | cut -d- -f2,3 | sort -uV | head -n -2 | awk -v c=$(uname -r | cut -d- -f1,2) '($0==c){exit} //' | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/'). Немає необхідності, dpkg-queryоскільки apt-getможна обробляти регулярні вирази. Зверніть увагу, як я уникаю крапок, і додайте префікс і суфікс до регулярного виразу. Використовуючи сценарій в моїй власній відповіді, ви також можете зберегти деякі ядра, які старші за поточні.
jarno

4

Перевагою цієї відповіді є те, що Ubuntu Bash використовується без встановлення сторонніх додатків. Користувачі користувацьких ядер, які не використовували aptабо dpkgможуть змінити цей скрипт bash відповідно до своїх потреб. Ця відповідь заснована на ( Як вибірково очистити старі ядра все одночасно ).

Рішення на основі зеніту

Zenity забезпечує приємний інтерфейс GUI до терміналу для обробки списку та вибору елементів за допомогою перемикачів :

rm-ядра 1

Оскільки заголовок вказує, що поточне ядро, з яким ви завантажилися, не може бути видалено і не включено до списку. Розмір повідомляється про те, скільки буде збережено в /bootкаталозі. Більше зберігається на вашому диску, оскільки бінарні файли ядра містяться і в інших областях. 27 липня 2017 р. Примітка: Довідники /usr/src/*kernel_version*і /lib/modules/*kernel_version*зараз також включені.

Дата зміни виявляється з допомогою statкоманди. У моїй системі ця дата "торкається" кожного разу, коли ядро ​​завантажується за допомогою цього ( Як дізнатися, коли конкретна версія ядра востаннє завантажувалася? ) Cron script перезавантаження. Однак у вашій системі датою буде дата випуску ядра, а не останній раз, коли ви її завантажували.

apt-get purge дає шанс зробити аборт

Вам надається остання можливість переглянути все, що буде очищено, і переглянути загальний простір на диску (дещо введений в оману), який буде відновлено:

The following packages will be REMOVED:
  linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic*
  linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic*
  linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic*
  linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic*
  linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic*
  linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic*
  linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic*
  linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic*
  linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic*
  linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic*
  linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic*
  linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic*
0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded.
After this operation, 2,330 MB disk space will be freed.
Do you want to continue? [Y/n] 

Код

Скопіюйте цей код у виконуваний файл, названий rm-kernelsу /usr/local/bin:

#!/bin/bash

# NAME: rm-kernels
# PATH: /usr/local/bin
# DESC: Provide zenity item list of kernels to remove

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    zenity --error --text "root access required. Use: sudo rm-kernels"
    exit 99
fi

OLDIFS="$IFS"
IFS="|"
choices=()

current_version=$(uname -r)

for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    choices=("${choices[@]}" false "$v" "$d" "$s")
done

# adjust width & height below for your screen 640x480 default for 1920x1080 HD screen
# also adjust font="14" below if blue text is too small or too large

choices=(`zenity \
        --title "rm-kernels - Total: $t MB excluding: $current_version" \
        --list \
        --separator="$IFS" \
        --checklist --multiple \
        --text '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
        --width=640 \
        --height=480 \
        --column "Select" \
        --column "Kernel Version Number" \
        --column "Modified Date" \
        --column " Size " \
        "${choices[@]}"`)
IFS="$OLDIFS"

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
     apt-get purge $list
fi

ПРИМІТКА. Для створення файлу потрібен дозвіл sudo:

gksu gedit /usr/local/bin/rm-kernels

Щоб використовувати файл у виконанні:

sudo chmod +x /usr/local/bin/rm-kernels

Версія сервера

rm-kernels-serverце серверна версія для вибіркового видалення ядер всі відразу. Замість діалогового вікна (графічного) графічного інтерфейсу використовується текстове діалогове вікно для вибору ядер для очищення.

  • Перед запуском сценарію потрібно встановити діалогову функцію за допомогою:

    sudo apt install dialog

Діалогове вікно встановлено за замовчуванням для установки Ubuntu Desktop, але не для сервера Ubuntu.

Зразок екрана

rm-ядра-сервер 1

rm-kernels-server баш-код

#!/bin/bash

# NAME: rm-kernels-server
# PATH: /usr/local/bin
# DESC: Provide dialog checklist of kernels to remove
#       Non-GUI, text based interface for server distro's.

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    echo "root access required. Use: sudo rm-kernels-server"
    exit 99
fi

# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed.  Aborting."; exit 99; }

OLDIFS="$IFS"
IFS="|"
item_list=() # Deviate from rm-kernels here.

current_version=$(uname -r)
i=0
for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    ((i++)) # Item List
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off)
done

cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \
    --title "Use space bar to toggle kernel(s) to remove" \
    --column-separator "!" \
    --separate-output \
    --ascii-lines \
    --checklist "         Kernel Version --------- Modified Date  Size" 20 60 15)

selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty)

IFS=$OLDIFS

if [ $? -ne 0 ] ; then
    echo cancel selected
    exit 1
fi

i=0
choices=()

for select in $selections ; do
    ((i++))
    j=$(( 1 + ($select - 1) * 3 ))
    choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!")
done

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
    apt-get purge $list
fi

ПРИМІТКА. У виклику до dialogдирективи --ascii-linesпередається замінити розширений набір символів (який sshне подобається) на "+ ----- +" для графічних коробок. Якщо вам не подобається ця зовнішність, ви можете використовувати --no-linesдирективу взагалі без поля.


28 липня 2017 року оновлення

Розрахунковий розмір кожного ядра було взято з /boot/*kernel_version*яких було 5 файлів на загальну суму ~ 50 Мб. Формула змінилася, включаючи файли в /usr/src/*kernel_version*і /lib/modules/*kernel_version*. Розрахунковий розмір для кожного ядра становить зараз ~ 400 МБ. Вищевказаний код для rm-kernelsта rm-kernels-serverбув оновлений. Однак наведені вище зразки екранів ще не відображають цих змін.

За замовчуванням - оцінити розмір файлів для linux-заголовків у 125 Мбайт та linux-зображення в 220 МБ, оскільки це duможе бути болісно повільним, якщо файли не знаходяться в кеші. Для отримання реального розміру використовуйте duпередайте будь-який параметр сценарію.

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

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


2

Простим способом позбутися майже всіх застарілих пакетів, пакунків, які більше не містяться в списку пакунків, поряд із застарілими ядрами є зробити одне з наступного:

dpkg --purge $(aptitude search ?obsolete)

Однак це буде пропускати пакунки, які все ще рекомендуються іншими пакунками, і аргумент -R / - без рекомендацій не вирішує цю проблему.

dselect після переключення режиму сортування на 'o' покаже всі застарілі пакети, включаючи пропуски, але деякі люди не люблять його використовувати.


Дана команда не очищує старі ядра і не впливає на меню grub на мій досвід.
jarno

2

У прийнятій відповіді, що використовує sedдля видалення старих ядер назавжди, є деякі недоліки, якщо хтось не перезавантажив комп'ютер після оновлення ядра, команда також видалить нове ядро.

Ось альтернативне рішення, яке розгляне всі ситуації лише для видалення фактичних старих ядер:

#!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))

for kernel in "${kernels[@]}"; do
    ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
    dpkg --compare-versions "$ker_rel" gt "$cur_rel" && echo "Please Restart your computer first" && break
    dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done

Якщо у вас є будь-яка версія, яка є більш новою, ніж поточна, то це попередить спочатку перезавантажити комп'ютер. Також зауважте, що старіші ядра зберігаються через вагому причину, яка полягає в тому, що якщо ви якимось чином псуєте своє поточне ядро, роблячи вашу систему нестабільною, то ви повинні мати можливість завантажуватися в будь-яке старе ядро.


Це не видалить ядра з низькою латентністю або ядрами іншого аромату, ніж загальний.
jarno

Я думаю, ви посилаєтесь на це sed рішення.
jarno

@jarno: Як щодо заміни grep -Po "^linux-image-[^-]+-[^-]+-generic\b"на grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"і grep -Po ".*(?=-[a-z]*$)"з grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"і grep -Po "[0-9].*(?=-[a-z]*)"на grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"?
Саді

@Sadi, well, l, які також не знайдуть ядер з низьким рівнем затримки.
jarno

1
Дякую. Інші методи не працювали для мене. Ваші зробили цю роботу.
Філіп Дельтейль

1

ailurus має особливість видалення старих ядер, а також невикористаних конфігурацій. Я особисто видаляю його вручну з синаптичного. Ви можете встановити Ailurus з getdeb , а також рра


"Ailurus - це інструмент для резервного копіювання списку імен встановленого програмного забезпечення. У минулому Ailurus має багато функцій. Зараз він має лише одну функцію. Тому що я думаю, що одна дійсно корисна функція краща за десятки менш корисних функцій."
jarno

1

У мене є сценарій для цього, який не потребує дуже фантазійного розбору рядків.

Видаліть заголовки та зображення, крім поточного, щоб звільнити місце

sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+

1

Ви можете використовувати ukuu - це все GUI - для оновлення та видалення старих ядер. Для мене працює!

Просто пам’ятайте, залиште останні два встановлені та, очевидно, «запущене» ядро.

Ви також можете встановити ukuu, щоб відображати лише основні версії, навіть RC ядра, приховувати версії.

укуу

Ви можете знайти ukuu в Synaptic, або інструкції можна знайти тут:

Інструкції з встановлення OMG! Ubuntu ukuu


1

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

#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)

SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | uniq | sed -n 2p)

# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
    if [ -n "$SECONDTOLASTVER" ]; then
        echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
    fi
}

echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get purge

(використовувати apt-get -yдля видалення без запитання)


Будь-яка причина, чому це було знято? Це не працювало для когось? Копіюючи / вставляючи, переконайтеся, що ви не загортаєте довгі рядки під час вставки. У мене жодних проблем із цим не працювало.
Марк

Найновіший випуск ядра в моїй машині - 3,13,0-43-низький рівень затримки. Цей сценарій очистив би Linux-заголовки-3.13.0-43-низькі затримки.
jarno

@jarno як ти це визначив? щоб спробувати це, не роблячи насправді нічого, додайте прапор "-s" до команди apt-get (або просто видаліть | xargs sudo apt-get -y purgeвзагалі). Якщо він видає 3.13.0-43-низької затримки, можливо, у вас є кілька пізніших версій, ніж встановлені у вашій системі.
Марк

Я спробував моделювання. Ні, але у мене було видалено попередню версію ядра, але її не очищено, і відповідні пакети заголовків очищені.
jarno

У всякому разі, я розробляв сценарій, заснований на ідеї відповіді Санкальпа.
jarno

0

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

gedit /boot/grub/grub.cfg

потім знайдіть записи, які ви хочете зберегти, ми виділимо і скопіюємо їх

cd /etc/grub.d
ls

ви побачите список таких файлів, як 10_linux та 30_os-prober

sudo chmod -x 10_linux

це зупинить форму автоматичного додавання всіх записів linux у меню завантаження grub.

gksudo gedit 40_custom

відкрийте користувальницький файл меню завантаження, потім поверніться до grub.cfg (який все ще має бути відкритим у gedit) та скопіюйте записи, які ви хочете зберегти ... наприклад

menuentry "My Default Karmic" {
  set root=(hd0,1)
  search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
  linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
  initrd /boot/initrd.img-2.6.31-11-generic
}

вставити їх 40_custom, а потім зберегти.

sudo chmod 755 40_custom

робить його виконуваним, потім, нарешті, ми оновлюємо grub, що змінить файл grub.cfg:

sudo update-grub

Тепер ЗАБЕЖАЙТЕ, якщо ви оновите ядро ​​або ОС, меню завантаження, ймовірно, не оновиться ... вам доведеться це робити вручну. Але виконання цієї процедури дозволить вам трохи більше налаштувати меню завантаження, наприклад, видалити версію ядра та просто поставити ім'я ubuntu ... тобто Ubuntu Lucid 10.04 і т.д. ...

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


3
Ця відповідь здається непосильним. Краще просто видалити старі ядра.
Скотт Северанс

Я читав, що додаткові ядра можуть бути корисні у випадку відновлення. Крім того, це простий спосіб редагувати текст запису завантаження. Тому замість того, щоб сказати "Ubuntu, Linux ядро ​​xxxx-y --text1 -text2 -t3 -t4 --t5 і т. Д. І т. Д. І т.д." (де записи --text просто позначають деякі параметри / параметри, я не розумію) ви можете змінити це до "Ubuntu xx.yy", хоча у мене була дужка "{", яку я не міг позбутися.
Джо

1
Я зберігаю безпосереднє попереднє ядро ​​навколо, поки я не переконався, чи найновіше ядро ​​працює належним чином. Якщо він працює, він не перестане працювати. Отже, після того, як я перевірив останнє ядро ​​(через тиждень або близько того), у мене немає підстав тримати старе ядро ​​навколо. Якщо це не працює, я маю останнє відоме добре ядро, до якого слід повернутися. Насправді я зараз запускаю старе ядро ​​через помилку showstopper у поточних ядрах. Але це не змінює мою загальну політику. Вам потрібно лише одне відоме добре ядро.
Скотт Северанс

0

Встановіть диспетчер синаптичних пакетів і перейдіть на вкладку «Фільтри» (думаю, фільтри, якщо не спробувати всі 5) і виберіть «локальний». Це покаже вам осиротілі пакети у вашій системі, наприклад, ядра. Після видалення їх запустіть update-grub. Ця команда оновлює список параметрів завантаження для grub.

Якщо це не вдається, ви завжди можете спробувати apt-get remove linux-image-version-generic.


У Synaptic ви можете фільтрувати на "Компоненти" -> "Ядро та модулі", які включають усі ядра. І сортуйте за першим стовпцем: 'S' (Статус), щоб ви отримали всі встановлені ядра зверху. Дійсно update-grubрадиться.
небезпека89

0

Щоб мати трохи більше контролю над тим, які версії зберігати, явно виберіть ті, які ви хочете видалити. Наприклад, якщо ви хочете видалити версії ядра 3.2.0. [49-53], використовуйте простий forцикл:

for k in 49 51 52 53 ; do aptitude remove --purge linux-image-3.2.0-${k}-generic ; done

Відрегулюйте список версій ядра відповідно до.


0

Спробуйте це. Запустити його як корінь.

Збережіть цей скрипт як, скажімо ./keep-n-kernels.sh

Передайте, як аргумент командного рядка, кількість останніх ядер, які ви хочете зберегти.

    
#! / бін / баш

# передайте n як аргумент командного рядка, і він знайде всі встановлені
# ядра та зберігати лише n найновіших => видалити всі старіші

# dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\(pted^ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
# Ця команда дає список усіх пакетів ВИКЛЮЧЕНО для останнього ядра.
# джерело: https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n = $ 1

# знайти встановлені версії ядра:
# dpkg-query -W -f = '$ {Версія} \ n' 'linux-image- *' | греп. | сортувати -н
# дає номери версій, по одному у кожному рядку
# dpkg-query -W -f = '$ {Версія} \ n' 'linux-image- *' | греп. | sed 's /\...$// g' | grep -v '\ ... $' | сортувати -у
# дає лише ті, які з’являються у linux-образі

# суфікс, наприклад -генерік-пае
# тип ядра, в яке ви завантажуєтесь
суфікс = $ (унаме -r | sed 's: ^ [0-9] \. [0-9] \. [0-9] \ - [0-9] \ {2 \} :: g')

command = "apt-get purge"

для версії в $ (dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$// g' | grep -v ' \ ... $ '| сортування -u | голова -n - $ {n})
робити
    command = $ {command} "^ linux-image - $ {version} $ {суфікс}"
зроблено

$ команда

Використання зразка:

# ./keep-n-kernels.sh 4 # запустіть команду apt-get, щоб видалити всі, крім чотирьох останніх ядер

Якщо ви хочете [І НА ВАШОМУ РИЗИКІ], ви можете додати команду apt-get до команди -y (або прапор сили) та зробити її неінтерактивною.


Він видаляє всі ядра, якщо ви запускаєте ./keep-n-kernels.sh 0. Визначення рядка суфікса не працює; Я думаю, що суфікс = $ (uname -r | sed -r 's / ^ [0-9.] * (- [0-9.] +) * //') або суфікс = $ (uname -r | egrep - -одинник-відповідність - '- [[: альфа:] -] + $').
jarno

Але я думаю, що ідея приємна. Я працював над вдосконаленням сценарію, і, можливо, опублікую його тут колись, коли думаю, що він достатньо готовий.
jarno

Поділіться будь ласка, @jarno. Радий знати, що ідея здається корисною.
Санкальп

Гаразд, ось воно: посилання
jarno

0

Я використовую робочий стіл KDE, і найпростішим варіантом, який я знайшов, було використання програми kde-config-grub2, як тут пропонується: https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux-versions (який я вже встановив для встановлення фонового зображення, опції завантаження за замовчуванням тощо). Поруч зі спадним вікном, де ви можете вибрати запис за замовчуванням, є кнопка "Видалити старі записи". Натиснувши на цю кнопку, ви побачите список усіх встановлених ядер, і ви можете вибрати, які з них видалити. При застосуванні змін він використовуватиме dpkg, щоб фактично видалити їх із системи, а також з меню GRUB.


0

Тільки щоб задзвонити, ви також можете видавати

apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}

як root, і робота буде виконана.


0

Якщо ви використовуєте ansible для керування машинами, ця книжка може бути корисною.

---
 - hosts: all
   become: yes
   tasks:
    - name: "Run apt-get autoremove"
      apt: 
        name: linux-image-generic
        autoremove: yes
        state: present 
        update_cache: yes
        cache_valid_time: 3600
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.