
Was macht der folgende Code?
Ich habe es im Internet gefunden, also habe ich es kopiert und in das Terminal eingefügt, aber als ich einen neuen Kernel installiert habe, wurde nur der alte erkannt.
sudo apt-get remove --purge $(dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d')
Antwort1
Lassen Sie uns den Code nacheinander aufschlüsseln (für mein System):
$ dpkg -l 'linux-image-*'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-=============================-===================-===================-================================================================
un linux-image-3.0 <none> <none> (no description available)
ii linux-image-3.13.0-32-generic 3.13.0-32.57 amd64 Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii linux-image-extra-3.13.0-32-g 3.13.0-32.57 amd64 Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image
$ dpkg -l 'linux-image-*' | sed '/^ii/!d'
ii linux-image-3.13.0-32-generic 3.13.0-32.57 amd64 Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii linux-image-extra-3.13.0-32-generic 3.13.0-32.57 amd64 Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image
$ uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/'
3.13.0-32
$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d"
ii linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image
$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d" | sed 's/^[^ ]* [^ ]* \([^ ]*\).*/\1/'
linux-image-generic
$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d" | sed 's/^[^ ]* [^ ]* \([^ ]*\).*/\1/' | sed '/[0-9]/!d'
## No output
Das hier würde also nichts bewirken:
$ sudo apt-get remove --purge $(dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d')
Wie du sehen kannstes war kurz davor, mein aktuelles Kernel-Metapaket zu entfernen linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image
(dank dieser letzten sed '/[0-9]/!d'
Zeile), was falsch ist.
Kurz gesagt, dieser Teil sed
hat mehrere Probleme. Sie sollten es vermeiden, Ihre älteren Kernel zu entfernen.
BEARBEITEN:
Ich habe bereits gesagt, dass der sed
Befehl Probleme hat. Der Erweiterung halber werde ich die letzten beiden Zeilen des Formulars entfernen, die in meinem aktuellen Szenario eigentlich funktionieren sollten.
Die letzten beiden Zeilen in abgewandelter Form:
sed -r 's/^[^ ]* *(([a-z]|-)*)(-[a-z]*) *(([0-9]|-)*)\..*/\1-\4\3/'
Also:
$ dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r |
sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d' |
sed -r 's/^[^ ]* *(([a-z]|-)*(-[a-z]*) *(([0-9]|\.|-)*)\..*/\1\-\4\3/'
Ausgabe:
linux-image-3.13.0.32-generic
Das ist sehr gefährlich!!
Um nun zu zeigen, was dies mit meinem System machen würde, --dry-run
verwenden wir den vollständigen apt-get remove
Befehl:
$ sudo apt-get remove --dry-run $(dpkg -l 'linux-image-*' |
sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d' |
sed -r 's/^[^ ]* *(([a-z]|-)*)(-[a-z]*) *(([0-9]|\.|-)*)\..*/\1\-\4\3/')
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'linux-image-3.13.0-32-generic' for regex 'linux-image-3.13.0.32-generic'
The following package was automatically installed and is no longer required:
linux-headers-generic
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
linux-generic linux-image-3.13.0-32-generic
linux-image-extra-3.13.0-32-generic linux-image-generic
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
Remv linux-generic [3.13.0.32.38]
Remv linux-image-generic [3.13.0.32.38]
Remv linux-image-extra-3.13.0-32-generic [3.13.0-32.57]
Remv linux-image-3.13.0-32-generic [3.13.0-32.57]
Wie Sie sehen, werden alle meine aktuellen Kernel entfernt. Beachten Sie auch, dass dies nur eine Simulation ist, die meinem aktuellen Szenario entspricht, und das Original sed
kann verbessert werden.
** Beachten Sie, dass der eigentliche Code funktioniert, wenn Sie reboot
nach dem Kernel-Upgrade Folgendes tun:Oli hat es schon erwähnt.
EDIT2:
Hier ist ein einfaches, aber robustes Skript, das alle Situationen berücksichtigt und die tatsächlich älteren Kernel entfernt:
#!/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
Wenn Sie eine neuere Version als die aktuelle haben, erhalten Sie eine Warnung, dass Sie Ihren Computer zuerst neu starten müssen. Beachten Sie auch, dass die älteren Kernel aus gutem Grund erhalten bleiben: Wenn Sie Ihren aktuellen Kernel irgendwie durcheinanderbringen und Ihr System dadurch instabil wird, sollten Sie in der Lage sein, jeden älteren Kernel zu booten.
Antwort2
Dies ist ein Versuch, Kernel zu entfernen, die nicht der aktuelle sind.
Es gibt viele Code-Schnipsel, die so etwas machen unddas ist kein gutes Beispiel. Es könnte problemlos neuere Kernel als die aktuellen und damit auch das Metapaket entfernen, das ( linux-generic
etwa) installiert wird, wenn Sie ein Upgrade durchgeführt und keinen Neustart durchgeführt haben.