#!/bin/bash ############################################################################################# # 用途: 内核版本升级 # 作者: 丁辉 # 编写时间: 2023-12-02 # 本脚本支持: Centos7/Centos8/Debian10/Debian11/Debian12/Ubuntu* 内核升级 ############################################################################################# # 检查服务器网络连接 function CHECK_NETWORK() { PING=$(ping -c 3 www.baidu.com | grep 'icmp_seq' | wc -l) if [[ ${PING} -eq 0 ]];then SEND_ERROR "未检测到网络,跳过网络安装系统基础依赖" else CHECK_INSTALL curl fi } function CHECK_INSTALL() { # 接收传递给脚本的参数列表 packages=("$@") log_file="/tmp/check_install_log" # 定义日志文件路径 for pkg in "${packages[@]}"; do if command -v yum >/dev/null 2>&1; then echo -e "\033[32m正在安装 $pkg,请稍后\033[0m" yum install -y "$pkg" >>"$log_file" 2>&1 if [ $? -ne 0 ]; then echo -e "\033[31m安装 $pkg 失败,请查看日志\033[0m" tail -n 10 "$log_file" # 输出最后10行日志 rm -rf $log_file exit 1 fi elif command -v apt >/dev/null 2>&1; then echo -e "\033[32m正在安装 $pkg,请稍后\033[0m" apt-get install -y "$pkg" >>"$log_file" 2>&1 if [ $? -ne 0 ]; then echo -e "\033[31m安装 $pkg 失败,请查看日志\033[0m" tail -n 10 "$log_file" # 输出最后10行日志 rm -rf $log_file exit 1 fi else echo -e "\033[31m无法识别的系统软件包管理工具\033[0m" exit 1 fi done } # 检测服务器架构 function IF_CHECK_CORE_ALL(){ if [ $(arch) = "x86_64" ] || [ $(arch) = "amd64" ]; then ARCH_TYPE=amd64 elif [ $(arch) = "aarch64" ] || [ $(arch) = "arm64" ]; then ARCH_TYPE=arm64 SEND_ERROR "本脚本暂不支持 $(arch) 架构,或许你可以删除本段判断试试哈哈" exit 1 else SEND_ERROR "无法识别的系统架构: $(arch)" exit 1 fi IF_CHECK_OS } function IF_OS_ENV(){ # 判断 OS_TRUE=0,则退出脚本 if [ ${OS_TRUE} -eq 0 ]; then SEND_ERROR "本脚本暂不支持 ${OS} ${OS_VERSION} 系统" exit 1 fi } # 检测服务器系统及版本 function IF_CHECK_OS(){ CHECK_OS OS_TRUE=1 if [ "$OS" = "centos" ]; then if [ "$OS_VERSION" -ne 7 ] && [ "$OS_VERSION" -ne 8 ]; then OS_TRUE=0 fi IF_OS_ENV IF_CHECK_CORE elif [ "$OS" = "debian" ]; then IF_CHECK_CORE elif [ "$OS" = "ubuntu" ]; then IF_CHECK_CORE else SEND_ERROR "无法识别的系统版本" exit 1 fi } # 检测内核版本 function IF_CHECK_CORE(){ CHECK_OS if [ ${OS} = "centos" ]; then # 判断内核是否低于5,如果低于5则更新内核 if [ $(uname -r | awk -F '.' '{print $1}') -lt 5 ]; then IF_UPDATE_ONLINE else SEND_INFO "当前内核版本为 $(uname -r),无需更新" fi elif [ ${OS} = "ubuntu" ]; then if [ $(uname -r | awk -F '.' '{print $1}') -lt 6 ]; then IF_UPDATE_ONLINE else SEND_INFO "当前内核版本为 $(uname -r),无需更新" fi elif [ ${OS} = "debian" ]; then if [ ${OS_VERSION} -eq 10 ] || [ ${OS_VERSION} -eq 11 ]; then if [ $(uname -r | awk -F '.' '{print $1}') -lt 5 ]; then IF_UPDATE_ONLINE else SEND_INFO "当前内核版本为 $(uname -r),无需更新" fi elif [ ${OS_VERSION} -eq 12 ]; then if [ $(uname -r | awk -F '.' '{print $1}') -lt 6 ]; then IF_UPDATE_ONLINE else SEND_INFO "当前内核版本为 $(uname -r),无需更新" fi else SEND_ERROR "当前 Debian 系统 $(uname -r) 版本暂时不支持内核更新" exit 1 fi else SEND_ERROR "当前系统暂时不支持内核更新" exit 1 fi } # 判断在线或离线升级 function IF_UPDATE_ONLINE(){ while true; do read -p "本脚本支持 在线(o)/离线(l) 升级内核,请选择升级方式 [o(默认)/l]: " UPDATE_TYPE case $UPDATE_TYPE in o|"") UPDATE_TYPE=online SEND_INFO "您选择的升级方式为: ${UPDATE_TYPE} 在线升级" break ;; l) UPDATE_TYPE=local SEND_INFO "您选择的升级方式为: ${UPDATE_TYPE} 离线升级" break ;; *) SEND_ERROR "输入错误,请重新输入" ;; esac done IF_UPDATE_TYPE } # 判断升级方式 function IF_UPDATE_TYPE(){ if [ ${UPDATE_TYPE} = "online" ]; then if [ ${OS} = "centos" ]; then if [ ${OS_VERSION} -eq 7 ]; then UPDATE_CENTOS_ONLINE_7 elif [ ${OS_VERSION} -eq 8 ]; then UPDATE_CENTOS_ONLINE_8 fi elif [ ${OS} = "debian" ]; then UPDATE_DEBIAN_ONLINE elif [ ${OS} = "ubuntu" ]; then UPDATE_UBUNTU_ONLINE fi elif [ ${UPDATE_TYPE} = "local" ]; then if [ ${OS} = "centos" ]; then if [ ${OS_VERSION} -eq 7 ]; then UPDATE_CENTOS_LOCAL_7 elif [ ${OS_VERSION} -eq 8 ]; then UPDATE_CENTOS_LOCAL_8 fi elif [ ${OS} = "debian" ]; then UPDATE_DEBIAN_LOCAL elif [ ${OS} = "ubuntu" ]; then UPDATE_UBUNTU_LOCAL fi fi } #选择内核版本 function SELECT_CORE(){ # 安装内核 # 查看可提供升级的版本 SEND_INFO "正在查询当前内核可升级版本" CHECK_COMMAND_ECHO yum list available --disablerepo='*' --enablerepo=elrepo-kernel | grep -v Loaded | grep -v Loading | grep -v "*" | grep -v Available # 让用户通过输入选择版本 if [ ${ALL_DEFAULT_YES} = true ]; then KERNEL_VERSION=kernel-lt SEND_INFO "您选择的内核版本为: ${KERNEL_VERSION}" else while true; do read -p "请输入您想要升级的内核版本[lt(默认)/ml]: " KERNEL_VERSION case $KERNEL_VERSION in lt|"") KERNEL_VERSION=kernel-lt SEND_INFO "您选择的内核版本为: ${KERNEL_VERSION}" break ;; ml) KERNEL_VERSION=kernel-ml SEND_INFO "您选择的内核版本为: ${KERNEL_VERSION}" break ;; *) SEND_ERROR "输入错误,请重新输入" ;; esac done fi } # 配置内核启动顺序 function CORE_SEQUENCE(){ # 配置系统默认启动内核 if [ ${ALL_DEFAULT_YES} = true ]; then DEFAULT_KERNEL=0 else while true; do SEND_INFO "正在获取内核版本序号" awk -F \' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg read -p "请选择系终启动默认内核序号(默认0): " DEFAULT_KERNEL if [ -z ${DEFAULT_KERNEL} ]; then DEFAULT_KERNEL=0 break elif [ ${DEFAULT_KERNEL} -ge 0 ] && [ ${DEFAULT_KERNEL} -le 9 ]; then break else SEND_ERROR "输入错误,请重新输入" fi done fi # 设置开机启动 SEND_INFO "正在设置开机启动,请稍后" grub2-set-default ${DEFAULT_KERNEL} REBOOT } function REBOOT(){ if [ ${ALL_DEFAULT_YES} = true ]; then SEND_INFO "正在重启系统,请稍后" reboot else while true; do read -p "是否重启系统[y(默认)/n]: " REBOOT case $REBOOT in y|"") SEND_INFO "正在重启系统,请稍后" reboot break ;; n) SEND_INFO "请手动重启系统" break ;; *) SEND_ERROR "输入错误,请重新输入" ;; esac done fi } # 升级 CentOS 内核 function UPDATE_CENTOS_ONLINE_7(){ SEND_INFO "正在加载 Kernel 源,请稍后" # 载入公钥 CHECK_COMMAND_NULL rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 安装 ELRepo 源 NULL_TRUE rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm SELECT_CORE # 安装内核 SEND_INFO "正在安装内核,请稍后" CHECK_COMMAND_ECHO yum --enablerepo=elrepo-kernel install ${KERNEL_VERSION} -y CORE_SEQUENCE } function UPDATE_CENTOS_LOCAL_7(){ CHECK_FILES kernel-*.rpm SEND_INFO "正在安装本地内核包,请稍后" CHECK_COMMAND_ECHO yum localinstall -y kernel-*.rpm CORE_SEQUENCE } function UPDATE_CENTOS_ONLINE_8(){ SEND_INFO "正在加载 Kernel 源,请稍后" # 载入公钥 CHECK_COMMAND_NULL rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 安装 ELRepo 源 NULL_TRUE rpm -Uvh https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm SELECT_CORE # 安装内核 SEND_INFO "正在安装内核,请稍后" CHECK_COMMAND_ECHO yum --enablerepo=elrepo-kernel install ${KERNEL_VERSION} -y CORE_SEQUENCE } function UPDATE_CENTOS_LOCAL_8(){ UPDATE_CENTOS_LOCAL_7 } function UPDATE_UBUNTU_ONLINE(){ SEND_INFO "正在获取内核版本,请稍后" VERSION=$(./ubuntu-mainline-kernel.sh -c | grep A | grep -o 'v[0-9]\+\(\.[0-9]\+\)\{2\}') SEND_INFO "最新稳定版本为: ${VERSION}" SEND_INFO "正在安装内核,请稍后" curl -sS https://raw.githubusercontent.com/pimlie/ubuntu-mainline-kernel.sh/master/ubuntu-mainline-kernel.sh | bash -s -- -i ${VERSION} CHECK_COMMAND_TRUE "安装成功" "安装失败请查看日志" REBOOT # # 第二种更新方式 # sudo apt update # apt search linux-image # apt-get upgrade linux-image-generic } function UPDATE_UBUNTU_LOCAL(){ CHECK_FILES *.deb SEND_INFO "正在安装本地内核包,请稍后" CHECK_COMMAND_ECHO dpkg --install *.deb REBOOT } function UPDATE_DEBIAN_ONLINE(){ # apt search linux-image CHECK_COMMAND_ECHO echo "deb http://deb.debian.org/debian buster-backports main" > /etc/apt/sources.list.d/backports.list CHECK_COMMAND_ECHO apt update CHECK_COMMAND_ECHO apt -t buster-backports install linux-image-amd64 -y CHECK_COMMAND_TRUE "linux-image 安装成功" "安装失败请查看日志" CHECK_COMMAND_ECHO apt -t buster-backports install linux-headers-amd64 -y CHECK_COMMAND_TRUE "linux-headers 安装成功" "安装失败请查看日志" SEND_INFO "正在更新开机启动顺序,请稍后" CHECK_COMMAND_TRUE update-grub REBOOT } function UPDATE_DEBIAN_LOCAL(){ SEND_ERROR "暂不支持 Debian 离线升级内核,有需求就提个 issue 吧" } function ALL(){ CHECK_NETWORK # 加载检测脚本 source <(curl -sS https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh) CHECK_PARAMETER $@ FUNC_PRINT_SYSTEM_INFO IF_CHECK_CORE_ALL } # 检测外部是否传入参数 function CHECK_PARAMETER(){ if [ "$#" -eq 0 ] || [ "$#" -eq 1 ]; then case $1 in ALL_DEFAULT_YES=1) ALL_DEFAULT_YES=true ;; *) if [ "$#" -eq 1 ]; then SEND_ERROR "输入参数错误,请查看帮助文档: https://gitee.com/offends/Linux/blob/main/%E8%84%9A%E6%9C%AC/README.md" exit 1 fi ALL_DEFAULT_YES=false ;; esac else SEND_ERROR "输入参数错误,请查看帮助文档: https://gitee.com/offends/Linux/blob/main/%E8%84%9A%E6%9C%AC/README.md" exit 1 fi } ALL $@