ฉันจะลบเคอร์เนลเวอร์ชันเก่าเพื่อล้างเมนูการบู๊ตได้อย่างไร


701

ทุกครั้งที่ฉันติดตั้งเคอร์เนลลินุกซ์ใหม่มันจะถูกทิ้งไว้ใน grub_config ทำให้เมนูการบู๊ตยาวขึ้นทุกครั้ง

ฉันรู้ว่าฉันสามารถค้นหาแพ็คเกจที่ติดตั้งด้วยตนเองและลบออกได้

Ubuntu ให้วิธีที่ง่ายกว่าในการทำความสะอาดหรือป้องกันไม่ให้ปรากฏในรายการบูตหรือไม่


10
มีคำสั่ง ubuntu เรียกว่า purge-old-kernels เพื่อทำงาน ดูคำตอบของฉันสำหรับข้อมูลเพิ่มเติม
jarno

29
sudo apt-get autoremoveควรทำเคล็ดลับใน Ubuntu 14.04+
hobs

1
การสะสมของเมล็ดเก่าเป็นข้อผิดพลาดที่มีการแก้ไขในความคืบหน้า: bugs.launchpad.net/bugs/1357093 เมื่อการแก้ไขถูกปล่อยออกมาเมล็ดที่เก่ากว่าจะตอบรับอัตโนมัติตามค่าเริ่มต้น
user535733

1
@hobs คำสั่งไม่ได้ทำเคล็ดลับสำหรับฉันใน Ubuntu Studio 14.04 ถ้าเมล็ดไม่ได้รับการติดตั้งโดยอัตโนมัติ แต่โดย Software Updater
jarno

1
ฉันกลับมาที่หน้านี้ต่อไป ... ความคิดเห็นโดย @hobs จะทำงานได้ก็ต่อเมื่อเมล็ดของคุณถูกติดตั้งอัตโนมัติ - แต่คุณจะต้องsudo apt-get autoremove --purge ตอบคำถามโดยทำตามapt-markคำแนะนำในhttps://help.ubuntu.com/community/RemoveOldKernels
earcam

คำตอบ:


602

16.04 และ Ubuntu รุ่นใหม่กว่า

sudo apt autoremove

คำสั่งนี้ลบแพ็กเกจที่ติดตั้งโดยอัตโนมัติเพื่อแก้ไขการพึ่งพา แต่ตอนนี้ไม่ได้ขึ้นอยู่กับ ซึ่งรวมถึงรุ่นเก่าและlinux-headers-* linux-image-*(มันยังฉลาดเกี่ยวกับกระบวนการนี้โดยปล่อยเคอร์เนลหนึ่งรุ่นไว้เป็นทางเลือก!)

11.10 และ Ubuntu รุ่นใหม่กว่า

GRUB2 และการแสดงผลของเมล็ดทั้งหมด

Grub2เวอร์ชันล่าสุดที่ติดตั้งในUbuntuจะแสดงเคอร์เนลล่าสุดโดยอัตโนมัติและซ่อนเมล็ดเก่าที่คุณติดตั้งไว้

GNU GRUB

หากคุณไม่เห็นด้วงของคุณ- อย่าลืมกดShiftขณะบู๊ต

อย่างที่คุณเห็นเฉพาะเคอร์เนลล่าสุดเท่านั้นที่จะปรากฏ

หากคุณเลือกตัวเลือกที่แสดง (กดEnter) เมล็ดทั้งหมดจะมองเห็นได้และสามารถบูตได้

GNU GRUB รุ่นก่อนหน้า

วิธีการลบเมล็ดเก่าอย่างถาวร

บูตครั้งแรกด้วยเคอร์เนลที่มีล่าสุด

มีหลายวิธีในการลบเมล็ดเก่า โดยส่วนตัวแล้วฉันจะไม่แตะคอมพิวเตอร์ภารโรงเนื่องจากเป็นที่รับทราบว่าจะทำให้คอมพิวเตอร์ของคุณเสียหายด้วยคำแนะนำ

synaptic

อีกทางเลือกหนึ่งคือSynaptic ( sudo apt install synaptic)

ค้นหาlinux-imageคลิกขวาที่เคอร์เนลและเลือกการลบที่สมบูรณ์และในที่สุดก็คลิกปุ่มApplyเพื่อลบเคอร์เนล

ผู้จัดการแพคเกจ Synaptic

ค้นหาซ้ำ แต่คราวนี้สำหรับlinux-header - คุณสามารถลบส่วนหัวที่เกี่ยวข้องสำหรับภาพเคอร์เนลที่เลือกไว้ก่อนหน้านี้

แม้ว่าSynapticจะไม่พยายามตรวจสอบสิ่งที่คุณกำลังพยายามลบ ... คุณสามารถลบเคอร์เนลใหม่ล่าสุดของคุณโดยไม่ตั้งใจหรือแม้กระทั่งลบเคอร์เนลทั้งหมดของคุณผ่านเครื่องมือนี้ทำให้คุณไม่สามารถบูตอูบุนตูได้เลย!

อย่าลืมตรวจสอบว่าคุณใช้เคอร์เนลประเภทใด:

uname -r

ผลลัพธ์จะคล้ายกับ:

เทอร์มินัล <uname -r>

จดจำผลลัพธ์และหมายเลข - ตรวจสอบให้แน่ใจว่าคุณไม่ได้ลบภาพหรือส่วนหัวที่เกี่ยวข้อง

คำแนะนำ

คำแนะนำของฉันคือการรักษาอย่างน้อยสองหรือสามเมล็ดรวมถึงล่าสุด เหตุผลสำหรับคำแนะนำคือคุณจะต้องมีอย่างน้อยหนึ่ง / สองเมล็ดในการบู๊ตด้วยหากเหตุผลใดก็ตามที่เคอร์เนลล่าสุดคุณไม่สามารถบูตด้วยหรือแนะนำความสามารถถดถอยเช่นไร้สายที่เสียหาย


3
การลบแพ็คเกจเก่า "linux-image *" โดยใช้ synaptic ก็ใช้ได้ดีกับ 10.04 ด้วย (ผมพูดถึงมันเพราะชื่อของมันอาจจะเป็นแค่ 11.10 ขึ้นไป)
mivk

4
จำเป็นต้องใช้-yสวิตช์ที่ส่วนท้ายของapt-getบรรทัดมิฉะนั้น apt-get จะขอการยืนยันและเนื่องจากอินพุตเป็นไพพ์ ดังนั้นควรสิ้นสุดใน:| xargs sudo apt-get purge -y
Josh

37
การลบพื้นที่ว่างเก่าlinux-imageและlinux-headersพื้นที่ 4.5GB ออกในเครื่องของฉันประมาณ 20 รุ่น
Andrew Mao

16
วิธีนี้ใช้งานได้ดี แต่การลบเคอร์เนลทุกตัวสร้าง grub.cfg มากเกินไปซึ่งต้องใช้เวลา มีวิธีปิดการใช้งานนี้สำหรับการลบแบทช์แล้วสร้างใหม่อีกครั้งหรือไม่
spacediver

15
ฉันสองคำถามจาก @spacediver - นี่เป็นกระบวนการที่ช้ามากเมื่อคุณมีเมล็ดที่ไม่ต้องการ 38 ตัวเนื่องจากแต่ละอันถูกถอนการติดตั้งมันจะไปถึงส่วนที่เหลือทั้งหมดในขณะที่สร้าง grub.cfg ใหม่ นั่นคือสิ่งที่เราเรียกการดำเนินงาน N ^ 2 - มันประมวลผลเคอร์เนลประมาณ (38 ^ 2/2) = 722 ครั้งและช้ามาก แน่นอน Ubuntu สามารถเกิดขึ้นกับสิ่งที่ดีกว่า ....
nealmcb

384

ขั้นแรกให้รีบูตระบบของคุณเพื่อให้แน่ใจว่ามันใช้เคอร์เนลล่าสุด จากนั้นเปิดเทอร์มินัลแล้วตรวจสอบเคอร์เนลปัจจุบันของคุณ:

uname -r 

อย่าลบเคอร์เนลนี้!

จากนั้นพิมพ์คำสั่งด้านล่างเพื่อดู / แสดงรายการเมล็ดที่ติดตั้งทั้งหมดในระบบของคุณ

dpkg --list 'linux-image-*'

ค้นหาเมล็ดทั้งหมดที่ต่ำกว่าเคอร์เนลปัจจุบันของคุณ เมื่อคุณทราบว่าจะลบเคอร์เนลใดให้ดำเนินการต่อด้านล่างเพื่อลบออก เรียกใช้คำสั่งด้านล่างเพื่อลบเคอร์เนลที่คุณเลือก

sudo apt-get purge linux-image-x.x.x-x-generic 

สุดท้ายให้รันคำสั่งด้านล่างเพื่ออัปเดต grub2

sudo update-grub2 

รีบูตระบบของคุณ


34
เมื่อทำสิ่งนี้ใน 10.04 และ 12.04 ฉันพบว่า update-grub จะทำงานโดยอัตโนมัติในระหว่างกระบวนการล้างข้อมูล
Aidan

