如何清理无法通过 package-cleanup 清理的启动分区?

如何清理无法通过 package-cleanup 清理的启动分区?

我最近在实验室/开发机器上重新安装了 CentOS 7。我想保留/home以前安装的分区,因此我手动配置了分区以允许我这样做。在这个过程中,我不小心保留以前安装的/boot分区。

安装成功后,我看到了一个非常繁忙的 Grub2 启动屏幕。除了我的“新”干净 CentOS 安装之外,我的所有旧内核映像都出现在启动屏幕中:

CentOS Linux (3.10.0-693.11.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-693.5.2.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)   <--- this is the new/reinstalled OS
CentOS Linux (3.10.0-693.11.1.el7.x86_64.debug) 7 (Core)
CentOS Linux (0-rescue-7859fc0fbe934b91b11ea69046b5d787) 7 (Core)
CentOS Linux (0-rescue-6c92bef5457049e5a42e5609c540d753) 7 (Core)
CentOS Linux (0-rescue-e7a05dc4cdda4e778a344945ef1ed391) 7 (Core)

简单地运行package-cleanup是行不通的,因为实际上只安装了一个内核(就新操作系统而言):

$ package-cleanup --oldkernels --count=1
No old kernels to remove

$ uname -r
3.10.0-693.el7.x86_64

$ rpm -qa kernel*
kernel-debug-devel-3.10.0-693.11.6.el7.x86_64
kernel-3.10.0-693.el7.x86_64
kernel-headers-3.10.0-693.11.6.el7.x86_64
kernel-tools-libs-3.10.0-693.el7.x86_64
kernel-tools-3.10.0-693.el7.x86_64

因此,我不相信这是常规“我如何清理我的/boot分区?”的骗局。问题(例如如何安全删除 CentOS 7 中的旧内核版本?

通常情况下,我只需要处理一个混乱的 Grub2 菜单就可以了,但我的/boot分区只剩下 11 MiB,所以我无法更新我的内核。

我不确定从/boot分区中删除什么是安全的。package-cleanup不清理时如何清理?

答案1

您可以使用它yum whatprovides /boot/*来确定哪些内核仍然安装,哪些内核不属于您可以安全删除的软件包。然而,这假设 grub 正在自动配置。

答案2

jdwolf 的回答生成了哪些软件包(在旧系统上)提供了 中的条目的列表/boot/*,但它有点冗长,并且不能立即看出哪些文件与我重新安装 CentOS 无关。一些输出的示例:

$ yum whatprovides /boot/*

kernel-3.10.0-693.5.2.el7.x86_64 : The Linux kernel
Repo        : updates
Matched from:
Filename    : /boot/config-3.10.0-693.5.2.el7.x86_64

kernel-3.10.0-693.el7.x86_64 : The Linux kernel
Repo        : base
Matched from:
Filename    : /boot/config-3.10.0-693.el7.x86_64

fwupdate-efi-9-8.el7.x86_64 : UEFI binaries used by libfwup
Repo        : base
Matched from:
Filename    : /boot/efi

[... truncated output ...]

但这导致我改用rpm -q --whatprovides /boot/*它,这对于确定是否需要该文件更有用:

$ rpm -q --whatprovides /boot/*
file /boot/config-3.10.0-693.11.1.el7.x86_64 is not owned by any package
file /boot/config-3.10.0-693.11.1.el7.x86_64.debug is not owned by any package
file /boot/config-3.10.0-693.5.2.el7.x86_64 is not owned by any package
kernel-3.10.0-693.el7.x86_64
file /boot/efi is not owned by any package
file /boot/elf-memtest86+-5.01 is not owned by any package
file /boot/grub is not owned by any package
grub2-common-2.02-0.65.el7.centos.2.noarch
[... truncated output ...]

请注意,rpm -q --whatprovides如果输入文件的名称与提供它的包匹配,则不会打印输入文件的名称。但0如果文件由包提供,或者1文件不是由包提供,则它确实返回。因此,解决方案很简单:

$ for f in /boot/*; do rpm -q --whatprovides $f || rm -f $f; done
file /boot/config-3.10.0-693.11.1.el7.x86_64 is not owned by any package
file /boot/config-3.10.0-693.11.1.el7.x86_64.debug is not owned by any package
file /boot/config-3.10.0-693.5.2.el7.x86_64 is not owned by any package
kernel-3.10.0-693.el7.x86_64
file /boot/efi is not owned by any package
rm: cannot remove ‘/boot/efi’: Is a directory
file /boot/elf-memtest86+-5.01 is not owned by any package
[... truncated output ...]

$ ls -1 /boot
config-3.10.0-693.el7.x86_64
efi
grub
grub2
initramfs-3.10.0-693.el7.x86_64.img
symvers-3.10.0-693.el7.x86_64.gz
System.map-3.10.0-693.el7.x86_64
vmlinuz-3.10.0-693.el7.x86_64

运行后grub2-mkconfig -o /boot/grub2/grub.cfg,我的 Grub 菜单是干净的,并且我有一个干净的/boot目录。

注意:使用它可能会更好或更安全find /boot -type f -exec ...(或者可能find ... -xargs ...),但我的解决方案工作得很好,因为rm -f不会删除目录。

相关内容