Openmediavault 的安装与配置

获取系统镜像、制作启动 U 盘

目前,Openmediavault 有基于 Debian 10 的 5.X 和基于 Debian 11 的 6.X 两个现役的大版本,我们这里选择较新的后者。打开 OMV 官方网站的下载页,下载 Stable 版本的 ISO 镜像,完成后用 SHA265 校验一下文件的完整性。我这里镜像的版本是 6.0.24

使用 rufus 或者类似工具,将 ISO 文件烧入 U 盘。我这里使用 UEFI 启动,分区类型选择 GPT;烧录时会提示选择 ISO 还是 DD 模式,推荐选择速度更快的 DD 模式。

安装系统

将服务器插上网线和电源,插入烧好镜像的 U 盘,开机选择 U 盘启动。随后会出现 OMV 的 LOGO 和启动选择项,选择 Install 回车进入安装程序:

  1. 选择语言:选择中文即可;
  2. 选择区域:中国;
  3. 选择键盘映射:汉语;
  4. 选择网络接口:选择插网线对应的接口;
  5. 主机名:默认即可;
  6. 域名:默认即可;
  7. root 用户密码和确认:推荐留空以禁用,不建议直接使用 root 用户;
  8. 设置初始用户全名和用户名:自定义,我这里取 ceba
  9. 设置初始用户密码和确认:自己设置;
  10. 提示多个磁盘驱动器:回车继续;
  11. 选择磁盘:选择用于安装系统的磁盘;
  12. 分区方案:选“是”,需要自己移动光标;
  13. 配置软件包管理器:不要选择“中国”,选择“手动输入信息”;
  14. Debian 仓库镜像主机名:这里推荐清华大学 TUNA,地址是 mirrors.tuna.tsinghua.edu.cn
  15. Debian 仓库镜像目录:对于清华大学 TUNA 源,默认即可;
  16. HTTP 代理信息:这里不需要,留空;
  17. 结束安装进程:回车选择继续,结束。

系统会自动重新启动,默认启动项应该会被自动修改为 Openmediavault。启动后会进入 Debian 的登陆界面,上面有提示当前服务器 IP 地址,可以用来访问 Web 管理界面。

PS:安装系统的时候需要外接显示器,但我手头并没有 DP 接口的显示器,只好找了条 DP 转 Type-C 的视频线接到便携屏上。另外,没得采集卡,所以没图。

初始化配置

打开浏览器,输入机器登陆界面看到的 IP,打开 Web 管理界面的登陆页面。这里也可以尝试输入 openmediavault.local(即之前设置的主机名+域名),如果网络环境合适也可以打开 Web 管理界面。

Web 管理界面的用户名是 admin,初始密码是 openmediavault,’’’不是’’’此前设置的 Debian 用户名和密码。输入用户密码后即可进入系统。

修改管理界面密码

点击右上角设置图标、“更改密码”,输入新的密码后点击保存。

修改网络配置

根据我家的网络环境,我需要把 IPv4 地址改为静态地址,并且启用 IPv6。点击左侧“网络”、“接口”,在右侧选中需要修改的接口。

然后点击编辑按钮,进入编辑界面:

  • IPv4:方式改为“静态”,地址、子网掩码、网关根据需要填写;
  • IPv6:方式改为“自动”。
  • DNS:根据需要填写,我这里填写网关地址。

填写完成后滑倒最下方,点击“保存”。随后页面上方会弹出黄色框,提示需要应用设置,点击右侧对勾图标,勾选“确认”后点击“是”按钮。随后网络配置会立即应用,大概率会卡在“正在应用”界面,需要重新输入地址进入 Web 管理界面。

PS:OMV 的几乎所有配置都需要二次确认应用。请在操作后稍等一会儿,看看会不会弹出黄色提示框。

设置时区

点击左侧“系统”、“时间和日期”,在“时区”一栏选择 Asia/Shanghai。点击保存,二次确认应用。

设置自动登出时间

OMV 默认的自动登出时间是 5 分钟,可以调长一些。点击左侧“系统”、“工作台”,在“自动登出”一栏选择希望的时间,例如 60 分钟。点击保存,二次确认应用。

