Bash tek liner sadece eski çekirdekleri silmek için

21

/ boot bölümündeki alanın nasıl boşaltılacağına dair birçok konu gördüm ve bu benim de hedefim. Ancak, sadece eski kernelleri silmekle ilgileniyorum ve bunlardan her birini değil, geçerli olanı.

Tek bir liner olmak için çözüme ihtiyacım var, çünkü senaryoyu Puppet'den yöneteceğim ve etrafta fazladan dosyalar olmasını istemiyorum. Şimdiye kadar aşağıdakileri aldım:

dpkg -l linux-* | awk '/^ii/{print }' | egrep [0-9] | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e 'uname -r | cut -f1,2 -d"-"' | xargs sudo apt-get -y purge

Daha net olmak gerekirse, şu anda ne yapıyor:

  • Tüm linux- * paketlerini listeleyin ve isimlerini yazınız.
  • Yalnızca sayıları olan ve sıralayanları listeler, ters sonucu döndürür. Bu şekilde, daha eski çekirdekleri en son listelenir.
  • Sadece mevcut çekirdekten sonra gelen sonuçları yazdırın
  • Bazı linux- {image, headers} sonuçları olduğundan, şu anki çekirdeğimle ilgili herhangi bir şeyi temizlememden emin olun
  • Tasfiye için çağrı yap

Bu işe yarıyor ama eminim ki çözüm daha zarif ve bir üretim ortamı için güvenli, çünkü sunucularımızın en az 20 tanesi Ubuntu kullanıyor.

Zaman ayırdığınız için teşekkürler Alejandro.

    
sordu Alejandro 07.01.2014 16:34

8 cevap

23

Yeterince güzel görünüyor, sadece birkaç yorum. İlk iki yorum komutu daha güvenli kılarken, üçüncü ve dördüncü adım biraz daha kısadır. Bunlardan herhangi birini takip etmek veya yok saymaktan çekinmeyin. Yine de ilk ikisini takip etmeyi şiddetle tavsiye ederim. Mümkün olduğunca güvenli olduğundan emin olmak istiyorsun. Gerçekten diyorum. Otomatik olarak oluşturulan bazı paketler listesinde sudo apt-get -y purge atıyorsunuz. Bu yüzden kötülük ! :)

  1. Tüm linux-* 'i listelemek size (örneğin çıktısından) linux-sound-base gibi birçok yanlış pozitif getirecektir. Her ne kadar bunlar sizin emrinizle daha sonra filtrelenebilse de, kişisel olarak onları daha önce listelemekten daha güvenli hissediyorum. Kaldırmak istediğiniz paketleri daha iyi kontrol edin. Beklenmeyen sonuçlar doğurabilecek şeyler yapmayın. Bu yüzden benimle başlayacağım

    dpkg -l linux-{image,headers}-*
    
  2. "Yalnızca sayıları olanları listeleme" ifadesi bence biraz fazla basit. Örneğin, 64 bitlik bir sistemde paket linux-libc-dev:amd64 var. Regex'iniz eşleşecek. Eşleşmesini istemiyorsun. Şüphesiz, ilk tavsiyemi takip ettiyseniz, linux-libc-dev:amd64 yine de listelenmez, yine de. Bir versiyon numarasının yapısı hakkında basit bir gerçek olan “bir sayı var” den daha çok şey biliyoruz. Ek olarak, kabuk tarafından olası yanlış yorumlamaların önlenmesi için normal ifadeler kullanmak genelde iyi bir fikirdir. Bu yüzden egrep komutunu yaparım

     egrep '[0-9]+\.[0-9]+\.[0-9]+'
    
  3. Sonra bu sıralama şey var. Neden sıralıyorsun? Zaten tüm çekirdekleri (geçerli olanı hariç) kaldırmaya başladığınızdan beri, daha eski olanları daha eskilerinden ayırmanız önemlidir. Bunun bir fark yarattığını sanmıyorum. Ya da sadece bunu yapıyorsunuz, o zaman sed 'yi sadece "geçerli çekirdekten sonra gelen sonuçları yazdır" için kullanabilirsiniz. Fakat IMO bu çok karmaşık bir şey. Zaten halihazırdaki çekirdeğinize karşılık gelen sonuçları neden filtrelemediniz, zaten zaten grep -v ile yapıyorsunuz ve bitiyor mu? Dürüst olmak gerekirse, komutunuzun ilk bölümünü aldığımda (entegre edilmiş iki öneri ile), makinemde

    $ dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e 'uname -r | cut -f1,2 -d"-"'
    linux-image-3.8.0-34-generic
    linux-image-3.5.0-44-generic
    

    Bu sıralama / sed öğelerini kaldırıyorum

    $ dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | grep -v -e 'uname -r | cut -f1,2 -d"-"'
    linux-image-3.5.0-44-generic
    linux-image-3.8.0-34-generic
    linux-image-extra-3.5.0-44-generic
    linux-image-extra-3.8.0-34-generic
    

    Böylece daha karmaşık komutunuz makinemdeki iki paketi özleyecektir, ki bunu kaldırmak istiyorum (şimdi linux-image-extra-* 'sinin linux-image-* thingysine bağlı olması ve dolayısıyla yine de kaldırılması mümkündür, ancak açık yapmak için zarar vermez. Her halükarda sıralama sırasını göremiyorum; fantezi ön işleme olmadan basit bir grep -v , muhtemelen daha iyi olmalıdır. KISS prensibinin bir savunucusuyum. Daha sonra anlamanızı veya hatalarınızı ayıklamanızı kolaylaştırır. Ayrıca, sıralama olmadan biraz daha verimli;)

  4. Bu tamamen estetiktir, ancak bu biraz daha kısa varyantla aynı çıktıyı elde edersiniz. : -)

    $ dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | grep -v $(uname -r | cut -d- -f-2)
    linux-image-3.5.0-44-generic
    linux-image-3.8.0-34-generic
    linux-image-extra-3.5.0-44-generic
    linux-image-extra-3.8.0-34-generic
    

