搬迁服务至 Proxmox LXC 的一些 tips

个人记录 Jellyfin、ZeroNet & i2p 的搬家,以 Ubuntu 为例。

Jellyfin

秉持着没事不要创建 Privileged Container 的原则,略复杂。

首先,在 host 上挂载你的 NAS。我这里使用的是 Synology,然后采用 NFS Share 的方式。

先创建一个目录用于挂载文件。

mkdir -p /mnt/lxc_shares/synology_multimedia

然后,将挂载相关信息写入 /etc/fstab

{ echo '' ; echo '# Mount CIFS share on demand with rwx permissions for use in LXCs ' ; echo '//SynologyIP/Multimedia /mnt/lxc_shares/synology_multimedia cifs _netdev,x-systemd.automount,noatime,uid=100000,gid=110000,dir_mode=0770,file_mode=0770,user=SynologyUsername,pass=SynologyPassword 0 0' ; } | tee -a /etc/fstab

其中,SynologyUsernameSynologyPassword 是你的群晖登录信息。也不要忘记更改 //SynologyIP/Multimedia 这一部分,例如 //10.0.0.1/Videos

_netdev 让 systemd 认为挂载的是一个网络载点。

x-systemd.automount 如果 NAS 离线然后重新在线了,可以让它被自动挂载。

noatime 设置读取文件(夹)的时候不修改时间戳。

uid=100000,gid=110000 的设置是为了让 host 跟 LXC 内的 UID 和 GID 对应上。简单来说,host 内的 UID 是 100000 的话,LXC 内对应的 UID 就是 0。host 内的 GID 是 110000 的话,LXC 内对应的 GID 就是 10000。

dir_mode=0770,file_mode=0770 设置只有这个 UID 和 GID 才有读写执行权限。Proxmox 的 root 用户对任何文件都有权限。

接下来手动挂载。后面重启之后就是自动挂载。

mount /mnt/lxc_shares/synology_multimedia

假设你已经创建好了 LXC,修改你的 LXC 设置。

{ echo 'mp0: /mnt/lxc_shares/synology_multimedia,mp=/mnt/nas,ro=1' ; } | tee -a /etc/pve/lxc/LXC_ID.conf

如果你不想设置为只读,想要读写权限,可以去掉 ro=1

{ echo 'mp0: /mnt/lxc_shares/synology_multimedia,mp=/mnt/nas' ; } | tee -a /etc/pve/lxc/LXC_ID.conf

不要忘记将 LXC_ID.conf 里面的 LXC_ID 修改成你实际的 ID。

随后进入 LXC 的终端,添加一个用户组。GID=10000 的话会跟 host 的 GID=110000 对应上。

groupadd -g 10000 lxc_shares

开始安装 Jellyfin。

curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash

将需要访问 NAS 文件的用户添加进 lxc_shares 组,这里我们的用户是 jellyfin

usermod -aG lxc_shares jellyfin

默认端口是 8096。

Intel iGPU 编解码支持

首先,去 LXC 内查看 /etc/group 来找到 render 这个组的 GID,我这里是 108。

然后去 Proxmox 的终端内通过 ls -l /dev/dri 命令查看相关硬件的信息:

root@ikazuchi:~# ls -l /dev/dri
total 0
drwxr-xr-x 2 root   root         80 May  7 09:48 by-path
crw-rw---- 1 root   video  226,   1 May  7 09:48 card1
crw-rw---- 1 100000 100108 226, 128 May  7 09:48 renderD128

通常来说,中间的输出都会是 226, 128

之后,去 LXC 的配置文件 /etc/pve/lxc/LXC_ID.conf 内添加以下参数,记得可能需要修改 100108 这个参数,即上面的 render 组 GID+100000。

lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
lxc.hook.pre-start: sh -c "chown 100000:100108 /dev/dri/renderD128"

之后,回到 LXC 内,将 jellyfin 用户添加至 render 组:

usermod -aG render jellyfin

然后安装 Intel OpenCL runtime 即可,不要忘记去 Jellyfin 后台设置编解码的选项!

apt install -y intel-opencl-icd

如果想测试的话,可以在 Proxmox 上安装 intel-gpu-tools 这个包,然后运行 intel_gpu_top 来查看状态。在你的 Jellyfin 上触发一下编解码看看吧!

ZeroNet

使用 ZeronetX 作为分支,直接在 release 下载后直接解压即可。将已有的数据文件夹(data 目录)放置于跟 ZeroNet.sh 同级的目录即可。

因为需要局域网内访问控制台,而不是在 headless server 上访问,所以启动参数为 ./ZeroNet.sh --ui_ip '*'

如果需要把它做成一个 systemd 服务,可以创建 /etc/systemd/system/zeronet.service

[Unit]
Description=Zeronet daemon
After=network.target

[Service]
WorkingDirectory=/root/ZeroNet/ZeroNet-linux
ExecStart=/root/ZeroNet/ZeroNet-linux/ZeroNet.sh --ui_ip '*'
User=root
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target

你可能需要重新去设置里面设置你的 tracker 来源,端口号等等。

默认端口是 43110。

i2p

首先安装 i2p 本体。

sudo apt install software-properties-common
sudo apt-add-repository ppa:i2p-maintainers/i2p
sudo apt update
sudo apt install i2p

之后,跟 ZeroNet 一样,我们需要在局域网内访问控制台。修改 /var/lib/i2p/i2p-config/clients.config.d/00-net.i2p.router.web.RouterConsoleRunner-clients.config,将 127.0.0.1 替换成 Server 的内网 IP 即可。

默认端口是 7657。

qBittorrent