93
สามารถใช้การขยายปีกกาของ bash ได้เช่นsudo apt-get purge linux-image-3.2.0-3{0..5}-generic(ลบ 30,31, .. , 35)
ajo

12
ไม่จำเป็นต้องรีบูตระบบหลังจากนั้น ในความเป็นจริงคุณควรรีบูตระบบก่อนที่จะทำตามขั้นตอนเหล่านี้เพื่อให้แน่ใจว่าคุณใช้เคอร์เนลเวอร์ชันล่าสุดที่คุณเพิ่งดาวน์โหลดและติดตั้ง (คุณทำการอัปเดต apt-get & & apt-get อัพเกรดก่อนหน้านี้ใช่มั้ย ??)
Ricket

4
คุณอาจต้องการถอนการติดตั้งlinux-signed-imageแพคเกจที่อาจติดตั้งในระบบ UEFI sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-genericซึ่งจะลบ 12, 14 และ 24
devius

1
@jarno ฉันไม่รู้ว่าฉันใช้เคอร์เนลที่ลงนามหรือไม่ แต่uname -rไม่มีsignedสตริงใด ๆในระบบของฉัน ดูเหมือนว่าฉันจะมีภาพที่เซ็นชื่อติดตั้งและผลลัพธ์ของlsคำสั่งนั้นคือ: /boot/vmlinuz-3.19.0-16-generic.efi.signed.
devius

283

หนึ่งซับของฉันเพื่อลบเมล็ดเก่า (นี้ยังเพิ่มพื้นที่ว่างในดิสก์)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

คำอธิบาย (จำไว้|ใช้เอาต์พุตของคำสั่งก่อนหน้าเป็นอินพุตไปยังถัดไป)

  • dpkg --list แสดงรายการแพ็คเกจที่ติดตั้งทั้งหมด
  • grep linux-image ค้นหาอิมเมจ linux ที่ติดตั้ง
  • awk '{ print $2 }' เพียงแค่ส่งออกคอลัมน์ที่ 2 (ซึ่งเป็นชื่อแพคเกจ)
  • sort -V วางรายการตามลำดับหมายเลขรุ่น
  • sed -n '/'`uname -r`'/q;p' พิมพ์บรรทัดก่อนเคอร์เนลปัจจุบัน
  • xargs sudo apt-get -y purge ล้างเมล็ดที่พบ

การยกเลิกการsedเชิญ:

  • -nบอกsedให้เงียบ
  • `uname -r` เอาต์พุตเคอร์เนลที่ติดตั้งปัจจุบัน - เรารวมไว้ใน backticks เพื่อให้เอาต์พุตนั้นรวมเป็นส่วนหนึ่งของคำสั่ง (คุณอาจเห็นสิ่งนี้เป็น $(uname -r)
  • /something/qพูดว่าหยุดเมื่อคุณจับคู่ 'บางสิ่งบางอย่าง' (ในกรณีนี้บางสิ่งบางอย่างเป็นผลลัพธ์uname -r) - /ล้อมรอบการแสดงออกปกติ
  • p กำลังพิมพ์
  • the ;is separtor คำสั่งดังนั้น/something/q;pบอกว่าเลิกเมื่อคุณจับคู่สิ่งอื่นพิมพ์

ทั้งหมดsed -n '/'`uname -r`'/q;p'จะพิมพ์บรรทัดจนกว่าจะตรงกับชื่อเคอร์เนลปัจจุบัน

หากคุณหวาดระแวง (เช่นฉัน) คุณสามารถสร้างส่วนสุดท้ายxargs echo sudo apt-get -y purgeเพื่อให้คำสั่งในการล้างเมล็ดเก่าถูกพิมพ์ออกมาจากนั้นคุณสามารถตรวจสอบว่าไม่มีสิ่งใดที่ไม่คาดคิดรวมอยู่ก่อนที่คุณจะเรียกใช้


รุ่นที่แก้ไขเพื่อลบส่วนหัว:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

หมายเหตุ: การsedร้องขอถูกแก้ไข "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"แยกเฉพาะรุ่น (เช่น "3.2.0-44") โดยไม่มี "-generic" หรือคล้ายกันuname -r


All-in-one version เพื่อลบภาพและส่วนหัว (รวมทั้งสองเวอร์ชั่นด้านบน):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge

1
โปรดทราบว่ามันอันตรายเล็กน้อยที่จะจับคู่เคอร์เนลเวอร์ชันปัจจุบันเนื่องจากนิพจน์ทั่วไปเช่นนั้น: Dots จับคู่กับอักขระใด ๆ และ 3.1.2-23 ตรงกับ 3.1.2-2 (หรือเป็นวิธีอื่นที่อยู่รอบ ๆ ) ดูคำตอบของฉันด้วย
jarno

19
นี่คือเวอร์ชั่นออล - อิน - วันที่ปรับจูน: sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done)ดูคำตอบของฉันด้วย
jarno

1
@jarno ที่ช่วยให้ฉันขยายใหญ่มาก ... รุ่งโรจน์เพื่อหนึ่งซับของคุณ
Clain Dsilva

5
เนื่องจากการพึ่งพาที่ไม่คาดหวังฉันจึงต้องใช้มันdkpg -Pแทน นี่คือเวอร์ชั่นเต็ม:dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo dpkg -P
Sebastian Sastre

