342 lines
7.9 KiB
Markdown
342 lines
7.9 KiB
Markdown
# 内核切换脚本使用指南
|
||
|
||
## 版本: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/<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 引导配置
|