我尝试这样做do-release-upgrade
,但结果却是:
可用磁盘空间不足
升级已中止。升级需要磁盘“/boot”上总共 25.7 M 的可用空间。请在“/boot”上至少释放 25.7 M 的额外磁盘空间。使用“sudo apt-get clean”清空垃圾并删除以前安装的临时软件包。
输出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
为什么启动时没有剩余空间?以下是输出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
输出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
答案1
您的 /boot 分区中充满了旧内核。有时会出现这种情况,不知道为什么它从未修复过。如果您知道旧内核来自哪些软件包,则可以轻松删除它们。
首先检查uname -a
您当前的版本。
然后运行以下命令:
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'
此命令将列出您不再需要的所有软件包。我不喜欢自动删除它们,我喜欢在删除内核时进行控制。因此,对于列出的每个软件包,请执行以下操作:
sudo apt-get -y purge some-kernel-package
间奏曲
本段插曲更详细地描述了命令的工作原理并尝试修复 的问题linux-libc-dev:amd64
。大多数用户可以跳过此段。
dpkg -l 'linux-*'
- 列出所有名称以“linux-”开头的软件包sed '/^ii/!d;
- 删除所有不是从...开始ii
uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/"
- 查找当前运行的内核版本/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d
- 删除所有行,除了包含当前运行内核版本号的行s/^[^ ]* [^ ]* \([^ ]*\).*/\1/
- 每行仅列出包名称/[0-9]/!d
- 删除不包含数字的行。
修理弗雷德里克·诺德的问题我认为该命令可以修改如下:
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d;/^linux-\(headers\|image\)/!d'
它基本上增加了一个额外的过滤器:
/^linux-\(headers\|image\)/!d
- 删除所有不以linux-headers
或开头的行linux-image
/间奏曲
可以some-kernel-package
用列出的软件包之一替换其中的内容。请注意不要删除当前正在使用的内核软件包(如 所列uname -a
),例如。sudo apt-get purge -y linux-headers-3.0.0-12
等等。
可以使用 xargs 命令进一步自动化,但我不喜欢这样。这是个人喜好。不过,这里有一个命令可以做到这一点:
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
这就是我的/boot
情况,一个备用内核(2.6.38-11)以防万一,并且 3.2.0-24 是当前的:
$ 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
以及文件系统的使用情况:
$ df -h /boot
Filesystem Size Used Avail Use% Mounted
/dev/sda5 228M 63M 154M 29% /boot
答案2
sudo apt-get autoremove
对我来说很管用,它成功清理了所有未使用的内核包。
答案3
与此处的其他 GUI 答案相比,此答案的优势在于无需安装第三方应用程序即可使用原生 Ubuntu Bash。
基于 Zenity 和 Bash 的解决方案
Zenity 为终端提供了一个漂亮的 GUI 界面,用于处理列表和选择项目单选按钮:
您启动时使用的当前内核无法删除,因此不包含在列表中。报告的大小是目录中将保存的大小/boot
。磁盘上保存的内容更多,因为内核二进制文件也位于其他区域。2017年7月27日注:目录/usr/src/*kernel_version*
和/lib/modules/*kernel_version*
现在也包括在内。
这修改日期是使用stat
命令发现的。在我的系统上,该日期是“感动”每次使用这个启动内核时(如何了解特定内核版本的上次启动时间?)计划任务重启脚本。但是,在您的系统上,日期将是内核发布日期,而不是您上次启动它的日期。
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
笔记:有关此脚本的服务器(基于文本,而非 GUI)版本,请参阅:如何删除旧内核版本来清理启动菜单?
2017 年 7 月 28 日更新
每个内核的计算大小取自/boot/*kernel_version*
5 个文件,总计约 50 MB。公式已更改为包括/usr/src/*kernel_version*
和中的文件/lib/modules/*kernel_version*
。每个内核的计算大小现在约为 400 MB。上述rm-kernels
和的代码rm-kernels-server
已更新。但是,上述示例屏幕尚未反映这些更改。
默认情况下,linux-headers 的文件大小估计为 125 MB,linux-image 的文件大小估计为 220 MB,因为du
除非文件在缓存中,否则速度会非常慢。要获取实际大小,请将du
任何参数传递给脚本。
所有内核大小的总数(不包括无法删除的当前运行的版本)现在显示在标题栏中。
用于显示每个内核的对话框最后访问日期。备份或类似操作期间,此日期可能会被所有内核批量覆盖。对话框现在显示修改日期反而。
答案4
您可以通过 synaptic 包管理器轻松处理内核。但首先您应该知道当前使用的内核版本名称。您可以通过uname -r
在终端提示符中运行来找到它:
linux@linux-desktop:~$ uname -r
4.4.0-75-generic
因此,至少这个版本你应该保持不变。打开 synaptic 并开始填写快速过滤器占位符,如下所示:
现在您可以选择所有想要删除的包并执行以下操作:
标记为完全删除 > 应用
我建议至少保留一个最新的当前内核包和一个以前的内核。例如,在这种情况下,您可以安全地删除Linux-映像-4.4.0-66-通用和Linux-image-extra-4.4.0-66-通用,但最好保留4.4.0-72 而且当然4.4.0-75。