3
ไม่ทำเช่นนี้! "ผู้ประกอบการรายนั้นดูอันตรายเล็กน้อย แต่แน่นอนว่าผู้เข้าร่วมแข่งขัน 220 คนต้องไม่ผิด!" ฉันคิดกับตัวเองและคัดลอกวางสุ่มสี่สุ่มห้า รีบูทตรงไปที่ GRUB คำสั่งนั้นเช็ดเมล็ดทั้งหมดของฉันรวมถึงที่ฉันใช้อยู่ บางทีฉันอาจใช้เคอร์เนลเรียลไทม์จำไม่ได้ ขณะนี้กำลังมองหา USB Stick สำหรับติดตั้ง Ubuntu Live CD บนบ้านของฉัน :(
Andreas Jansson

60

Ubuntu 16.04+:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic

Ubuntu 15.10 และต่ำกว่า:

ฉันคิดว่านี่เป็นวิธีที่ง่ายและรวดเร็วที่สุด มันช่วยให้เคอร์เนลล่าสุดเช่นเดียวกับอีกสอง:

sudo apt-get install bikeshed
sudo purge-old-kernels

หากต้องการเปลี่ยนจำนวนของเมล็ดเพิ่มเติมที่เก็บไว้:

sudo purge-old-kernels --keep 3

1
คำสั่งนั้นคือเชลล์สคริปต์ซึ่งเป็นตำแหน่งที่คุณสามารถค้นหาwhich purge-old-kernelsได้
jarno

ดีใจที่พวกเขาทำให้เรื่องนี้ง่ายขึ้นมากใน 16.04! หวังว่าคำตอบนี้จะทำให้มันดีขึ้นเรื่อย ๆ ...
Toby J

บน Ubuntu 16.04 ฉันpurge-old-kernelsไม่มี bikeshed ( เครื่องมือที่มีประโยชน์แบบสุ่มที่ยังไม่มีบ้านถาวร ) หรือแพ็คเกจใด ๆ หลีกเลี่ยงการใช้apt-get -yตัวเลือกเหมือนกับการหลับตาและหวังว่าทุกอย่างจะเรียบร้อย นอกจากนี้ที่นี่ยังเป็นที่ที่autoremoveตัดสินใจว่าจะเก็บเมล็ดเก่าไว้จำนวนเท่าใด
Pablo A

2
ใน 16.04 ล้างเก่าเมล็ด-ให้บริการโดยแพคเกจ byobu นี้ (คำใบ้: apt-file search purge-old-kernels) ตกลงapt-get -yฉันจะลบมัน
bmaupin

1
@Dan เนื่องจากฉันไม่ได้ใช้รุ่นที่ไม่ใช่ LTS ฉันไม่แน่ใจว่าเมื่อมันเริ่มต้น แต่ฉันสามารถพูดได้อย่างแน่นอนsudo apt-get autoremoveว่าไม่ได้ลบเมล็ดใน 14.04 อย่าลังเลที่จะอัปเดตคำตอบด้วยเวอร์ชันเฉพาะถ้าคุณรู้ว่ามันคืออะไร!
bmaupin

43

การลบรายการออกจากรายการ Grub 2 ควรลบออกโดยการแก้ไขหรือลบไฟล์ในโฟลเดอร์ /etc/grub.d ไฟล์ /boot/grub/grub.cfg เป็นแบบอ่านอย่างเดียวและไม่ควรต้องแก้ไขตามปกติ

เมล็ดมากเกินไปหรือไม่

  • หากคุณไม่แน่ใจว่าเมล็ดที่คุณกำลังใช้ในประเภทอาคารuname -r

  • เมล็ดที่ถูกลบผ่าน APT (Synaptic, "apt-get remove" ฯลฯ ) จะอัปเดต grub.cfg โดยอัตโนมัติและไม่จำเป็นต้องมีการดำเนินการของผู้ใช้

  • เครื่องมือที่ยอดเยี่ยมสำหรับการลบเมล็ด (และรายการเมนู) คือ Ubuntu-Tweak ซึ่งเป็นแอพ GUI ที่ปลอดภัยและใช้งานง่าย

  • ติดตั้ง ubuntu tweak

  • Ubuntu-Tweak จะอยู่ภายใต้ Applications> System Tools

ลบรายการเคอร์เนลที่เก่ากว่า

  • เลือก "Package Cleaner" ทางซ้ายและ "Clean Kernel" จากแผงด้านขวา

  • กดปุ่ม "ปลดล็อก" ที่ด้านล่างขวาใส่รหัสผ่านของคุณ

  • เลือกจากรายการที่แสดงอิมเมจเคอร์เนลและส่วนหัวที่คุณต้องการลบ เคอร์เนลที่ใช้งานอยู่ไม่อยู่ในรายการ

  • กดปุ่ม "ล้างข้อมูล" ที่ด้านล่างขวาเพื่อลบภาพเคอร์เนลและส่วนหัวที่เลือก

ลบระบบปฏิบัติการออกจากเมนูด้วง

  • ระบบปฏิบัติการอื่น ๆ ที่ถูกลบออกจากคอมพิวเตอร์ก็จะถูกลบออกจากเมนูเช่นกันเมื่อมีการเรียกใช้ "update-grub" เป็นรูท

  • รายการเมนูจะถูกวางไว้บนเมนู Grub2 โดยสคริปต์ หากคุณไม่ต้องการให้ระบบปฏิบัติการอื่นเข้าสู่เมนูให้ปิดการใช้งาน /etc/grub.d/30_osprober

  • รันคำสั่งนี้เพื่อหยุดสคริปต์ไม่ให้ทำงาน
    sudo chmod -x /etc/grub.d/30_os-prober

  • DISABLE_30_OS-PROBER = 'จริง' ใน / etc / default / grub

ลบ Memtest86 + จากเมนูด้วง
sudo chmod -x /etc/grub.d/20_memtest86+

  • รันคำสั่ง update-grub เพื่ออนุญาตการเปลี่ยนแปลงที่จะรวมอยู่ใน grub.cfg

แหล่ง

หมายเหตุ: หลังจากเคอร์เนลอัปเดตรายการใหม่จะถูกเพิ่มลงในเมนู GRUB คุณสามารถลบรายการเก่าได้ถ้าคุณต้องการอย่างไรก็ตามผู้ใช้ที่มีประสบการณ์ส่วนใหญ่จะแนะนำให้คุณเก็บรายการสำรองอย่างน้อยหนึ่งรายการในกรณีที่มีสิ่งผิดปกติในการอัปเกรด จำเป็นต้องบูตรุ่นเคอร์เนลที่เก่ากว่าเพื่อการแก้ไขปัญหา

วิธีอื่นในการลบรายการเคอร์เนล (ก่อนหน้า 10.04)

สำหรับ GRUB ไม่ใช่ GRUB2

startupmanager ติดตั้ง startupmanager

คุณสามารถค้นหาได้ภายใต้ระบบ >> การบริหาร >> ข้อความแสดงแทน
ข้อความแสดงแทน
คุณเห็นในภาพหน้าจอที่สองคุณสามารถเลือกจำนวนเมล็ดที่จะแสดง? ฉันมักจะเก็บไว้ในวันที่ 1 แต่เมื่อฉันได้รับการอัพเกรดเคอร์เนลฉันมักจะเปลี่ยนเป็น 2 ก่อนที่จะรีสตาร์ทเพื่อให้ฉันสามารถเลือกเคอร์เนลเก่าถ้าเคอร์เนลใหม่มีปัญหากับฮาร์ดแวร์ของฉัน เมื่อฉันรู้ว่าเคอร์เนลใหม่ทำงานได้ดีฉันจะเปลี่ยนกลับไปเป็น 1


2
อันที่จริง startupmanager ให้หน้าต่างแบบนี้กับฉันใน Ubuntu 10.04 แทนที่จะให้หน้าต่างที่มีสองแท็บ -> ตัวเลือกการบูตและขั้นสูง .. และในระดับสูงมันมีตัวเลือกที่จะ จำกัด จำนวนของเมล็ด ดังนั้นโปรดอัปเดตคำตอบสำหรับ Ubuntu 10.04 (และนั่นเป็นเหตุผลว่าทำไมฉันถึงลงคะแนนในครั้งนี้ .. )
Sen

มีความคิดอย่างไรว่า "จำนวนเมล็ดที่จะเก็บ" สามารถกำหนดได้บนเครื่องที่ไม่ได้ติดตั้ง GUI (เซิร์ฟเวอร์)
sylvainulg

ผู้จัดการเริ่มต้นล้าสมัยแล้ว ดูgrup-customizer
muhasturk

39

หมดจด commandline นี้จะลบทั้งหมดยกเว้นปัจจุบันและที่สองมากที่สุดในปัจจุบัน (ผ่าน "-2" ในคำสั่งหัวด้านล่าง):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge

9
หนึ่งซับจากมี :dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge
Dmitry Verkhoturov

@DmitryPaskal คุณควรเพิ่มนี่เป็นคำตอบใหม่
saji89

10
@DmitryPaskal เช่นเคยอย่าคัดลอกวางโดยไม่เข้าใจ ในเครื่องของฉันหนึ่งซับนี้ยังตรงกับlinux-libc-dev:amd64ที่ไม่ควรลบ
jamesadney

1
@ Kees Cook ไม่ควรโต้แย้งอาร์กิวเมนต์ awk เพียงแค่ล้อมรอบด้วยเครื่องหมายคำพูดเดี่ยวเท่านั้น? หากเจตนาของคุณคือการเพิ่ม "ลินุกซ์อิมเมจเฉพาะบล็อก" awk '{print "linux-image-" $0}'เพื่อสายการประปานี้เท่านั้นดูเหมือนว่าจะทำงานถ้าคุณใช้
Mark

มันใช้งานไม่ได้สำหรับฉันรวมถึงเคอร์เนลที่ติดตั้งเอง (Ubuntu 14.04 กับ 3.17)
Alex R

35

ปรับปรุง: purge-old-kernelsจะเลิกใช้ในปัจจุบัน

ฉันทำสคริปเพื่อล้างเมล็ดแม้ในสภาพที่มีความยุ่งยาก มันถูกเรียกว่าlinux-purgeและคุณสามารถค้นหาได้ที่นี่

หากคุณเพียงต้องการกำจัดเมล็ด (และแพ็คเกจที่เกี่ยวข้อง) ที่เก่ากว่าเคอร์เนลที่ใช้อยู่ในปัจจุบันเมื่อระบบไม่เสียหายคุณสามารถใช้สคริปต์นี้ได้

นอกจากนี้ยังมีหน้าเอกสารประกอบของอูบุนตูที่ผมมีส่วนร่วมเกี่ยวกับการเอาเมล็ดเก่าที่นี่


ดูเหมือนว่าpurge-old-kernelsจะไม่ได้อยู่ในรุ่นที่ถูกต้อง (1.22) ของ bikeshed มีวิธีที่เหมาะสม / ปลอดภัยในการรับ bikeshed ที่ใหม่กว่าเพื่อความแม่นยำหรือไม่? หรือว่าจะง่ายกว่า / ปลอดภัยกว่าเพียงแค่ติดตั้งสคริปต์ ฉันต้องการใช้ repo แม้ว่าแม้จะมีรายการของการพึ่งพากันนาน ..
drevicko

1
@drevicko ดูที่นี่
jarno

1
@drevicko แน่นอนdlocate -lsbin bikeshed
jarno


1
@ChrisW ใช่มี ฉันเพิ่งปรับปรุงสคริปต์เล็กน้อยดังนั้นจึงเป็นการดีที่สุดที่จะใช้เวอร์ชันล่าสุด
jarno

29

คุณสามารถติดตามส่วนการใช้แพคเกจ "unattended-upgrade"ของบทความAutomatic Security Updatesบน Ubuntu Wiki เพื่อดำเนินการนี้

คุณต้องเปลี่ยนบรรทัดต่อไปนี้ในไฟล์/etc/apt/apt.conf.d/50unattended-upgrades

//Unattended-Upgrade::Remove-Unused-Dependencies "false";

กับ

Unattended-Upgrade::Remove-Unused-Dependencies "true";

เพื่อลบแพ็คเกจเก่าโดยอัตโนมัติรวมถึงเมล็ด

ลบหรือแสดงความคิดเห็นบรรทัด

"^linux-image.*"; 

ในส่วน "NeverAutoRemove" ของไฟล์/etc/apt/apt.conf.d/01autoremove


2
ฉันทำสิ่งนี้แล้ว แต่ก็ยังคงเก็บเมล็ดข้าวเหนียวเก่ากว่า 3+ ตัวซึ่งกินเวลา 100 MB ดังนั้นฉันจึงเพิ่มapt-get autoremoveงาน cron ประจำวันของฉันซึ่งทำการอัปเกรดจริง ๆ เพราะมันไม่ได้ผ่านตัวจัดการอัปเดตในตัวเสมอไป
Marcos

ฉันคิดว่ามันใช้งานได้ใน Trusty สำหรับเมล็ดที่ติดตั้งโดยอัตโนมัติเท่านั้น
jarno

นี่เป็นวิธีที่ดีในการป้องกันการสะสมของเมล็ดเก่าเมื่อแพ็คเกจอัปเกรดอัตโนมัติเช่นการอัปเกรดแบบไม่ต้องใส่ข้อมูล อย่างไรก็ตามหากคุณไม่รีบูทคุณอาจพบว่าแพ็กเกจสำหรับเคอร์เนลที่รันอยู่ในปัจจุบันได้ถูกถอนการติดตั้งแล้ว! ปัญหานี้อาจทำให้เกิด: อุปกรณ์ใหม่ที่คุณเสียบอาจไม่ทำงานเนื่องจากโมดูลสำหรับพวกเขาไม่สามารถโหลดได้เพราะมันไม่ได้อยู่บนดิสก์ของคุณอีกต่อไป (การแก้ไขอย่างรวดเร็วสำหรับสิ่งนี้เพียงเพื่อติดตั้งแพ็กเกจเคอร์เนลอีกครั้งจากนั้นถอดและเสียบอุปกรณ์อีกครั้ง)
joeytwiddle

ฉันสร้างโซลูชันอัตโนมัติสำหรับปัญหาดังกล่าวข้างต้น หากคุณคิดว่านี่เป็นวิธีการที่ดีคุณสามารถเพิ่มเข้าไปในคำตอบของ Qwerty ได้
joeytwiddle

27

ที่เร็วที่สุด / วิธีที่ง่าย (ใช้งานได้อย่างน้อยก็ตั้งแต่ 12.04) apt-getเป็นไปได้ที่มีอยู่แล้วมาพร้อมกับอูบุนตู ทำสิ่งต่อไปนี้หากคุณต้องการลบเคอร์เนลเวอร์ชันเก่าทั้งหมดที่ไม่ได้ใช้งาน (ยกเว้นเวอร์ชันก่อนหน้านี้ที่คุณไม่ได้ใช้) เพื่อให้แน่ใจว่าหากเวอร์ชันเคอร์เนลปัจจุบันล้มเหลวในบางวิธี กลับสู่สถานะก่อนหน้า) ทำดังต่อไปนี้:

