尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux系统维护:定期给Ubuntu/Centos“瘦身”,自动清理旧内核防止下次开机panic

Linux系统维护:定期给Ubuntu/Centos“瘦身”,自动清理旧内核防止下次开机panic Linux系统维护自动化清理旧内核的预防性运维策略每次系统更新后那些静静躺在/boot分区里的旧内核文件就像定时炸弹随时可能因为磁盘空间不足引发启动故障。上周我管理的三台Ubuntu服务器就因此集体罢工——内核更新后/boot被占满重启直接陷入kernel panic。这种看似低级的错误恰恰暴露了运维中最容易被忽视的预防性维护盲区。1. 旧内核堆积的根源与风险Linux发行版默认保留旧内核的设计初衷是提供回滚保障。当新内核出现兼容性问题时管理员可以通过GRUB菜单选择旧版本启动。以Ubuntu为例每次通过apt upgrade更新内核时包管理器会自动保留之前2-3个版本的核心组件linux-image-5.4.0-100-generic linux-headers-5.4.0-100 linux-modules-extra-5.4.0-100-generic这些文件通常占用/boot分区200-400MB空间。对于采用独立/boot分区的传统方案默认仅分配500MB三次更新后就可能触发空间危机。更棘手的是CentOS的yum虽然会自动清理旧内核包但如果手动安装过第三方内核如ELRepo的长期支持版本同样会面临堆积问题。典型故障链/boot分区使用率超过90%新内核安装失败生成不完整的initramfs系统重启时加载损坏的初始化内存盘控制台输出Kernel panic - not syncing: Attempted to kill init!我曾用以下命令快速诊断过数十台服务器的/boot状态建议加入日常监控清单# 查看当前使用中的内核版本 uname -r # 检查/boot空间使用率 df -h /boot | awk NR2 {print $5} # 列出所有已安装内核包Ubuntu dpkg -l | grep linux-image-[0-9]2. Ubuntu系统的自动化清理方案Ubuntu的APT包管理系统其实内置了智能清理机制只是需要正确配置才能发挥作用。经过多次实践验证我总结出以下可靠的工作流2.1 配置自动清理策略修改APT配置文件确保每次更新后自动移除无用依赖sudo tee /etc/apt/apt.conf.d/99autoremove EOF APT::Periodic::AutocleanInterval 7; APT::Clean-Installed true; APT::Get::AutomaticRemove true; EOF关键参数说明参数作用推荐值AutocleanInterval自动清理周期(天)7Clean-Installed清除已卸载包的配置文件trueAutomaticRemove自动移除无用依赖true2.2 安全清理手动操作指南当需要立即释放空间时按以下步骤操作确认当前运行中的内核版本current_kernel$(uname -r) echo 当前内核: ${current_kernel}列出所有可清理的旧内核# 生成可安全删除的旧内核列表 dpkg -l | awk /linux-image-[0-9]/{print $2} | grep -v ${current_kernel} old_kernels.txt执行批量删除while read pkg; do sudo apt purge -y $pkg done old_kernels.txt重要提示操作前务必备份GRUB配置sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak2.3 定时任务监控方案创建每日检查脚本/usr/local/bin/kernel_cleaner.sh#!/bin/bash THRESHOLD80 BOOT_USAGE$(df -h /boot | awk NR2 {print $5} | tr -d %) if [ $BOOT_USAGE -ge $THRESHOLD ]; then logger -t kernel-cleaner Boot partition ${BOOT_USAGE}% full, triggering cleanup sudo apt autoremove --purge -y sudo update-grub fi设置cron任务每天凌晨执行sudo chmod x /usr/local/bin/kernel_cleaner.sh (crontab -l 2/dev/null; echo 0 3 * * * /usr/local/bin/kernel_cleaner.sh) | crontab -3. CentOS/RHEL系统的差异处理与Ubuntu的APT不同CentOS的yum/dnf默认采用更激进的清理策略但某些情况下仍需人工干预。以下是企业环境中验证过的方案3.1 基础清理命令# 查看已安装内核 rpm -q kernel # 只保留最近2个内核 sudo package-cleanup --oldkernels --count23.2 第三方内核的特殊处理当使用ELRepo等第三方仓库的内核时需要修改清理策略创建YUM插件配置文件sudo tee /etc/yum/pluginconf.d/remove-with-leaves.conf EOF [main] enabled1 EOF设置保留策略sudo tee /etc/dnf/dnf.conf EOF installonly_limit2 clean_requirements_on_removeTrue EOF3.3 自动化脚本实现CentOS的清理脚本需要额外处理initramfs和grub2配置#!/bin/bash # 保留的内核数量 KEEP2 # 获取当前运行内核 CURRENT$(uname -r) # 列出所有内核并按版本排序 ALL_KERNELS$(rpm -q kernel | sort -V) # 计算需要删除的数量 TOTAL$(echo $ALL_KERNELS | wc -l) REMOVE$((TOTAL - KEEP)) if [ $REMOVE -gt 0 ]; then # 获取最旧的N个内核排除当前运行的 OLDEST$(echo $ALL_KERNELS | grep -v $CURRENT | head -n $REMOVE) for KERNEL in $OLDEST; do echo Removing $KERNEL sudo yum remove -y $KERNEL done # 重建initramfs和grub配置 sudo dracut -f sudo grub2-mkconfig -o /boot/grub2/grub.cfg fi4. 深度防御构建系统健康监控体系真正的运维高手不是等问题发生才解决而是建立多层防御机制。我在生产环境部署的完整监控方案包含以下组件4.1 实时监控看板使用PrometheusGrafana监控关键指标# prometheus.yml 片段 scrape_configs: - job_name: node_kernel static_configs: - targets: [localhost:9100] metrics_path: /probe params: module: [kernel_metrics]配套的Grafana面板监控以下指标/boot分区使用率已安装内核数量上次内核清理时间系统运行时长检测是否需要重启应用新内核4.2 智能告警规则基于以下条件触发告警/boot空间使用超过85%同一内核版本运行超过60天提示需要安全更新检测到未清理的旧内核超过3个4.3 灾备恢复方案即使所有预防措施失效也应准备应急恢复方案Live CD救援模式使用Ubuntu安装ISO进入Try Ubuntu模式挂载原系统分区sudo mount /dev/sda1 /mnt sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/syschroot后执行清理操作云端实例的特殊处理对于AWS/Azure云主机可通过以下步骤替换系统盘# AWS EC2示例 aws ec2 create-image --instance-id i-1234567890 --name Recovery-$(date %s) aws ec2 stop-instances --instance-ids i-1234567890 aws ec2 modify-instance-attribute --instance-id i-1234567890 --block-device-mappings file://mapping.json配置管理集成在Ansible Playbook中加入内核状态检查- name: Check kernel health hosts: all tasks: - name: Verify boot space shell: df -h /boot | awk NR2 {print $5} | tr -d % register: boot_usage failed_when: boot_usage.stdout|int 85这套方案在我管理的200服务器环境中将内核相关故障降低了90%。关键是要理解运维的本质不是救火而是防火。每次系统更新后多花5分钟检查内核状态能避免日后数小时的紧急故障处理。
返回列表