我的/ boot分区命中率100%,现在我无法升级。无法删除旧内核以腾出空间


154

我的第一个问题是当我尝试apt-get updateapt-get upgrade。升级时出现以下错误:

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.

我试着运行apt-get install -f,这是输出(在提示符后回答是之后)

(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)

我试着跑步apt-get autoremove,它给我和一样的错误apt-get upgrade

当我跑步时df,我得到的是/boot

/dev/sda1                    233191     230297         0 100% /boot

因此,我在其他地方读到我应该尝试清除旧内核。我检查了使用的内核:

$ 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

当我尝试使用此方法删除最旧的代码时:

$ 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).

如何释放或扩展启动而不破坏安装?


我认为@mreiter的答案可能是最好的:它使用了程序包管理器,并且在其他程序包管理器命令失败时也有效,至少对我来说:askubuntu.com/a/205776/247661
Aaron Hall


1
@dskrvk是的!为什么Remove-Unused-Dependencies没有默认值?
史蒂文·R·鲁米斯

Answers:


129

释放根文件系统上的空间

要释放根文件系统上的空间,可以尝试执行apt-get clean

如果这样不起作用,则可以转到/var/cache/apt/archives并手动从缓存中删除一些文件以获取一些空间,例如:

sudo rm linux-headers-*

.deb如果需要的话,删除这里的所有文件不会有任何伤害-就是apt-get clean这样。apt如果再次需要它们,它们将被自动重新下载。

释放/ boot文件系统上的空间

原始海报有一个单独的/boot分区,该分区已满,并阻止了apt系统工作。他有必要释放那里的空间。

如果几乎有足够的空间,请转到/boot并删除一个或两个配置文件:

sudo rm config-3.2.0-19-generic-pae

例如,但是无论如何要使用其中一个内核版本的名称删除。这样可以释放一点空间(每个大约144K)。

如果您需要更多的空间单独删除旧的vmlinuzinitrdabiSystem.map文件,直到你有足够的空间(约22M为我的i386的内核版本之一)。

无论您做什么,都不要全部删除。对于您使用的每种内核,至少应保留每种文件的最新两个匹配版本。

然后继续执行apt-get install命令。如上所述,他们可能必须重新下载一些已删除的deb,但如果这样,它将自动发生。当您再次使用apt时,请使用apt-get进行清理,以删除与要删除的文件相对应的软件包-从而使所有内容都匹配。


在配置文件/boot是在内核配置使用内核团队打造的同名内核。删除它应该是无害的,除非您希望它作为参考或帮助您构建自己的内核。

最后,您要从/boot分区中手动删除一两个旧的内核程序包,以便为新程序包腾出更多空间。


我尝试删除几乎所有配置。它似乎仍然没有足够的空间。那里的其他文件可以安全删除吗?我的根文件系统还没满,所以我不必担心。
Strifey16

我用其他文件更新了答案,以手动删除。在我看来,删除3.0.0.13和3.0.0.14集(包括abi文件的5个文件)就足够了。
约翰·格鲁伯

2
这样就解决了。我意识到这可能归结为手动删除文件,但是我总是不愿意使用apt安装的任何工具来执行此操作,因此我想我首先要问这里。
Strifey16年

9
不要使用sudo rm从/ boot中删除。相反,使用sudo dpkg --purge删除一些旧的linux-image软件包。此后用于sudo apt-get -f install修复损坏的依赖关系。
jarno '02

4
尽管有时系统可能已满,甚至dpkg也无法运行。但是rm可以使用。
jarno

66

就我而言,apt命令和dpkg命令无法完成,也无法删除。自动更新安装失败2.6.32-56-server

我的第一步是确定要使用的空间,

cd /boot
du -sk *|sort -n

我大约有30个内核和支持文件。

我做了一个uname -a来获取正在运行的内核,我确定我使用的是Linux替代版本,2.6.32-43-server并且执行tar了6个未运行且较旧的版本。

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

然后rm -rf,我执行了我备份的操作:

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

我以这些命令为例,您将不得不决定要使用哪种命令。

现在我有一些空间/boot可以运行了

apt-get -f install 

清理失败的安装2.6.32-56-server

然后我做了一个

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

这给了我退回备份内容的空间。

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

为了清理,我可以运行:

apt-get autoremove

我重新启动,现在只能使用4%的/boot


在所有建议中,这对我来说最有帮助。非常感谢你!
Joshua F. Rountree

从/ boot删除文件只是可怕地破坏了apt和dpkg,因为缺少文件时,安装和删除脚本将使HARD失败。我看不到您如何使用它。
FizxMike

20

您可以使用dpkg而不是apt-get删除旧的内核:

sudo dpkg -r linux-image-3.2.0-29-generic

也许有使用它的好处,但是@mreiter的建议对我有用(当该建议没有被使用时(在ubuntu的IRC支持频道上建议了这个建议)。)
Aaron Hall

3
@AaronHall这个答案只包含的关键部分mreiter的答案(最后一行),它是短得多,因为它不包括头的清洗(不单独的情况下帮助/boot分区)。
Melebius

9

我注意到引导目录中仍然存在一些旧版本的文件:

$ ls /boot
vmcoreinfo-2.6.31-17-server

包管理器将列出旧版本:

dpkg -l | grep linux-image

因此,我使用了此命令(autoremove还将删除我不想删除的更多最新图像)

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

我还有一些标题:

dpkg -l | grep linux-headers

所以我这样做:

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

最终,剩下了一个我无法通过apt-get purge删除的软件包:

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

来源:删除dpkg标记为rc的软件包

sudo dpkg --purge linux-image-2.6.28-11-server

3

检查/var/tmpwith 的使用du -sh /var/tmp/。可以删除该文件夹中的所有文件以腾出空间。

