从零开始的小主机折腾记#2

续上一章:Docker 相关事项补充

上一章中关于 Docker 的内容相对偏多,如果对 Docker 还不太熟悉,可以先用下面这个最简单的验证与补救方法。

在终端中输入:

docker -v
sudo apt install "xxx"

此时只需要将提示中的整行命令复制并执行即可完成安装。

这种方式虽然不是官方推荐的安装路径,但对于只是想快速用起来、验证环境是否可用的用户来说已经足够,后续也不影响正常使用 Docker。

确认能够正常输出版本号后,就可以继续进行后面的 Docker 容器部署内容了。

(可选)在有多块硬盘的情况下,格式化硬盘并挂载

下面按实际可操作流程说明:在 Linux / Ubuntu Server 下,多块硬盘如何识别 → 格式化 → 挂载。不涉及 GUI,适合服务器环境。


一、识别所有硬盘与分区(非常重要)

先确认 哪块盘是哪块盘,避免误操作。

lsblk

常见输出示例:

NAME   SIZE TYPE MOUNTPOINT
sda    256G disk
├─sda1 512M part /boot/efi
├─sda2 1G   part /boot
└─sda3 254G part /
sdb    4T   disk
sdc    8T   disk

说明:

如果想看得更清楚(型号、接口):

sudo lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL

二、给硬盘分区(新盘 / 空盘)

如果整块盘打算只用一个分区,可直接全盘一个分区

以 /dev/sdb 为例(请自行替换):

sudo fdisk /dev/sdb

常用操作流程:

  1. g → 创建 GPT 分区表(大于 2TB 必须)
  2. n → 新建分区
    • 分区号:回车
    • 起始扇区:回车
    • 结束扇区:回车(使用整块盘)
  3. w → 写入并退出

完成后刷新分区表:

sudo partprobe

确认分区生成(例如 /dev/sdb1):

lsblk

三、格式化分区(推荐 ext4)

以 /dev/sdb1 为例:

sudo mkfs.ext4 /dev/sdb1

常见可选格式:

⚠️ 格式化会清空数据,确认设备名无误再执行


四、创建挂载目录

建议统一放在 /mnt 或 /data 下,例如:

sudo mkdir -p /data/disk1

五、临时挂载(立即生效,重启失效)

sudo mount /dev/sdb1 /data/disk1

验证:

df -h

如果能看到 /data/disk1,说明挂载成功。


第六步:配置 /etc/fstab(永久挂载)

1️⃣ 获取 sdb1 的 UUID(必须)

sudo blkid /dev/sdb1

你会看到类似输出:

/dev/sdb1: UUID="1234abcd-5678-efgh-90ab-cdef12345678" TYPE="ext4"

👉 把这个 UUID 原样复制下来,下面要用。


2️⃣ 规划挂载点(推荐方案)

为了后续 Docker / 下载数据结构清晰,我建议你这样规划:

你说的“文件夹”,在 Linux 里叫 目录(directory),和 Windows 的文件夹是同一个概念,你可以完全按“文件夹”来理解。

先创建挂载点:

sudo mkdir -p /data

3️⃣ 编辑 /etc/fstab

sudo nano /etc/fstab

在文件最后一行加入:

UUID=1234abcd-5678-efgh-90ab-cdef12345678  /data  ext4  defaults,noatime  0  2

⚠️ 注意:

参数解释(给你吃个定心丸):


4️⃣ 验证 fstab(这一步不能跳过)

sudo mount -a

确认是否挂载成功:

df -h

你应该能看到类似:

/dev/sdb1   458G  ...  /data

到这里,硬盘已经安全、永久挂载完成。


第七步:在数据盘内创建“文件夹”(目录)

现在你要做的只是在 /data 里建目录,不涉及 Docker 本身。

1️⃣ 创建 Docker 数据目录

sudo mkdir -p /data/docker

你可以理解为:

“在大容量盘里新建一个文件夹,专门给 Docker 放下载内容用”


2️⃣ 设置目录权限(非常关键)

为了以后 Docker、qB、普通用户都不折腾权限,先把所有权交给你当前用户:

sudo chown -R $USER:$USER /data

验证:

ls -ld /data /data/docker

应显示为你的用户名。


到目前为止,你已经完成了什么?

✔ sdb 整盘作为一个大容量数据盘
✔ 永久挂载到 /data
✔ 结构清晰、不会影响系统盘
✔ 为 Docker 留好了专用目录但未动 Docker 本身
✔ 重启不丢、不炸、不进 emergency mode

(可选)进一步配置(机械)硬盘(——自动启停)

因为机械盘一直响会比较吵,我们得想个办法让它不那么吵。

最安全、最推荐的方法:hdparm 省电策略

1️⃣ 临时测试(立刻生效,重启失效)

sudo hdparm -B 127 -S 120 /dev/sdb

含义:

-S 的单位是特殊编码:
120 × 5 秒 = 600 秒 = 10 分钟

如果你发现:

说明这个方案适合你。


2️⃣ 写成永久规则(推荐)

安装 udev 规则支持:

sudo apt install -y hdparm

编辑配置:

sudo nano /etc/hdparm.conf

在末尾添加:

/dev/sdb {
    apm = 127
    spindown_time = 120
}

