# 01｜Linux 设备部署计划

> 目标设备：`zrh-dracarys`（HUAWEI MateBook D 14 2020）。本文保留 Linux 服务器化的设计与历史安装基线；当前设备已运行 Ubuntu 24.04.5，后续硬件/系统变更以 [设备概览](../设备概览.md) 和参考规范为准。

---

## 一、目标设备基线

| 项目 | 内容 | 备注 |
| --- | --- | --- |
| 机型 | HUAWEI MateBook D 14 (2020)，BOHB-WAX9 | BIOS 1.45 (2023-01-17) |
| CPU | Intel Core i5-10210U，4C8T | Comet Lake，**支持 AVX2，无 AVX-512** |
| 核显 | Intel UHD Graphics 620 | 原生驱动，无问题 |
| 独显 | NVIDIA GeForce MX250（2GB） | **Pascal 架构 GP108，sm_61** |
| 内存 | 16GB（SK Hynix 2×8GB 2666） | **BGA 焊接，无法升级** |
| 硬盘 | 512GB 三星 MZVLB512HAJQ NVMe | 支持 TRIM |
| 无线 | Intel Wireless-AC 9560 | CNViO2，原生 `iwlwifi` 驱动 |
| TPM | 可信平台模块 2.0 | 可做 LUKS + TPM 自动解锁 |
| 电池 | S3 待机 / S1 睡眠 | **长期插电存在鼓包风险** |

原磁盘分区（Windows）：

| 分区 | 大小 | 用途 |
| --- | --- | --- |
| #1 | 0.1 GB | EFI System Partition |
| #3 | 167.3 GB | C: Windows |
| #4 | 283.5 GB | D: Data |
| #5 | 0.5 GB | Recovery |
| #6 | 12 GB | 华为「一键重装」Onekey |
| #7 | 1 GB | WinRE |

> 磁盘物理容量 512GB，已分配约 464GB，**存在约 47.7GB 未分配空间**，
> 全盘安装时会一并并入新分区。

---

## 二、关键决策

### 2.1 全盘安装，而非双系统

| 考量维度 | 全刷 | 双系统 | 结论 |
| --- | --- | --- | --- |
| 7×24 可用性 | 重启自动进系统 | 需人工选择启动项，否则卡在 GRUB 超时 | **全刷胜** |
| 磁盘空间 | 512GB 全给 Linux | Windows 占用 167GB，Agent 容器很吃盘 | **全刷胜** |
| 另一台已有 Windows 机 | 需求已覆盖 | 冗余 | 全刷 |
| NVIDIA 双显卡 | 黑名单 nouveau 即可 | 与 Windows 抢硬件状态 | **全刷胜** |
| 系统故障救援 | 需 U 盘重装 | 尚可进 Windows | 双系统胜 |
| 华为一键重装 | 丢失 | 保留 | 双系统胜 |

**决定性因素是 7×24 可用性。** 服务器的核心属性是"随时能远程连上"，
GRUB 启动菜单直接违背这一点。即使把 `default=0` + `timeout=0` 配好，
一次磁盘顺序变更或内核升级失败都足以让它变砖。

**关于丢失华为 Onekey 分区：** 该分区本质是预置的 Windows PE 镜像，
不是华为独占功能。在另一台 Windows 电脑上用微软官方 Media Creation Tool
制作启动 U 盘即可完全替代，开机 F12 也可直接选择 U 盘启动。
**此顾虑不成立。**

### 2.2 不安装 NVIDIA 驱动

MX250 为 Pascal 架构（compute capability 6.1）、2GB 显存：

- 7B 模型 Q4 量化需 4~5GB 显存，显存不足
- Pascal 已进入 EOL，CUDA 13 起官方移除编译目标，新版 PyTorch wheel 逐步放弃 sm_61
- 384 CUDA 核，算力与 UHD 620 相当（OpenCL 下甚至更弱）

**结论：黑名单 nouveau，完全使用 Intel 核显 + CPU。**
对服务器场景这是纯粹收益：省电、无双显卡切换状态、无驱动冲突。

### 2.3 发行版与桌面选型

**Ubuntu 24.04 LTS + XFCE**

- 5 年长期支持（LTS 到 2029）
- Agent 生态文档与社区支持最完整
- Tailscale / Tailscale SSH 开箱即用
- XFCE 资源占用约 350MB，GNOME 约 800MB~1.2GB
  16GB 内存需同时承载 GUI + Agent 容器，桌面必须轻量

---

## 三、部署流程

### Step 0 — 备份与恢复路径确认

