问题描述
我的/boot
分区已满,我每次重新启动系统时都会收到警告。我已经删除了旧的内核包(linux-headers …),实际上我是这么做的,以便安装自动更新附带的新内核版本。
安装新版本后,分区几乎已经满了。那么我还能删除什么?有没有其他文件与旧的内核映像关联?
以下是我的/boot
分区上的文件列表:
:~$ ls /boot/
abi-2.6.31-21-generic lost+found
abi-2.6.32-25-generic memtest86+.bin
abi-2.6.38-10-generic memtest86+_multiboot.bin
abi-2.6.38-11-generic System.map-2.6.31-21-generic
abi-2.6.38-12-generic System.map-2.6.32-25-generic
abi-2.6.38-8-generic System.map-2.6.38-10-generic
abi-3.0.0-12-generic System.map-2.6.38-11-generic
abi-3.0.0-13-generic System.map-2.6.38-12-generic
abi-3.0.0-14-generic System.map-2.6.38-8-generic
boot System.map-3.0.0-12-generic
config-2.6.31-21-generic System.map-3.0.0-13-generic
config-2.6.32-25-generic System.map-3.0.0-14-generic
config-2.6.38-10-generic vmcoreinfo-2.6.31-21-generic
config-2.6.38-11-generic vmcoreinfo-2.6.32-25-generic
config-2.6.38-12-generic vmcoreinfo-2.6.38-10-generic
config-2.6.38-8-generic vmcoreinfo-2.6.38-11-generic
config-3.0.0-12-generic vmcoreinfo-2.6.38-12-generic
config-3.0.0-13-generic vmcoreinfo-2.6.38-8-generic
config-3.0.0-14-generic vmcoreinfo-3.0.0-12-generic
extlinux vmcoreinfo-3.0.0-13-generic
grub vmcoreinfo-3.0.0-14-generic
initrd.img-2.6.31-21-generic vmlinuz-2.6.31-21-generic
initrd.img-2.6.32-25-generic vmlinuz-2.6.32-25-generic
initrd.img-2.6.38-10-generic vmlinuz-2.6.38-10-generic
initrd.img-2.6.38-11-generic vmlinuz-2.6.38-11-generic
initrd.img-2.6.38-12-generic vmlinuz-2.6.38-12-generic
initrd.img-2.6.38-8-generic vmlinuz-2.6.38-8-generic
initrd.img-3.0.0-12-generic vmlinuz-3.0.0-12-generic
initrd.img-3.0.0-13-generic vmlinuz-3.0.0-13-generic
initrd.img-3.0.0-14-generic vmlinuz-3.0.0-14-generic
目前,我正在使用3.0.0-14-generic
内核。
最佳解决方法
你有很多未使用的内核。删除除最后一个内核以外的所有内核:
sudo apt-get purge linux-image-{3.0.0-12,2.6.3{1-21,2-25,8-{1[012],8}}}
这是简写:
sudo apt-get purge linux-image-3.0.0-12 linux-image-2.6.31-21 linux-image-2.6.32-25 linux-image-2.6.38-10 linux-image-2.6.38-11 linux-image-2.6.38-12 linux-image-2.6.38-8
删除linux-image-x.x.x-x
软件包也会删除linux-image-x.x.x-x-generic
。
这些头文件安装在/usr/src
中,用于构建out-tree内核模块(如专有的nvidia驱动程序和virtualbox)时使用。如果没有安装匹配的内核包(linux-image-*
),大多数用户应该删除这些头文件包。
要列出所有安装的内核,请运行:
dpkg -l linux-image-\* | grep ^ii
一个命令显示可以删除的所有内核和头文件,不包括当前运行的内核:
kernelver=$(uname -r | sed -r 's/-[a-z]+//')
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve $kernelver
它选择以linux-headers-<some number>
或linux-image-<some number>
开头的所有软件包,打印已安装软件包的软件包名称,然后排除当前加载/正在运行的内核(不一定是最新的内核!)。这符合删除旧的known-to-work内核之前测试新内核的建议。
因此,在升级内核并重新启动测试之后,可以使用以下命令删除所有其他内核:
sudo apt-get purge $(dpkg -l linux-{image,headers}-"[0-9]*" | awk '/ii/{print $2}' | grep -ve "$(uname -r | sed -r 's/-[a-z]+//')")
次佳解决方法
您的启动分区已满。由于这是内核更新,因此这些文件将被复制到启动分区,因此您需要清理干净。这里是一个blog post,它将告诉你如何用一个命令清除旧的内核映像。我将给出该方法的基本概要。使用此命令可以打印出当前版本的内核:
uname -r
然后使用这个命令打印出你安装的不是最新内核的所有内核:
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]'
确保您当前的内核不在该列表中。注意这是最终命令的大部分(在下面)。要卸载并删除这些旧内核,您需要将这些参数传递给:
sudo apt-get -y purge
现在我们可以通过将这两个最后的命令组合到这个邪恶的混乱中来做我们想做的一切:
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge
那一个命令会照顾你的一切。我会确认这个功能完美,但从不相信任何人在互联网上。 :)有关详细信息,博客文章非常好地解释了命令的每个部分如何通过它进行读取,以便您满意地完成您希望的操作。
第三种解决方法
sudo apt-get autoremove
该命令自动执行作业。
第四种方法
新立得软件包管理器可用于轻松选择和删除旧的内核映像。
如果您尚未安装Synaptic:
sudo apt-get install synaptic
启动应用程序并选择显示的选项。
您应该能够根据/boot文件夹中的文件高亮显示所有”linux-“软件包,其中x在31到38之间的版本为”2.6.x”。
Right-click这些linux软件包中的每一个,并选择“标记为完全删除”选项。最后点击应用按钮。这将删除所有文件和任何相关文件。你的/boot
文件夹现在应该有点整齐。
第五种方法
感谢您详细提出您的问题,这让我朝着正确的方向前进。尽管保留以前的内核文件非常有用,但您可以一次删除所有内核文件,请查看以下文章:How to Remove All Unused Linux Kernel Headers, Images and Modules
通过命令行完成。如果你是通过远程使用WINSCP这样的方式来打开终端会话并将其粘贴进去,那么效果很好。
这里是从文章链接复制的,我建议你阅读完整的文章:
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
第六种方法
这是一个老问题的新答案,但清理这个东西(以及更多)的简单方法是安装Ubuntu Tweak。至install it:
sudo add-apt-repository ppa:tualatrix/ppa
sudo apt-get update
sudo apt-get install ubuntu-tweak
那么你可以运行Ubuntu Tweak,进入”janitor”标签,从这里只需要点击三次:
尽管如此,为了安全起见,最好留下最后一个内核(你永远不知道)或well-known工作内核;但这很容易定制。
您可以使用相同的工具来清理很多事情—请记住,如果您清理缩略图缓存或TB缓存,那么系统将在必要时重建它们。
第七种方法
我能够通过使用dpkg
直接删除软件包来解决问题。虽然软件包仍在dpkg -l
中列出,但文件从/boot
中删除,释放空间。
phrogz@planar:/boot$ sudo dpkg --remove linux-image-2.6.32-30-server
(Reading database ... 145199 files and directories currently installed.)
Removing linux-image-2.6.32-30-server ...
Running postrm hook script /usr/sbin/update-grub.
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-35-server
Found linux image: /boot/vmlinuz-2.6.32-34-server
Found initrd image: /boot/initrd.img-2.6.32-34-server
Found linux image: /boot/vmlinuz-2.6.32-33-server
Found initrd image: /boot/initrd.img-2.6.32-33-server
Found linux image: /boot/vmlinuz-2.6.32-32-server
Found initrd image: /boot/initrd.img-2.6.32-32-server
Found linux image: /boot/vmlinuz-2.6.32-31-server
Found initrd image: /boot/initrd.img-2.6.32-31-server
Found memtest86+ image: /memtest86+.bin
done
# Repeat for kernels -31 and -32 and -33, up to (but not including)
# the version listed by `uname -a`
在此之后,apt-get -f install
解决了我的依赖问题,并且与世界一切都很好。
然而,我不会接受我的这个答案,因为我仍然需要知道我是否应该增加/boot
尺寸或做其他事情。
第八种方法
你可以停止使用单独的/boot分区,那么你将不会有那么有限的空间。为此,请卸载分区,然后将其挂载到其他位置,并将其中的所有文件复制到根分区中的/boot目录,然后从/etc /fstab删除条目并重新安装grub。例如(你将需要使用正确的分区):
sudo -s
umount /boot
mount /dev/sda2 /mnt
cp -a /mnt/* /boot/
umount /mnt
gedit /etc/fstab
grub-install /dev/sda
然后可以使用gparted删除旧的/启动分区,并可能扩展根分区以使用该空间。要扩展根分区,您需要从livecd启动,并且可用空间需要立即到右侧。如果/boot分区当前位于根分区的左侧,那么您需要先将根分区移动到左侧,然后将其扩展,但这可能需要非常很长的时间,因此可能不值得麻烦。
第九种方法
对我来说,apt-get purge
和dpkg --remove
都失败了。所以我不得不从rm -f
的/boot中删除一些旧的内核映像。
第十种方法
I already deleted old kernel packages (linux-headers…)
linux-headers-*
不是内核。内核包是名为linux-image-*
的包。名为linux-headers-*
的是用于编译内核模块的开发包:它们不居于/boot目录中,并且不需要日常使用系统。
您在/boot中列出的文件包含这些内核的几个旧内核映像(vmlinuz*
)和编译后的initrd映像(initrd.img*
),这表示您仍然安装了很多旧的内核软件包。
你应该能够列出你安装的内核
aptitude search ~ilinux-image
(请注意,这可能会返回不是内核的软件包)。
通常不需要安装两个以上的内核 – 当前正在使用的内核和之前的那个内核(作为后备)。所以你可以开始逐个删除旧的,像这样:
sudo apt-get autoremove linux-image-3.2.0-23-generic
确保用您想要删除的实际内核版本替换”3.2.0-23-generic”!另外,请勿移除linux-image-generic
等软件包。你必须非常小心,不要删除当前运行的内核,否则你将无法启动(Ubuntu可能会或可能不会警告你这样做)。
您可以通过以下方式找到当前运行的内核
uname -r