sudo apt-get autoclean

วิธีนี้จะกำจัดไฟล์เก่า ๆ (รวมถึงเวอร์ชันเคอร์เนล) ที่คุณมี โปรดทราบว่าหากคุณมีรุ่นเก่าหลายรุ่นจะใช้เวลาสักครู่เนื่องจากจะต้องตรวจสอบให้แน่ใจว่าการลบรุ่นเคอร์เนลไม่มีปัญหา สำหรับฉันการลบเคอร์เนล 12 เวอร์ชันล่าสุดใช้เวลาประมาณ 2 นาที คุณยังสามารถทำสิ่งต่อไปนี้:

sudo apt-get clean

ซึ่งจะกำจัดทุกสิ่งที่ดาวน์โหลดและเก็บไว้ในโฟลเดอร์แคชของ apt สุดท้ายคุณมี:

sudo apt-get autoremove

ซึ่งจะตรวจสอบแพ็กเกจที่ไม่ได้ใช้และลบออกหากจำเป็น นี่เป็นสิ่งที่ยอดเยี่ยมสำหรับไลบรารีและแพ็คเกจอ้างอิงที่ไม่จำเป็นต้องติดตั้งแอพใด ๆ อีกต่อไป


1
ฉันคิดว่าสิ่งนี้มีการเปลี่ยนแปลงในรุ่นใหม่เช่นเดียวกับใน 14.04 นี้เพียงล้างแคชแพคเกจและไม่ส่งผลกระทบต่อแพคเกจหรือด้วงที่ติดตั้ง
jarno

2
ฉันสามารถยืนยันได้ว่าsudo apt-get autoremoveจะลบเมล็ดเก่า (มากกว่าหนึ่งรุ่นที่ผ่านมา) ใน 14.04 คุณอาจต้องเรียกใช้ก่อนและหลังการอัพเกรดเคอร์เนลของคุณ เมื่อฉันวิ่งก่อนอัพเกรดมันลบเฉพาะรุ่นเก่าของเคอร์เนลเท่านั้น จากนั้นหลังจากอัปเกรดเคอร์เนลของฉันมันก็ลบเวอร์ชันต่ำสุดของเคอร์เนลเก่าเช่นกัน
tekNorah

ฉันหมายถึงsudo apt-get autocleanคำสั่ง @tekNorah ฉันได้ติดตั้ง kernels รุ่นเก่าสองอันแล้วก็วิ่งsudo apt-get autoremoveใน Ubuntu Studio 14.04 มันไม่ได้ลบเมล็ดใด ๆ ฉันมีการติดตั้งเคอร์เนลต่ำสุดเท่านั้น ทำไมคุณถึงติดตั้งทั้ง -generic and-lowlatency kernels
jarno

5
ใช่มันใช้งานได้ดีสำหรับฉันทำความสะอาดเมล็ดเก่าให้ถูกต้องและไม่พึ่งพาสคริปต์บรรทัดเดียวที่บ้าคลั่ง! แนะนำหวังว่าฉันจะสามารถโหวตได้มากกว่าหนึ่งครั้ง!
Jeff Atwood

1
@JeffAtwood ดีมันอาจลบเมล็ดที่ปลอดภัยได้มากกว่านี้ ดูรายงานข้อผิดพลาด
jarno

25

วิธี 10.04 GUI

นักการภารโรงคอมพิวเตอร์สามารถล้างเมล็ดเก่าและฉันเชื่อว่าติดตั้งโดยค่าเริ่มต้นใน Ubuntu (แต่ไม่ใช่ Kubuntu)

ด้วง 1 หากคุณใช้สิ่งนั้นมีตัวเลือกใน/boot/grub/menu.lstการระบุจำนวนเมล็ดที่ควรแสดงในระดับสูงสุด ด้วง 2 เท่าที่ฉันสามารถบอกได้ไม่


4
ไม่ควรใช้นักการภารโรงคอมพิวเตอร์ - เป็นรถบักกี้และตอนนี้ถูกดร็อปเป็นแอปพลิเคชันเริ่มต้นใน natty / oneiric / แม่นยำ
fossfreedom

2
ค่อนข้างติดตั้ง "Ubuntu Tweak" ตามที่อธิบายไว้ในคำตอบอื่น (ppa ของตัวเอง) ซึ่งมี "ภารโรงคอมพิวเตอร์" ของตัวเอง (เพื่อไม่ให้สับสนกับ "คอมพิวเตอร์ภารโรง" ที่ชั่วคราวมีอยู่ในรุ่นอูบุนตูเก่า)
michael

25

หากต้องการทราบว่ามีการติดตั้งเมล็ดและหัวกระดาษแบบใด

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

จากนั้นคุณสามารถลบพวกเขาทีละคนหรือรวมกันเพียงให้แน่ใจว่าได้รับการปรับปรุงล่าสุด

นอกจากนี้ยังมีคำสั่งและสคริปต์ที่ใช้งานง่ายเพื่อทำการลบโดยอัตโนมัติ

http://ubuntuforums.org/showthread.php?t=1658648

การอ้างสิทธิ์ต่อไปนี้เพื่อลบเมล็ดและส่วนหัวที่ไม่ได้ใช้ทั้งหมด:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | grep -v hwe | xargs sudo apt-get purge

(ใช้apt-get -yเพื่อลบโดยไม่มีคำถาม)

นี่คือสิ่งที่เกิดขึ้นเมื่อทำงานกับ 18.04.1:

~$ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]

\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | xargs sudo apt-get -y purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-4.15.0-33* linux-headers-4.15.0-33-generic* linux-headers-4.15.0-34* linux-headers-4.15.0-34-generic* linux-image-4.15.0-33-generic* linux-image-4.15.0-34-generic*
  linux-modules-4.15.0-33-generic* linux-modules-4.15.0-34-generic* linux-modules-extra-4.15.0-33-generic* linux-modules-extra-4.15.0-34-generic*
0 upgraded, 0 newly installed, 10 to remove and 1 not upgraded.
After this operation, 671 MB disk space will be freed.
(Reading database ... 227403 files and directories currently installed.)
Removing linux-headers-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-headers-4.15.0-33 (4.15.0-33.36) ...
Removing linux-headers-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-headers-4.15.0-34 (4.15.0-34.37) ...
Removing linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-image-4.15.0-33-generic (4.15.0-33.36) ...
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-33-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-image-4.15.0-34-generic (4.15.0-34.37) ...
I: /vmlinuz.old is now a symlink to boot/vmlinuz-4.15.0-36-generic
I: /initrd.img.old is now a symlink to boot/initrd.img-4.15.0-36-generic
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-34-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
(Reading database ... 156180 files and directories currently installed.)
Purging configuration files for linux-image-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
dpkg: warning: while removing linux-modules-4.15.0-33-generic, directory '/lib/modules/4.15.0-33-generic' not empty so not removed
Purging configuration files for linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-image-4.15.0-33-generic (4.15.0-33.36) ...
Purging configuration files for linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
~$ uname -r
4.15.0-36-generic

