Wie entscheidet 'apt', wie viele alte Kernel aufbewahrt werden sollen?

23

Ich verwalte ein paar Server für Kerndienste (NTP, DNS usw.) und es ist mir gerade aufgefallen, dass einer der Server die 3 neuesten Kernel anstatt der 2 anderen zu behalten scheint:

nul@quark:~$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
nul@quark:~$ dpkg -l |grep linux-image
ii  linux-image-3.13.0-51-generic       3.13.0-51.84                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.13.0-52-generic       3.13.0-52.85                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.16.0-37-generic       3.16.0-37.49~14.04.1             amd64        Linux kernel image for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-51-generic 3.13.0-51.84                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-52-generic 3.13.0-52.85                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.16.0-37-generic 3.16.0-37.49~14.04.1             amd64        Linux kernel extra modules for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-generic                 3.13.0.52.59                     amd64        Generic Linux kernel image
ii  linux-image-generic-lts-utopic      3.16.0.37.29                     amd64        Generic Linux kernel image

...

nul@dwarf:~$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
nul@dwarf:~$ dpkg -l |grep linux-image
ii  linux-image-3.13.0-52-generic       3.13.0-52.85                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.16.0-37-generic       3.16.0-37.49~14.04.1             amd64        Linux kernel image for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-52-generic 3.13.0-52.85                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.16.0-37-generic 3.16.0-37.49~14.04.1             amd64        Linux kernel extra modules for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-generic                 3.13.0.52.59                     amd64        Generic Linux kernel image
ii  linux-image-generic-lts-utopic      3.16.0.37.29                     amd64        Generic Linux kernel image

Alle Server werden identisch gewartet, wissen nicht, was ich hätte tun können, müssen irgendwo ein Parameter sein, können ihn aber nicht finden!

Bitte füttere meine Neugier! Vielen Dank

ionreflex
quelle

Antworten:

32

Es gibt eine automatisch generierte Datei, apt-getdie angibt , welche Kernel automatisch entfernt und welche beibehalten werden sollen.
Die Datei, aus der hervorgeht, um apt-getwelche Kernel es sich handelt /etc/apt/apt.conf.d/01autoremove-kernels, wird aus welchen Kerneln generiert /etc/kernel/postinst.d/apt-auto-removal.

Normalerweise geschieht dies, wenn Sie Kernel-Updates erhalten und die Kernel-Version sich ändert, z. B. von 3.13bis 3.16, und /etc/apt/apt.conf.d/01autoremove-kernelsdann aktualisiert wird, um die 3.16*Kernel beizubehalten. Anschließend werden alle 3.13Kernel entfernt, es sei denn, das generierende Skript gibt an, dass sie nicht entfernt werden sollen.

Aus dem apt-auto-removalSkript:

# Autor: Steve Langasek 
#
# Markiere die folgenden Kernelpakete als Nicht-zur-Autoremoval:
# - Die aktuell gebootete Version
# - Die Kernel-Version, für die wir gerufen wurden
# - die neueste Kernelversion (ermittelt anhand von Regeln, die aus dem Grub kopiert wurden)
# Paket für die Entscheidung, welcher Kernel gebootet werden soll)
# - die zweitletzte Kernel-Version, wenn es sich um die gebootete Kernel-Version handelt
# bereits das neueste und dieses Skript wird für dieselbe Version aufgerufen,
# um sicherzustellen, dass ein Fallback für den Fall verfügbar bleibt, dass das Programm neu installiert wird
# Kernel bei diesem ABI bootet nicht
# Im Normalfall werden genau zwei Kernel gespeichert, dies ist jedoch möglich
# führt dazu, dass drei Kernel gespeichert werden. Es ist besser, auf der Seite zu irren
# Zu viele Kernel speichern als zu wenige.
#
# Wir generieren diese Liste und speichern sie in /etc/apt/apt.conf.d, anstatt sie zu markieren
# Pakete in der Datenbank, da dies über ein Postinst-Skript und apt ausgeführt wird
# überschreibt die Datenbank, wenn sie beendet wird.

Dies markiert sie jedoch manchmal nicht für die automatische Entfernung, da ein Teil der Codierung auf Versionen umgestellt wurde, um dies zu verhindern.

Wenn Sie die vorherigen Kernel mit autoremoveAusnahme der erforderlichen Kernel basierend auf den Skripten markieren möchten , führen Sie den folgenden Befehl in einem Terminalfenster aus:

sudo apt-mark auto ^linux-image-

Wenn Sie dann den apt-get autoremoveBefehl ausführen, können nur diejenigen entfernt werden, die alt sind und nicht mehr benötigt werden. Ich habe Beispiele unten aufgeführt:

Dieser erste zeigt alle Kernel auf dem System abzüglich des aktuell ausgeführten Kernels.