因为我希望单独划分一个数据盘内有一个文件夹给 qBittorrent,所以我在 ext4 的数据盘(新建的是 Directory)内创建了一个 torrent 文件夹。假设这个文件夹的路径为 /mnt/pve/data-for-all/torrents

首先,去 LXC 内安装 headless 版本的 qBittorrent。

sudo apt install dirmngr ca-certificates software-properties-common apt-transport-https
sudo add-apt-repository ppa:qbittorrent-team/qbittorrent-stable -y
sudo apt install qbittorrent-nox

然后,创建一个名字为 qbittorrent-nox 的用户和用户组。

sudo adduser --system --group qbittorrent-nox

然后创建一个 systemd service 方便管理,路径为 /etc/systemd/system/qbittorrent-nox.service,内容如下:

[Unit]
Description=qBittorrent Command Line Client
After=network.target

[Service]
Type=forking
User=qbittorrent-nox
Group=qbittorrent-nox
UMask=007
ExecStart=/usr/bin/qbittorrent-nox -d --webui-port=8080
Restart=on-failure

[Install]
WantedBy=multi-user.target

最后启动服务即可。

sudo systemctl daemon-reload
sudo systemctl start qbittorrent-nox
sudo systemctl status qbittorrent-nox
sudo systemctl enable qbittorrent-nox

如果正常启动了,默认用户名是 admin,密码是 adminadmin。去 Tools > Options > Web UI > Authentication 改掉默认的用户名和密码。

之后,同样的,我们采用 Jellyfin 一样的挂载方法。不过需要提前掌握 qbittorrent-nox 这个用户和用户组的 ID。最简单的方法是查看 /etc/passwd。假设这是我的输出:

qbittorrent-nox:x:110:118::/home/qbittorrent-nox:/usr/sbin/nologin

那么接下来我可以将 LXC 关机,然后在 host 内这样挂载:

chown 100110:100118 -R /mnt/pve/data-for-all/torrents
{ echo 'mp0: /mnt/pve/data-for-all/torrents,mp=/mnt/torrents' ; } | tee -a /etc/pve/lxc/LXC_ID.conf

其中,我设置不要忘记将 LXC_ID.conf 里面的 LXC_ID 修改成你实际的 ID。

然后启动 LXC,进入 qBittorrent 的网页端,在 Tools > Options > Downloads > Saving Management 处设置 Default Save Path 为 /mnt/torrents/Downloads

最后去下载 Ubuntu 的 Torrent 试试成功了没有吧!

默认端口是 8080。

与 Jellyfin 同步 qBittorrent 下载文件夹

LXC_ID 替换成 Jellyfin 的 ID。因为 mp0 被占用了,所以用 mp1

{ echo 'mp1: /mnt/pve/data-for-all/torrents,mp=/mnt/torrents' ; } | tee -a /etc/pve/lxc/LXC_ID.conf

禁止吸血

因为可能会下载 PT,所以不能使用 qBittorrent Enhanced,但我也不想再开一个实例(懒),发现了 qBittorrent-ClientBlocker 这个东西。

下载之后,解压到一个临时的地方。

# 拷贝本体
cp qBittorrent-ClientBlocker /usr/local/bin
mkdir -p /etc/qBittorrent-ClientBlocker/qbittorrent-nox/
cp config.json /etc/qBittorrent-ClientBlocker/qbittorrent-nox/

我们这里使用 systemd 服务来用于开机自启和后台运行。创建 /etc/systemd/system/qbittorrent-clientblocker@.service

[Unit]
Description=qBittorrent-ClientBlocker service
Wants=network-online.target
After=qbittorrent-nox.service

[Service]
Type=simple
Restart=always
User=%i
WorkingDirectory=/etc/qBittorrent-ClientBlocker/%i/
ExecStart=/usr/local/bin/qBittorrent-ClientBlocker --nochdir

[Install]
WantedBy=multi-user.target

然后编辑 config.json,主要注意以下几行:

        "clientType": "qBittorrent",
        "clientURL": "http://127.0.0.1:8080",
        "clientUsername": "你的网页登录用户名",
        "clientPassword": "你的网页登录密码",

如果不需要日志可以将 logToFile 设置为 false。最后给予权限即可。

chown -R qbittorrent-nox:qbittorrent-nox /etc/qBittorrent-ClientBlocker/qbittorrent-nox/
systemctl daemon-reload
systemctl start qbittorrent-clientblocker@qbittorrent-nox.service
systemctl status qbittorrent-clientblocker@qbittorrent-nox.service
systemctl enable qbittorrent-clientblocker@qbittorrent-nox.service

使用第三方 Web UI

一直有在用的是 qb-web。直接下载 release 解压,然后 chown -R qbittorrent-nox:qbittorrent-nox dist,最后在设置内指定备用 Web UI 路径 (例如 /opt/dist) 即可。

Linux 下 non-ASCII 字符显示为 .

这个 issue 在 2022 年都有了。不过 4.6.x 应该修复了?

mkdir /etc/systemd/system/qbittorrent-nox.service.d
nano /etc/systemd/system/qbittorrent-nox.service.d/locale.conf

locale.conf 内添加以下内容:

[Service]
Environment="LC_ALL="C.UTF-8""
Environment="LANG="C.UTF-8""

之后 sudo systemctl daemon-reload,然后通过以下命令看是否设置成功了环境变量。

systemctl show --property Environment qbittorrent-nox

如果没有问题的话重启即可。

systemctl restart qbittorrent-nox.service

参考网址


如果喜欢本文,欢迎点击下方的「鼓掌」按钮!

如果上面没有加载出任何东西,可以点击这里