进阶配置

之后不少工作需要 ssh 到服务器进行,请准备一个 ssh 客户端。我这里使用 Windows Terminal 通过 Powershell 或者 WSL 登录。

配置 ssh 用户

要通过 ssh 连接到服务器,需要将用户放入 ssh 用户组才可使用 ssh 登录。

点击左侧“用户”、“用户”,选中安装时创建的初始用户,点击“编辑”图标。

点击“用户组”一行,在 ssh 处打勾,在最下方点击“保存”按钮,二次确认应用修改。

随后就可以尝试用 ssh 登陆了。

通过 ssh 登录

在终端中,输入下面的命令通过 ssh 登录服务器,其中 <your_user_name> 是初始用户名、<your_nas_ip> 是服务器 IP 地址:

1
ssh <your_user_name>@<your_nas_ip>

通过下面的命令将公钥拷贝到服务器,则可以免密码登录服务器:

1
ssh-copy-id <your_user_name>@<your_nas_ip>

调整 ssh 配置

点击左侧“服务”、“SSH”,取消“允许 root 登录”、“密码认证”,勾选“公钥认证”,以提升服务器安全性。

配置 OMV 源

清华大学 TUNA 源提供了 Openmediavault 的镜像,推荐使用它来增快下载速度。

通过 ssh 登录服务器后,执行下面的命令:

1
2
3
4
5
6
7
8
9
# 进入 root 用户
sudo su
# 设置 OMV 软件源环境变量
omv-env set OMV_APT_REPOSITORY_URL "https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/public"
omv-env set OMV_APT_ALT_REPOSITORY_URL "https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/packages"
omv-env set OMV_APT_KERNEL_BACKPORTS_REPOSITORY_URL "https://mirrors.tuna.tsinghua.edu.cn/debian"
omv-env set OMV_APT_SECURITY_REPOSITORY_URL "https://mirrors.tuna.tsinghua.edu.cn/debian-security"
# 使环境变量生效
omv-salt stage run all

使环境变量生效一步可能会耗费较长的时间(约 2 分钟),请耐心等待。之后可以手动检查 /etc/apt/source.list.d/ 目录下的几个文件,看软件源是否成功更改。

安装更新

点击左侧“系统”、“更新管理”、“更新”,首先点击“检测是否有更新”图标(图案是搜索),然后点击“安装更新”图标(图案是下载)、确认。

当然也可以用命令行完成这些工作:

1
2
apt update
apt upgrade

安装 OMV-Extras.org

OMV-Extras.org 是 OMV 的增强插件,后续部署 ZFS 和 Docker 都需要它。

安装 OMV-Extras 需要管理员权限,下面的操作都需要通过 sudo su 命令,在 root 用户下进行。

配置代理

OMV-Extras 安装需要访问 Github。考虑到我这里的网络环境,需要使用 HTTP 代理来保证安装顺利。

首先,配置好代理服务器,允许局域网连接。

SSH 到服务器,在主目录下新建 proxy.sh,内容如下:

1
2
3
4
5
6
7
8
9
10
export http_proxy="http://<your_proxy_ip>:<your_proxy_port>/"
export https_proxy="http://<your_proxy_ip>:<your_proxy_port>/"
export ftp_proxy="http://<your_proxy_ip>:<your_proxy_port>/"
export no_proxy="127.0.0.1,localhost"

# For curl
export HTTP_PROXY="http://<your_proxy_ip>:<your_proxy_port>/"
export HTTPS_PROXY="http://<your_proxy_ip>:<your_proxy_port>/"
export FTP_PROXY="http://<your_proxy_ip>:<your_proxy_port>/"
export NO_PROXY="127.0.0.1,localhost"

运行下面的命令,让代理生效:

1
source proxy.sh

然后测试一下代理是否能够正常连接,如果能看到正在连接代理服务器的相关输出,则说明代理正常。

1
wget https://github.co

PS:这个方法是用来临时使用代理的,退出登陆后代理设置就失效了。也可以用 OMV 的 Web 管理界面设置代理,但我折腾半天发现没这个方便。