root @ terrance-Linux: / home / share # dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\([^ 0-9] \ + \) / \ 1 / ")" / d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
Linux-Header-3.16.0-34
Linux-Header-3.16.0-34-generic
Linux-Header-3.16.0-36
Linux-Header-3.16.0-36-generic
Linux-Header-3.16.0-37
Linux-Header-3.16.0-37-generic
Linux-Header-4.0.0-040000
Linux-Header-4.0.0-040000-generic
Linux-Image-3.16.0-34-generic
Linux-Image-3.16.0-36-generic
Linux-Image-3.16.0-37-generic
Linux-Image-4.0.0-040000-generic
Linux-Image-Extra-3.16.0-34-generic
Linux-Image-Extra-3.16.0-36-generic
Linux-Image-Extra-3.16.0-37-generic

Dieser zeigt den aktuell laufenden Kernel.

terrance @ terrance-Linux: ~ $ uname -r
4.0.1-040001-generic
terrance @ terrance-Linux: ~ $ sudo apt-get autoremove
[sudo] Passwort für Terrance: 
Paketlisten lesen ... Fertig
Abhängigkeitsbaum erstellen       
Statusinformationen werden gelesen ... Fertig
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
terrance @ terrance-Linux: ~ $ sudo apt-mark auto ^ linux-image-
linux-image-extra-3.16.0-33-generic kann nicht markiert werden, da es nicht installiert ist.
linux-image-extra-3.13.0-27-generic kann nicht markiert werden, da es nicht installiert ist.
linux-image-3.13.0-44-lowlatency kann nicht markiert werden, da es nicht installiert ist.
linux-image-3.13.0-27-generic kann nicht markiert werden, da es nicht installiert ist.
linux-image-3.16.0-31-lowlatency kann nicht markiert werden, da es nicht installiert ist.
linux-image-3.16.0-36-generic wird automatisch installiert.
linux-image-lowlatency-lts-utopic kann nicht markiert werden, da es nicht installiert ist.
linux-image-extra-3.13.0-36-generic kann nicht markiert werden, da es nicht installiert ist.
linux-image-3.13.0-36-generic kann nicht markiert werden, da es nicht installiert ist.
linux-image-4.0.0-040000-generic wird automatisch installiert.
linux-image-extra-3.13.0-45-generic kann nicht markiert werden, da es nicht installiert ist.
linux-image-3.16.0-25-generic kann nicht markiert werden, da es nicht installiert ist.

HINWEIS: Die obige war zu lang, um sie aufzulisten, daher habe ich sie etwas abgeschnitten.

terrance @ terrance-Linux: ~ $ sudo apt-get autoremove
Paketlisten lesen ... Fertig
Abhängigkeitsbaum erstellen       
Statusinformationen werden gelesen ... Fertig
Die folgenden Pakete werden ENTFERNT:
  Linux-Image-3.16.0-34-generic Linux-Image-3.16.0-36-generic
  linux-image-4.0.0-040000-generic linux-image-extra-3.16.0-34-generic
  Linux-Image-Extra-3.16.0-36-generic
0 aktualisiert, 0 neu installiert, 5 zu entfernen und 0 nicht aktualisiert.
Nach diesem Vorgang werden 613 MB Festplattenspeicher freigegeben.
Wollen Sie fortfahren? [J / n]

Nachdem Sie diese Befehle ausgeführt haben, können Sie sehen, dass ich jetzt alle alten bis auf den aktuellen Kernel (4.0.1-040001-generic) und den nächsten neuen Kernel (3.16.0-37-generic) automatisch entfernen kann.

Hoffentlich hilft das.

Terrance
quelle
Ubuntu führt standardmäßig keine automatische Entfernung durch, oder? Wir haben die Option, aber es wurde (noch) als unmöglich erachtet, zu entscheiden, was ein "unerwünschter" Kernel ist (auf anderen Betriebssystemen ist "unerwünscht" gleich "nicht verwendet").
Rinzwind,
Okay. Ich habe deinen Beitrag in diesem
Punkt
1
@Terrance Ich habe versucht, sudo apt-mark auto ^linux-image-gefolgt von, sudo apt-get autoremove --purgeaber ohne Erfolg zu übergeben; Allerdings wurden ein wenig dist-upgrademodifizierte 2-Kernel (3.13.0-52 und 3.16.0.37) und die folgenden autoremove3.13.0-51 ...
ionreflex
1
@ionreflex Schön, dass du das gefunden hast. Nicht jede Antwort ist perfekt und funktioniert möglicherweise nicht für alle. Aber ich finde es schön, dass Leute wie Sie eine kleine Fehlerbehebung durchführen und einen Weg finden, sie zu entfernen. Ich denke, das dist-upgradedu losgerannt bist, hat /etc/kernel/postinst.d/apt-auto-removaldas dann modifiziert und /etc/apt/apt.conf.d/01autoremove-kernelsdann gesagt, welche du behalten sollst .
Terrance
1
@Terrance Ich bin mir ziemlich sicher, dass ich das schon mal gemacht habe dist-upgrade, aber vielleicht hat die Tatsache, dass die Kernel heute Morgen aktualisiert wurden, den Trick bewirkt ... Trotzdem, Prost , und danke für deine Antwort, ich habe viel gelernt!
ionreflex