我最近在实验室/开发机器上重新安装了 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
不会删除目录。