增加debian开机磁盘挂载以及docker安全启动方案
This commit is contained in:
@@ -0,0 +1,170 @@
|
|||||||
|
# Debian 服务器核心配置指南:磁盘阵列与 Docker 安全启动
|
||||||
|
|
||||||
|
本文档旨在规范 Debian 服务器的底层存储挂载与容器服务启动流程,确保数据持久化安全及服务在系统异常恢复后的自动接管能力。
|
||||||
|
|
||||||
|
## 1 核心流程
|
||||||
|
挂载磁盘阵列
|
||||||
|
|
|
||||||
|
↓
|
||||||
|
超过30秒后直接进系统
|
||||||
|
|
|
||||||
|
↓
|
||||||
|
docker.service
|
||||||
|
|
|
||||||
|
↓
|
||||||
|
Requires
|
||||||
|
|
|
||||||
|
↓
|
||||||
|
docker-mount-guard.service
|
||||||
|
|
|
||||||
|
↓
|
||||||
|
检查挂载
|
||||||
|
|
|
||||||
|
↓
|
||||||
|
成功
|
||||||
|
|
|
||||||
|
↓
|
||||||
|
Docker启动
|
||||||
|
|
||||||
|
|
||||||
|
## 2 磁盘阵列挂载配置
|
||||||
|
|
||||||
|
为防止系统启动时因阵列未就绪导致进入紧急模式(Emergency Mode),必须采用 `nofail` 参数并正确配置文件系统类型。
|
||||||
|
|
||||||
|
### 2.1 确认阵列设备信息
|
||||||
|
在修改配置前,务必确认阵列的 UUID 及文件系统类型,避免使用 `/dev/sdX` 等易变设备名。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看阵列 UUID 及文件系统类型
|
||||||
|
sudo blkid /dev/md0
|
||||||
|
# 输出示例: /dev/md0: UUID="a1b2c3d4-..." TYPE="ext4"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 编辑挂载配置
|
||||||
|
编辑 `/etc/fstab` 文件,添加阵列挂载项。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/fstab
|
||||||
|
```
|
||||||
|
|
||||||
|
在文件末尾添加以下配置:
|
||||||
|
|
||||||
|
```text
|
||||||
|
# Disk Array Mount Configuration
|
||||||
|
UUID=a1b2c3d4-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data ext4 defaults,nofail,x-systemd.device-timeout=30s 0 2
|
||||||
|
```
|
||||||
|
|
||||||
|
**关键参数说明:**
|
||||||
|
- `nofail`:**核心安全参数**。若阵列初始化失败或设备不存在,系统将跳过该挂载点继续启动,而非直接进入紧急模式。
|
||||||
|
- `x-systemd.device-timeout=30s`:设置 systemd 等待设备就绪的超时时间,防止因阵列初始化慢导致启动超时。
|
||||||
|
- `0 2`:禁用启动时自动检查(`0`),或设置为非根分区检查顺序(`2`),避免阵列过大导致启动阻塞。
|
||||||
|
|
||||||
|
### 2.3 验证配置
|
||||||
|
**切勿直接重启**,必须先验证配置语法及挂载可用性。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 验证 fstab 语法是否正确
|
||||||
|
sudo findmnt --verify --verbose
|
||||||
|
|
||||||
|
# 尝试重新挂载所有 fstab 条目(不中断当前会话)
|
||||||
|
sudo mount -a
|
||||||
|
```
|
||||||
|
|
||||||
|
> **注意**:若 `mount -a` 报错,请立即检查并修正 `/etc/fstab`,确认无误后方可重启。
|
||||||
|
|
||||||
|
## 3 开机 Docker 检查启动机制
|
||||||
|
|
||||||
|
为确保 Docker 服务在系统恢复后能自动拉起,并具备健康检查能力,需配置 Systemd 依赖与重启策略。
|
||||||
|
|
||||||
|
### 3.1 第一步:创建“安检脚本”
|
||||||
|
写个简单的 bash 脚本,专门检查你关心的那几个挂载点(/mnt/a1-files 等)。只要有一个没挂载,就报错退出。
|
||||||
|
```bash
|
||||||
|
sudo nano /usr/local/bin/check-docker-mounts.sh
|
||||||
|
```
|
||||||
|
把下面这段代码复制进去:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# 定义需要检查的挂载点数组(包含你所有的阵列盘)
|
||||||
|
MOUNTS=(
|
||||||
|
"/mnt/a1-files"
|
||||||
|
"/mnt/a2-temp"
|
||||||
|
"/mnt/b1-variety"
|
||||||
|
"/mnt/c1-music"
|
||||||
|
"/mnt/c2-history"
|
||||||
|
"/mnt/c3-movie"
|
||||||
|
"/mnt/d1-tv-cn"
|
||||||
|
"/mnt/d2-manga"
|
||||||
|
"/mnt/d3-tv-jk"
|
||||||
|
)
|
||||||
|
|
||||||
|
for mnt in "${MOUNTS[@]}"; do
|
||||||
|
# 检查该路径是否是一个真正的挂载点
|
||||||
|
if ! mountpoint -q "$mnt"; then
|
||||||
|
echo "错误:挂载点 $mnt 未就绪!阻止 Docker 启动。"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "所有关键挂载点检查通过,允许 Docker 启动。"
|
||||||
|
exit 0
|
||||||
|
```
|
||||||
|
保存退出后,给它加上可执行权限:
|
||||||
|
```bash
|
||||||
|
sudo chmod +x /usr/local/bin/check-docker-mounts.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 第二步:创建一个 systemd 服务来“拦截” Docker
|
||||||
|
我们要让系统在执行 Docker 之前,必须先跑一遍这个脚本。
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/systemd/system/docker-mount-guard.service
|
||||||
|
```
|
||||||
|
把下面这段代码复制进去:
|
||||||
|
```bash
|
||||||
|
[Unit]
|
||||||
|
Description=Check Mount Points Before Docker Starts
|
||||||
|
Before=docker.service
|
||||||
|
RequiresMountsFor=/mnt/a1-files /mnt/a2-temp /mnt/b1-variety /mnt/c1-music /mnt/c2-history /mnt/c3-movie /mnt/d1-tv-cn /mnt/d2-manga /mnt/d3-tv-jk
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/local/bin/check-docker-mounts.sh
|
||||||
|
RemainAfterExit=yes
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
保存退出。
|
||||||
|
### 3.3 第三步:让配置生效
|
||||||
|
```bash
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable docker-mount-guard.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.4 第四步:给 Docker 加上强依赖
|
||||||
|
使用 tee 命令直接强行创建并写入这个文件,最暴力、最稳妥!
|
||||||
|
直接把下面这一整段复制到终端里敲回车:
|
||||||
|
```ash
|
||||||
|
sudo mkdir -p /etc/systemd/system/docker.service.d
|
||||||
|
sudo tee /etc/systemd/system/docker.service.d/override.conf > /dev/null << 'EOF'
|
||||||
|
[Unit]
|
||||||
|
Requires=docker-mount-guard.service
|
||||||
|
After=docker-mount-guard.service
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
敲完之后,再敲一下这个让它生效:
|
||||||
|
```bash
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
```
|
||||||
|
怎么验证它真的生效了?
|
||||||
|
直接看 systemd 的“最终合并结果”。你敲一下这个命令:
|
||||||
|
```bash
|
||||||
|
systemctl cat docker
|
||||||
|
```
|
||||||
|
这个命令会把 Docker 的原始配置和你刚才写的 override 配置拼在一起显示出来。
|
||||||
|
你拉到最下面,一定会看到类似这样的输出:
|
||||||
|
```
|
||||||
|
[Unit]
|
||||||
|
Requires=docker-mount-guard.service
|
||||||
|
After=docker-mount-guard.service
|
||||||
|
```
|
||||||
|
只要看到这段,就说明配置 100% 完美生效了!
|
||||||
Reference in New Issue
Block a user