我的 /boot 分区达到 100%,现在我无法升级。无法移除旧内核以腾出空间

Str*_*fey 163 upgrade apt partitioning

我的第一个问题是当我尝试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.
Run Code Online (Sandbox Code Playgroud)

我尝试运行 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)
Run Code Online (Sandbox Code Playgroud)

我尝试运行apt-get autoremove,它给了我与apt-get upgrade.

当我跑步时df,我得到了这个/boot

/dev/sda1                    233191     230297         0 100% /boot
Run Code Online (Sandbox Code Playgroud)

所以,我在别处读到我应该尝试清除旧内核。我检查了我有哪些内核:

$ 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
Run Code Online (Sandbox Code Playgroud)

当我尝试删除最旧的时:

$ 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).
Run Code Online (Sandbox Code Playgroud)

如何在不弄乱我的安装的情况下释放或扩展引导?

Joh*_*ber 139

释放根文件系统上的空间

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

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

sudo rm linux-headers-*
Run Code Online (Sandbox Code Playgroud)

.deb如果需要,删除这里的所有文件不会有什么坏处- 这就是这样apt-get clean做的。apt如果再次需要它们,它们将被自动重新下载。

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

原始海报有一个单独的/boot分区,这就是已满并阻止apt系统工作的地方。他有必要在那里腾出空间。

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

sudo rm config-3.2.0-19-generic-pae
Run Code Online (Sandbox Code Playgroud)

例如,但使用您打算删除的内核版本之一的名称。这将释放一点空间(每个大约 144K)。

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

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

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


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

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

  • 不要使用 `sudo rm` 从 /boot 中删除。相反,使用 `sudo dpkg --purge` 删除一些旧的 linux-image 包。此后使用 `sudo apt-get -f install` 来修复损坏的依赖项。 (10认同)
  • 虽然有时系统可能太满了,甚至连 dpkg 都无法运行。但是可以使用`rm`。 (5认同)
  • 这修复了它。我意识到这可能归结为手动删除文件,但我总是犹豫要不要使用 apt 安装的任何东西,所以我想我会先在这里问。 (2认同)

小智 70

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

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

cd /boot
du -sk *|sort -n
Run Code Online (Sandbox Code Playgroud)

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

我做了一个uname -a来获取正在运行的内核,我确定我在 Linux 上,2.6.32-43-server并且做了tar6 个没有运行的版本中的一个,并且是旧的。

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
Run Code Online (Sandbox Code Playgroud)

然后我做了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
Run Code Online (Sandbox Code Playgroud)

我将这些命令作为示例展示,您将必须决定将针对您的情况使用什么命令。

现在我有一些空间/boot,我可以跑了

apt-get -f install 
Run Code Online (Sandbox Code Playgroud)

清理失败的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
Run Code Online (Sandbox Code Playgroud)

这让我有空间放回我备份的内容。

tar -xf ~username/boot.tar
rm  ~username/boot.tar    
Run Code Online (Sandbox Code Playgroud)

为了清理,我可以运行:

apt-get autoremove
Run Code Online (Sandbox Code Playgroud)

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


psu*_*usi 22

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

sudo dpkg -r linux-image-3.2.0-29-generic
Run Code Online (Sandbox Code Playgroud)

  • @AaronHall 这个答案只包含 [mreiter 的答案](https://askubuntu.com/a/205776/250300)(最后一行)的关键部分,而且它要短得多,因为它不包括标题的清理(不包括在单独的`/boot` 分区的情况下提供帮助)。 (3认同)

小智 10

我注意到引导目录中还有一些旧版本的文件:

$ ls /boot
vmcoreinfo-2.6.31-17-server
Run Code Online (Sandbox Code Playgroud)

包管理器会列出旧版本:

dpkg -l | grep linux-image
Run Code Online (Sandbox Code Playgroud)

因此我使用了这个命令(autoremove也会删除我不想删除的最近的图像)

sudo apt-get purge linux-image-2.6.31-17-server
Run Code Online (Sandbox Code Playgroud)

我还有一些标题:

dpkg -l | grep linux-headers
Run Code Online (Sandbox Code Playgroud)

所以我这样做了:

sudo apt-get purge linux-headers-2.6.32-34
Run Code Online (Sandbox Code Playgroud)

最后还有一个包我无法用 apt-get purge 删除:

$ dpkg -l | grep linux-image
rc  linux-image-2.6.28-11-server
Run Code Online (Sandbox Code Playgroud)

来源:删除一个被 dpkg 标记为 rc 的包

sudo dpkg --purge linux-image-2.6.28-11-server
Run Code Online (Sandbox Code Playgroud)