update
This commit is contained in:
127
dev/image.sh
Normal file
127
dev/image.sh
Normal file
@@ -0,0 +1,127 @@
|
||||
#!/bin/bash
|
||||
# Debian/Ubuntu 内核切换脚本
|
||||
# 功能:从 Cloud 内核切换到标准内核
|
||||
# 适用:Debian 11+/Ubuntu 18.04+
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[0;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
check_root() {
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
echo -e "${RED}错误:必须使用 root 权限运行此脚本${NC}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_cloud_kernel() {
|
||||
if ! uname -r | grep -q 'cloud'; then
|
||||
echo -e "${GREEN}提示:系统已在标准内核运行 ($(uname -r))${NC}"
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
purge_cloud_kernel() {
|
||||
echo -e "${YELLOW}步骤1/4:彻底移除 Cloud 内核...${NC}"
|
||||
|
||||
# 找出所有 Cloud 内核包
|
||||
local cloud_pkgs=$(dpkg -l | awk '/linux-(image|headers)-[0-9].*cloud/ {print $2}')
|
||||
|
||||
if [ -n "$cloud_pkgs" ]; then
|
||||
echo -e "正在卸载: ${cloud_pkgs}"
|
||||
apt purge -y $cloud_pkgs
|
||||
apt autoremove -y --purge
|
||||
else
|
||||
echo -e "${GREEN}提示:未找到 Cloud 内核包${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
lock_cloud_kernel() {
|
||||
echo -e "${YELLOW}步骤2/4:锁定 Cloud 内核...${NC}"
|
||||
|
||||
# 检查是否还有额外的 Cloud 内核包,如果有则标记为 hold
|
||||
cloud_kernels=$(apt list --installed 2>/dev/null | grep -i 'linux-image' | grep -i 'cloud' | cut -d'/' -f1)
|
||||
|
||||
if [ -n "$cloud_kernels" ]; then
|
||||
echo "找到以下 Cloud 内核包,正在锁定:$cloud_kernels"
|
||||
apt-mark hold $cloud_kernels
|
||||
else
|
||||
echo -e "${GREEN}提示:未找到任何 Cloud 内核包,跳过锁定步骤。${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
force_install_standard() {
|
||||
echo -e "${YELLOW}步骤3/4:安装标准内核...${NC}"
|
||||
|
||||
# 根据系统类型选择包名
|
||||
local image_pkg="linux-image-amd64"
|
||||
local headers_pkg="linux-headers-amd64"
|
||||
|
||||
if grep -q 'ID=ubuntu' /etc/os-release; then
|
||||
image_pkg="linux-image-generic"
|
||||
headers_pkg="linux-headers-generic"
|
||||
fi
|
||||
|
||||
# 强制安装并跳过配置提问
|
||||
DEBIAN_FRONTEND=noninteractive apt install -y --reinstall --allow-downgrades \
|
||||
"$image_pkg" "$headers_pkg"
|
||||
|
||||
# 确保 initramfs 更新
|
||||
local std_kernel=$(ls /boot/vmlinuz-* | grep -v cloud | sort -V | tail -1 | sed 's|/boot/vmlinuz-||')
|
||||
update-initramfs -u -k "$std_kernel"
|
||||
}
|
||||
|
||||
nuclear_grub_update() {
|
||||
echo -e "${YELLOW}步骤4/4:重建 GRUB...${NC}"
|
||||
|
||||
# 备份原配置
|
||||
mkdir -p /root/grub_backup
|
||||
cp -a /boot/grub /root/grub_backup/grub.bak.$(date +%s)
|
||||
|
||||
# 生成干净的 GRUB 配置
|
||||
cat > /etc/default/grub <<'EOF'
|
||||
GRUB_DEFAULT=0
|
||||
GRUB_TIMEOUT=5
|
||||
GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian
|
||||
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
|
||||
GRUB_CMDLINE_LINUX=""
|
||||
GRUB_DISABLE_OS_PROBER=true
|
||||
GRUB_DISABLE_RECOVERY=true
|
||||
EOF
|
||||
|
||||
# 完全重建配置
|
||||
grub-mkconfig -o /boot/grub/grub.cfg
|
||||
|
||||
# 确保使用第一个菜单项
|
||||
grub-set-default 0
|
||||
update-grub
|
||||
|
||||
# 特殊处理 UEFI 系统
|
||||
if [ -d /sys/firmware/efi ]; then
|
||||
echo -e "检测到 UEFI 系统,更新引导加载程序..."
|
||||
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
echo -e "\n${GREEN}=== Debian/Ubuntu 内核切换脚本 ===${NC}"
|
||||
check_root
|
||||
check_cloud_kernel
|
||||
|
||||
# 执行核心修复步骤
|
||||
purge_cloud_kernel
|
||||
lock_cloud_kernel
|
||||
force_install_standard
|
||||
nuclear_grub_update
|
||||
|
||||
# 最终验证
|
||||
echo -e "\n${GREEN}=== 操作完成 ===${NC}"
|
||||
echo -e "请手动重启系统:"
|
||||
echo -e "1. 重启系统: ${YELLOW}reboot${NC}"
|
||||
echo -e "2. 检查内核: ${YELLOW}uname -r${NC}"
|
||||
|
||||
touch /root/.kernel_switch_success
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user