Linux 系统的 NAS 之路——容器与虚拟机
tags: NAS, LinuxLinux 系统的 NAS 之路——容器与虚拟机
目前常见的容器方案有两种:Docker 和 Podman。两者的使用方法差不多,但在实际使用中,Docker 会遇到几个让人头疼的问题。
第一个是文件权限问题。Docker 的守护进程 dockerd 默认以 root 身份运行,容器里创建的文件经常变成 root 所有,导致其他程序没法访问。比如你的媒体文件夹被容器里的程序改成了 root 属主,Plex 或 Jellyfin 就读不到了。我试过改 UID、GID 这些办法,效果都不太理想。
第二个是安全与网络的问题。dockerd 在宿主机上有很高的权限,而且 Docker 容器默认会绕过宿主机防火墙规则——你在宿主机上配的 firewalld 或 iptables 规则对容器不起作用,想限制容器网络只能在外面再加一道防火墙。
因此,对于个人 NAS 系统,我更推荐用 Podman:
- 没有文件权限问题——Podman 默认以当前用户运行容器,创建的文件自然也归属当前用户,不存在权限被篡改的情况
- 不需要 root 权限——容器以普通用户身份运行,安全性好很多
- 不绕过防火墙——宿主机上的防火墙规则对 Podman 容器完全生效,网络管理更透明
- 直接用系统代理——不需要额外配置代理。不过有个小坑:如果你在开了代理的终端里执行 podman 命令,容器会继承终端的环境变量,导致容器内部的流量也被代理,可能引发奇怪的问题
至于自启动,Podman 也能借助 systemd 很方便地解决,后面会详细说。
Podman
Cockpit 安装 Podman
sudo dnf install cockpit-podman
也可以在图形界面中安装:

以前 cockpit 还有 docker 的插件,但现在已经停止维护了。不过可以安装第三方的 docker 插件。
Cockpit 的 Podman

插件主页中,可以看到正在运行的容器、pod 以及它们占用资源的情况。

pod 的使用方法
Podman 兼容 docker-compose 格式的编排文件。对于 immich 这类比较复杂的项目,直接用 podman-compose 就能启动。
cd immich
podman-compose up -d
如果需要升级版本:
podman-compose down
podman-compose pull
podman-compose up -d
先 down 再 pull 可以避免旧容器还在运行时拉取镜像导致冲突。其他用法跟 Docker 差不多,熟悉 Docker 的话很快就能上手。
Pod 自启动
之前在 systemd 那篇文章里讲过用户级 systemd 的用法,借助它就能实现容器自启动。
下面是一个 immich.service 文件模板:
[Unit]
Description=immich
After=network-online.target
[Service]
Type=forking
WorkingDirectory=/path/to/immich
ExecStart=/usr/bin/podman-compose up -d
ExecStop=/usr/bin/podman-compose stop
TimeoutStopSec=30
[Install]
WantedBy=default.target
把这个文件放到 ~/.config/systemd/user/ 目录下:
systemctl --user daemon-reload
systemctl --user enable immich
这样 immich 就会随系统自动启动了。不同的服务,改一下文件名、WorkingDirectory 和 Description 就行。
注意 ExecStart 用的是 up -d 而不是 start。up -d 的好处是:如果没有新版镜像就直接启动容器;如果发现镜像有更新,它会自动拉取并重建容器,更加灵活。
虚拟机
Cockpit 原生支持虚拟机管理。功能没有 PVE 那么丰富,但基本的控制、硬件直通这些还是有的,做一个轻量的虚拟机管理面板够用了。
虽然功能不够丰富,但 BUG 还是丰富的——只能说需求不高的人用起来还行。
安装

在 Cockpit 的应用程序页面中找到虚拟机插件,点击安装即可。
网络
安装虚拟机插件的时候会自带一个 NAT 网络,我觉得没啥用就删掉了。
建议参考之前网络那篇文章创建一个桥接网络备用。
❯ ip a
......
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr2s0 state UP group default qlen 1000
link/ether a0:36:90:35:c0:08 brd ff:ff:ff:ff:ff:ff
altname enxa0369035c008
4: vmbr2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether a0:36:90:35:c0:08 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.111/24 brd 10.0.0.255 scope global dynamic noprefixroute vmbr2s0
valid_lft 583321sec preferred_lft 583321sec
......
可以看到桥接接口 vmbr2s0 的 IP 地址(比如我这里的是 10.0.0.111),记下这个接口名,后面创建虚拟机时把网络选成它就行。
创建虚拟机

点击创建虚拟机后,会弹出配置窗口,填写虚拟机名称、选择安装镜像等。
有一个小坑:安装源这个选项有时候点了没生效。如果发现没生效,在后续编辑页面里重新指定一下镜像路径就可以了。
其他设置按需调整——CPU、内存、磁盘大小这些,根据自己的需求来。网络接口记得选之前创建的桥接网络(比如 vmbr2s0),这样虚拟机就能跟宿主机在同一个网段了。
确认无误后点击开始安装,就像装普通系统一样完成虚拟机系统的安装。
其他功能
Cockpit 面板还支持硬件直通、快照、文件共享等功能,可以在使用过程中慢慢摸索。
总的来说,Cockpit 的虚拟机功能虽然不如 PVE 那么专业,但胜在简单——图形界面就能完成创建和配置,不需要额外搭建管理平台。对于只想跑一两个轻量虚拟机的 NAS 用户来说,完全够用了。