搬迁服务至 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
其中,SynologyUsername
和 SynologyPassword
是你的群晖登录信息。也不要忘记更改 //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
参考网址
- https://forum.proxmox.com/threads/tutorial-unprivileged-lxcs-mount-cifs-shares.101795/
- https://geti2p.net/en/download/debian
- https://old.reddit.com/r/i2p/comments/vrpp3l/allowing_access_to_i2p_router_on_the_local_lan/
- https://www.linuxcapable.com/how-to-install-qbittorrent-on-ubuntu-linux/
- https://forum.proxmox.com/threads/guide-jellyfin-remote-network-shares-hw-transcoding-with-intels-qsv-unprivileged-lxc.142639/
如果喜欢本文,欢迎点击下方的「鼓掌」按钮!
如果上面没有加载出任何东西,可以点击这里。