สคริปต์ที่คุณพบในฟอรัมนั้นเป็นความผิดพลาด มันอาจไม่ลบแพ็คเกจส่วนหัวที่ต้องการบางอย่าง (หากคุณใช้เคอร์เนล -pae เก่าบางตัว) และในทางกลับกันอาจลบแพ็กเกจบางส่วนที่คุณต้องการเก็บไว้
jarno

ขอบคุณสำหรับความคิดเห็น สคริปต์อาจไม่สมบูรณ์ แต่ฉันใช้มาหลายปีแล้วส่วนใหญ่จะเป็น 12.04 และ 14.04, 32 และ 64 บิตและไม่มีปัญหาอะไรเลย ... และใช่linux-libc-devติดตั้งแล้ว
mikewhething

ฉันคิดว่าหมายเลขรุ่นของการlinux-libc-devจับคู่หมายเลขรุ่นของเคอร์เนลปัจจุบันแล้ว นี่dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'พิมพ์ linux-libc-dev: amd64
jarno

ฉันยังคงไม่สามารถทำซ้ำผลการวิจัยของคุณ แต่จะอยู่ในด้านความปลอดภัยที่ฉันได้แก้ไขคำสั่งโดยการเพิ่มตัวกรองเพิ่มเติม grep -E "(image|headers)"-
mikewhething

1
ก่อนอื่นให้ลอง-yล้างธงด้วยการกำจัดโปรดเถอะ .. !
danger89

16

ในการลบเคอร์เนลอิมเมจเก่าของ Linux ให้บูตครั้งแรกในเคอร์เนลที่คุณต้องการเก็บไว้

คุณยังสามารถตรวจสอบเวอร์ชันเคอร์เนลโดยใช้คำสั่งuname -rเพื่อที่คุณจะได้ไม่ลบสิ่งที่ผิดโดยไม่ได้ตั้งใจ

ตอนนี้ไปที่ตัวจัดการแพคเกจ synaptic และค้นหาlinux-imageและลบเวอร์ชันเก่ายกเว้นอันที่แสดงโดยคำสั่งด้านบน โดยทั่วไปฉันชอบที่จะไปกับคนล่าสุด

ตอนนี้เมื่อคุณเริ่มต้นใหม่คุณจะเห็นเมนูด้วงที่สะอาดมากขึ้น


นี่อาจเป็นวิธีพื้นฐานที่สุดสำหรับผู้ใช้ที่ติดตั้งโดยไม่มี Computer Janitor
Broam

1
จาก Ubuntu 11.04 เมนูด้วงจะแสดงเฉพาะเคอร์เนลปัจจุบันตามค่าเริ่มต้นเคอร์เนลเก่าจะถูกซ่อนในเมนู 'เมล็ดก่อนหน้า' วิธีนี้ยังคงใช้งานได้กับการล้างสิ่งเก่า ๆ
Andy

14

คุณสามารถติดตั้งubuntu-tweakแล้วไปที่ Applications -> เครื่องมือระบบ -> ubuntu tweak และ

ป้อนคำอธิบายรูปภาพที่นี่คลิกแพคเกจทำความสะอาดและทำความสะอาดเมล็ด จะไม่แสดงเคอร์เนลที่ใช้ในปัจจุบันดังนั้นคุณจะปลอดภัยเสมอ


8

Synapticส่วนตัวผมชอบใช้ มันทำให้ฉันรู้สึกปลอดภัยมากขึ้นเกี่ยวกับสิ่งที่เกิดขึ้น app ที่เดียวที่ผมเคยใช้ที่มีตัวเลือกในการลบเมล็ดเก่าUbuntu Tweak

วิธีลบเมล็ดที่คุณไม่ได้ใช้:

  • เปิด UbuntuTweak
  • คลิกที่ 'Package Cleaner' ภายใต้ 'Applications' ในบานหน้าต่างด้านซ้าย
  • ที่ด้านขวาของ 'มุมมองการทำความสะอาด' กด 'Clean Kernels'
  • เลือกเมล็ดทั้งหมด - ฉันคิดว่าหนึ่งในการใช้งานไม่ได้อยู่ในรายการ แต่ในกรณีที่ตรวจสอบการทำงานuname -aในสถานี

ใน Synaptic คุณสามารถกรอง 'องค์ประกอบ' -> 'เคอร์เนลและโมดูล' ซึ่งรวมถึงเมล็ดทั้งหมด และจัดเรียงตามคอลัมน์แรก: 'S' (สถานะ) ดังนั้นคุณจะได้รับเมล็ดที่ติดตั้งทั้งหมดอยู่ด้านบน แท้จริงupdate-grubคือการแนะนำ
danger89

6

คุณสามารถถอนการติดตั้งเคอร์เนลเก่า ( linux-image-...แพ็คเกจ) โดยใช้ Synaptic และจะลบออกจากเมนูการบูต ระวังอย่าลบเคอร์เนลที่กำลังรันอยู่ (คุณสามารถตรวจสอบเวอร์ชั่นของมันได้uname -r)

โปรดทราบว่าการมีรุ่นเก่ากว่าหนึ่งหรือสองรุ่นสามารถช่วยคุณแก้ไขปัญหาได้ควรมีบางอย่างผิดปกติ

อีกวิธีหนึ่งคุณสามารถแก้ไข / ลบรายการด้วยตนเอง ( gksu gedit /boot/grub/grub.cfg) แต่จะถูกสร้างขึ้นใหม่เมื่อคุณอัปเดตเป็นเคอร์เนลที่ใหม่กว่า หากคุณกำลังคิดที่จะลบrecovery modeตัวเลือก - อย่า พวกมันมีประโยชน์ถ้าคุณทำอะไรบางอย่างที่ทำให้คุณไม่สามารถบูทได้


อ้างถึงหน้านี้


ตอนนี้ Grub2 จะสร้างรายการ grub ทุกครั้งที่มีการติดตั้งเคอร์เนลใหม่ ด้วยupdate-grubซึ่งจะเขียนใหม่เมล็ดเหล่านั้นทั้งหมด
Marco Ceppi

4

นี่คือโซลูชันบรรทัดคำสั่งล้วนๆ

ขั้นแรกสร้างรายการรุ่นเคอร์เนลที่ติดตั้งทั้งหมดยกเว้นเคอร์เนลที่กำลังทำงาน

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    grep -v $(uname -r | cut -d- -f1,2))

หรือสร้างรายการของเคอร์เนลเวอร์ชันที่ติดตั้งทั้งหมดยกเว้นสองอันสุดท้าย:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    sort -V | head -n -2)

ตรวจสอบรายการ ตรวจสอบให้แน่ใจว่ารุ่นเคอร์เนลที่คุณต้องการเก็บไม่ได้เป็นส่วนหนึ่งของรายการ ใช้คำสั่งuname -rเพื่อดูเวอร์ชันของเคอร์เนลที่รันอยู่ในปัจจุบัน

หากคุณพอใจกับผลลัพธ์ที่คุณสามารถใช้apt-getเพื่อลบแพ็กเกจ

ครั้งแรกที่ใช้แห้ง (ใช้เครื่องกำเนิดแรกเป็นตัวอย่าง):

sudo apt-get --dry-run purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

จากนั้นเรียกใช้จริง:

sudo apt-get purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

หากคุณต้องการทำให้กระบวนการเป็นอัตโนมัติให้เพิ่ม--yesพารามิเตอร์:

sudo apt-get --yes purge $(
  ...)

@jarno ฉันขอขอบคุณที่พยายามรวมและเพิ่มประสิทธิภาพบรรทัดคำสั่งของฉัน ฉันลบบรรทัดคำสั่งของคุณเพราะฉันชอบการอ่านและความเรียบง่าย ฉันจงใจปรับคำสั่งของฉันสำหรับการอ่านและเรียบง่าย อย่างน้อยสามารถอ่านได้และง่ายสำหรับสมองของฉัน กรุณาโพสต์บรรทัดคำสั่งของคุณเป็นความคิดเห็นหรือในคำตอบของคุณเอง
lesmana