Sonuç olarak, daha basit ve güvenli bir komutla bitiriyorum

$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | grep -v $(uname -r | cut -d- -f-2) | xargs sudo apt-get -y purge

Aslında /boot bölümünüzü temizlemeyi tercih ettiğinizden, /boot içeriğini listelemek tamamen farklı bir yaklaşım olacaktır, her bir dosyanın ait olduğu paketleri belirlemek için dpkg -S kullanın, mevcut çekirdeğe aittir ve ortaya çıkan paketleri kaldırır. Ancak, yaklaşımınızı daha iyi seviyorum, çünkü linux-headers-* , /boot 'ye yüklenmeyen, /usr/src gibi eski moda paketleri de bulacaktır.

    
verilen cevap Malte Skoruppa 07.01.2014 17:44
5

Şu anda başlatılmış olandan daha az sürüme sahip olan "linux- *" paketlerini kaldıran bu komut dosyasını yazdım. Paket durumunu test etmenin gerekli olmadığını düşünüyorum. Komut paketleri temizlemeden önce onay ister. Bunu istemiyorsanız apt-get komutuna -y seçeneğini ekleyin.

sudo apt-get purge $(dpkg-query -W -f'${Package}\n' 'linux-*' |
sed -nr 's/.*-([0-9]+(\.[0-9]+){2}-[^-]+).*/ &/p' | sort -k 1,1V | 
awk '(==c){exit} {print }' c=$(uname -r | cut -f1,2 -d-))

Ancak, yapılandırılabilir miktarda yedek taneden ayrılabilmek için, linux-purge betiğimi --keep seçeneğiyle kullanmanız önerilir. Komut dosyası hakkında daha fazla bilgi için burayı inceleyin.

    
verilen cevap jarno 07.05.2015 11:44
3