安装

执行下面的命令:

1
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | bash

打开 OMV 的 Web 管理界面,按下 Ctrl + Shift + R 或者 Ctrl + F5 强制刷新页面缓存。然后可以在左侧“系统”菜单下看到“omv-extras”项,说明安装成功。

PS:强制刷新 Web 管理界面是常规操作,能解决很多奇怪问题。

设置 OMV-Extras 的镜像

OMV-Extras 引入了一些新的软件源,我们同样可以将之换成清华大学 TUNA 源来加快下载速度。

通过 ssh 登录服务器后,执行下面的命令:

1
2
3
4
5
6
7
8
# 进入 root 用户
sudo su
# 设置 OMV 软件源环境变量
omv-env set OMV_EXTRAS_APT_REPOSITORY_URL "https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/openmediavault-plugin-developers"
omv-env set OMV_DOCKER_APT_REPOSITORY_URL "https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian"
omv-env set OMV_PROXMOX_APT_REPOSITORY_URL "https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian"
# 使环境变量生效
omv-salt stage run all

和之前相同,使环境变量生效一步可能会耗费较长的时间(约 2 分钟),请耐心等待。同样可以手动检查 /etc/apt/source.list.d/ 目录下的几个文件,看软件源是否成功更改。

结语

OK,OMV 的基本安装和配置算是告一段落了,可以说是非常麻烦。接下来,我会在 OMV 上部署 ZFS 文件系统,然后用 Docker 部署 qBittorrent,让 NAS 正式工作起来。

Openmediavault 部署 ZFS 文件系统

替换 Proxmox 内核

Proxmox 内核(即 pve 内核)对 ZFS 文件系统的支持要更好。要使用 ZFS 文件系统,首先需要将 Debian 内核替换为 Proxmox 内核。

PS:踩的坑之一,不换 Proxmox 内核,ZFS 跑不起来……

安装 openmediavault-kernel 插件

登录 OMV 的 Web 管理界面,点击左侧“系统”、“插件”,在右侧搜索“proxmox”即可找到 openmediavault-kernel 插件。选中 openmediavault-kernel,点击“安装”按钮,确认安装。

安装完成后,按下 Ctrl + Shift + R 或者 Ctrl + F5 强制刷新页面缓存,然后可以在左侧“系统”菜单下看到“内核”项。

安装 Proxmox 内核

点击左侧“系统”、“内核”,点击右侧“Proxmox”图标,选择“安装 Proxmox 内核”一项,开始安装进程。

安装完成后,刷新页面,可以看到 pve 内核已是默认。

点击右上角电源图标,重启系统。如果能够正常进入系统,就可以移除常规内核了。

清理其他内核

点击左侧“系统”、“内核”,点击右侧“Proxmox”图标,选择“移除非 Proxmox 内核”一项,开始清理其他内核。

刷新页面后,可看到只有 pve 内核了。这里可以考虑再重启系统一次。

安装 ZFS 文件系统支持

禁用 backports 源

PS:踩的坑之二,不禁用 backports 源,ZFS 装不上……

点击左侧“系统”、“omv-extras”、“设置”,取消勾选“Backports”选项,点击保存,二次确认应用。

安装 openmediavault-zfs 插件

点击左侧“系统”、“插件“,在右侧搜索“zfs”即可找到 openmediavault-zfs 插件。选中 openmediavault-zfs,点击“安装”按钮,确认安装。

安装完成后,按下 Ctrl + Shift + R 或者 Ctrl + F5 强制刷新页面缓存,然后可以在左侧“存储器”菜单下看到“zfs”项。

创建 ZFS 存储池、数据集

ZFS 文件系统中,有存储池、数据集、卷等概念。存储池是一组磁盘构成的逻辑卷,多个磁盘组成软 RAID 阵列;数据集则相当于存储池的一个子文件夹,可更改的选项会比存储池更多,通常用它来存储数据。

擦除硬盘

创建存储池前需要先将磁盘擦除。登录 OMV 的 Web 管理界面,点击左侧“存储器”、“磁盘”,选中需要擦除的硬盘,点击“擦除”图标,二次确认擦除,选择“快速”模式即可。