1
สิ่งนี้รวมสองวัตถุประสงค์: รักษาเมล็ดสองเมล็ดสุดท้ายและรักษาเมล็ดให้ใหม่กว่าsudo apt-get purge -- $(ls -1U /boot/vmlinuz* | cut -d- -f2,3 | sort -uV | head -n -2 | awk -v c=$(uname -r | cut -d- -f1,2) '($0==c){exit} //' | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/')เดิม ไม่จำเป็นต้องใช้dpkg-queryตั้งแต่apt-getสามารถจัดการนิพจน์ทั่วไปได้ โปรดทราบวิธีที่ฉันหนีจุดและเพิ่มคำนำหน้าและคำต่อท้ายในการแสดงออกปกติ การใช้สคริปท์ในคำตอบของฉันคุณสามารถเก็บเมล็ดที่แก่กว่าที่เป็นอยู่ในปัจจุบันได้
jarno

4

ข้อดีของคำตอบนี้คือการใช้งาน Ubuntu Bash โดยไม่ต้องติดตั้งแอพพลิเคชั่นบุคคลที่สาม ผู้ใช้เมล็ดที่กำหนดเองที่ไม่ได้ใช้aptหรือdpkgสามารถเปลี่ยนสคริปต์ทุบตีนี้เพื่อให้เหมาะกับความต้องการของพวกเขา คำตอบนี้เป็นไปตาม ( วิธีการล้างเมล็ดเก่าทั้งหมดพร้อมกัน )

วิธีการแก้ปัญหาตาม Zenity

Zenity นำเสนออินเทอร์เฟซ GUI ที่ยอดเยี่ยมไปยังเครื่องเทอร์มินัลเพื่อประมวลผลรายการและเลือกรายการด้วยปุ่มตัวเลือก :

rm-kernels 1

เนื่องจากชื่อระบุว่าเคอร์เนลปัจจุบันที่คุณบูตด้วยไม่สามารถลบออกได้และไม่รวมอยู่ในรายการ ขนาดรายงานคือเท่าใดจะถูกบันทึกไว้ใน/bootไดเรกทอรี มีการบันทึกเพิ่มเติมในดิสก์ของคุณเนื่องจากเคอร์เนลไบนารีอยู่ในพื้นที่อื่นด้วย 27 กรกฎาคม 2017 หมายเหตุ:ไดเรกทอรี/usr/src/*kernel_version*และ/lib/modules/*kernel_version*ตอนนี้รวมอยู่ด้วย

วันที่แก้ไขจะถูกค้นพบโดยใช้statคำสั่ง ในระบบของฉันวันนั้นคือ"สัมผัส"ทุกครั้งที่เคอร์เนลถูกบูทโดยใช้สิ่งนี้ ( คุณจะทราบได้อย่างไรว่าเวอร์ชันเคอร์เนลที่ถูกบูทครั้งล่าสุดเมื่อใด ) สคริปต์รีบูตcron อย่างไรก็ตามในระบบของคุณวันที่จะเป็นวันวางจำหน่ายเคอร์เนลไม่ใช่ครั้งสุดท้ายที่คุณบูต

apt-get purge ให้โอกาสคุณยกเลิก

คุณจะได้รับโอกาสสุดท้ายในการดูทุกสิ่งที่จะถูกลบทิ้งและดูพื้นที่ดิสก์ทั้งหมด (ค่อนข้างทำให้เข้าใจผิด) ที่จะกู้คืน:

The following packages will be REMOVED:
  linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic*
  linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic*
  linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic*
  linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic*
  linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic*
  linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic*
  linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic*
  linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic*
  linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic*
  linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic*
  linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic*
  linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic*
0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded.
After this operation, 2,330 MB disk space will be freed.
Do you want to continue? [Y/n] 

รหัส

คัดลอกรหัสนี้ไปยังไฟล์ปฏิบัติการที่มีชื่อrm-kernelsใน/usr/local/bin:

#!/bin/bash

# NAME: rm-kernels
# PATH: /usr/local/bin
# DESC: Provide zenity item list of kernels to remove

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    zenity --error --text "root access required. Use: sudo rm-kernels"
    exit 99
fi

OLDIFS="$IFS"
IFS="|"
choices=()

current_version=$(uname -r)

for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    choices=("${choices[@]}" false "$v" "$d" "$s")
done

# adjust width & height below for your screen 640x480 default for 1920x1080 HD screen
# also adjust font="14" below if blue text is too small or too large

choices=(`zenity \
        --title "rm-kernels - Total: $t MB excluding: $current_version" \
        --list \
        --separator="$IFS" \
        --checklist --multiple \
        --text '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
        --width=640 \
        --height=480 \
        --column "Select" \
        --column "Kernel Version Number" \
        --column "Modified Date" \
        --column " Size " \
        "${choices[@]}"`)
IFS="$OLDIFS"

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
     apt-get purge $list
fi

หมายเหตุ:คุณต้องได้รับอนุญาต sudo เพื่อสร้างไฟล์เพื่อใช้:

gksu gedit /usr/local/bin/rm-kernels

หากต้องการใช้ไฟล์ที่ปฏิบัติการได้:

sudo chmod +x /usr/local/bin/rm-kernels

เวอร์ชันเซิร์ฟเวอร์

rm-kernels-serverเป็นรุ่นของเซิร์ฟเวอร์ที่เลือกลบทั้งหมดในคราวเดียว แทนที่จะใช้กล่องโต้ตอบ GUI (กราฟิก) กล่องโต้ตอบแบบข้อความจะใช้เพื่อเลือกเมล็ดที่จะทำการล้าง

  • ก่อนที่จะรันสคริปต์คุณต้องติดตั้งฟังก์ชั่นการโต้ตอบโดยใช้:

    sudo apt install dialog

กล่องโต้ตอบอยู่ในการติดตั้ง Ubuntu Desktop เริ่มต้น แต่ไม่ได้อยู่ในเซิร์ฟเวอร์ Ubuntu

ตัวอย่างหน้าจอ

rm-kernels-server 1

rm-kernels-server รหัสทุบตี

#!/bin/bash

# NAME: rm-kernels-server
# PATH: /usr/local/bin
# DESC: Provide dialog checklist of kernels to remove
#       Non-GUI, text based interface for server distro's.

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    echo "root access required. Use: sudo rm-kernels-server"
    exit 99
fi

# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed.  Aborting."; exit 99; }

OLDIFS="$IFS"
IFS="|"
item_list=() # Deviate from rm-kernels here.

current_version=$(uname -r)
i=0
for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    ((i++)) # Item List
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off)
done

cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \
    --title "Use space bar to toggle kernel(s) to remove" \
    --column-separator "!" \
    --separate-output \
    --ascii-lines \
    --checklist "         Kernel Version --------- Modified Date  Size" 20 60 15)

selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty)

IFS=$OLDIFS

if [ $? -ne 0 ] ; then
    echo cancel selected
    exit 1
fi

i=0
choices=()

for select in $selections ; do
    ((i++))
    j=$(( 1 + ($select - 1) * 3 ))
    choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!")
done

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
    apt-get purge $list
fi

หมายเหตุ:ในการเรียกไปdialogยังคำสั่ง--ascii-linesจะถูกส่งผ่านเพื่อแทนที่ชุดอักขระที่ขยายวาดเส้นวาด (ซึ่งsshไม่ชอบ) ด้วย "+ ----- +" สำหรับกล่องรูปวาด หากคุณไม่ชอบรูปลักษณ์นี้คุณสามารถใช้--no-linesคำสั่งแบบไม่มีกล่องเลย


อัปเดต 28 กรกฎาคม 2560

ขนาดที่คำนวณได้ของเคอร์เนลแต่ละ/boot/*kernel_version*ไฟล์มีขนาด 5 ไฟล์รวมกัน ~ 50 MB สูตรที่มีการเปลี่ยนแปลงที่จะรวมไฟล์ในและ/usr/src/*kernel_version* /lib/modules/*kernel_version*ขนาดที่คำนวณได้สำหรับแต่ละเคอร์เนลคือ ~ 400 MB รหัสด้านบนสำหรับrm-kernelsและrm-kernels-serverได้รับการปรับปรุง อย่างไรก็ตามหน้าจอตัวอย่างด้านบนยังไม่สะท้อนการเปลี่ยนแปลงเหล่านี้

ค่าเริ่มต้นคือการประมาณขนาดของไฟล์สำหรับส่วนหัวของลินุกซ์ที่ 125 MB และรูปแบบของลินุกซ์ที่ 220 MB เพราะduอาจช้าลงอย่างเจ็บปวดเว้นแต่ไฟล์จะอยู่ในแคช เพื่อให้ได้ขนาดจริงโดยใช้การduส่งผ่านพารามิเตอร์ใด ๆ ไปยังสคริปต์

ขนาดทั้งหมดของเคอร์เนล (ไม่รวมรุ่นที่รันอยู่ในปัจจุบันซึ่งไม่สามารถลบได้) จะแสดงในแถบชื่อเรื่อง

กล่องโต้ตอบใช้ในการแสดงแต่ละเคอร์เนลของวันสุดท้ายการเข้าถึง วันนี้จะได้รับการเขียนทับมวลสำหรับเมล็ดทั้งหมดในระหว่างการสำรองข้อมูลหรือการดำเนินการที่คล้ายกัน ตอนนี้กล่องโต้ตอบจะแสดงวันที่แก้ไขแทน


2

วิธีง่ายๆในการกำจัดแพ็คเกจที่ล้าสมัยเกือบทั้งหมดแพ็คเกจที่ไม่อยู่ในรายการแพ็คเกจอีกต่อไปพร้อมกับเมล็ดที่ล้าสมัยคือการทำอย่างใดอย่างหนึ่งต่อไปนี้:

dpkg --purge $(aptitude search ?obsolete)

อย่างไรก็ตามสิ่งนี้จะพลาดแพ็กเกจที่ยังคงแนะนำโดยแพ็กเกจอื่นและอาร์กิวเมนต์ -R / - ที่ไม่มีการแนะนำจะไม่สามารถแก้ปัญหานี้ได้

dselect หลังจากสลับโหมดการจัดเรียงด้วย 'o' จะแสดงแพคเกจล้าสมัยทั้งหมดรวมถึงคนที่ขาดความถนัด แต่บางคนไม่ชอบใช้มัน


คำสั่งที่กำหนดไม่ได้กำจัดเมล็ดเก่าและไม่มีผลต่อเมนูด้วงในประสบการณ์ของฉัน
jarno

2

คำตอบที่ได้รับการยอมรับโดยใช้sedเพื่อลบเมล็ดเก่าอย่างถาวรมีข้อบกพร่องบางอย่างถ้ามีคนไม่รีบูตเครื่องคอมพิวเตอร์หลังจากอัพเกรดเคอร์เนลคำสั่งจะลบเคอร์เนลใหม่กว่าด้วย

นี่คือทางเลือกอื่นที่จะพิจารณาสถานการณ์ทั้งหมดเพื่อลบเมล็ดเก่าที่แท้จริงเท่านั้น:

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

หากคุณมีเวอร์ชันใด ๆ ที่ใหม่กว่าเวอร์ชั่นปัจจุบันจะมีคำเตือนให้รีสตาร์ทคอมพิวเตอร์ก่อน นอกจากนี้โปรดทราบว่าเคอร์เนลที่เก่ากว่านั้นได้รับการเก็บรักษาไว้เนื่องจากเหตุผลที่ดีซึ่งหากคุณทำให้เคอร์เนลปัจจุบันของคุณทำให้ระบบของคุณไม่เสถียรจากนั้นคุณควรจะสามารถบูตเข้าสู่เคอร์เนลที่เก่ากว่าได้


วิธีนี้จะไม่ลบเมล็ดความหนืดต่ำหรือเมล็ดของรสชาติอื่นใดนอกเหนือจากสามัญ
jarno

ฉันคิดว่าคุณอ้างถึงนี้ sedการแก้ปัญหา
jarno

@jarno: วิธีการแทนที่grep -Po "^linux-image-[^-]+-[^-]+-generic\b"ด้วยgrep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"และgrep -Po ".*(?=-[a-z]*$)"ด้วยgrep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"และgrep -Po "[0-9].*(?=-[a-z]*)"ด้วยgrep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"?
Sadi

@Sadi, wel, l ที่ไม่สามารถหาเมล็ดความหนืดได้เช่นกัน
jarno

1
ขอบคุณ วิธีอื่นไม่ได้ผลสำหรับฉัน คุณทำงานได้ดี
Philippe Delteil

1

ailurusมีคุณสมบัติในการลบเมล็ดเก่ารวมถึงการกำหนดค่าที่ไม่ได้ใช้ ฉันเป็นการส่วนตัวลบออกจาก synaptic ด้วยตนเอง คุณสามารถติดตั้ง ailurus จากgetdebและppa


"Ailurus เป็นเครื่องมือสำหรับสำรองรายชื่อซอฟต์แวร์ที่ติดตั้งไว้ ... ในอดีต Ailurus มีฟังก์ชั่นมากมายตอนนี้มันมีฟังก์ชั่นเดียวเท่านั้นเพราะฉันคิดว่าฟังก์ชั่นที่มีประโยชน์จริงๆดีกว่าฟังก์ชั่นที่มีประโยชน์น้อยกว่าหลายสิบ"
jarno

1

ฉันมีสคริปต์สำหรับสิ่งนี้ที่ไม่จำเป็นต้องแยกสตริงที่แฟนซีมาก

ลบส่วนหัวและรูปภาพยกเว้นอันปัจจุบันเพื่อปล่อยพื้นที่

sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+

1

คุณสามารถใช้ ukuu - เป็น GUI ทั้งหมด - เพื่ออัปเดตและลบ Kernels เก่า ใช้งานได้สำหรับฉัน!

เพียงจำไว้ว่าให้ติดตั้ง 2 ครั้งสุดท้ายและเห็นได้ชัดว่าเคอร์เนล 'ที่ใช้งานอยู่'

นอกจากนี้คุณยังสามารถตั้งค่า ukuu ให้แสดงเฉพาะการปล่อยฉีดแม้กระทั่งเมล็ด RC, การซ่อนจุด

ukuu

คุณสามารถค้นหา ukuu ใน Synaptic หรือคำแนะนำอยู่ที่นี่:

คำแนะนำการติดตั้ง OMG! Ubuntu ukuu


1

ตามคำตอบก่อนหน้านี้ของ David Kemp สคริปต์ต่อไปนี้จะกำจัดส่วนหัวและรูปภาพทั้งหมดยกเว้นเวอร์ชัน2 ล่าสุด

#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)

SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | uniq | sed -n 2p)

# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
    if [ -n "$SECONDTOLASTVER" ]; then
        echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
    fi
}

echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get purge

(ใช้apt-get -yเพื่อลบโดยไม่มีคำถาม)


เหตุผลใดก็ตามที่สิ่งนี้ถูก downvote? มันไม่ทำงานสำหรับใครบางคน? เมื่อคัดลอก / วางให้แน่ใจว่าคุณไม่ได้ห่อสายยาวเมื่อคุณวาง ฉันไม่มีปัญหากับการทำงาน
ทำเครื่องหมาย

เคอร์เนลใหม่ล่าสุดในเครื่องของฉันคือ 3.13.0-43-lowlatency สคริปต์นี้จะล้างข้อมูล linux-headers-3.13.0-43-lowlatency
jarno

@jarno คุณทราบได้อย่างไร? หากต้องการลองโดยไม่ทำอะไรเลยจริงๆให้เพิ่มแฟล็ก "-s" ในคำสั่ง apt-get (หรือลบ| xargs sudo apt-get -y purgeทั้งหมด) ถ้ามันพิมพ์ออกมา 3.13.0-43-lowlatency แสดงว่าคุณอาจมีเวอร์ชั่นที่ใหม่กว่าที่ติดตั้งในระบบของคุณ
ทำเครื่องหมาย

ฉันลองจำลองสถานการณ์ ไม่ แต่ฉันได้ลบเคอร์เนลเวอร์ชันก่อนหน้านี้บางส่วนออก แต่ไม่ถูกลบและแพ็คเกจส่วนหัวที่เกี่ยวข้องจะถูกลบ
jarno

อย่างไรก็ตามฉันได้พัฒนาสคริปต์ขึ้นอยู่กับแนวคิดของคำตอบของ Sankalp
jarno

0

นี่คือคร่าวๆเกี่ยวกับสิ่งที่ฉันทำระวังตัวเองในฐานะที่ฉันไม่มีผู้เชี่ยวชาญใน linux ต้องแน่ใจว่าคุณรู้ว่าคุณกำลังทำอะไรและสำรองไฟล์ใด ๆ ที่คุณกำลังปรับเปลี่ยน

gedit /boot/grub/grub.cfg

จากนั้นค้นหารายการที่คุณต้องการเก็บไว้เราจะเน้นและคัดลอก

cd /etc/grub.d
ls

คุณจะเห็นรายการไฟล์เช่น 10_linux และ 30_os-prober

sudo chmod -x 10_linux

สิ่งนี้จะหยุดแบบอัตโนมัติเพิ่มรายการ linux ทั้งหมดลงในเมนูการบูตด้วง

gksudo gedit 40_custom

เปิดไฟล์เมนูบู๊ตที่กำหนดเองจากนั้นกลับไปที่ grub.cfg (ซึ่งควรจะยังคงเปิดอยู่ใน gedit) และคัดลอกรายการที่คุณต้องการเก็บ ... เช่น

menuentry "My Default Karmic" {
  set root=(hd0,1)
  search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
  linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
  initrd /boot/initrd.img-2.6.31-11-generic
}

วางลงใน40_customแล้วบันทึก

sudo chmod 755 40_custom

ทำให้ปฏิบัติการได้ในที่สุดเราก็อัพเดต grub ซึ่งจะเปลี่ยนไฟล์ grub.cfg:

sudo update-grub

ตอนนี้ระวังถ้าคุณอัปเดตเคอร์เนลหรือระบบปฏิบัติการเมนูบู๊ตของคุณอาจจะไม่อัปเดต ... คุณจะต้องทำด้วยตนเอง แต่การทำโพรซีเดอร์นี้จะช่วยให้คุณปรับแต่งเมนูการบู๊ตได้มากขึ้นเช่นลบเคอร์เนลเวอร์ชั่นและเพียงแค่ใส่ชื่ออูบุนตู ... เช่น Ubuntu Lucid 10.04 และอื่น ๆ ...

หวังว่าบางคนจะพบว่าสิ่งนี้มีประโยชน์เพราะฉันใช้เวลาสักครู่ในการคิดออก ... ไม่เห็นโซลูชันนี้ที่ใดก็ได้ ...


3
คำตอบนี้ดูเหมือนจะเกินความจริง จะเป็นการดีกว่าที่จะลบเมล็ดข้าวเก่าออก
Scott Severance

ฉันได้อ่านว่าเมล็ดพิเศษอาจมีประโยชน์ในกรณีที่มีสถานการณ์การฟื้นตัว นอกจากนี้ยังเป็นวิธีที่ง่ายในการแก้ไขข้อความของรายการบูต ดังนั้นแทนที่จะพูดว่า "Ubuntu, เคอร์เนล Linux xxxx-yy --text1 -text2 -t3 -t4 --t5 ฯลฯ ฯลฯ " (โดยที่ - รายการข้อความแสดงถึงตัวเลือก / พารามิเตอร์ที่ฉันไม่เข้าใจ) คุณสามารถเปลี่ยนได้ เป็น "Ubuntu xx.yy" แม้ว่าฉันจะมีเครื่องหมาย "{" อยู่ แต่ก็ไม่สามารถกำจัดได้
Joe

1
ฉันเก็บเคอร์เนลก่อนหน้าทันทีรอบ ๆ จนกว่าฉันจะตรวจสอบว่าเคอร์เนลปัจจุบันทำงานอย่างถูกต้อง ถ้ามันใช้งานได้มันจะไม่หยุดทำงาน ดังนั้นหลังจากฉันตรวจสอบเคอร์เนลล่าสุด (หลังจากผ่านไปหนึ่งสัปดาห์หรือมากกว่านั้น) ฉันไม่มีเหตุผลที่จะต้องรักษาเคอร์เนลเก่าไว้ ถ้ามันใช้ไม่ได้ผลฉันมีเคอร์เนลที่รู้จักกันดีมาก่อน ที่จริงแล้วฉันกำลังใช้เคอร์เนลเก่าเนื่องจากข้อผิดพลาด showstopper ในเมล็ดปัจจุบัน แต่นั่นไม่ได้เปลี่ยนนโยบายโดยรวมของฉัน คุณต้องการเคอร์เนลที่ดีที่รู้จักเท่านั้น
Scott Severance

0

ติดตั้งตัวจัดการแพคเกจ synapticและลงไปที่แท็บตัวกรอง (ฉันคิดว่าตัวกรองถ้าไม่ลองทั้งหมด 5) และเลือก "ท้องถิ่น" สิ่งนี้จะแสดงให้คุณเห็นแพ็กเกจกำพร้าในระบบของคุณเช่นเมล็ด update-grubหลังจากที่คุณถอนการติดตั้งพวกเขาทำงาน คำสั่งนั้นอัพเดตรายการตัวเลือกการบูตสำหรับด้วง

apt-get remove linux-image-version-genericหากล้มเหลวคุณสามารถลอง


ใน Synaptic คุณสามารถกรอง 'องค์ประกอบ' -> 'เคอร์เนลและโมดูล' ซึ่งรวมถึงเมล็ดทั้งหมด และจัดเรียงตามคอลัมน์แรก: 'S' (สถานะ) ดังนั้นคุณจะได้รับเมล็ดที่ติดตั้งทั้งหมดอยู่ด้านบน แท้จริงupdate-grubคือการแนะนำ
danger89

0

หากต้องการควบคุมเวอร์ชันที่จะเก็บเพิ่มเติมให้เลือกเวอร์ชันที่คุณต้องการลบอย่างชัดเจน ตัวอย่างเช่นหากคุณต้องการลบเคอร์เนลเวอร์ชั่น 3.2.0 [49-53] ให้ใช้การforวนรอบอย่างง่าย:

for k in 49 51 52 53 ; do aptitude remove --purge linux-image-3.2.0-${k}-generic ; done

ปรับรายการรุ่นเคอร์เนลให้พอดี


0

ลองสิ่งนี้ เรียกใช้เป็นราก

บันทึกสคริปต์นี้เป็นพูด. /keep-n-kernels.sh

ผ่านเป็นอาร์กิวเมนต์บรรทัดคำสั่งจำนวนของเมล็ดล่าสุดที่คุณต้องการรักษา

    
#! / bin / ทุบตี

# pass n เป็นอาร์กิวเมนต์บรรทัดคำสั่งและจะพบการติดตั้งทั้งหมด
# kernels และเก็บเฉพาะ n ล่าสุดเท่านั้น => ถอนการติดตั้งเก่ากว่าทั้งหมด

# dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\(CD ^ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
# คำสั่งนี้ให้รายชื่อของแพ็คเกจทั้งหมดยกเว้นเคอร์เนลล่าสุด
# source: https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n = $ 1

# ค้นหาเวอร์ชันเคอร์เนลที่ติดตั้ง:
# dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep | เรียงลำดับ -n
# ให้หมายเลขเวอร์ชันหนึ่งหมายเลขในแต่ละบรรทัด
# dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep | sed 's /\...$// g' | grep -v '\ ... $' | เรียงลำดับ -u
# ให้เฉพาะภาพที่ปรากฏใน linux-image เท่านั้น

# ส่วนต่อท้ายเช่น -generic-pae
# ประเภทของเคอร์เนลที่คุณบูตเข้าไป
คำต่อท้าย = $ (uname -r | sed 's: ^ [0-9] \. [0-9] \. [0-9] \ - [0-9] \ {2 \} :: g')

คำสั่ง = "apt-get purge"

สำหรับรุ่นใน $ (dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$// g' | grep -v ' \ ... $ '| sort -u | head -n - $ {n})
ทำ
    คำสั่ง = $ {คำสั่ง} "^ linux-image - $ {version} $ {คำต่อท้าย}"
เสร็จแล้ว

$ คำสั่ง

ตัวอย่างการใช้งาน:

# ./keep-n-kernels.sh 4 # เรียกใช้คำสั่ง apt-get เพื่อลบทั้งหมดยกเว้น 4 เมล็ดล่าสุด

ถ้าคุณต้องการ [และความเสี่ยงของคุณเอง] คุณสามารถเพิ่ม -y (หรือการบังคับธง) เพื่อคำสั่ง apt-get และทำให้มันไม่ใช่แบบโต้ตอบ


มันจะลบเมล็ดทั้งหมดถ้าคุณเรียกใช้. /keep-n-kernels.sh 0 การตรวจสอบสายอักขระคำต่อท้ายไม่ทำงาน ฉันคิดว่าคำต่อท้าย = $ (uname -r | sed -r 's / ^ [0-9.] * (- [0-9.] +) * //') หรือต่อท้าย = $ (uname -r | egrep - - เฉพาะการจับคู่ - '- [[: อัลฟ่า:] -] + $') จะทำอย่างไร
jarno

แต่ฉันคิดว่าความคิดนั้นดี ฉันพยายามปรับปรุงสคริปต์และบางทีฉันอาจโพสต์ไว้ที่นี่เมื่อฉันคิดว่ามันพร้อมแล้ว
jarno

กรุณาแบ่งปัน @jarno ดีใจที่ได้ทราบความคิดที่ดูเหมือนว่ามีประโยชน์
Sankalp

ตกลงนั่นคือ: ลิงก์
jarno

0

ฉันใช้เดสก์ท็อป KDE และตัวเลือกที่ง่ายที่สุดที่ฉันพบคือใช้แอปพลิเคชัน kde-config-grub2 ตามที่แนะนำที่นี่: https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux-versions (ซึ่งฉันได้ติดตั้งไว้แล้วสำหรับการตั้งค่าภาพพื้นหลังตัวเลือกการบูตเริ่มต้นและสิ่งที่คล้ายกัน) ถัดจากช่องรายการแบบเลื่อนลงที่คุณสามารถเลือกรายการเริ่มต้นได้จะมีปุ่ม "ลบรายการเก่า" การคลิกปุ่มนี้จะแสดงรายการของเมล็ดข้าวที่ติดตั้งไว้ทั้งหมดและคุณสามารถเลือกได้ว่าจะเอาเมล็ดใด เมื่อคุณใช้การเปลี่ยนแปลงมันจะใช้ dpkg เพื่อลบออกจากระบบเช่นเดียวกับเมนู GRUB


0

เพียงเพื่อตีระฆังคุณยังสามารถออก

apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}

ในฐานะที่เป็นรูทและงานจะเสร็จ


0

หากคุณใช้การควบคุมเครื่องไม่ได้หนังสือเล่มนี้อาจมีประโยชน์

---
 - hosts: all
   become: yes
   tasks:
    - name: "Run apt-get autoremove"
      apt: 
        name: linux-image-generic
        autoremove: yes
        state: present 
        update_cache: yes
        cache_valid_time: 3600
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.