Tidak dapat memutakhirkan karena ruang disk rendah pada / boot

123

Saya mencoba melakukan do-release-upgrade tetapi kemudian saya mendapatkan:

Tidak cukup ruang disk kosong

Pembaruan telah dibatalkan. Pemutakhiran membutuhkan total ruang bebas 25,7 M pada disk '/ boot'. Silakan kosongkan setidaknya 25,7 M ruang disk tambahan pada '/ boot'. Kosongkan tempat sampah Anda dan hapus paket sementara dari instalasi sebelumnya menggunakan 'sudo apt-get clean'.

Output dari df:

                    237251272 214797108  10402504  96% /
udev                    488120         4    488116   1% /dev
tmpfs                   198676       668    198008   1% /run
none                      5120         0      5120   0% /run/lock
none                    496684         0    496684   0% /run/shm
/dev/sda1               233191    225867         0 100% /boot

Kenapa tidak ada ruang tersisa saat boot? Inilah output dari ls -as /boot:

total 221839
    4 .
    4 ..
  645 abi-2.6.32-34-generic-pae
  698 abi-2.6.35-30-generic-pae
  727 abi-2.6.38-12-generic-pae
  727 abi-3.0.0-12-generic-pae
  727 abi-3.0.0-13-generic-pae
  727 abi-3.0.0-14-generic-pae
  727 abi-3.0.0-15-generic-pae
  727 abi-3.0.0-16-generic-pae
  727 abi-3.0.0-17-generic-pae
  727 abi-3.0.0-19-generic-pae
  761 abi-3.0.0-20-generic-pae
  115 config-2.6.32-34-generic-pae
  128 config-2.6.35-30-generic-pae
  136 config-2.6.38-12-generic-pae
  140 config-3.0.0-12-generic-pae
  140 config-3.0.0-13-generic-pae
  140 config-3.0.0-14-generic-pae
  140 config-3.0.0-15-generic-pae
  140 config-3.0.0-16-generic-pae
  140 config-3.0.0-17-generic-pae
  140 config-3.0.0-19-generic-pae
  140 config-3.0.0-20-generic-pae
    5 grub
10773 initrd.img-2.6.32-34-generic-pae
13619 initrd.img-2.6.35-30-generic-pae
15365 initrd.img-2.6.38-12-generic-pae
16481 initrd.img-3.0.0-12-generic-pae
16487 initrd.img-3.0.0-13-generic-pae
16501 initrd.img-3.0.0-14-generic-pae
16476 initrd.img-3.0.0-15-generic-pae
16481 initrd.img-3.0.0-16-generic-pae
16478 initrd.img-3.0.0-17-generic-pae
   12 lost+found
  174 memtest86+.bin
  176 memtest86+_multiboot.bin
 1700 System.map-2.6.32-34-generic-pae
 1841 System.map-2.6.35-30-generic-pae
 2115 System.map-2.6.38-12-generic-pae
 2141 System.map-3.0.0-12-generic-pae
 2141 System.map-3.0.0-13-generic-pae
 2143 System.map-3.0.0-14-generic-pae
 2146 System.map-3.0.0-15-generic-pae
 2147 System.map-3.0.0-16-generic-pae
 2147 System.map-3.0.0-17-generic-pae
 2148 System.map-3.0.0-19-generic-pae
 2149 System.map-3.0.0-20-generic-pae
    2 vmcoreinfo-2.6.32-34-generic-pae
    2 vmcoreinfo-2.6.35-30-generic-pae
    2 vmcoreinfo-2.6.38-12-generic-pae
    2 vmcoreinfo-3.0.0-12-generic-pae
    2 vmcoreinfo-3.0.0-13-generic-pae
    2 vmcoreinfo-3.0.0-14-generic-pae
    2 vmcoreinfo-3.0.0-15-generic-pae
    2 vmcoreinfo-3.0.0-16-generic-pae
    2 vmcoreinfo-3.0.0-17-generic-pae
    2 vmcoreinfo-3.0.0-19-generic-pae
    2 vmcoreinfo-3.0.0-20-generic-pae
 4092 vmlinuz-2.6.32-34-generic-pae
 4347 vmlinuz-2.6.35-30-generic-pae
 4567 vmlinuz-2.6.38-12-generic-pae
 4675 vmlinuz-3.0.0-12-generic-pae
 4676 vmlinuz-3.0.0-13-generic-pae
 4681 vmlinuz-3.0.0-14-generic-pae
 4698 vmlinuz-3.0.0-15-generic-pae
 4700 vmlinuz-3.0.0-16-generic-pae
 4700 vmlinuz-3.0.0-17-generic-pae
 4703 vmlinuz-3.0.0-19-generic-pae
 4705 vmlinuz-3.0.0-20-generic-pae