```powershell
# 若启用了 BitLocker，记录 48 位恢复密钥
manage-bde -protectors -get C:
```

- 备份 C/D 盘重要数据到外置硬盘
- 确认另一台 Windows 电脑可访问微软 Media Creation Tool

### Step 1 — Live USB 试跑（必做）

用于提前暴露"装完才发现没网卡/没声音"类问题。

1. 下载 `ubuntu-24.04.x-desktop-amd64.iso`（约 5.7GB）
2. 使用 **Rufus** 写入 U 盘：
   - 分区类型：**GPT**
   - 目标系统：**UEFI（非 CSM）**
   - 文件系统：**ext4**
3. 开机 **F12** 选择 U 盘启动
   - 若 U 盘未出现在 F12 列表，进入 F2 BIOS 检查 `Boot` 中 USB 是否被禁用
4. 进入「试用 Ubuntu」，逐项验证：

| 验证项 | 方法 | 期望结果 |
| --- | --- | --- |
| 无线网卡 | 右上角扫描并连接 WiFi | `iwlwifi` 正常加载 |
| 网卡 / USB | 插入外接网卡、USB 网卡、U 盘 | 均可被 `lsusb` 识别 |
| 声音 | 播放音频 + 录制麦克风 | 扬声器与麦克风均正常 |
| 屏幕 / 亮度 | 调节亮度，测试 Fn 快捷键 | 显示与键盘布局正常 |
| 摄像头 | 打开 Cheese 预览画面 | 画面正常 |
| 电池 | `ls /sys/class/power_supply/` | BAT0 存在且可读容量 |
| TPM | `cat /sys/class/tpm/tpm0/device/description` | 设备节点存在 |

> **重点验证「网卡 / USB」与「电池」两项。** 这两项在试用环境通不过，
> 安装后必然需要返工。

### Step 2 — 正式分区

在 Live 环境执行 `erase disk`（清空整盘）后手动分区：

| 序号 | 大小 | 类型 | 挂载点 | 说明 |
| --- | --- | --- | --- | --- |
| 1 | 1 GB | FAT32 | `/boot/efi` | ESP，存放 shim + GRUB |
| 2 | 8 GB | swap | — | Docker 编译、内存溢出兜底 |
| 3 | 60 GB | ext4 | `/var/lib/docker` | 容器镜像隔离区 |
| 4 | 剩余全部 | ext4 | `/` | 根分区 |

> **为何单独划出 `/var/lib/docker`：** Agent 反复 `docker pull` 拉取镜像
> 是最容易撑爆磁盘的操作。独立分区后，重建/清理镜像不会波及根分区，
> 避免服务器因磁盘写满而服务中断。

- 文件系统统一 **ext4**
- 原有 47.7GB 未分配空间会并入最后一个分区
- **不建议**首装就启用 LUKS 全盘加密：安装器图形界面不支持，
  需改用手动加密分区流程，复杂度与启动失败风险显著上升。
  待方案跑通并稳定运行后再评估。

### Step 3 — 装后必做的 6 项配置

#### ① 安装 XFCE 桌面

```bash
sudo apt update
sudo apt install -y xubuntu-desktop
```

`xubuntu-desktop` 为官方维护的 Ubuntu + XFCE 桌面环境。
若需更精简的环境，可改装 `sudo apt install -y task-xfce-desktop`。

#### ② 永久禁止休眠与待机

```bash
sudo systemctl mask sleep suspend hibernate suspend-then-hibernate

sudo sed -i \
  -e 's/^#\?HandleLidSwitch=.*/HandleLidSwitch=ignore/' \
  -e 's/^#\?HandlePowerButton=.*/HandlePowerButton=ignore/' \
  /etc/systemd/logind.conf

sudo systemctl restart systemd-logind
```

#### ③ 电池充电限流（长期插电的鼓包防护）

```bash
sudo apt install -y tlp tlp-rdw

# 探测华为机型是否在 ACPI 暴露充电阈值接口
ls /sys/class/power_supply/BAT0/ | grep -i threshold
```

多数华为机型**不暴露该接口**（输出为空）。应对策略：

1. `tlp` 配置中设置 `START_CHARGE_THRESH_BAT0=40` / `STOP_CHARGE_THRESH_BAT0=60`
   （接口不存在时不生效，但无害）
2. 日常保持约 50% 电量插电
3. **每 2 周目视检查电池仓是否隆起，一旦鼓包立即断电停用**
4. 兜底手段：使用支持监控电流的智能插座，定期断电放空

> 电池鼓包是笔记本改作 7×24 服务器的头号硬件风险，优先级高于任何软件优化。

#### ④ UPS 与优雅关机