然后,您可以运行以下命令删除旧内核:

sudo apt-get clean
sudo apt install byobu
sudo purge-old-kernels
sudo apt autoremove
sudo update-grub

什么是/var/tmp有老的内核呢?而且它并不总是安全地删除一切/var/tmp...
fosslinux

3

这是我使用的:

sudo apt-get autoremove linux-image-xxxx

对所有旧内核执行此操作,仅保留最新的两个。

如果要自动删除旧内核并更新GRUB,请参见:Ubuntu文档


2
这应该是公认的答案。如果您不介意清理所有内容,则甚至无需指定Linux映像。
Cyber​​Ed '16

2

我发现唯一适合我的方法是使用Aptitude。

sudo aptitude

然后,当打开它时,通常会在底部说一些关于未满足的依赖项。您可以按字母g进行建议的移除。它将带您到一个页面,其中列出了将要发生的事情。

-破碎的内核旁边应该有一个减号。再按g一次,它将删除损坏的内核。按q退出。然后,您应该可以使用它sudo apt-get autoremove来摆脱旧的内核并释放空间。


1
这是唯一有效的答案。所有其他答案均不起作用,因为程序包管理器要先安装程序包,然后才能删除任何内容。
machineaddict

2

您不能对包执行操作,但是可以对其他文件执行操作。首先,浏览您的主文件夹,查看是否可以删除任何内容。如果不是,请尝试将大量文件移动到另一个分区(或闪存驱动器),然后尝试sudo apt-get install -f清除程序包相关性问题(很可能是通过安装了.deb文件dpkg),然后清除所有旧内核。安全地拥有至少10 MB的空间后,请尝试清除不需要的软件或文件。


5
主文件夹是不是/开机
托尔比约恩Ravn的安徒生

1

使用Synaptic软件包管理器。只需选择要删除的软件包,它会提示您也删除依赖于此的软件包。以我的经验,内核软件包总是以两个相互依赖的组(或更多,取决于您的计数方式)分组。通常,您可以使用“本地/过时”过滤器快速找到旧的过滤器。


2
例如,在(纯文本)服务器上,没有Synaptic。因此,对于服务器而言,这并不是真正可行的解决方案。
nerdoc '17

1

我一直不时与这个问题作斗争,但仍然没有看到任何能够真正完成全部工作的解决方案。在某些情况下,删除旧内核最终会导致依赖关系,这使我无法删除任何东西,而不得不从/ boot手动删除内核。但是,我仍然想完成全部工作,因为我想手动删除的内核会记录在某处,并且可能由于某些原因导致文件丢失,因为我坐在文件上执行rm -rf可能会导致将来出现问题。

因此,我根据此处的许多谷歌建议编写了此脚本,不需要进一步安装任何东西。对该脚本进行了几次修改,以支持我自己的某些“意外”情况。例如,在树莓派上运行此命令,update-grub可能不存在。在某些情况下,当运行最新的更新程序时,服务器会被IPv6阻塞,无法访问某些站点。

该脚本确定是否必须强制删除由于依赖关系构建而完全卡住的内核,或者可以以“正确”的方式进行操作。

#!/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

您尝试过linux-purge吗?但是,它目前没有该Force IPv4的东西。
佳诺

您的脚本会清除我系统中的linux-image-generic,这很糟糕。
佳诺

清理旧内核后,由于某种原因会将它们放回原处。自从我构建此脚本以来,至少对我来说就是这种情况。但是,当没有其他选项可以继续时,我将使用此脚本。通常,升级是由他们自己完成的,但是到了这一刻,当其他任何事情都不起作用时,这可能是一个不错的选择,因为通常会在清理后设置更多的内核。这是好是坏是可以讨论的。
Tomas Tornevall

0

只需运行即可sudo apt-get -f autoremove解决我的问题。


2
您有100%的磁盘空间/启动使用率吗?
fosslinux

查看我的监视历史记录,似乎没有。PS:我在Vagrant xenial上,我的启动文件系统/dev/sda1安装在/
forzagreen

0

运行这个:

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

资料来源:升级后出现此错误。请帮忙


sudo dpkg-reconfigure -a有什么作用?在Ubuntu 16上,它说的未知选项-a
Shivam Kotwalia

对于此问题,apt将无法删除内核软件包,因为删除过程本身会在中生成文件/boot,该文件中的文件已满。这就是为什么apt-get autoremove失败。您正在寻找的问题是askubuntu.com/q/142926/158442(已autoremove列出)。
大师

@muru我刚刚发布了它,因为它起到了作用,对我而言:D
Ardi Nusawan

我确定是的,我的意思是您的问题将是另一个问题,而不是这个问题。
muru

@muru哦,知道了:D
Ardi Nusawan

0

我已经看到了/ boot上的几篇文章已满,而dpkg清除旧的Linux内核并不能解决这些问题,因为apt-get -f installapt-get -f autoremov e重新安装了内核。

就我而言,至少还需要删除已签名和多余的软件包-内核是这些软件包的依赖项,因此必须重新安装它们。通常,应在调用“安装”之前清除相关的内核软件包。如果您尝试在清除后立即进行升级,则错误消息应该说明哪些软件包与您刚刚清除的内核具有未满足的依赖性。

就我而言,以下策略有效:

#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

0

这样安装linux-purge工具。

然后在终端中运行:

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

然后继续删除内核,例如

sudo linux-purge --keep 1 --choose

额外:

如果要使用linux-purge进行无人值守的内核删除,而不是为此使用无人值守的升级,则应通过编辑/etc/apt/apt.conf.d/50unattended-upgrades禁用删除未使用的东西,并设置系统服务执行中

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

无论你什么时候想要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.