Output dari uname -a:

 Linux kitsch 3.0.0-17-generic-pae #30-Ubuntu SMP Thu Mar 8 17:53:35 UTC 2012 i686 i686 i386 GNU/Linux
penjepit
sumber
Tambahkan output ke ls -l /bootdan uname -ake pertanyaan Anda.
jippie
Juga tambahkan output ke dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'pertanyaan Anda.
jippie
ls -as /bootmungkin berguna sebagai gantinya. Ini hanya akan mencakup ukuran file.
adempewolff
output dari ls -l / boot cukup panjang juga posting di sini jadi di sini adalah pastebin pastebin.com/yM1aEJUx
clamp
5
Tidak, bukan. Itu adalah penyebab masalah Anda. Jika pertanyaan Anda memang terlalu lama, seseorang akan mengeditnya. Penggunaan layanan eksternal seperti pastebin akan mematahkan nilai pertanyaan untuk referensi di masa mendatang.
jippie

Jawaban:

160

Partisi / boot Anda diisi dengan kernel lama. Terkadang melakukan hal itu, tidak yakin mengapa itu tidak pernah diperbaiki. Anda dapat dengan mudah menghapus kernel lama jika Anda tahu paket mana yang masuk.

Pertama periksa uname -auntuk memeriksa versi Anda saat ini.

Kemudian jalankan perintah berikut:

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

Perintah ini akan mencantumkan semua paket yang tidak lagi Anda perlukan. Saya tidak suka menghapusnya secara otomatis, saya suka memegang kendali ketika harus melepas kernel. Jadi untuk setiap paket yang terdaftar lakukan hal berikut:

sudo apt-get -y purge some-kernel-package

Selingan

Intermezzo ini menjelaskan secara lebih rinci bagaimana perintah bekerja dan mencoba untuk memperbaiki masalah linux-libc-dev:amd64. Sebagian besar pengguna dapat melewati paragraf ini.

  • dpkg -l 'linux-*' daftar semua paket yang memiliki nama dimulai dengan 'linux-'
  • sed '/^ii/!d; remove all lines that do *not* start withii`
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" temukan versi kernel yang sedang berjalan
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d Hapus semua baris, kecuali yang berisi nomor versi kernel saat ini
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ Untuk setiap daftar baris hanya nama paket
  • /[0-9]/!d Hapus garis yang tidak mengandung angka.

Untuk memperbaiki masalah Frederick Nord, saya pikir perintah dapat diubah sebagai berikut:

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

Ini pada dasarnya menambahkan filter tambahan:

  • / ^ linux- (header \ | image) /! d Hapus semua baris yang tidak dimulai dengan linux-headersataulinux-image

/Selingan

Di mana some-kernel-packagebisa diganti dengan salah satu paket yang terdaftar. Berhati-hatilah bahwa Anda tidak menghapus paket kernel yang digunakan saat ini (seperti yang tercantum oleh uname -a) mis. sudo apt-get purge -y linux-headers-3.0.0-12dll.

Ini dapat diotomatisasi lebih lanjut menggunakan perintah xargs, tapi saya tidak suka itu. Itu adalah masalah pribadi. Namun, inilah perintah untuk melakukannya:

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

Seperti inilah /bootpenampilan saya , satu kernel cadangan (2.6.38-11) untuk jaga-jaga dan 3.2.0-24 saat ini:

$ ls -l /boot
total 59388
-rw-r--r-- 1 root root   730545 Sep 13  2011 abi-2.6.38-11-generic
-rw-r--r-- 1 root root   791023 Apr 25 13:51 abi-3.2.0-24-generic
-rw-r--r-- 1 root root   130326 Sep 13  2011 config-2.6.38-11-generic
-rw-r--r-- 1 root root   140341 Apr 25 13:51 config-3.2.0-24-generic
drwxr-xr-x 3 root root     5120 May 27 17:46 grub
-rw-r--r-- 1 root root 20883146 Oct  1  2011 initrd.img-2.6.38-11-generic
-rw-r--r-- 1 root root 22474219 May  5 09:04 initrd.img-3.2.0-24-generic
drwxr-xr-x 2 root root    12288 Apr 16  2009 lost+found
-rw-r--r-- 1 root root   176764 Nov 27 11:00 memtest86+.bin
-rw-r--r-- 1 root root   178944 Nov 27 11:00 memtest86+_multiboot.bin
-rw------- 1 root root  2656297 Sep 13  2011 System.map-2.6.38-11-generic
-rw------- 1 root root  2884358 Apr 25 13:51 System.map-3.2.0-24-generic
-rw------- 1 root root     1369 Sep 13  2011 vmcoreinfo-2.6.38-11-generic
-rw------- 1 root root  4526784 Sep 13  2011 vmlinuz-2.6.38-11-generic
-rw------- 1 root root  4965776 Apr 25 13:51 vmlinuz-3.2.0-24-generic

Dan penggunaan sistem file:

$ df -h /boot
Filesystem Size Used Avail Use% Mounted
/dev/sda5  228M  63M  154M  29% /boot
jippie
sumber
2
Solusi ini sangat terinspirasi pada sebuah artikel oleh OzzyFrank di ubuntugenius.wordpress.com/2011/01/08/…
jippie
6
Ya, mengapa ini menjadi masalah? Ini seharusnya tidak berada pada pengguna untuk menangani.
Elijah Lynn
2
FWIW: Ini juga cocok dengan linux-libc-dev: amd64 untuk saya. Jadi mungkin agak terlalu murah hati.
Frederick Nord
4
It does that sometimes, not sure why it is never fixedUbuntu telah membuat keputusan, baik atau buruk, untuk menyediakan kernel baru sebagai paket baru dan bukan sebagai upgrade ke paket yang ada, untuk memberikan opsi untuk menginstal beberapa kernel dan beralih di antara mereka sesuka hati. Saya setuju bahwa asumsi ini tidak sesuai dengan 95% orang yang hanya menginginkan kernel terbaru (dan mungkin satu kali mundur jika terjadi masalah boot baru), dan yang tidak ingin mengelola sendiri kernel yang diinstal. Mungkin di masa depan Ubuntu akan mengubah perilaku ini. Untuk saat ini, pastikan / boot Anda besar.
thomasrutter
1
@thomasrutter Jika Anda (seperti saya dan 95% orang yang Anda bicarakan) menganggap bug ini penting, pilihlah di
FriendFX
46

sudo apt-get autoremove

lakukan trik untuk saya, itu berhasil membersihkan semua paket kernel yang tidak digunakan.

topless
sumber
3
ini tidak benar. dari man apt-getautoremove digunakan untuk menghapus paket yang diinstal secara otomatis untuk memenuhi dependensi untuk beberapa paket dan yang tidak lagi diperlukan. kernel tidak akan diinstal untuk memenuhi dependensi, mereka diinstal saat upgrade.
dward
5
@neon_overload Saya baru saja mempostingnya karena berhasil, bagi saya.
topless
1
@dward Itu membebaskan beberapa ruang untuk saya: sebelum autremove: /dev/sda1, 240M total, 171M used, 57M free, 75% used /boot after: /dev/sda1, 240M total, 129M used, 98M free, 57% used /boot
Stefan Rogin
6
Seharusnya ada tombol untuk melakukan tugas ini dalam dialog "Ruang disk tidak cukup". Ini terutama akan membantu pengguna pemula yang tidak terbiasa dengan baris perintah.
Martin R.
1
Melakukan trik tanpa merusak OS saya
Ruthvik Vaila
8

Setara dengan jawaban yang diterima - cara lain (mungkin) yang lebih mudah adalah dengan menginstal ubuntu-tweakalat, dapat diunduh dari sini . Pergi ke "Petugas kebersihan", dan pilih "Kernel Lama" untuk membersihkan. Itu dapat dilakukan dalam beberapa klik. (diuji pada desktop 14,04)

masukkan deskripsi gambar di sini

Yixing
sumber
Situasi dengan kekurangan ruang /bootterjadi setiap saat jadi ini adalah solusi favorit saya - aplikasi yang mudah dijalankan yang melakukan pekerjaan dengan satu klik.
s3m3n
2

Dibandingkan dengan jawaban GUI lainnya di sini, keuntungan dari jawaban ini adalah Ubuntu Bash asli digunakan tanpa menginstal aplikasi pihak ketiga.

Solusi berbasis Zenity dan Bash

