# 内核切换脚本使用指南 ## 版本:V1.3(支持离线安装 + DKMS 故障处理 + 自动日志记录) --- ## 功能特性 ✅ **在线/离线双模式**:自动检测网络,无网时切换离线模式 ✅ **DKMS 智能处理**:自动检测问题驱动,提供交互式修复 ✅ **预下载支持**:在有网机器上打包,传到离线机器安装 ✅ **驱动自动编译**:网卡、显卡驱动随内核自动重编译 ✅ **版本锁定**:防止系统自动更新覆盖指定内核 ✅ **自动日志记录**:所有操作追加写入 `log-日期-dacs.log` ## 使用场景 ### 场景 1:在线安装(推荐) **适用:** 目标机器有网络连接 ```bash sudo ./switch_kernel.sh # 或指定版本 sudo ./switch_kernel.sh --version 6.8.0-52-generic ``` **流程:** 1. 自动检测网络 ✓ 2. 检查 DKMS 驱动兼容性 3. 在线下载并安装内核 4. 自动编译驱动(DKMS) 5. 配置 GRUB 引导 --- ### 场景 2:离线安装(两步法) **适用:** 目标机器无网络,需要提前准备 #### 步骤 1:在有网机器上下载包 ```bash 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:在目标机器上安装 ```bash # 复制包目录到目标机器(U盘、scp 等方式) scp -r ./dacs user@target-machine:/tmp/ # 在目标机器上运行 sudo ./switch_kernel.sh --offline ./dacs --version 6.8.0-52-generic ``` --- ### 场景 3:跳过 DKMS 编译(解决驱动兼容问题) **适用:** 已知某些驱动与新内核不兼容,想先安装内核 ```bash 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: 如何查看当前已安装的内核? ```bash dpkg -l | grep linux-image ``` ### Q2: 如何查看 DKMS 驱动状态? ```bash dkms status ``` ### Q3: 安装后如何验证新内核? ```bash # 检查 GRUB 菜单 grep menuentry /boot/grub/grub.cfg | grep 6.8.0-52 # 重启后查看当前内核 uname -r ``` ### Q4: 如何回退到旧内核? 1. 重启时按 `Shift` 或 `Esc` 进入 GRUB 菜单 2. 选择 "Advanced options" 3. 选择旧内核版本启动 4. 启动后移除新内核: ```bash sudo apt-get remove linux-image-6.8.0-52-generic ``` ### Q5: elkeid-driver 编译失败怎么办? **临时移除(推荐):** ```bash sudo dkms remove elkeid-driver/1.7.0.22 --all sudo ./switch_kernel.sh ``` **安装完成后恢复:** ```bash sudo apt-get install --reinstall elkeid-driver # 或手动编译 sudo dkms install elkeid-driver/1.7.0.22 -k 6.8.0-52-generic ``` ### Q6: 显卡驱动失效怎么办? **NVIDIA 显卡:** ```bash # 检查驱动状态 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:在线安装并锁定版本 ```bash sudo ./switch_kernel.sh --version 6.8.0-52-generic # 按提示操作: # - 是否设置为默认启动内核?Y # - 是否锁定该内核版本?Y # - 是否立刻重启系统?Y ``` ### 示例 2:离线安装(完整流程) ```bash # 在有网机器上 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 快速安装 ```bash 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`: ```bash # 查看今天的日志 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 等) - 错误信息和警告 - 系统信息(主机名、当前内核等) **查看日志:** ```bash # 实时查看日志 tail -f log-$(date +%Y%m%d)-dacs.log # 查看完整日志 less log-$(date +%Y%m%d)-dacs.log # 搜索错误 grep -i error log-*.log ``` --- ### 查看系统日志 ```bash # APT 安装日志 cat /var/log/apt/term.log # DKMS 编译日志 cat /var/lib/dkms///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 引导配置