Partisi / boot saya mencapai 100% dan sekarang saya tidak dapat memutakhirkan. Tidak dapat menghapus kernel lama untuk memberi ruang

154

Masalah pertama saya adalah ketika saya mencoba apt-get updateatau apt-get upgrade. Pada peningkatan, saya mendapatkan kesalahan berikut:

You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not installed
E: Unmet dependencies. Try using -f.

Saya mencoba menjalankan apt-get install -f dan ini adalah output (setelah mengatakan ya saat diminta)

(Reading database ... 186183 files and directories currently installed.)
Unpacking linux-image-3.2.0-27-generic (from .../linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb) ...
Done.
dpkg: error processing /var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb (--unpack):
 failed in write on buffer copy for backend dpkg-deb during `./boot/System.map-3.2.0-27-generic': No space left on device
 No apport report written because the error message indicates a disk full error
                                                                          dpkg-deb:    error: subprocess paste was killed by signal (Broken pipe)
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.2.0-27-generic   /boot/vmlinuz-3.2.0-27-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.2.0-27-generic /boot/vmlinuz-3.2.0-27-generic
Errors were encountered while processing:
/var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

Saya mencoba menjalankan apt-get autoremovedan itu memberi saya kesalahan yang sama seperti apt-get upgrade.

Ketika saya berlari df, saya mendapatkan ini untuk /boot:

/dev/sda1                    233191     230297         0 100% /boot

Jadi, saya membaca di tempat lain bahwa saya harus mencoba membersihkan kernel lama. Saya memeriksa kernel apa yang saya miliki:

$ dpkg -l linux-image-\* | grep ^ii
ii  linux-image-2.6.38-13-server  2.6.38-13.52  Linux kernel image for version 2.6.38 on x86_64
ii  linux-image-3.0.0-13-server   3.0.0-13.22   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-14-server   3.0.0-14.23   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-15-server   3.0.0-15.26   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-16-server   3.0.0-16.29   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-17-server   3.0.0-17.30   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.2.0-24-generic  3.2.0-24.39   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-25-generic  3.2.0-25.40   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-26-generic  3.2.0-26.41   Linux kernel image for version 3.2.0  on 64 bit x86 SMP

Ketika saya mencoba menghapus yang tertua dengan ini:

$ sudo apt-get purge linux-image-2.6.38-13-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not going to be     installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

Bagaimana saya bisa membebaskan atau memperpanjang boot tanpa mengacaukan instalasi saya?

Strifey16
sumber
Saya pikir jawaban @ mreiter mungkin yang terbaik: ia menggunakan manajer paket, dan itu berfungsi ketika perintah manajer paket lainnya gagal, setidaknya bagi saya: askubuntu.com/a/205776/247661
Aaron Hall
1
@dskrvk Ya! Kenapa Remove-Unused-Dependenciestidak default?
Steven R. Loomis

Jawaban:

130

Membebaskan Ruang pada Sistem File Root

Untuk membebaskan ruang pada sistem berkas root Anda dapat mencoba untuk mengeksekusi apt-get clean.

Jika itu tidak berhasil, Anda dapat pergi ke /var/cache/apt/archivesdan secara manual menghapus beberapa file dari cache untuk mendapatkan ruang kembali, misalnya:

sudo rm linux-headers-*

Tidak ada ruginya untuk menghapus semua .debfile di sini jika Anda perlu - itulah yang apt-get cleandilakukan. Mereka akan secara otomatis diunduh ulang aptjika mereka diperlukan lagi.

Membebaskan Ruang pada Sistem File / boot

Poster Asli memiliki /bootpartisi yang terpisah , dan itulah yang penuh dan mencegah aptsistem bekerja. Penting baginya untuk membebaskan ruang di sana.

Jika ada cukup ruang, buka /bootdan hapus satu atau dua file konfigurasi:

sudo rm config-3.2.0-19-generic-pae

misalnya, tetapi menggunakan nama salah satu versi kernel yang ingin Anda hapus. Ini akan membebaskan sedikit ruang (masing-masing sekitar 144 ribu).

Jika Anda membutuhkan lebih banyak ruang individual menghapus tua vmlinuz, initrd, abidan System.mapfile sampai Anda memiliki cukup ruang (sekitar 22m untuk salah satu versi kernel i386 saya).

Apa pun yang Anda lakukan, jangan hapus semuanya . Anda setidaknya harus menyimpan dua versi terbaru yang cocok dari setiap jenis file, untuk setiap jenis kernel yang Anda gunakan.

Kemudian lanjutkan dengan perintah instalasi apt-get Anda. Seperti disebutkan di atas, mereka mungkin harus mengunduh ulang beberapa hutang yang Anda hapus, tetapi jika demikian itu akan terjadi secara otomatis. Ketika Anda harus bekerja lagi, bersihkan dengan menggunakan apt-get untuk menghapus paket yang sesuai dengan file yang Anda hapus - jadi semuanya cocok.


File config di /bootadalah konfigurasi kernel yang digunakan oleh tim kernel untuk membangun kernel dengan nama yang sama. Seharusnya tidak berbahaya untuk dihapus kecuali jika Anda menginginkannya untuk referensi atau untuk membantu Anda dalam membangun kernel Anda sendiri.

Terakhir, Anda secara manual menghapus satu atau dua paket kernel lama dari /bootpartisi untuk membuat lebih banyak ruang untuk yang baru.

John S Gruber
sumber
Saya mencoba menghapus hampir semua konfigurasi. Tampaknya masih tidak memiliki ruang yang cukup. File apa lagi yang aman untuk dihapus? Sistem file root saya tidak mendekati penuh, jadi saya tidak khawatir tentang hal itu.
Strifey16
Saya memperbarui jawaban saya dengan file-file selanjutnya untuk dihapus dengan tangan. Sepertinya saya bahwa menghapus set 3.0.0.13 dan 3.0.0.14 (lima file ke set termasuk file abi) akan cukup.
John S Gruber
2
Ini memperbaikinya. Saya menyadari mungkin akan turun untuk menghapus file dengan tangan, tapi saya selalu ragu untuk melakukan itu dengan apa pun yang diinstal oleh apt, jadi saya pikir saya akan bertanya di sini dulu.
Strifey16
9
Jangan gunakan sudo rmuntuk menghapus dari / boot. Sebagai gantinya, gunakan sudo dpkg --purgeuntuk menghapus beberapa paket linux-image lama. Setelah itu digunakan sudo apt-get -f installuntuk memperbaiki ketergantungan yang rusak.
jarno
4
Meskipun kadang-kadang sistem mungkin begitu penuh sehingga bahkan dpkg tidak dapat beroperasi. Tetapi rmbisa digunakan kemudian.
jarno
66

Dalam kasus saya, aptperintah dan dpkgperintah tidak bisa selesai, dan tidak bisa menghapus. Pembaruan otomatis gagal diinstal 2.6.32-56-server.

Langkah pertama saya, adalah mengidentifikasi ruang yang akan digunakan,

cd /boot
du -sk *|sort -n

Saya memiliki sekitar 30 kernel dan file pendukung.

Saya melakukan uname -auntuk mendapatkan kernel yang berjalan, saya mengidentifikasi bahwa saya menggunakan Linux secara alternatif 2.6.32-43-serverdan melakukan tar6 dari versi yang tidak berjalan, dan sudah tua.

tar -cvf ~username/boot.tar *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

Saya kemudian melakukan rm -rfapa yang telah saya backup:

rm -rf *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

Saya menunjukkan perintah ini sebagai contoh, Anda harus memutuskan apa yang akan Anda kerjakan untuk situasi Anda.

Sekarang saya memiliki beberapa ruang /boot, saya bisa berlari

apt-get -f install 

Untuk membersihkan instalasi gagal 2.6.32-56-server.

Saya kemudian melakukan

apt-get remove linux-headers-2.6.32-38 linux-headers-2.6.32-38-server linux-image-2.6.32-38-server
apt-get remove linux-headers-2.6.32-39 linux-headers-2.6.32-39-server linux-image-2.6.32-39-server

Ini memberi saya ruang untuk mengembalikan apa yang telah saya backup.

tar -xf ~username/boot.tar
rm  ~username/boot.tar    

Untuk membersihkan, saya kemudian dapat menjalankan:

apt-get autoremove

Saya reboot dan sekarang saya menggunakan 4% dari /boot.

AG Russell
sumber
Ini adalah yang paling membantu saya dari semua saran. Terima kasih banyak!
Joshua F. Rountree
menghapus file dari / boot hanya merusak apt dan dpkg karena skrip instalasi dan penghapusannya gagal KERAS ketika file hilang. Saya tidak mengerti bagaimana Anda bisa membuatnya bekerja.
FizxMike
20

Anda bisa menggunakan dpkgalih-alih apt-getmenghapus kernel yang lebih lama:

sudo dpkg -r linux-image-3.2.0-29-generic
psusi
sumber
Mungkin ada plusses untuk menggunakan ini, tetapi saran @ mreiter bekerja untuk saya ketika yang ini tidak (yang ini disarankan di saluran dukungan IRC ubuntu.)
Aaron Hall
3
@ AaronHall Jawaban ini hanya berisi bagian kunci dari jawaban mreiter (baris terakhir) dan jauh lebih pendek karena tidak mencakup pembersihan header (yang tidak membantu dalam kasus /bootpartisi terpisah ).
Melebius
9

Saya perhatikan masih ada beberapa file dari versi lama di direktori boot:

$ ls /boot
vmcoreinfo-2.6.31-17-server

Dan manajer paket akan mencantumkan versi lama:

dpkg -l | grep linux-image

Karena itu saya menggunakan perintah ini ( autoremovejuga akan menghapus lebih banyak gambar terbaru yang tidak ingin saya hapus)

sudo apt-get purge linux-image-2.6.31-17-server

Saya masih memiliki beberapa header:

dpkg -l | grep linux-headers

Jadi saya melakukan ini:

sudo apt-get purge linux-headers-2.6.32-34

Akhirnya ada satu paket lagi yang tidak bisa saya hapus dengan apt-get purge:

$ dpkg -l | grep linux-image
rc  linux-image-2.6.28-11-server

Sumber: Hapus paket yang ditandai sebagai rc oleh dpkg

sudo dpkg --purge linux-image-2.6.28-11-server
mreiter
sumber
3

Periksa penggunaan /var/tmpdengan du -sh /var/tmp/. Semua file dalam folder itu dapat dihapus untuk membuat ruang.

Anda kemudian dapat menjalankan yang berikut untuk menghapus kernel lama:

sudo apt-get clean
sudo apt install byobu
sudo purge-old-kernels
sudo apt autoremove
sudo update-grub
Tertius
sumber
Apa /var/tmphubungannya dengan kernel lama? Dan tidak selalu aman untuk menghapus semuanya di /var/tmp...
fosslinux
3

Inilah yang saya gunakan:

sudo apt-get autoremove linux-image-xxxx

Lakukan itu untuk semua kernel lama dan simpan hanya dua yang terbaru.

Jika Anda ingin secara otomatis menghapus kernel lama dan memperbarui GRUB lihat ini: Dokumentasi Ubuntu

Samer
sumber
2
Ini harus menjadi jawaban yang diterima. Jika Anda tidak keberatan membersihkan semuanya, Anda bahkan tidak perlu menentukan gambar Linux.
CyberEd
2

Saya menemukan bahwa satu-satunya hal yang berhasil bagi saya adalah menggunakan Aptitude.

sudo aptitude

Kemudian ketika terbuka biasanya akan mengatakan sesuatu tentang dependensi yang belum terpenuhi di bagian bawah. Anda dapat menekan huruf guntuk melanjutkan dengan penghapusan yang disarankan. Ini akan membawa Anda ke halaman di mana ia mencantumkan apa yang akan terjadi.

Seharusnya ada minus di -sebelah kernel yang rusak. Tekan glagi dan itu akan menghapus kernel yang rusak. Tekan quntuk berhenti. Maka Anda harus dapat menggunakan sudo apt-get autoremoveuntuk menyingkirkan kernel lama dan membebaskan ruang.

Matthew Swanson
sumber
1
ini adalah jawaban yang HANYA valid. semua jawaban lain tidak berfungsi, karena manajer paket ingin menginstal paket sebelum dapat menghapus apa pun.
machineaddict
2

Anda tidak bisa menindaklanjuti paket, tetapi Anda bisa bertindak atas file lain. Pertama, buka folder rumah Anda dan lihat apakah ada sesuatu yang dapat Anda hapus. Jika tidak, cobalah untuk memindahkan sejumlah file ke partisi lain (atau flash drive) dan kemudian mencoba sudo apt-get install -funtuk membersihkan masalah ketergantungan paket (kemungkinan besar Anda menginstal file deb. dpkg), Dan kemudian bersihkan kernel lama. Setelah Anda memiliki setidaknya 10 MB dengan aman, cobalah membersihkan perangkat lunak atau file yang tidak dibutuhkan.

ζ--
sumber
5
Folder rumah bukan di / boot
Thorbjørn Ravn Andersen
1

Gunakan Pengelola Paket Synaptic. Pilih saja paket yang ingin Anda hapus dan itu akan meminta Anda untuk juga menghapus paket yang bergantung padanya. Dalam pengalaman saya, paket kernel selalu datang dalam kelompok dua (atau lebih, tergantung pada bagaimana Anda menghitung) yang saling tergantung. Anda biasanya dapat menemukan yang lama dengan cepat menggunakan filter "lokal / usang".

Wegko
sumber
2
Misalnya pada server (hanya teks), tidak ada Synaptic. Jadi bukan solusi yang layak untuk server.
nerdoc
1

Saya telah berjuang dengan masalah ini dari waktu ke waktu, dan masih belum melihat solusi yang benar-benar melakukan pekerjaan penuh. Dalam beberapa kasus, menghapus kernel lama berakhir dengan dependensi yang menghentikan saya menghapus apa pun dan saya harus menghapus kernel secara manual dari / boot. Namun, saya masih ingin melakukan pekerjaan penuh karena saya membayangkan kernel yang dihapus secara manual dicatat di suatu tempat dan dapat menyebabkan masalah di masa depan, ketika sesuatu melaporkan file yang hilang karena saya duduk melakukan rm-rf pada file.

Jadi saya menulis skrip ini, berdasarkan banyak saran Google di sini yang tidak memerlukan instalasi lebih lanjut dari sesuatu. Script telah dimodifikasi beberapa kali untuk mendukung beberapa situasi "tak terduga" saya sendiri. Sebagai contoh, menjalankan ini pada raspberry pi, pembaruan-grub mungkin tidak ada. Dan dalam beberapa kasus ketika menjalankan pembaruan terakhir, server macet dengan IPv6 di mana beberapa situs tidak terjangkau.

Script mencari tahu apakah ia harus menghapus kernel yang benar-benar macet karena ketergantungan membangun, atau jika bisa melakukannya dengan cara "benar".

#!/bin/bash

ipv4="-o Acquire::ForceIPv4=true"

if [ "$1" = "4" ] ; then
    withip=$ipv4
    echo "Going IPv4 ($withip)"
fi

echo "Autoremove+Purge."
apt-get $withip -y -f autoremove --purge >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "Auto Removal Failed!"
fi

echo "Old dependency fix."
apt-get $withip -f -y install >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "That failed. So we'll try to make up to it during this process."
fi

echo "Now, going old kernel cleanup!"
kern=$(dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v `uname -r`)
hadErrors=0

for k in $kern
do
    echo apt-get -y purge $k
    apt-get $withip -y purge $k >/dev/null 2>&1

    if [ "$?" != "0" ] ; then
        echo "Failed apt-purge... Using plan B (--force-all -P)..."
        dpkg --force-all -P $k >/dev/null 2>&1
        echo "Rerunning stuff (apt-get -f -y install) for dependencies..."
        apt-get $withip -f -y install >/dev/null 2>&1
        if [ "$?" != "0" ] ; then
            echo "Still failing..."
            hadErrors=1
        fi
    fi
done

if [ "$hadErrors" = "1" ] ; then
    echo "I had errors. I should rerun this process, to see if there are more kernels that were left out after cleanup..."
    /usr/local/tornevall/cleankernel
fi

apt-get $withip autoremove
apt-get $withip update
apt-get $withip upgrade
apt-get $withip dist-upgrade

grb=$(which update-grub)
if [ "" != "$grb" ] ; then
    update-grub
else
    echo "Can't upgrade grub since update-grub is missing..."
fi
Tomas Tornevall
sumber
Apakah Anda mencoba linux-purge ? Itu tidak memiliki hal Force IPv4 saat ini, meskipun.
jarno
Script Anda akan membersihkan linux-image-generic di sistem saya, yang buruk.
jarno
Mereka karena alasan tertentu dikembalikan ketika kernel lama telah dibersihkan. Setidaknya ini sudah menjadi kasus saya sejak saya membuat skrip ini. Namun, skrip ini adalah sesuatu yang saya gunakan ketika tidak ada opsi lain untuk melanjutkan. Biasanya, upgrade dilakukan sendiri, tetapi ketika sampai pada saat ini, ketika tidak ada yang berfungsi, ini mungkin merupakan pilihan yang baik karena biasanya ada lebih banyak kernel yang akan dibentuk setelah pembersihan. Apakah ini baik atau buruk mungkin bisa dibicarakan.
Tomas Tornevall
0

Cukup menjalankan sudo apt-get -f autoremovemenyelesaikan masalah saya.

forzagreen
sumber
2
Apakah Anda memiliki 100% penggunaan ruang disk / boot?
fosslinux
Melihat sejarah pemantauan saya, sepertinya tidak. PS: Saya menggunakan xenial Vagrant, dan sistem file boot saya /dev/sda1sudah terpasang/
forzagreen
0

Jalankan ini:

sudo apt-get autoremove
sudo apt-get --purge remove && sudo apt-get autoclean
sudo apt-get -f install
sudo dpkg-reconfigure -a

Sumber: Saya mendapatkan kesalahan ini setelah peningkatan. tolong bantu

Ardi Nusawan
sumber
apa fungsi sudo dpkg-reconfigure -a ini? Di Ubuntu 16 mengatakan opsi tidak dikenal -a
Shivam Kotwalia
Untuk pertanyaan ini, aptakan gagal menghapus paket kernel karena proses penghapusan itu sendiri menghasilkan file /boot, yang sudah penuh. Itu sebabnya apt-get autoremovegagal. Pertanyaan yang Anda cari adalah askubuntu.com/q/142926/158442 , yang sudah autoremoveterdaftar.
muru
@muru Saya baru memposting karena berhasil, bagi saya: D
Ardi Nusawan
Saya yakin itu benar, yang saya katakan adalah bahwa masalah Anda adalah pertanyaan lain, bukan yang ini.
muru
@muru oh ok mengerti: D
Ardi Nusawan
0

Saya telah melihat beberapa artikel di / boot penuh yang tidak diselesaikan dengan membersihkan kernel linux lama, karena apt-get -f install atau apt-get -f autoremov e menginstal ulang kernel.

Dalam kasus saya, setidaknya, paket yang ditandatangani dan tambahan juga perlu dihapus - kernelnya adalah dependensi untuk paket-paket ini sehingga perlu diinstal ulang. Secara umum, paket kernel terkait harus dibersihkan sebelum memanggil 'install'. Jika Anda mencoba apt-get upgrade segera setelah membersihkan, pesan kesalahan seharusnya mengatakan paket mana yang memiliki ketergantungan yang belum terpenuhi dari kernel yang baru saja Anda bersihkan.

Dalam kasus saya, taktik berikut berhasil:

#as sudo, repeat 1-3 for any old kernels; can be scripted
dpkg --force-all -P linux-image-4.4.0-112-generic 
dpkg --purge linux-image-extra-4.4.0-112-generic
dpkg --purge linux-signed-image-4.4.0-112-generic
apt-get -f install #dependency resolution didn't have work to do for kernel packages
apt-get autoremove --purge -f 
apt-get autoclean
apt-get upgrade
Rhandi Martin
sumber
0

Instal alat linux-purge seperti ini .

Kemudian jalankan di terminal:

sudo linux-purge --clear-boot --fix

Kemudian lanjutkan menghapus kernel dengan misalnya

sudo linux-purge --keep 1 --choose

Tambahan:

Jika Anda ingin menggunakan linux-purge untuk menghapus kernel tanpa pengawasan alih-alih menggunakan upgrade tanpa pengawasan untuk itu, Anda harus menonaktifkan penghapusan hal-hal yang tidak terpakai dengan mengedit /etc/apt/apt.apt.conf.d/50unattended-upgrades, dan mengatur layanan systemd mengeksekusi

/usr/local/bin/linux-purge --auto-only --keep 1 --yes

kapanpun kamu mau.

jarno
sumber