Files
Linux/File/Shell/Core.sh
offends cee91802b3
Some checks failed
continuous-integration/drone Build is failing
synchronization
2025-08-25 15:57:40 +08:00

381 lines
12 KiB
Bash

#!/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 $@