9.5 KiB
内核切换脚本使用指南
版本:V1.4(全自动化:安装后自动设置默认内核并锁定版本)
功能特性
✅ 在线/离线双模式:自动检测网络,无网时切换离线模式
✅ DKMS 智能处理:自动检测问题驱动,提供交互式修复
✅ 预下载支持:在有网机器上打包,传到离线机器安装
✅ 驱动自动编译:网卡、显卡驱动随内核自动重编译
✅ 自动设置默认内核:安装完成后自动配置 GRUB,无需手动确认
✅ 全面版本锁定:锁定具体版本包 + 元包,防止 apt 升级时切换内核
✅ 自动日志记录:所有操作追加写入 log-日期-dacs.log
🆕 V1.4 重要变更
安装完成后自动执行以下操作(无需用户确认):
-
强制设置默认启动内核
- 自动修改
/etc/default/grub中的GRUB_DEFAULT - 禁用
GRUB_SAVEDEFAULT,防止 GRUB "记住上次选择" - 自动运行
update-grub更新引导菜单
- 自动修改
-
全面锁定内核版本
- 锁定具体版本包:
linux-image-6.8.0-52-generic、linux-headers-6.8.0-52-generic - 新增锁定元包:
linux-image-generic、linux-headers-generic - 防止
apt upgrade时自动切换到新内核
- 锁定具体版本包:
-
解决的问题
- ✅ 重启后不会再进入其他内核(如 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
流程:
- 自动检测网络 ✓
- 检查 DKMS 驱动兼容性
- 在线下载并安装内核
- 自动编译驱动(DKMS)
- 配置 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-driver、bbr 等),并提示:
警告:以下驱动可能与新内核不兼容:
- 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: 如何回退到旧内核?
- 重启时按
Shift或Esc进入 GRUB 菜单 - 选择 "Advanced options"
- 选择旧内核版本启动
- 启动后移除新内核:
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 Boot(BIOS 设置)
- 或为驱动模块签名(高级)
⚠️ 备份重要数据:内核切换有风险,建议提前备份关键数据。
⚠️ 生产环境:建议先在测试环境验证,确认无问题后再部署到生产。
更新日志
V1.3 (2024-05-14)
- ✨ 新增 DKMS 兼容性预检查
- ✨ 新增 DKMS 编译失败自动修复
- ✨ 新增
--skip-dkms参数 - ✨ 新增自动日志记录功能(log-日期-dacs.log)
- 🐛 修复离线模式下 DKMS 钩子未恢复的问题
- 📝 添加详细的故障排查文档
V1.2 (2024-05-14)
- ✨ 新增离线安装支持
- ✨ 新增
--download模式 - ✨ 新增网络自动检测
- 🐛 修复依赖安装顺序问题
V1.0
- 🎉 初始版本
- ✅ 在线安装内核
- ✅ DKMS 驱动自动编译
- ✅ GRUB 引导配置