381 lines
12 KiB
Bash
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 $@ |