```bash
sudo apt install -y apcupsd
# 编辑 /etc/apcupsd/apcupsd.conf，将 UPSMODEL 改为实际型号
```

APC / 山特 600VA 级别约 200 元，足够覆盖本机约 65W 负载。
配置完成后，市电断开时系统会自动执行 `shutdown`。

#### ⑤ Tailscale 与 SSH 加固

```bash
# Tailscale：无需公网 IP、无需路由器端口映射
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

# 仅通过 tailnet 暴露 SSH（最省事的内网穿透方式）
sudo tailscale up --ssh
```

**Tailscale 即本方案中「内网透传」的答案。** 使用同一账号的 Windows 客户端
自动加入同一 tailnet，可直接通过 MagicDNS 名称访问本机，
完全规避公网 IP 与端口映射的暴露风险。

SSH 服务端加固：

```bash
sudo apt install -y openssh-server
```

编辑 `/etc/ssh/sshd_config`：

```text
PasswordAuthentication no
PermitRootLogin no
Port <非默认端口>
PubkeyAuthentication yes
```

```bash
sudo sshd -t && sudo systemctl restart ssh
```

- 关闭密码认证，仅允许密钥登录
- 建议在 `~/.ssh/authorized_keys` 中配置 `from=` 限制来源地址
- 配合 `tailscale up --ssh` 时，SSH 仅监听 tailnet 接口，边界最小

#### ⑥ 硬件监控与告警

```bash
sudo apt install -y smartmontools lm-sensors
```

- 通过 systemd timer 每周执行 `smartctl -a /dev/nvme0`，检查 NVMe 健康度与温度
- CPU 温度阈值告警（建议 80℃）
- 摆放方式：**开放式或竖立，禁止密闭柜内积尘**
  灰尘是消费级笔记本长期高负载运行的主要失效诱因

---

## 四、拓扑结构

```mermaid
graph LR
    W["Windows 电脑<br/>(主要操作终端)"] -->|"Tailscale tailnet<br/>加密直连"| S["MateBook D 14<br/>Ubuntu 24.04 + XFCE"]
    S --> A["Agent 运行环境<br/>(Docker / Node / Python)"]
    S --> U["UPS 监控<br/>apcupsd 优雅关机"]
    S --> M["NVMe 健康监控<br/>smartmontools"]
```

内网访问路径：`Windows → Tailscale 客户端 → tailnet 虚拟网卡 → Ubuntu`
全程加密，**不经过任何公网中转服务器**。

---

## 五、预期问题与处理

| 问题 | 原因 | 处理方式 |
| --- | --- | --- |
| 无线偶发断流 | CNViO2 省电策略 | 关闭无线省电：`iw dev wlan0 set power_save off` |
| 麦克风无法识别 | SOF 音频拓扑 | GRUB 加 `snd_hda_intel.dmic_detect=0` |
| 扬声器功放异常 | 智能功放拓扑 | 安装对应 UCM 补丁 |
| 指纹不可用 | Goodix 驱动支持有限 | 预期内，服务器场景不依赖 |
| 键盘摄像头无法弹出 | 电机控制依赖 Windows 管家 | 预期内，不影响使用 |
| 容器写入缓慢 | 未启用 overlayfs 存储驱动 | `/etc/docker/daemon.json` 配置 `storage-driver: overlay2` |
| 电池健康度衰减 | 长期满电插电 | 见 Step 3-③ |

---

## 六、后续规划（可选加固）

1. **LUKS 全盘加密 + TPM 自动解锁**
   利用现有 TPM 2.0 实现「磁盘全加密 + 重启自动解锁」，
   兼顾数据安全与无人值守启动。待基础方案稳定后实施。
2. **systemd-boot 替代 GRUB**
   缩短启动时间，提升引导过程可控性。
3. **远程图形访问**
   若需 GUI 介入，选用 `xrdp` + XFCE（Xorg 方案）；
   **不建议使用 Wayland 远程桌面**，兼容性问题较多。
4. **监控与告警外发**
   将温度、磁盘健康、UPS 状态接入统一告警通道。

---

## 七、方案要点速查

- 全盘安装，放弃双系统，保证 7×24 可用性
- 不装 NVIDIA 驱动，纯 Intel 核显 + CPU，黑名单 nouveau
- XFCE 轻量桌面，资源占用约 350MB
- `/var/lib/docker` 独立分区，防止镜像撑爆根分区
- Tailscale 实现零配置内网穿透，无需公网 IP
- 电池限流 + UPS 是长期运行的两个必备硬件措施
- 先 Live USB 试跑验证，再正式安装
