Do czego służy ta instrukcja „apt-get remove”?


10

Co robi następujący kod?

Znalazłem go w Internecie, więc skopiowałem go i wkleiłem do terminala, ale kiedy zainstalowałem nowe jądro, wykrywa ono tylko stary.

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')

Druga część to wyrażenie regularne, określające, jak powinna wyglądać nazwa pliku, ale nie jest to dokładnie nazwa tego pliku. Czy instalujesz jądro, które jest twoim celem, czy też dokładnie dowiaduje się, co usuwa polecenie?
Niklas Lindskog,

Ten kod nie zainstaluje żadnego jądra, ale je usunie ! Nie rozumiem, co dokładnie robi to polecenie sed, ale przetwarza dane wyjściowe dpkg -l 'linux-image-*', które wyświetla listę wszystkich zainstalowanych pakietów jądra i filtruje niektóre z nich w celu ich usunięcia apt-get remove.
Bajt Dowódca

16
Bardzo praktyczna zasada: jeśli nie wiesz, co robi kod, nie umieszczaj go w Terminalu, dopóki ktoś, kto wie, co on mówi. Jeśli próbujesz uzyskać najbardziej aktualne jądro, możesz spojrzeć na askubuntu.com/questions/119080/… zamiast używać kodu, którego nie rozumiesz.
Pułkownik Trogdor,

Stare jądra siedzące na dysku nie powodują żadnych problemów, z wyjątkiem zajmowania miejsca na dysku i update-grubspowalniania (pakiet postinst). Jeśli martwisz się, że tak naprawdę nie uruchomiłeś jądra, na które próbujesz uaktualnić, a następnie uruchomić uname -a, a nawetdmesg | less
Peter Cordes

7
„Znalazłem go w Internecie, więc skopiowałem go i wkleiłem do terminala” NIE NIE NIE NIE NIE. Skończysz robić okropne rzeczy przez przypadek. Uruchamianie kodu, którego nie rozumiesz, powoduje straszne rzeczy, takie jak nukanie twojego systemu i wyrzucanie szczeniąt.
Journeyman Geek

Odpowiedzi:


12

Złammy kod jeden po drugim (dla mojego systemu):

$ 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

To by nic nie zrobiło:

$ 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')

Jak widać , było bardzo blisko usunięcia mojego obecnego pakietu meta jądra linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image (dzięki tej ostatniej sed '/[0-9]/!d'linii), co jest złe.

Krótko mówiąc, ten kawałek sedma kilka problemów. Powinieneś tego unikać, aby usunąć starsze jądra.

EDYTOWAĆ:

Powiedziałem już, że sedpolecenie ma problemy. Ze względu na rozszerzenie zamierzam usunąć dwa ostatnie wiersze z formularzem, który powinien działać w moim bieżącym scenariuszu.

Ostatnie dwa wiersze w zmodyfikowanej formie:

sed -r 's/^[^ ]* *(([a-z]|-)*)(-[a-z]*) *(([0-9]|-)*)\..*/\1-\4\3/'

Więc:

$ 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/'

Outpus:

linux-image-3.13.0.32-generic

To bardzo dengerous !!

Teraz pokazuję, co zrobiłoby to z moim systemem, wykonując --dry-runpełne apt-get removepolecenie:

$ 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]

Jak widzisz, usunie wszystkie moje obecne jądra, zauważ również, że jest to tylko symulacja pasująca do mojego obecnego scenariusza, a oryginał sedmożna poprawić.

** Zauważ, że rzeczywisty kod będzie działał, jeśli wykonasz rebootaktualizację po jądrze, jak już wspomniał Oli .

EDYCJA 2:

Oto prosty, ale solidny skrypt, który weźmie pod uwagę wszystkie sytuacje i usunie rzeczywiste starsze jądra:

#!/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

Jeśli masz wersję nowszą niż bieżąca, pojawi się ostrzeżenie, aby najpierw ponownie uruchomić komputer. Zauważ też, że starsze jądra są zachowane z dobrego powodu, który jest taki, że jeśli w jakiś sposób zepsujesz swoje obecne jądro, powodując niestabilność systemu, powinieneś być w stanie uruchomić się na dowolnym starszym jądrze.


Um, czekaj co? Zastępujesz oryginalny, działający kod innym kodem, który Twoim zdaniem „powinien (!!) powinien tam być”, zauważ, że Twój „naprawiony” kod jest uszkodzony i usunąłby twoje obecne jądro, a tym samym doszedłeś do wniosku, że oryginalny kod to „ bardzo dengerous !! "? WTF? -1.
Ilmari Karonen

Z pewnością istnieją uzasadnione powody do krytyki oryginalnego kodu, jak wskazano np. W odpowiedzi Oli, i jestem pewien, że kod sed mógłby zostać wzmocniony. Ale faktem pozostaje, że w normalnych okolicznościach (np. Zrestartowałeś się po ostatniej aktualizacji jądra), oryginalny kod działa, podczas gdy twoja zmodyfikowana wersja nie.
Ilmari Karonen

1
Przede wszystkim nie powinieneś używać ostatniego użytego słowa .. czy rzeczywiście uruchomiłeś właściwy kod? usunięcie apt-getczęści i jaki wynik uzyskałeś?
heemayl

@IlmariKaronen: cóż, w niektórych punktach jestem drugi, zmodyfikowałem odpowiedź ..
heemayl

Dlaczego, tak, ja nie uruchomić polecenie (zmodyfikowaną wersję, że nie psuje z powodu brakującego nawiasu po (([a-z]|-)*, że jest), bez apt-getczęści przed krytykując go. W moim systemie, wyprowadza następujące wiersze: linux-image-3.13-, linux-image-3.13-, linux-image-extra-3.13-, linux-image-extra-3.13-, linux-image-3.13.0.49-generic. Czy to naprawdę to, co zamierzałeś? (Również punkty bonusowe, jeśli możesz dowiedzieć się, które jądra faktycznie zainstalowałem.)
Ilmari Karonen

12

Jest to próba usunięcia jądra, które nie jest bieżące.

Istnieje wiele fragmentów kodu, które robią coś takiego, a to nie jest dobry przykład . Może łatwo usunąć nowsze niż obecnie jądra, a zatem meta-pakiet, który instaluje się ( linux-generici wsp.), Jeśli masz aktualizację i nie uruchamiasz się ponownie.


2
I to wcale nie jest dobry pomysł. Te starsze jądra są przechowywane bez powodu, domyślnie są tylko 2 stare i bieżące.
Barafu Albino
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.