TL; DR: en alta geçin.

Yine de biraz daha uzun. Senin için kıracağım:

  1. dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' Sadece Malte'nin önerdiği gibi. İlgili çekirdek dosyalarını listeler.
  2. egrep '[0-9]+\.[0-9]+\.[0-9]+' Ayrıca, bir sürüm numarası arayarak sadece çekirdek dosyalarını seçmenin daha güvenli bir yolu olarak Malte tarafından önerildi.
  3. Şu anda muhtemelen hem resim hem de başlık paketlerini listelediğimizden, paket adlandırma değişebilir, bu yüzden awk 'BEGIN{FS="-"}; {if ( ~ /[0-9]+/) print "-",sort -k1,1 --version-sort -r; else if ( ~ /[0-9]+/) print "-",sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e 'uname -r | cut -f1,2 -d"-"'}' sorti için gerekli olan bu garip geçici çözümümüz var. Sonuç, orijinalden önceki sürüm numarasıyla yeni bir sütundur. aşağıdaki gibi paket adı:

    $ dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ( ~ /[0-9]+/) print "-",
    $ dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ( ~ /[0-9]+/) print "-",
    $ dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ( ~ /[0-9]+/) print "-",
    $ dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ( ~ /[0-9]+/) print "-",
    dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ( ~ /[0-9]+/) print "-",
    dpkg -l linux-{image,headers}-* | awk '/^ii/{print }' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ( ~ /[0-9]+/) print "-",%pre%; else if ( ~ /[0-9]+/) print "-",%pre%}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e 'uname -r | cut -f1,2 -d"-"' | awk '{print }' | xargs sudo apt-get -y purge
    
    ; else if ( ~ /[0-9]+/) print "-",%pre%}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e 'uname -r | cut -f1,2 -d"-"' | awk '{print }' | xargs sudo apt-get --dry-run remove
    ; else if ( ~ /[0-9]+/) print "-",%pre%}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e 'uname -r | cut -f1,2 -d"-"' | awk '{print }' linux-image-extra-3.11.0-23-generic linux-image-3.11.0-23-generic linux-headers-3.11.0-23-generic linux-headers-3.11.0-23 linux-image-extra-3.8.0-35-generic linux-image-3.8.0-35-generic
    ; else if ( ~ /[0-9]+/) print "-",%pre%}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e 'uname -r | cut -f1,2 -d"-"' 3.11.0-23 linux-image-extra-3.11.0-23-generic 3.11.0-23 linux-image-3.11.0-23-generic 3.11.0-23 linux-headers-3.11.0-23-generic 3.11.0-23 linux-headers-3.11.0-23 3.8.0-35 linux-image-extra-3.8.0-35-generic 3.8.0-35 linux-image-3.8.0-35-generic
    ; else if ( ~ /[0-9]+/) print "-",%pre%}' | sort -k1,1 --version-sort -r 3.11.0-26 linux-image-extra-3.11.0-26-generic 3.11.0-26 linux-image-3.11.0-26-generic 3.11.0-26 linux-headers-3.11.0-26-generic 3.11.0-26 linux-headers-3.11.0-26 3.11.0-24 linux-image-extra-3.11.0-24-generic 3.11.0-24 linux-image-3.11.0-24-generic 3.11.0-24 linux-headers-3.11.0-24-generic 3.11.0-24 linux-headers-3.11.0-24 3.11.0-23 linux-image-extra-3.11.0-23-generic 3.11.0-23 linux-image-3.11.0-23-generic 3.11.0-23 linux-headers-3.11.0-23-generic 3.11.0-23 linux-headers-3.11.0-23 3.8.0-35 linux-image-extra-3.8.0-35-generic 3.8.0-35 linux-image-3.8.0-35-generic
    ; else if ( ~ /[0-9]+/) print "-",%pre%}' 3.11.0-23 linux-headers-3.11.0-23 3.11.0-23 linux-headers-3.11.0-23-generic 3.11.0-24 linux-headers-3.11.0-24 3.11.0-24 linux-headers-3.11.0-24-generic 3.11.0-26 linux-headers-3.11.0-26 3.11.0-26 linux-headers-3.11.0-26-generic 3.11.0-23 linux-image-3.11.0-23-generic 3.11.0-24 linux-image-3.11.0-24-generic 3.11.0-26 linux-image-3.11.0-26-generic 3.8.0-35 linux-image-3.8.0-35-generic 3.11.0-23 linux-image-extra-3.11.0-23-generic 3.11.0-24 linux-image-extra-3.11.0-24-generic 3.11.0-26 linux-image-extra-3.11.0-26-generic 3.8.0-35 linux-image-extra-3.8.0-35-generic
  4. Şimdi, çalışmakta olandan daha yeni görüntülerin kaldırılmasını önlemek için listeyi sıralamalıyız. Bize şunu veren awk '{print }' :

    %pre%
  5. Şimdi bize şu anki ve daha yeni kernel dosyalarını% co_de çıkartın:

    %pre%
  6. Şimdi, tam olarak istediğimizi almak için %code% ile eklediğimiz ilk sütunu çıkartın:

    %pre%
  7. Artık bunu her şeyi otomatik olarak kaldırmak ve grubun yeniden yapılandırılması için paket yöneticisine iletebiliriz:

    Önce bir kuru çalışma yapmanızı öneriyorum (komut dosyalarınız için büyük bir ortama sahipseniz de pratik olmayabilir)

    %pre%

    Şimdi her şey yolunda görünüyor ve devam ederse:

    %pre%