重复上述步骤,将所有要放入 ZFS 存储池的磁盘都擦除。

创建存储池

点击左侧“存储器”、“zfs”、“池”,点击加号图标,选择“添加池”一项,进入创建存储池页面。

在创建存储池页面:

  • 名称:存储池的名称,根据个人喜好,我这里叫 main
  • 池类型:RAID 类型,通常根据磁盘数量选择,磁盘应当是同品牌、同型号、同大小的。我这里只有 2 块盘,所以选择“镜像”;
  • 设备:勾选上一步中擦除过的设备;
  • 挂载点:可以留空,系统会自动设置,也可以根据习惯自行设置;
  • 设备别名:“以 ID”,不要改;
  • 强制创建:磁盘大小不同时才需要,这里不勾选;
  • 设置ashift:注释都说了不要改;
  • 压缩:可以勾上,压缩类型选默认的“zf4”就好,不会占用太多资源。

点击“保存”按钮创建存储池,二次确认应用设置。可以看到存储池已经在列表中了,挂载点是 /main,可以用命令行访问这个目录看看。

创建数据集

OMV 里面,ZFS 的数据集被称作“文件系统”。点击左侧“存储器”、“zfs”、“池”,勾选刚刚创建的存储池,点击加号图标,选择“添加文件系统快照卷”选项。

PS:这里的“添加文件系统快照卷”指的是“添加文件系统、快照、卷”,并不存在某个东西叫“文件系统快照卷”……

在弹出的对话框里:

  • 类型:选择“文件系统”,即数据集;
  • 前缀:存储池的名称,不需要修改;
  • 名称:根据需要起名,我这里叫 test
  • 挂载点:同样可以留空。

点击“保存”按钮创建数据集,二次确认应用设置。可以看到数据卷已经在列表中了,挂载点是 /main/test,可以用命令行访问这个目录看看。

设置共享

设置好共享后,就可以在局域网内访问 NAS 上的存储空间了。我的主力机器是 Windows 的,这里主要介绍 SMB 协议的共享。

调整存储池 ACL 设置

ZFS 插件默认禁用了 ACL 权限控制,这会对之后共享文件夹的设置产生一定的影响,需要手动开启。

点击左侧“存储器”、“zfs”、“池”,选中之前创建的存储池,点击“特性”图标,进入特性页面。修改以下几个参数:

  • aclmode:改为 groupmask
  • aclinherit:确认为 restricted
  • acltype:改为 posix

上面这些修改都需要先选中修改项,再到上方点击“编辑”按钮,然后再手动输入值,保存。

新建用户

为了访问共享文件,我们需要创建一个新用户。点击左侧“用户”、“用户”,点击“新建|导入”图标,选择“创建”项。填入以下信息:

  • 用户名:自己选择一个用户名,这里使用 asdf
  • 密码:自己选择一个密码;
  • 用户组:留空即可,系统会自动加入 users 用户组。

点击保存,二次确认应用,即可看到新建的用户出现在列表之中。

设置共享文件夹和权限

点击左侧“存储器”、“共享文件夹”,点击“创建”图标。

在打开的页面中,设置如下参数:

  • 名称:共享文件夹的名称,可以和数据集保持一致;
  • 文件系统:选择之前创建的数据集;
  • 相对路径:选择共享文件夹本身,显示出来应当是 /
  • 权限:默认即可,或根据自己需要修改;

点击保存,二次确认应用,即可看到创建的共享文件夹出现于列表之中。

选中刚刚创建的共享文件夹,点击“访问控制列表”按钮,在进入的页面中:

  • 找到刚刚创建的 asdf 用户,将之权限改为“读/写”;
  • 将下方的所有者从root改为admin;
    • OMV 其他文件系统默认的所有者即是 admin,推荐手动调整一下;
  • 将用户组的权限改为“读/写/执行”;
  • 勾选下方的“取代”和“递归”选项。

点击保存即可。

设置 SMB 共享