Zenity menyediakan antarmuka GUI yang bagus ke terminal untuk memproses daftar dan memilih item dengan tombol radio :

kernel-rm 1

Kernel saat ini yang Anda booting tidak dapat dihapus dan tidak termasuk dalam daftar. Ukuran yang dilaporkan adalah berapa banyak yang akan disimpan dalam /bootdirektori. Lebih banyak disimpan di disk Anda karena binari kernel berada di area lain juga. 27 Juli 2017 catatan: Direktori /usr/src/*kernel_version*dan /lib/modules/*kernel_version*sekarang juga disertakan.

The Date Modified ditemukan menggunakan statperintah. Pada sistem saya tanggal itu "tersentuh" setiap kali kernel di-boot menggunakan ini ( Bagaimana Anda mengetahui kapan versi kernel tertentu terakhir kali di-boot? ) Cron reboot script. Namun, pada sistem Anda tanggalnya adalah tanggal rilis kernel, bukan terakhir kali Anda mem-bootnya.

apt-get purge memberi Anda kesempatan untuk membatalkan

Anda diberi kesempatan terakhir untuk melihat semua yang akan dihapus dan melihat total ruang disk (agak menyesatkan) yang akan dipulihkan:

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] 

Kode

Salin kode ini ke file yang dapat dieksekusi yang bernama rm-kernelsdi /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

CATATAN: Anda memerlukan izin sudo untuk membuat file jadi gunakan:

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

Untuk membuat file dapat dieksekusi, gunakan:

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

CATATAN: Untuk versi server (berbasis teks, bukan GUI) dari skrip ini, lihat: Bagaimana cara menghapus versi kernel lama untuk membersihkan menu boot?


28 Juli 2017 Pembaruan

Ukuran yang dihitung dari masing-masing kernel diambil dari /boot/*kernel_version*5 file dengan total ~ 50 MB. Formula telah berubah untuk memasukkan file ke dalam /usr/src/*kernel_version*dan /lib/modules/*kernel_version*. Ukuran terhitung untuk setiap kernel sekarang ~ 400 MB. Kode di atas untuk rm-kernelsdan rm-kernels-servertelah diperbarui. Namun, layar sampel di atas belum mencerminkan perubahan ini.

Standarnya adalah memperkirakan ukuran file untuk linux-header di 125 MB dan linux-image di 220 MB karena dubisa sangat lambat kecuali file dalam cache. Untuk mendapatkan ukuran sebenarnya dengan menggunakan duparameter apa saja ke skrip.

Total semua ukuran kernel (tidak termasuk versi berjalan saat ini yang tidak dapat dihapus) sekarang ditampilkan di bilah judul.

Kotak dialog yang digunakan untuk menampilkan Tanggal Akses Terakhir masing-masing Kernel . Tanggal ini dapat ditimpa secara massal untuk semua kernel selama pencadangan atau operasi serupa. Kotak dialog sekarang menunjukkan Tanggal yang Dimodifikasi sebagai gantinya.

WinEunuuchs2Unix
sumber
Kamu luar biasa! Terima kasih banyak! Anda membuat saya bahagia!
zhartaunik
0

Anda dapat dengan mudah menangani kernel melalui manajer paket synaptic. Tetapi pertama-tama Anda harus tahu nama rilis kernel yang digunakan saat ini, di terminal prompt:

linux@linux-desktop:~$ uname -r 4.4.0-75-generic Jadi setidaknya versi ini Anda harus tetap tidak tersentuh. Buka sinaptik dan mulai isi tempat penampung filter cepat seperti yang ditunjukkan di bawah ini: masukkan deskripsi gambar di sini Sekarang Anda dapat memilih semua paket yang ingin Anda hapus dan lakukan hal berikut: Tandai untuk penghapusan lengkap -> Terapkan . Saya menyarankan untuk menyimpan setidaknya satu paket kernel terbaru dan satu kernel sebelumnya. Misalnya dalam hal ini Anda dapat dengan aman menyingkirkan linux-image-4.4.0-66-generic dan linux-image-extra-4.4.0-66-generic , tetapi ada baiknya tetap menggunakan 4.4.0-72 dan tentu saja 4.4.0-75 .

daGo
sumber
0

Untuk memudahkan commandline:

https://github.com/erichs/bootnukem

git clone https://github.com/erichs/bootnukem.git
cd bootnukem
sudo ./install.sh

Kemudian

sudo bootnukem --dry-run
Jonathan
sumber