Bir kez daha, bu "tek liner" in tüm noktası, şu anda çalışan çekirdekten (henüz yeni kurulmuş olan çekirdekleri hala mevcut olanlardan) OLDER kuşaklarını kaldırmaktır.

Teşekkürler, bunun sizin için nasıl çalıştığını ve bunu geliştirebilmeniz için bana bildirin!

    
verilen cevap user313760 08.08.2014 19:16
1

'ls' komutunu kullandığınız çekirdek sürümlerini görmek için / boot dizinini listeleyebilirsiniz. Daha sonra kaldırmak istediğiniz sürüm numarası ile "xxx" yerini "sudo apt-get -y purge" xxx "'kullanın. Şu anda çalıştırmakta olduğunuz sürümün olmamasına dikkat edin!.

    
verilen cevap Natarajan 11.09.2016 14:57
1

bikeshed ( apt install bikeshed ) yükleyin ve purge-old-kernels öğesini root olarak adlandırın.

$ sudo purge-old-kernels
    
verilen cevap Flow 19.12.2016 11:38
0

Hızlı cevap, istek üzerine açıklama:

dpkg -l 'linux-image-[0-9]*' | 
awk -v current="$(uname -r)" '!/^i/ || ~current {next} {print }' |
sed '$d' | 
xargs echo sudo apt-get autoremove
    
verilen cevap glenn jackman 08.08.2014 20:03
0

Bu gereksiz karmaşıklığı gerçekten çok yorgundum ve tek liner önemsiz kılan bir Python paketi oluşturdum:

ubuntu-old-kernel-cleanup | xargs sudo apt-get -y purge

ile yükleyin

sudo pip install git+http://github.com/mrts/ubuntu-old-kernel-cleanup.git

İşte adresinden daha fazla bilgi edinin.

Bunun başkalarına da yardımcı olmasını umarım.

    
verilen cevap mrts 05.10.2015 22:54
0
sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d' | xargs sudo apt-get -y purge

Her zaman çalışır ve hatta ubuntu 17.10

    
verilen cevap David Ramsay 25.04.2018 08:03

Etiketlerdeki diğer soruları oku