保存后重启,或手动应用:

sudo systemctl restart udev

Docker 日志设置

1️⃣ Docker 默认日志行为

2️⃣ 最小侵入的优化(不动容器)

创建 / 修改 Docker 配置:

sudo nano /etc/docker/daemon.json

写入:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "1"
  }
}

然后:

sudo systemctl restart docker

这会:

初步使用docker(qBittorrent)

那么目前所有准备工作都已完毕,我们可以开始正式使用docker了。

让我们先来部署一个qBittorrent练练手。

目标:

✔ 使用 Docker 部署 qBittorrent
✔ Docker 运行仍在 sda
✔ 下载数据存放在 /data(机械盘 sdb)
✔ 尽量减少机械盘噪音
✔ 方案稳、清晰、可回滚

一、整体结构(先建立正确认知)

你最终会得到这样的结构:

/data
├── qb
│   ├── config        ← qB 配置(小量写入)
│   ├── downloads     ← 已完成下载(机械盘)
│   ├── incomplete   ← 未完成下载(可选:后面可迁移)

二、创建目录(只做一次)

sudo mkdir -p /data/qb/{config,downloads,incomplete}
sudo chown -R $USER:$USER /data/qb

你可以把它理解为:
“在大容量盘里新建一个 qb 文件夹,里面再分三个子文件夹”


三、选择镜像(稳定、主流)

这里我明确推荐 LinuxServer 团队的镜像:

lscr.io/linuxserver/qbittorrent

理由:


四、部署方式(推荐 docker compose)

1️⃣ 新建 compose 文件

mkdir -p ~/docker/qbittorrent
cd ~/docker/qbittorrent
nano docker-compose.yml

2️⃣ 写入以下内容(可直接复制)

version: "3.8"
services:
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
      - WEBUI_PORT=8080
    volumes:
      - /data/qb/config:/config
      - /data/qb/downloads:/downloads
      - /data/qb/incomplete:/incomplete
    ports:
      - 8080:8080
      - 6881:6881
      - 6881:6881/udp
    restart: unless-stopped

3️⃣ 关键参数解释(重要)


五、启动 qBittorrent

docker compose up -d

查看状态:

docker ps

六、访问 Web UI

浏览器访问:

http://服务器IP:8080

默认账号密码(第一次)

docker logs qbittorrent | grep password

登录后第一件事建议改密码。


七、关键配置(直接关系到“吵不吵”)

进入 Web UI → 设置

1️⃣ 下载目录(确认)


2️⃣ 降低磁盘噪音(非常重要)

✅ 启用内存缓存
❌ 不要勾选

3️⃣ 文件预分配

👉 机械盘友好,避免长时间“狂响”


八、验证:机械盘是否还在“乱响”

1️⃣ 观察 IO

sudo iotop -o

2️⃣ 查看是否能休眠

sudo hdparm -C /dev/sdb

理想状态:


注意事项:

如果你像我一样遇到这样的报错:

WARN[0000] /home/lluosu/docker/qbittorrent/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion

unable to get image 'lscr.io/linuxserver/qbittorrent:latest': permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.51/images/lscr.io/linuxserver/qbittorrent:latest/json": dial unix /var/run/docker.sock: connect: permission denied

别担心,让我们分析一下

一、version is obsolete ——只是警告,不是错误

the attribute `version` is obsolete, it will be ignored
这句话是什么意思?

处理方式(可选,但建议)

编辑你的 docker-compose.yml:

nano /home/lluosu/docker/qbittorrent/docker-compose.yml

把这一行删掉即可:

version: "3.8"

删不删都不影响运行,只是让文件更“干净”。


二、真正的问题:Docker 权限不足(核心问题)

错误原文
permission denied while trying to connect to the Docker daemon socket
connect: permission denied
这句话的准确含义是:

当前用户 lluosu 没有权限访问 Docker 守护进程

也就是说:


三、最直接的验证方式(你可以先看一眼)

groups

如果输出里 没有 docker,那就是原因。


四、修复方案(推荐做法)

1️⃣ 把当前用户加入 docker 组
sudo usermod -aG docker $USER

⚠️ 注意:


2️⃣ 让权限立刻生效(二选一)
✅ 方式 A(推荐,最干净)

重新登录 SSH / 重新开一个终端

然后再试:

cd ~/docker/qbittorrent
docker ps

如果不报错,说明成功。


⚠️ 方式 B(临时生效,不如 A 干净)
newgrp docker

这个会:


五、验证 Docker 是否可用(必须)

docker version
docker ps

只要不再出现 permission denied,就说明问题解决。


六、重新启动 qB 容器

回到 qB 目录:

cd /home/lluosu/docker/qbittorrent
docker compose up -d

然后检查:

docker ps

你应该能看到:

qbittorrent   lscr.io/linuxserver/qbittorrent   Up ...

七、如果你现在就想“先跑起来”(不推荐长期)

你也可以用 sudo 直接跑(不建议作为习惯):

sudo docker compose up -d

这只是为了验证环境,不是最终方案。


八、一句话总结

✔ 只是 Linux 权限模型在起作用
✔ 加入 docker 组即可
✔ 属于“第一次用 Docker 必踩坑”