Bu 'apt-get remove' komutu ne işe yarar?


10

Aşağıdaki kod ne işe yarar?

İnternette buldum, bu yüzden kopyaladım ve terminale yapıştırdım, ancak yeni bir çekirdek yüklediğimde sadece eskisini algılar.

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

İkinci bölüm, dosya adının nasıl görünmesi gerektiğini tanımlayan ancak tam olarak hangi dosya adı olduğunu tanımlayan normal bir ifadedir. Amacınız olan bir çekirdek mi kuruyor yoksa komutun neyi kaldırdığını tam olarak öğreniyor mu?
Niklas Lindskog

Bu kod herhangi bir çekirdek yüklemez , ancak kaldırır ! Bu sed komutunun tam olarak ne yaptığını görmüyorum, ancak dpkg -l 'linux-image-*'tüm kurulu çekirdek paketlerini listeleyen ve bazılarını silmek için filtreleyen çıktısını işler apt-get remove.
Bayt Komutanı

16
Yaşamak için çok iyi bir kural: Eğer bir kodun ne yaptığını bilmiyorsanız, size ne söylediğini bilen biri olana kadar bu kodu Terminal'e koymayın. En güncel çekirdeği almaya çalışıyorsanız, anlamadığınız bir kodu kullanmak yerine askubuntu.com/questions/119080/… adresine bakmak isteyebilirsiniz .
Albay Trogdor

Diskte oturan eski çekirdekler, disk alanı kaplamak ve update-grub(paket sonrası) yavaşlatmak dışında sorun yaratmaz. Yükseltmeye çalıştığınız çekirdeği gerçekten başlatmadığınızdan endişe ediyorsanız, o zaman koşun uname -a, hattadmesg | less
Peter Cordes

7
"İnternette buldum ve kopyaladım ve terminale yapıştırdım" HAYIR HAYIR HAYIR HAYIR HAYIR. Sonunda kazara korkunç şeyler yapacaksınız. Kodunu anlamadığınızda , sisteminizi nuking ve yavruların vurulması gibi korkunç şeyler ortaya çıkar.
Journeyman Geek

Yanıtlar:


12

Kodu tek tek kıralım (sistemim için):

$ 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

Yani bu hiçbir şey yapmaz:

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

Gördüğünüz gibi, şu anki çekirdek meta paketimi kaldırmaya çok yakındı linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image (bu son sed '/[0-9]/!d'satır sayesinde ), bu yanlış.

Özetle, bu parçanın sedbirkaç sorunu var. Eski çekirdeklerinizi kaldırmak için bundan kaçınmalısınız.

DÜZENLE:

Daha önce sedkomutun sorunları olduğunu söylemiştim . Uzatma uğruna, şu anki senaryomda çalışması gereken formla son iki satırı kaldıracağım.

Değiştirilmiş bir formdaki son iki satır:

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

Yani:

$ 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

Bu çok tehlikeli !!

Şimdi bunun benim sistemime ne yapacağını göstererek --dry-run, tam apt-get removekomutu ning :

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

Gördüğünüz gibi, mevcut tüm çekirdeklerimı kaldıracak, bunun sadece mevcut senaryomla eşleşecek bir simülasyon olduğunu ve orijinalin sedgeliştirilebileceğini unutmayın.

** Oli daha önce belirtildiğireboot gibi bir çekirdek sonrası yükseltme yaparsanız gerçek kod çalışacağını unutmayın .

EDIT2:

İşte tüm durumları dikkate alacak ve gerçek eski çekirdekleri kaldıracak basit ama sağlam bir komut dosyası:

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

Geçerli sürümden daha yeni bir sürümünüz varsa, önce bilgisayarınızı yeniden başlatmanız için bir uyarı verilir. Ayrıca, eski çekirdeklerin iyi bir nedenden dolayı korunduğunu unutmayın; bu, sisteminizi kararsız hale getirmek için bir şekilde mevcut çekirdeğinizi bozarsanız, daha eski bir çekirdeğe önyükleme yapabilmeniz gerekir.


Bekle, ne? Orijinal, çalışma kodunu "aslında (!!) orada olması gerektiğini" düşündüğünüz başka bir kodla değiştirirsiniz, "sabit" kodunuzun bozuk olduğunu ve geçerli çekirdeğinizi kaldıracağını ve böylece orijinal kodun " çok tehlikeli !! "? O NE LAN? -1.
Ilmari Karonen

Örneğin Oli'nin cevabında belirtildiği gibi orijinal kodu eleştirmek için kesinlikle geçerli nedenler var ve eminim sed kodu daha sağlam hale getirilebilir. Ancak bu durum, normal koşullar altında (örneğin, son çekirdek yükseltmenizden sonra yeniden başlattınız), orijinal kodun çalışır, ancak değiştirilmiş sürümünüz çalışmaz.
Ilmari Karonen

1
Her şeyden önce kullandığınız son kelimeyi kullanmamalısınız .. yani, gerçek kodu çalıştırdınız mı? çıkarmadan apt-getbölümünü ve ne çıktı elde ettiniz?
heemayl

@IlmariKaronen: iyi, bazı noktalarda seninle ikinci, cevabı değiştirdim ..
heemayl

Neden, evet, yaptım değiştirilen komutu (sonra eksik bir parantez nedeniyle çökmez sürümünü çalıştırmak (([a-z]|-)*olmadan,) apt-getonu eleştirmeden önce parçası. Benim sistemde, aşağıdaki satırları çıkarır: 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. Böyle mi gerçekten ne amaçladığınız? (Ayrıca, hangi çekirdekleri gerçekten yüklediğimi anlayabiliyorsanız bonus puanlar.)
Ilmari Karonen

12

Bu, mevcut olmayan çekirdekleri kaldırmak için yapılan bir çabadır.

Bunun gibi bir şey yapan birçok kod parçası var ve bu iyi bir örnek değil . Güncellemeden daha yeni çekirdekleri ve dolayısıyla linux-genericbir yükseltme yaptıysanız ve yeniden başlatmadıysanız ( et al) yükleyen meta paketi kolayca kaldırabilir .


2
Ve bu hiç de iyi bir fikir değil. Bu eski çekirdekler nedenden dolayı saklanır, varsayılan olarak sadece 2 eski ve geçerli bir tane vardır.
Barafu Albino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.