点击左侧“服务”、“SMB”、“设置”,勾选“已启动”项。点击下方保存,二次确认应用,即可打开 SMB 服务。

点击左侧“服务”、“SMB”、“共享”,点击“创建”按钮,设置如下项:

  • 共享文件夹:选择刚才创建的共享文件夹;
  • 公开:选择“否”或者“允许访客”均可;
  • 勾选“继承ACL”、“继承权限”。

点击保存,二次确认应用,SMB 设置就 OK 了。

连接和测试

在本地机器上,打开 Windows 资源管理器,通过以下两种方法之一访问:

  • 打开“网络”文件夹,找到“OPENMEDIAVAULT”(安装时设置的主机名)项目,双击进入;
  • 在地址栏中输入 \\<your_nas_ip>(两个反斜杠 + IP地址),按回车进入。

随后会弹出窗口请求用户名和密码,输入此前创建的用户即可登录。

尝试复制文件到 NAS,或者从 NAS 复制文件,速度能够基本跑满千兆以太网。

结语

到这一步,NAS 算是达到一个可用的状态了,同样是非常麻烦。部署 ZFS 文件系统踩了巨大多的坑。

Openmediavault 通过 Docker 部署 qBittorrent

安装 Docker

点击左侧“系统”、“omv-extras”、“Docker”,点击“安装”按钮,开始安装进程。安装完成后,回到同一界面,应该能看到提示状态是“已安装、运行中”,版本号应当不低于 20.10.17。

如果发现版本号低于 20.10.17,请点击“移除”按钮,移除当前版本的 Docker。使用 ssh 连接到服务器,运行下面的命令安装 Docker:

1
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Docker Hub 镜像加速

推荐添加阿里云、中国科大的容器镜像,以加快 Docker Hub 上的镜像拉取速度。编辑 /etc/docker/daemon.json 这个文件,在其中添加如下一项:

1
"registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com/"]

修改后的文件形如:

1
2
3
4
{
"data-root": "/var/lib/docker",
"registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com/"]
}

然后重启 Docker 服务:

1
service docker restart

踩到的坑与捉到的虫

这段内容可以略过:)

我当初用上面的办法安装好 Docker 之后,发现我没有办法启动任何 Docker 容器,会报如下错误:

1
2
3
4
ceba@openmediavault:~$ sudo docker start portainer
Error response from daemon: AppArmor enabled on system but the docker-default profile could not be loaded: running `apparmor_parser apparmor_parser --version` failed with output:
error: exec: "apparmor_parser": executable file not found in $PATH
Error: failed to start containers: portainer

我寻找了许多材料、尝试了许多办法来解决这个问题,包括缺少安装 apparmor,但都无济于事。后来找到了这篇帖子,发现到我通过 OMV-Extras 插件安装的是一个巨大古老的 Docker 版本(v20.10.5)。于是根据帖子提示,手动执行了安装命令,终于解决了这一问题。

但我还是很好奇为啥会装上这么古老的 Docker。我检查了 OMV-Extras 安装 Docker 时的输出,发现这个家伙竟然是从 Debian 源安装 docker.io,而不是从 Docker 源安装 docker-ce,前者已经是上古时代的东西了。

我在 OMV-extras 的仓库翻了翻,发现了下面这段代码

1
2
3
4
5
6
7
8
9
10
11
setDockerPackages() 
{
if [[ "${arch}" == "i386" ]] || ! grep -q 'download.docker.com' ${omvextrasList}; then
# there is no i386 docker-ce package in the docker repos
# if docker repos are disabled, use debian repos as well
# use docker.io from Debian repo
dockerPackages="docker.io docker-compose ${dockerPackages}"
else
dockerPackages="docker-ce ${dockerPackages}"
fi
}

这段代码竟然直接根据源列表中是否含有 download.docker.com 这个字符串来决定 Docker 包名……我之前更换 OMV-extras 软件源的时候就修改了 Docker 的镜像仓库,清华 TUNA 源里显然并不包含 download.docker.com 这个字符串,于是 OMV-extras 就以为没有 Docker 源,选择了从 Debian 源安装。

