ทำไมระบบรับอัตโนมัติ apt-get autoremove จึงไม่ลบเมล็ดเก่าของฉัน


53

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



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

คำตอบ:


36

เพื่อที่จะตอบว่าทำไมโปรดดูไฟล์ /etc/apt/apt.conf.d/01autoremove-kernels

ป้อนคำอธิบายรูปภาพที่นี่

ในขณะที่คุณสามารถมองเห็นแนวโน้มที่จะบอกให้ไม่เคย autoremove เมล็ดเป็นบอกอีกไฟล์ /etc/kernel/postinst.d/apt-auto-removal(สคริปต์) และนี่คือ:

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณติดตั้ง 2 เมล็ดที่เลือกด้วยตนเองเช่นอันแรกและอันปัจจุบัน apt-autoremove จะลบรุ่นเก่าที่คุณไม่ได้ติดตั้งด้วยตนเองเท่านั้นดังนั้นคุณจะมี 2 ตัวเลือกพร้อมด้วยสิ่งล่าสุด

ปรับปรุง:

ใน/etc/kernel/postinst.d/apt-auto-removalส่วนนี้มี:

if [ "$latest_version" != "$installed_version" ] \
   || [ "$latest_version" != "$running_version" ] \
   || [ "$installed_version" != "$running_version" ]
then
        # We have at least two kernels that we have reason to think the
        # user wants, so don't save the second-newest version.
        previous_version=
fi

ดังนั้นหากคุณเปรียบเทียบผลลัพธ์ของ01autoremove-kernelsไฟล์และuname -rคุณจะรู้ว่าเคอร์เนลที่รันอยู่ในปัจจุบันและล่าสุดก่อนหน้านี้จะถูกเก็บไว้เพื่อไม่ให้ถูกลบโดยสคริปต์นั้น ปรากฎว่ามีไฟล์อื่น/etc/apt/apt.conf.d/01autoremoveที่มีบรรทัด:

    APT
    {
      NeverAutoRemove
      {
            "^firmware-linux.*";
            "^linux-firmware$";
      };
  VersionedKernelPackages
  {
        # linux kernels
        "linux-image";
        "linux-headers";
        "linux-image-extra";
        "linux-signed-image";
        # kfreebsd kernels
        "kfreebsd-image";
        "kfreebsd-headers";
        # hurd kernels
        "gnumach-image";
        # (out-of-tree) modules
        ".*-modules";
        ".*-kernel";
        "linux-backports-modules-.*";
        # tools
        "linux-tools";
  };

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


1
น่าสนใจมาก! ของฉัน/etc/apt/apt.conf.d/01autoremove-kernelsมีหลายบรรทัด แต่มีเพียงสองเวอร์ชันเท่านั้น: 3.13.0. {39,43} แต่dpkg -l linux-*จะมีสี่รุ่นคือ 3.13.0 {39,40,41,43} ดังนั้นมีอะไรอีกที่นอกเหนือจาก/etc/apt/apt.conf.d/01autoremove-kernelsการรักษาเวอร์ชันกลางเหล่านั้นเอาไว้ใช่ไหม
BlueBomber

1
TL: DR: 01autoremoveเป็นไฟล์ที่คุณต้องการ01autoremove-kernelsอาจเป็นเพียงการป้องกันดังนั้น apt จึงไม่ลบเคอร์เนลที่ติดตั้งอยู่ในปัจจุบันและล่าสุด (ในกรณีที่สกรูใหม่ล่าสุดขึ้นมา)
Sergiy Kolodyazhnyy

1
เว้นแต่ฉัน misreading ก็เพียงการป้องกันอัตโนมัติกำจัดของแพคเกจการพึ่งพาเช่น01autoremove linux-image-extraเปลี่ยนก็ไม่ควรส่งผลกระทบหรือไม่linux-image-3.16.0-31-genericได้รับ autoremoved ไม่มีรูปแบบใดที่ตรงกับชื่อแพ็คเกจที่เราต้องการลบออกโดยอัตโนมัติ
Peter Cordes

1
@PeterCordes /etc/apt/apt.conf.d/01autoremoveอย่าถอดหรือแสดงความคิดเห็นในสาย ที่ไม่ได้ช่วยคุณในการเติมข้อความอัตโนมัติในแพ็คเกจเคอร์เนลเวอร์ชันเก่า แต่อาจมีผลกระทบที่ไม่พึงประสงค์ ไฟล์ไม่ได้ป้องกันการตอบกลับอัตโนมัติlinux-image-extraแต่แพ็คเกจที่ตรงกับนิพจน์ทั่วไปในNeverAutoRemoveส่วน
jarno

2
@BlueBomber เหตุผลที่apt-get autoremoveไม่ลบเมล็ดที่ไม่อยู่ในรายการ/etc/apt/apt.conf.d/01autoremove-kernelsนั้นคือเมล็ดเหล่านั้นถูกทำเครื่องหมายว่าติดตั้งด้วยตนเอง; เห็นของฉันคำตอบ
jarno

8

สำหรับฉันมันช่วยในการติดตั้ง Ubuntu ล่าสุด (X) (15.10) ในรุ่นก่อนหน้าเคอร์เนลแพคเกจอาจถูกทำเครื่องหมายว่าติดตั้งด้วยตนเองอย่างน้อยถ้าติดตั้งโดยใช้ Software Updater ดังนั้นจึงsudo apt-get autoremove --purgeไม่สามารถลบได้ มีรายงานข้อผิดพลาดเกี่ยวกับปัญหา: Bug # 1175637 , Bug # 1439769

ในรีลีสก่อนหน้านี้คุณสามารถลองทำเครื่องหมายแพ็คเกจเคอร์เนลที่ติดตั้งโดยอัตโนมัติsudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")และเรียกใช้sudo apt-get autoremove --purgeหลังจากนั้นเพื่อดูว่ามันสร้างความแตกต่างหรือไม่ คำสั่งไม่ควรลบแพ็กเกจเมล็ดที่แสดงใน /etc/apt/apt.conf.d/01autoremove-kernels แต่จะปลอดภัยที่สุดหากรันapt-get autoremoveด้วย--dry-runอ็อพชันก่อน


โอ้คำสั่ง autoremove มีแนวโน้มที่จะลบเมล็ดมากเกินไปดูBug # 1440608
jarno

1
apt-markได้เคล็ดลับสำหรับฉันหวังว่าฉันจะ upvote 10 ครั้ง: P
ไมค์กลีสันจูเนียร์ Couturier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.