This repository has been archived on 2026-07-19. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files

9.5 KiB
Raw Permalink Blame History

内核切换脚本使用指南

版本:V1.4(全自动化:安装后自动设置默认内核并锁定版本)


功能特性

在线/离线双模式:自动检测网络,无网时切换离线模式
DKMS 智能处理:自动检测问题驱动,提供交互式修复
预下载支持:在有网机器上打包,传到离线机器安装
驱动自动编译:网卡、显卡驱动随内核自动重编译
自动设置默认内核:安装完成后自动配置 GRUB,无需手动确认
全面版本锁定:锁定具体版本包 + 元包,防止 apt 升级时切换内核
自动日志记录:所有操作追加写入 log-日期-dacs.log


🆕 V1.4 重要变更

安装完成后自动执行以下操作(无需用户确认):

  1. 强制设置默认启动内核

    • 自动修改 /etc/default/grub 中的 GRUB_DEFAULT
    • 禁用 GRUB_SAVEDEFAULT,防止 GRUB "记住上次选择"
    • 自动运行 update-grub 更新引导菜单
  2. 全面锁定内核版本

    • 锁定具体版本包:linux-image-6.8.0-52-genericlinux-headers-6.8.0-52-generic
    • 新增锁定元包linux-image-genericlinux-headers-generic
    • 防止 apt upgrade 时自动切换到新内核
  3. 解决的问题

    • 重启后不会再进入其他内核(如 6.14.0-1015
    • 系统更新时不会自动安装并切换到新内核
    • 无需手动编辑 grub 配置文件

日志功能

脚本会自动记录所有操作到当前目录下的日志文件:

日志文件命名: log-YYYYMMDD-dacs.log(例如:log-20240514-dacs.log

日志内容包括:

  • 脚本启动/完成时间
  • 执行的命令和参数
  • 所有关键操作的输出(apt-get、dpkg、dkms 等)
  • 错误信息和警告
  • 系统信息(主机名、当前内核等)

查看日志:

# 实时查看日志
tail -f log-$(date +%Y%m%d)-dacs.log

# 查看完整日志
less log-$(date +%Y%m%d)-dacs.log

# 搜索错误
grep -i error log-*.log

使用场景

场景 1:在线安装(推荐)

适用: 目标机器有网络连接

sudo ./switch_kernel.sh
# 或指定版本
sudo ./switch_kernel.sh --version 6.8.0-52-generic

流程:

  1. 自动检测网络 ✓
  2. 检查 DKMS 驱动兼容性
  3. 在线下载并安装内核
  4. 自动编译驱动(DKMS
  5. 配置 GRUB 引导

场景 2:离线安装(两步法)

适用: 目标机器无网络,需要提前准备

步骤 1:在有网机器上下载包

sudo ./switch_kernel.sh --download ./dacs --version 6.8.0-52-generic

输出:

[OK] 下载完成,包列表:
-rw-r--r-- 1 root root  14M linux-image-6.8.0-52-generic_6.8.0-52.53_amd64.deb
-rw-r--r-- 1 root root 3.9M linux-headers-6.8.0-52-generic_6.8.0-52.53_amd64.deb
-rw-r--r-- 1 root root  38M linux-modules-6.8.0-52-generic_6.8.0-52.53_amd64.deb
-rw-r--r-- 1 root root 108M linux-modules-extra-6.8.0-52-generic_6.8.0-52.53_amd64.deb

将 ./dacs 目录复制到目标机器后,运行:
  sudo ./switch_kernel.sh --offline ./dacs --version 6.8.0-52-generic

步骤 2:在目标机器上安装

# 复制包目录到目标机器(U盘、scp 等方式)
scp -r ./dacs user@target-machine:/tmp/

# 在目标机器上运行
sudo ./switch_kernel.sh --offline ./dacs --version 6.8.0-52-generic

场景 3:跳过 DKMS 编译(解决驱动兼容问题)

适用: 已知某些驱动与新内核不兼容,想先安装内核

sudo ./switch_kernel.sh --skip-dkms

效果:

  • 临时禁用 DKMS 自动编译钩子
  • 内核安装完成后自动恢复钩子
  • 可重启后手动编译驱动:sudo dkms autoinstall -k 6.8.0-52-generic

参数说明

参数 说明 示例
--version <版本> 指定内核版本 --version 6.8.0-52-generic
--download <目录> 仅下载包到目录(需要网络) --download /tmp/debs
--offline <目录> 强制离线模式,从目录安装 --offline /tmp/debs
--skip-dkms 跳过 DKMS 自动编译 --skip-dkms
-h, --help 显示帮助信息 -h

DKMS 故障处理

自动检测与提示

脚本会在安装前检测已知问题驱动(如 elkeid-driverbbr 等),并提示:

警告:以下驱动可能与新内核不兼容:
  - elkeid-driver/1.7.0.22

是否跳过 DKMS 自动编译?(Y/N):

安装时遇到 DKMS 错误

如果安装过程中 DKMS 编译失败,脚本会自动捕获并提供选项:

[ERROR] DKMS 驱动编译失败!

可能的原因:
  1. 某些第三方驱动与新内核不兼容
  2. 缺少编译依赖

解决方案:
  A. 临时移除问题驱动后重试
  B. 强制完成安装(忽略 DKMS 错误)
  C. 退出并手动排查

请选择 [A/B/C]:

选项说明:

  • A(推荐):列出所有 DKMS 驱动,选择移除问题驱动,然后自动重试安装
  • B:强制完成内核安装,忽略驱动编译错误(驱动可能不可用)
  • C:退出脚本,查看 TROUBLESHOOTING.md 手动排查

常见问题

Q1: 如何查看当前已安装的内核?

dpkg -l | grep linux-image

Q2: 如何查看 DKMS 驱动状态?

dkms status

Q3: 安装后如何验证新内核?

# 检查 GRUB 菜单
grep menuentry /boot/grub/grub.cfg | grep 6.8.0-52

# 重启后查看当前内核
uname -r

Q4: 如何回退到旧内核?

  1. 重启时按 ShiftEsc 进入 GRUB 菜单
  2. 选择 "Advanced options"
  3. 选择旧内核版本启动
  4. 启动后移除新内核:
    sudo apt-get remove linux-image-6.8.0-52-generic
    

Q5: elkeid-driver 编译失败怎么办?

临时移除(推荐):

sudo dkms remove elkeid-driver/1.7.0.22 --all
sudo ./switch_kernel.sh

安装完成后恢复:

sudo apt-get install --reinstall elkeid-driver
# 或手动编译
sudo dkms install elkeid-driver/1.7.0.22 -k 6.8.0-52-generic

Q6: 显卡驱动失效怎么办?

NVIDIA 显卡:

# 检查驱动状态
nvidia-smi

# 如果失效,重新安装驱动
sudo apt-get install --reinstall nvidia-driver-xxx
# 或使用 DKMS 重新编译
sudo dkms install nvidia/xxx -k 6.8.0-52-generic

注意: 如果启用了 Secure Boot,需要关闭或签名驱动模块。


完整示例

示例 1:在线安装并锁定版本

sudo ./switch_kernel.sh --version 6.8.0-52-generic
# 按提示操作:
# - 是否设置为默认启动内核?Y
# - 是否锁定该内核版本?Y
# - 是否立刻重启系统?Y

示例 2:离线安装(完整流程)

# 在有网机器上
sudo ./switch_kernel.sh --download /tmp/kernel-6.8.0-52 --version 6.8.0-52-generic
tar czf kernel-6.8.0-52.tar.gz -C /tmp kernel-6.8.0-52

# 传输到目标机器
scp kernel-6.8.0-52.tar.gz user@target:/tmp/

# 在目标机器上
cd /tmp
tar xzf kernel-6.8.0-52.tar.gz
sudo ./switch_kernel.sh --offline /tmp/kernel-6.8.0-52 --version 6.8.0-52-generic

示例 3:跳过 DKMS 快速安装

sudo ./switch_kernel.sh --skip-dkms --version 6.8.0-52-generic
# 重启后手动编译驱动
sudo dkms autoinstall -k 6.8.0-52-generic

日志与调试

自动日志记录

脚本会自动将所有操作记录到 log-YYYYMMDD-dacs.log

# 查看今天的日志
cat log-$(date +%Y%m%d)-dacs.log

# 实时监控日志(另一个终端)
tail -f log-$(date +%Y%m%d)-dacs.log

# 搜索错误
grep -E "ERROR|failed|Failed" log-*.log

日志功能

脚本会自动记录所有操作到当前目录下的日志文件:

日志文件命名: log-YYYYMMDD-dacs.log(例如:log-20240514-dacs.log

日志内容包括:

  • 脚本启动/完成时间
  • 执行的命令和参数
  • 所有关键操作的输出(apt-get、dpkg、dkms 等)
  • 错误信息和警告
  • 系统信息(主机名、当前内核等)

查看日志:

# 实时查看日志
tail -f log-$(date +%Y%m%d)-dacs.log

# 查看完整日志
less log-$(date +%Y%m%d)-dacs.log

# 搜索错误
grep -i error log-*.log

查看系统日志

# APT 安装日志
cat /var/log/apt/term.log

# DKMS 编译日志
cat /var/lib/dkms/<driver>/<version>/build/make.log

# 内核消息
dmesg | tail -100

详细故障排查

参见 TROUBLESHOOTING.md 文档。


安全提示

⚠️ Secure Boot:如果启用了 Secure Boot,第三方驱动(NVIDIA、VirtualBox 等)可能无法加载。建议:

  • 关闭 Secure BootBIOS 设置)
  • 或为驱动模块签名(高级)

⚠️ 备份重要数据:内核切换有风险,建议提前备份关键数据。

⚠️ 生产环境:建议先在测试环境验证,确认无问题后再部署到生产。


更新日志

V1.3 (2024-05-14)

  • 新增 DKMS 兼容性预检查
  • 新增 DKMS 编译失败自动修复
  • 新增 --skip-dkms 参数
  • 新增自动日志记录功能(log-日期-dacs.log
  • 🐛 修复离线模式下 DKMS 钩子未恢复的问题
  • 📝 添加详细的故障排查文档

V1.2 (2024-05-14)

  • 新增离线安装支持
  • 新增 --download 模式
  • 新增网络自动检测
  • 🐛 修复依赖安装顺序问题

V1.0

  • 🎉 初始版本
  • 在线安装内核
  • DKMS 驱动自动编译
  • GRUB 引导配置