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
dacs-switch-kernel/README.md
T
beyondx123 ca1c38417c 本次修改了三个地方:
① set_boot_kernel(去掉确认,新增禁止自动选最新内核)

移除 read -p 确认,直接写入 /etc/default/grub
同时将 GRUB_SAVEDEFAULT 强制写为 false,防止 GRUB 记住上次选择 干扰指定内核
新增 UUID 有效性检查,获取失败时报错退出而非写入空值
② hold_default_boot_kernel(新增锁定元包)

原来只锁定具体版本的 linux-image-6.8.0-52-generic
新增锁定 linux-image-generic 和 linux-headers-generic 两个元包——这才是 apt 升级时切换内核的根本原因
③ 主流程(去掉两个交互确认)

安装完成后自动调用 set_default_boot_kernel + hold_default_boot_kernel,无需用户输入
2026-05-15 17:42:40 +08:00

353 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 内核切换脚本使用指南
## 版本:V1.3(支持离线安装 + DKMS 故障处理 + 自动日志记录)
***
## 功能特性
**在线/离线双模式**:自动检测网络,无网时切换离线模式\
**DKMS 智能处理**:自动检测问题驱动,提供交互式修复\
**预下载支持**:在有网机器上打包,传到离线机器安装\
**驱动自动编译**:网卡、显卡驱动随内核自动重编译\
**版本锁定**:防止系统自动更新覆盖指定内核\
**自动日志记录**:所有操作追加写入 `log-日期-dacs.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
```
***
## 使用场景
### 场景 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
将 /tmp/kernel-debs 目录复制到目标机器后,运行:
sudo ./switch_kernel.sh --offline ./dacs --version 6.8.0-52-generic
```
#### 步骤 2:在目标机器上安装
```bash
# 复制包目录到目标机器(U盘、scp 等方式)
scp -r /tmp/kernel-debs 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_V1.2.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_V1.2.sh --version 6.8.0-52-generic
# 按提示操作:
# - 是否设置为默认启动内核?Y
# - 是否锁定该内核版本?Y
# - 是否立刻重启系统?Y
```
### 示例 2:离线安装(完整流程)
```bash
# 在有网机器上
sudo ./switch_kernel_V1.2.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_V1.2.sh --offline /tmp/kernel-6.8.0-52 --version 6.8.0-52-generic
```
### 示例 3:跳过 DKMS 快速安装
```bash
sudo ./switch_kernel_V1.2.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
```
### 查看系统日志
```bash
# 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 引导配置