真相大白,于是跑去写了个 Issue。很快啊,不到二十分钟,人家就修完提交了,顺带也把 Issue 关掉了。

现在大概是没有这个 bug 了。

部署 qBittorrent

我们使用 linuxserver 制作的 linuxserver/qbittorrent 镜像,使用 docker compose 部署。

通过 ssh 登入服务器,拉取 linuxserver/qbittorrent 镜像:

1
docker pull linuxserver/qbittorrent:4.4.1

然后在主目录下建立 qbittorrent 文件夹,在其中建立 docker-compose.yml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
version: "2.1"
services:
qbittorrent:
image: linuxserver/qbittorrent:4.4.1
container_name: qbittorrent
environment:
- PUID=998 # 数据卷所有者的 id
- PGID=100 # 数据卷所属用户组的 id
- TZ=Asia/Shanghai # 时区
- WEBUI_PORT=8080 # Web 界面端口,须和下方保持一致
volumes: # 数据卷挂载,帽号前面是宿主机,帽号后面是容器内
- /main/test/qbittorrent-config:/config # 配置文件目录,根据需要修改帽号前内容
- /main/test/downloads:/downloads # 下载文件目录,根据需要修改帽号前内容
ports:
- 8080:8080 # Web 界面端口,须和上方保持一致
- 26881:26881 # BT/PT 下载用通信端口,根据需要设置
- 26881:26881/udp # BT/PT 下载用通信端口,根据需要设置
restart: unless-stopped
network_mode: host # 网络模式,改为 host 模式

这里我们选择了 qBittorrent 的 4.4.1 版本,它是 linux 下最后一个使用 Qt5 的版本。随后的版本使用了 Qt 6.3.0,但这个版本的 Qt6 存在 bug 导致 RSS 订阅功能不可用。最新的 qBittorrent 4.4.3 尚未更换 Qt 版本,只能先用这个较老的版本凑活凑活了。

PUIDPGID 是用于解决挂载数据卷权限问题的两个环境变量,PUID 设为数据卷所有者的 id,PGID 设为数据卷所属用户组的 id。在这里,数据卷所有者之前已改为 admin,id 是 998;用户组是 users,id 是 100。可以通过 id user 命令来查看。

数据卷理论上可以挂载到任意位置,但通常都是会放在文件系统之中的,相对更加安全一些。这里就放在了 test 数据集下面的两个目录里。

网络模式强烈改为 host 模式,这样就会直接使用主机网卡,好处多多:可以直接使用 IPv6 地址,不用再碰 Docker 糟糕的 IPv6 支持;少过一层虚拟网卡,性能更好,连接性更优。PS:我当初找了一堆资料研究 Docker 怎么开 IPv6,后来发现用 host 模式直接解决了。

准备好 docker-compose.yml 文件后,在它所在的目录下(即 qbittorrent)运行下面的指令,启动编组:

1
docker compose up -d

然后就可以打开浏览器,访问 <your_nas_ip>:8080 来看看能否打开 qBittorrent 的界面啦。默认的登陆用户是 admin,密码是 adminadmin

登录进去之后就可以随便玩耍了,随便塞个新番的 BT 种子试试看。

修改 Hosts

考虑到网络环境,有必要给一些 BT、PT 网站手动设置 Hosts。/etc/hosts 这个文件是由 OMV 自动管理的,需要稍稍绕点弯路。

首先新建 /etc/hosts2 文件,里面填好需要设置的 Hosts 内容。然后再新建文件 /srv/salt/omv/deploy/hosts/20myentries.sls,内容如下:

1
2
3
4
append_custom_hosts:
file.append:
- name: "/etc/hosts"
- source: "/etc/hosts2"

随后运行 sudo omv-salt deploy run hosts 命令,即可使上面的设置生效。可以再次查看 /etc/hosts 文件,hosts2 的内容应该已经填充到其中了。

结语

在完成 qBittorrent 的部署之后,openmediavault 的折腾之旅算是告一段落了。本来还应该折腾折腾虚拟化,但实在使不想搞了。希望这几篇文章能给想要使用 OMV 的同学一些帮助,让大家少踩一些坑。