Mengapa apt-get autoremove tidak menghapus kernel lama saya?

53

Partisi boot saya menggunakan SSD, sehingga tidak memiliki ruang untuk lebih dari 8 versi kernel yang diinstal, dan akhirnya beberapa pembaruan kernel akan gagal diinstal karena partisi boot saya penuh dengan versi lama. Ada banyak pertanyaan di luar sana tentang cara menghapus versi lama (bahkan bagaimana mengotomatiskan proses), tetapi pertanyaan saya hanyalah ini: Mengapa tidak apt-get autoremovemendeteksi dan menghapusnya secara otomatis, dan adakah cara saya dapat membuatnya melakukannya ? Maksud saya, apt-getapakah yang menginstalnya, jadi ia tahu tentang mereka, jadi mengapa ia memilih untuk meninggalkan semua versi lama?

BlueBomber
sumber
3
kemungkinan rangkap dari Mengapa Ubuntu tidak menghapus kernel lama secara otomatis?
Pasang kembali Monica - M. Schröder
1
Autoremove memang menghapus kernel lama dalam sebagian besar keadaan. Kernel terakumulasi karena sistem tidak menjalankan autoremove secara otomatis. Itu adalah pengaturan dalam peningkatan tanpa pengawasan, dan dapat diubah. Autoremove tidak dapat menghapus kernel lama ketika tindakan apt sebelumnya-antri (seperti menginstal kernel baru) gagal (karena ruang tidak cukup). Lihat bugs.launchpad.net/bugs/1357093 untuk tambalan ke peningkatan tanpa pengawasan yang akan mulai menghapus kernel lama secara otomatis.
user535733

Jawaban:

36

Untuk menjawab alasannya, lihat file tersebut /etc/apt/apt.conf.d/01autoremove-kernels

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, apt dikatakan untuk tidak pernah autoremove kernel, seperti yang diceritakan oleh file (script) lain /etc/kernel/postinst.d/apt-auto-removal,. Dan ini dia:

masukkan deskripsi gambar di sini

Jika Anda menginstal 2 kernel yang dipilih secara manual, yaitu yang pertama dan yang sekarang, maka apt-autoremove hanya akan menghapus versi lama yang tidak Anda instal secara manual, sehingga Anda akan selalu memiliki 2 opsi tersebut ditambah apa pun yang terbaru.

Memperbarui:

Di /etc/kernel/postinst.d/apt-auto-removalsana ada bagian ini:

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

Jadi jika Anda membandingkan output 01autoremove-kernelsfile dan uname -rAnda akan menyadari bahwa kernel yang saat ini berjalan dan yang terbaru sebelum itu, disimpan untuk tidak pernah dihapus oleh skrip itu. Ternyata ada file lain /etc/apt/apt.conf.d/01autoremove, di mana ada baris:

    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";
  };

Jadi Anda bisa mengomentari ini, dan itu akan memungkinkan Anda untuk menghapus kernel secara otomatis apt-autoremove, meskipun ingat - lakukan ini dengan risiko Anda sendiri

Sergiy Kolodyazhnyy
sumber
1
Sangat menarik! My /etc/apt/apt.conf.d/01autoremove-kernelsmemiliki banyak baris, tetapi hanya dua versi di antara semuanya: 3.13.0. {39,43}. Tetapi dpkg -l linux-*daftarkan empat versi, 3.13.0. {39,40,41,43}, jadi sesuatu selain /etc/apt/apt.conf.d/01autoremove-kernelsmenjaga agar versi-versi menengah tersebut ada, bukan?
BlueBomber
1
TL: DR: 01autoremoveadalah file yang Anda inginkan, 01autoremove-kernelsmungkin hanya perlindungan, sehingga apt tidak menghapus kernel yang saat ini terinstal dan yang terbaru (untuk berjaga-jaga jika sekrup terbaru up)
Sergiy Kolodyazhnyy
1
Kecuali saya salah membaca 01autoremove, itu hanya melindungi dari penghapusan otomatis paket dependensi, seperti linux-image-extra. Mengubahnya seharusnya tidak memengaruhi apakah linux-image-3.16.0-31-genericakan autoremoved atau tidak . Tidak ada pola di dalamnya yang cocok dengan nama paket yang ingin kami hapus secara otomatis.
Peter Cordes
1
@PeterCordes Jangan hapus atau komentar baris /etc/apt/apt.conf.d/01autoremove. Itu tidak membantu Anda dalam autoremoving paket kernel versi lama, tetapi mungkin memiliki efek yang tidak diinginkan. File tidak melindungi dari autoremoving linux-image-extratetapi paket yang cocok dengan ekspresi reguler di NeverAutoRemovebagian ini.
jarno
2
@BlueBomber, alasan mengapa apt-get autoremovetidak menghapus kernel yang tidak terdaftar /etc/apt/apt.conf.d/01autoremove-kernelsadalah bahwa kernel tersebut ditandai sebagai diinstal secara manual; lihat jawaban saya .
jarno
8

Bagi saya itu membantu menginstal ubuntu (X) terbaru (15.10). Dalam rilis sebelumnya, paket kernel dapat ditandai sebagai yang diinstal secara manual, setidaknya, jika diinstal dengan menggunakan Pembaruan Perangkat Lunak, sehingga sudo apt-get autoremove --purgetidak dapat menghapusnya. Ada laporan bug mengenai masalah ini: Bug # 1175637 , Bug # 1439769

Dalam rilis sebelumnya, Anda dapat mencoba menandai paket-paket kernel yang diinstal secara otomatis oleh sudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")dan dijalankan sudo apt-get autoremove --purgesetelahnya untuk melihat, jika itu membuat perbedaan. Perintah tersebut seharusnya tidak menghapus paket kernel yang ditunjukkan pada /etc/apt/apt.conf.d/01autoremove-kernels, tetapi lebih aman untuk dijalankan apt-get autoremovedengan --dry-runopsi terlebih dahulu.

jarno
sumber
Oh, perintah autoremove cenderung menghapus terlalu banyak kernel, lihat Bug # 1440608
jarno
1
yang apt-markmelakukan trik untuk saya, berharap saya bisa mengungguli 10 kali: P
Mike Gleason jr Couturier