Linux内核管理避坑指南:如何安全卸载旧内核并保留救援模式

每次系统升级后,那些静静躺在磁盘角落的旧内核就像衣柜里多年不穿的衣服——既占空间又舍不得扔。作为运维工程师,我曾在凌晨三点被磁盘空间不足的告警惊醒,也见过同事误删救援内核后面对崩溃系统时的绝望表情。本文将分享一套经过实战检验的内核清理方法论,帮助你在释放宝贵磁盘空间的同时,确保系统始终留有安全退路。

1. 内核管理基础认知

1.1 为什么需要保留旧内核

Linux系统的内核更新机制采用叠加式设计,新内核安装后旧版本依然保留。这种设计提供了三重保障:

  • 版本回退:当新内核出现硬件兼容性问题时(比如我在AWS c5实例上遇到的NVMe驱动故障),30秒内即可切换回旧版本
  • 救援通道:保留的救援内核(通常标记为0-rescue)是系统崩溃时的最后防线
  • 依赖保险:某些第三方驱动(如NVIDIA显卡驱动)会绑定特定内核版本

查看当前系统所有内核的实用命令组合:

# RHEL/CentOS系
rpm -qa | grep kernel | sort -V
yum list installed kernel-\* | awk '{print $1}' | sort -V

# Debian/Ubuntu系
dpkg --list | grep linux-image | awk '{print $2}' | sort -V

1.2 内核文件的空间占用分析

通过du -sh命令实测,典型的内核组件占用空间如下:

组件类型CentOS 7 (MB)Ubuntu 20.04 (MB)
单个内核镜像45-6030-45
内核头文件20-3015-25
内核模块80-12060-90
救援内核全套150-200120-180

这意味着保留3个旧内核可能占用500MB-1GB空间,对于根分区只有20GB的云主机而言相当可观。

2. 安全卸载操作指南

2.1 RPM系系统的精确卸载

在CentOS/RHEL系统中,yum remove会同时移除依赖包,这是最危险的陷阱之一。安全操作流程:

  1. 标记保护内核:

    # 找出需要保留的内核(当前运行的和救援内核)
    CURRENT_KERNEL=$(uname -r)
    RESCUE_KERNEL=$(rpm -q kernel | grep rescue | head -n1)
    
  2. 生成卸载候选列表:

    rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' | 
      grep -E '^kernel-[0-9]' |
      grep -v -e "$CURRENT_KERNEL" -e "$RESCUE_KERNEL" |
      sort -V > kernel_remove_candidates.txt
    
  3. 模拟卸载测试:

    yum remove --assumeno $(cat kernel_remove_candidates.txt)
    
  4. 实际执行卸载:

    yum remove -y $(cat kernel_remove_candidates.txt)
    

关键提示:务必检查/boot分区剩余空间,建议保留至少200MB余量。我曾遇到因空间不足导致新内核安装失败,进而引发系统无法启动的案例。

2.2 DEB系系统的智能清理

Ubuntu/Debian的apt autoremove虽然方便,但可能误删仍在使用的内核。更可靠的做法:

# 使用purge彻底删除旧内核(保留当前和上一个版本)
sudo apt purge $(dpkg --list | 
  awk '/linux-image-[0-9]/{print $2}' | 
  grep -v $(uname -r) | 
  grep -v $(dpkg --list | 
    awk '/linux-image-[0-9]/{print $2}' | 
    sort -V | tail -n2 | head -n1))

配套清理命令:

sudo apt autoremove --purge
sudo update-initramfs -c -k all

3. GRUB2配置的深度优化

3.1 菜单项的精简策略

即使卸载了旧内核,GRUB菜单可能仍保留无效条目。手动清理步骤:

  1. 备份现有配置:

    cp /etc/default/grub /etc/default/grub.bak
    cp -a /boot/grub2 /boot/grub2.bak
    
  2. 重建配置文件:

    # CentOS/RHEL
    grub2-mkconfig -o /boot/grub2/grub.cfg
    
    # Ubuntu/Debian
    update-grub
    
  3. 验证菜单项:

    grep -P "submenu|menuentry" /boot/grub2/grub.cfg
    

3.2 救援内核的锁定机制

为防止误删救援内核,可以通过yum versionlock或apt-mark hold进行保护:

# CentOS/RHEL
yum install yum-plugin-versionlock
yum versionlock add kernel-*rescue*

# Ubuntu/Debian
apt-mark hold linux-image-*-rescue

4. 自动化维护方案

4.1 智能清理脚本

以下脚本自动保留最新3个内核和救援内核,适合加入cron任务:

#!/bin/bash
# 保留的内核数量(不含救援内核)
KEEP=3

# CentOS/RHEL版本
if [ -f /etc/redhat-release ]; then
  # 获取需要保留的内核列表
  KEEP_KERNELS=$(rpm -q kernel --qf "%{VERSION}-%{RELEASE}.%{ARCH}\n" | 
    sort -V | tail -n $KEEP)
  RESCUE_KERNEL=$(rpm -q kernel | grep rescue | head -n1)
  
  # 生成卸载列表
  rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' | 
    grep -E '^kernel-[0-9]' |
    grep -v -e "$RESCUE_KERNEL" $(printf -- "-e %s " $KEEP_KERNELS) |
    xargs -r yum remove -y

  # 更新GRUB
  grub2-mkconfig -o /boot/grub2/grub.cfg

# Ubuntu/Debian版本
elif [ -f /etc/debian_version ]; then
  # 获取当前和上一个内核版本
  CURRENT=$(uname -r)
  PREVIOUS=$(dpkg --list | 
    awk '/linux-image-[0-9]/{print $2}' | 
    sort -V | grep -v $CURRENT | tail -n1)

  # 清理旧内核
  apt purge $(dpkg --list |
    awk '/linux-image-[0-9]/{print $2}' |
    grep -v -e $CURRENT -e $PREVIOUS -e rescue)
  
  update-grub
fi

4.2 监控告警设置

建议在监控系统中添加以下检测项:

  • /boot分区使用率(建议>80%触发告警)
  • 当前运行内核版本与最新安全公告的比对
  • 救援内核的存在性检查

通过Prometheus的示例监控规则:

groups:
- name: kernel_monitoring
  rules:
  - alert: BootPartitionFull
    expr: 100 - (node_filesystem_avail_bytes{mountpoint="/boot"} / node_filesystem_size_bytes{mountpoint="/boot"} * 100) > 80
    for: 15m
    labels:
      severity: warning
    annotations:
      summary: "Boot partition is nearly full ({{ $value }}%)"
      description: "Consider cleaning old kernels on {{ $labels.instance }}"

在阿里云ECS实例上,我曾通过这套组合方案将/boot分区使用率从95%降至35%,同时确保每次内核更新后自动保留有效的回退路径。记住,内核管理不是简单的空间释放,而是在系统稳定性与维护效率之间寻找最佳平衡点。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