NAS实践
在折腾完软路由之后,发现其还可以做很多事,但是R86s只能插一个NVME的固态硬盘,很容易数据损坏。
IP分配
| 设备 | IP | 作用 |
|---|---|---|
| 猫棒/光猫 | 192.168.1.1 | 桥接 |
| 爱快/路由器 | 192.168.5.1 | 主路由,PPPoe拨号,内网管理 |
| iStoreOS | 192.168.5.2 | 旁路由,安装各种插件 |
| NAS(unRaid) | 192.168.5.3 | NAS服务器,存储资料,24小时开机 |
| 工作站(PVE/unRaid) | 192.168.5.4 | CPU性能比较强,可以用来干点其它的事,但是费电 |
| fnOS | 192.168.5.5 | 安装于 工作站下,充当于NAS App,也体验下国产NAS |
| Windows11(NAS虚拟机) | 192.168.5.6 | 安装于 unRaid NAS下,性能不高,挂迅雷 |
| Windows11(工作站虚拟机) | 192.168.5.7 | 安装于 工作站下,可以用来开发,设计等需要性能的事 |
| Ubuntu LXC(工作站) | 192.168.5.8 | 安装于 工作站下,可以用来开发编译 |
| Ubuntu(NAS虚拟机) | 192.168.5.9 | - |
| Ubuntu(工作站虚拟机) | 192.168.5.10 | - |
| Windows7(虚拟机) | 192.168.5.11 | 兼容软件测试 |
| Windows11 台式机 | 192.168.5.12 | 日常办公娱乐使用 |
Unraid
Unraid是个不错的系统,我当时最喜欢的一点是,他是用U盘作为数据盘,所以理论上所有的SATA口和NVME口都可用作数据盘。基于这个原因,一咬牙就买入了Pro版。
安装
在安装完成后,最先碰到的问题就是无法下载应用插件。
- 首先先在
设置➡日期和时间更新国内能正常访问的 NTP 服务器,设置正确的时区,确保时间正确。 - 因为 unraid 的插件基本上都是存放在 github 上的,而国内不知道为啥总是污染
raw.githubusercontent.com这个域名的解析,导致下载失败。所以我们可以将正确的 IP 地址解析加入/etc/hosts文件中。
在 DNS Lookup 搜索 raw.githubusercontent.com 的 IP 为 185.199.110.133。修改 /etc/hosts:
185.199.110.133 raw.githubusercontent.com
Unraid除了提供了奇偶校验数据盘的特性,还集成了Docker以及虚拟机的支持。有了Docker,我们可以部署很多应用,当然,占用的端口也多了。
Unraid自带的功能多了,但是感觉又变得相对不稳定了,特别是对于想要折腾 All in One 的人来说,在最开始折腾的过程中,特别是在使用VFIO将PCI设备直通到虚拟机的情况。
无论是什么情况下,都请先备份好U盘里面的所有文件,然后再进行操作!
有遇到网卡 eth0 eth1 顺序调换导致不能通过管理网口访问的情况,此时网卡直通出现了混乱导致的。(这种情况总是碰到)
有遇到PCI直通出问题,导致虚拟机无法自启动的。
总结下来,好像都和直通有关系。如果不想重装系统,这个时候就只能插上显示器,通过终端使用命令行来解决问题了。所以下文会记录一些命令帮助使用命令行来解决问题。
/boot/config/vfio-pci.cfg:这个文件应该就是我们在 工具 ➡ 系统设备 下选择使用 vfio 进行直通的设备的 pci 编号。其内容大致如下,以空格作为分隔符:
BIND=0000:01:00.0|1002:6779 0000:01:00.1|1002:aa98 0000:00:1f.0|8086:a305 0000:00:1f.3|8086:a348 0000:00:1f.4|8086:a323 0000:00:1f.5|8086:a324 0000:00:1f.6|8086:15bc 0000:03:00.1|8086:10fb
有时候我们换了PCI设备,但是其编号在留在里面,这会导致虚拟机无法自启动。这时就需要我们仔细排查 vfio-pci.cfg 文件,看看哪个PCI设备已经没有了。
针对无法使用管理网口的问题:
-
首先,我们需求查看
vfio-pci.cfg文件,来确定这个网口是不是被直通了。如果被直通了,那就将它的编号删除,然后重启。 -
通过 virsh 将使用了直通网口的虚拟机(或者全部虚拟机)关掉自启动,排除下是不是因为虚拟机导致无法使用管理网口。
-
检查
/boot/config/network.cfg文件, -
最后实在搞不定,终结大招就是把上述
vfio-pci.cfg、network.cfg两个文件都删了。unraid 会默认生成network.cfg文件,以 dhcp 方式获取 IP 地址。默认内容如下:# 表示使用 DHCP 服务器自动获取 IP 的方式向路由器申请 IP 给到 unRAID 使用。
USE_DHCP="yes"
# 当前 unRAID 的内网 IP
IPADDR=
# 子网掩码,一般的值为 255.255.255.0
NETMASK=
# unRAID 的网关
GATEWAY=
# 是否启用绑定(默认为 yes )
BONDING="yes"
# 是否启用桥接(默认为是 yes )
BRIDGING="yes"如果需要静态IP,可作如下配置:
# 取消 DHCP 自动获取 IP。
USE_DHCP="no"
# 请将 IPADDR 的值设置为你需要的 IP 。
IPADDR="192.168.2.3"
# NETMASK 不需要修改。
NETMASK="255.255.255.0"
# GATEWAY 是网关地址,根据你自己实际的情况来。
GATEWAY="192.168.2.1"
# BONDING 和 BRIDGING 不需要修改,等你能够访问 unRAID 之后再在网络设置中修改即可。
BONDING="yes"
BRIDGING="yes"
# DNS 服务器地址,可以填写两个,根据你的需求来。
DNS_SERVER1="192.168.2.1"
DNS_SERVER2="114.114.114.114"
当然,我们也可以仅修改 USE_DHCP="no" 这一行,然后通过 ifconfig 命令暂时配置 IP:
ifconfig br0 192.168.2.3 netmask 255.255.255.0
然后使用 PC 修改静态IP保持同一网段直连 Unraid,最好是将 PC 的网关直接改成 Unraid 的 IP 地址。
等我们能够成功访问 Web 控制台的时候,再通过其修改 IP 地址获取方式。
使用代理
#!/bin/bash
DOCKER_RC_FILE="/etc/rc.d/rc.docker"
if [ -f "$DOCKER_RC_FILE" ]; then
sed -i 's|nohup|nohup env https_proxy=http://192.168.5.69:10809 http_proxy=http://192.168.5.69:10809|' "$DOCKER_RC_FILE" ;
fi
使用 User Scripts,选择在磁盘阵列启动时,执行上述脚本。
验证是否修改成功:
grep -n 'nohup env https_proxy' /etc/rc.d/rc.docker
更换 Docker 镜像源
以阿里云镜像源为例,在 镜像容器服务➡镜像工具➡镜像加速器 找到 加速器地址,然后在 Unriad /boot/config/go 添加如下内容:
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6bcoyx9o.mirror.aliyuncs.com"]
}
EOF
使用FRP
使用FRP时,前往不要将Web访问端口直接映射出去。这样外网可以直接无需密码,直接跳转至URL。
可以使用FRP提供的 HTTP基本认证 实现账号密码验证登录(在nginx反向代理一侧,请使用HTTPS)。
[[proxies]]
name = "unraid"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["unraid.amass.fun"]
httpUser = "your_account"
httpPassword = "your_password"
开启网卡SRIOV
SR-IOV ,Single-root input/output virtualization 能允许一个物理PCIe设备把自身虚拟为多个虚拟PCIe设备。
理论上:纯虚拟性能 < SR-IOV虚拟性能 < 物理直通性能
开启网卡/虚拟网卡直通,另一个好处就是能够可以和 Unraid宿主机 网络隔离。举个例子,如果 Unraid 具备了科学上网的能力,虚拟机通过 VM 网络桥接在 Unraid 的网络接口上,也会具有其能力,对于流量计费和网络延时的情况,这是体验极不好的。
确保宿主机启用了 HVM 以及 IOMMU。然后确定网卡,如果不清楚物理网口对应哪个 eth* 接口,可以使用命令:
ethtool -p eth1
这条命令会使 eth1 接口对应的实际物理网卡上的LED灯闪烁,如果我这里有两个支持 SR-IOV 的万兆网口:
[8086:10fb] 03:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
[8086:10fb] 03:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
对应着 eth1、eth2。通过:
cat /sys/bus/pci/devices/0000:设备ID/sriov_totalvfs
# 例如
cat /sys/bus/pci/devices/0000:03:00.1/sriov_totalvfs
可以查看当前设备支持的最大虚拟数,我这里输出 63,那么最大可以支持 63 个虚拟物理网卡。通过:
echo 4 > /sys/bus/pci/devices/0000:03:00.1/sriov_numvfs
我们可以对设备(我这里的 eth2 接口)虚拟出 4 个虚拟物理网卡,0 表示关闭,最大即为上述的 sriov_totalvfs 值。
[8086:10ed] 03:10.1 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
[8086:10ed] 03:10.3 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
[8086:10ed] 03:10.5 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
[8086:10ed] 03:10.7 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
确定好配置以后,我们修改 Unraid linux 内核的启动参数:
label Unraid OS
menu default
kernel /bzimage
append vfio-pci.ids=8086:10ed initrd=/bzroot
如上,我们指定参数 vfio-pci.ids 的值为虚拟物理网卡的总线ID 8086:10ed,以使总线上的虚拟物理网卡能够被虚拟机绑定。然后把命令写入到go文件中,以使每次 Unraid 开机自动开启虚拟设备:
echo 4 > /sys/bus/pci/devices/0000:03:00.1/sriov_numvfs
# 为创建的虚拟网卡设置 mac 地址,否则默认都是 00:00:00:00:00:00
ip link set eth2 vf 0 mac 24:7b:bf:cc:69:4a
ip link set eth2 vf 1 mac 24:7b:bf:cc:69:4b
ip link set eth2 vf 2 mac 24:7b:bf:cc:69:4c
ip link set eth2 vf 3 mac 24:7b:bf:cc:69:4d
重启后,可通过以下命令查看网卡信息:
ip link show dev eth2
Docker及端口占用
在 设置 ➡ Docker 中,设置使用目录方法存储 Docker 相关文件,而不是虚拟镜像 img 文件,这样方便磁盘空间管理。
| 端口号 | 组件 | 作用 |
|---|---|---|
| 80 | Unraid | 访问Unraid |
| 1022 | Ubuntu SSH | 用于开发调试,ssh 端口 |
| 1443 | NextCloud | 私有云盘 |
| 2022 | Gitea ssh | 用于 pull/push 仓库 |
| 3000 | Gitea | 仓库镜像备份 |
| 3100 | HomeBox | 物品收纳管理 |
| 3306 | MySQL | 被NextCloud所用 |
| 8085 | librespeed | 用于内网测速 |
| 8087 | Code Server | 用于在线编写代码 |
| 8088 | reader | 电纸书阅读 |
| 8089 | Chevereto | 图片分享,图床 |
| 8096 | Jellyfin | 影音播放 |
| 8920 | Jellyfin HTTPS | https接口,通过 frpc + nginx 访问8096端口 |
Ubuntu
日常使用中,还是需要在NAS做一些事的,例如构建Docker镜像,体验一些应用等。这个时候是不推荐在 Unraid 上直接操作的,一个原因是 Unraid 是基于 Slackware 开发的,我不太熟悉这个系统。另一个更重要的原因是因为如果直接在 Unriad 做实验,会污染其环境或可能产生冲突增加其不稳定性,如果要导致数据不见了,或者需要重装 Unraid,那就非常麻烦了。
LXC
Default LXC storage path 不要填 FUSE 目录,否则会遇到各种文件权限问题,推荐 /mnt/cache/lxc/。
在挂在 unRaid 主机目录时,lxc 容器内的路径第一个 / 要去掉,挂载目录酌情也尽量不要使用 FUSE 目录,实测编译代码时,FUSE 会严重拖慢编译时间。
lxc.mount.entry = /mnt/user/appdata/frpc/ mnt/user/appdata/frpc/ none bind,create=dir 0 0
lxc.mount.entry = /mnt/cache/Projects/ home/amass/Projects/ none bind,create=dir 0 0
lxc.mount.entry = /mnt/cache/Backup/Espressif/ opt/Espressif/ none bind,create=dir 0 0
# 允许容器访问USB串口设备
lxc.cgroup2.devices.allow = c 188:* rwm
# 如果想启动就挂载的话
lxc.mount.entry = /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
创建用户,和 unRaid 用户的 uid、gid 保持一致:
# uid=1000(amass) gid=100(users) groups=100(users)
# 确认 ubuntu 用户 id 冲突
id ubuntu
userdel -r ubuntu
apt install zsh
useradd -m -u 1000 -g 100 -s /bin/zsh -d /home/amass amass
usermod -aG sudo amass
usermod -aG dialout amass
passwd amass
apt install openssh-server
动态挂载设备:
lxc-device -n Ubuntu add /dev/ttyACM0
lxc-attach -n Ubuntu -- chgrp dialout /dev/ttyACM0
lxc-device -n Ubuntu del /dev/ttyUSB0
Windows 虚拟机
在创建 Windows 虚拟机时,我们选择 机器 类型为:Q35-9.2。
Q35 是比 i440fx 更新的虚拟机硬件平台,提供更强的硬件虚拟化支持,支持更高效的内存管理和更好的PCIe设备支持,适合需要高性能计算和现代化外设的用户。而我现在选用的硬件都是比较新的,为了不在显卡直通之类的操作上遇到43报错 之类的问题,无脑选 Q35 就对了。
Docker
所以,比较好的方式就是我们自己构建一个 Ubuntu 的 Docker 镜像,然后在容器上做我们想做的事。
rm -fr /mnt/user/appdata/code-server /mnt/user/appdata/vscode-server
mkdir -p /mnt/user/appdata/code-server /mnt/user/appdata/vscode-server
chown -R amass:users /mnt/user/Backup/Projects /mnt/user/appdata/code-server /mnt/user/appdata/vscode-server
docker run -it --privileged -d --name ubuntu --hostname Ubuntu \
--restart=unless-stopped \
--network host \
--add-host Ubuntu:127.0.1.1 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mnt/user/appdata/code-server:/home/amass/.local/share/code-server \
-v /mnt/user/appdata/code-server:/home/amass/.config/code-server \
-v /mnt/user/appdata/vscode-server:/home/amass/.vscode-server \
-v /mnt/user/appdata/homeassistant:/home/amass/homeassistant \
-v /mnt/user/appdata/frpc:/home/amass/frpc \
-v /mnt/user/Documents:/home/amass/Documents \
-v /mnt/user/Backup/Projects:/home/amass/Projects \
-v /mnt/user/Backup/SourceCode:/home/amass/SourceCode \
registry.cn-shenzhen.aliyuncs.com/amass_law/ubuntu_dev:24.04-qt6.9.1-user
docker exec -it -u amass ubuntu zsh
在本地 ssh config 配置:
Host ubuntu_unraid
HostName 192.168.5.3
User root
IdentityFile E:/Projects/id_rsa_amass
Port 1022
IdentityFile 在 Windows 下的权限问题:
Bad permissions. Try removing permissions for user: NT AUTHORITY\\Authenticated Users (S-1-5-11) on file E:/Projects/id_rsa_amass.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'E:\\Projects\\id_rsa_amass' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "E:\\Projects\\id_rsa_amass": bad permissions
使用命令行修改权限:
# 移除 NT AUTHORITY\\Authenticated Users 的权限
icacls "E:\Projects\id_rsa_amass" /remove "NT AUTHORITY\Authenticated Users"
# 确保只有当前用户(假设用户名为 amass)有权限访问
icacls "E:\Projects\id_rsa_amass" /inheritance:r
icacls "E:\Projects\id_rsa_amass" /grant:r amass:F
Code Server
下载 C/C++ 插件,然后手动安装。
frp
frp的具体使用可以参考之前写的笔记,这里使用Docker运行frpc, 如下使用了多个 frp 服务以便于在不同网络环境下不同来回切换而同时使用:
docker run --restart=always --network host -d --name frpc \
-e TZ="Asia/Shanghai" \
-v /mnt/user/appdata/frpc/frpc.toml:/etc/frp/frpc.toml \
registry.cn-shenzhen.aliyuncs.com/amass_law/frpc:0.63.0
docker run --restart=always --network host -d --name mirror_frpc \
-e TZ="Asia/Shanghai" \
-v /mnt/user/appdata/frpc/mirror_frpc.toml:/etc/frp/frpc.toml \
registry.cn-shenzhen.aliyuncs.com/amass_law/frpc:0.63.0
如果我们想自己构建frpc,可以参考,我构建的 frpc 集成了 nginx,这样方便我们通过 frp 使用 https 访问,然后再将请求反向代理至内部服务,以 jellyfin 为例:
upstream jellyfin {
server 192.168.2.3:8096;
}
server {
listen 8920 ssl;
server_name frp-by1.wwvvww.cn;
ssl_certificate /config/cert/frp-by1.wwvvww.cn_bundle.pem;
ssl_certificate_key /config/cert/frp-by1.wwvvww.cn.key;
ssl_session_timeout 5m; #缓存有效期
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #安全链接可选的加密协议
ssl_prefer_server_ciphers on; #使用服务器端的首选算法
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header x-wiz-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://jellyfin;
}
}
iStoreOS
unRaid 创建 iStoreOS 虚拟机需要下载 EFI版本 的固件,直接将 istoreos-22.03.7-2024120615-x86-64-squashfs-combined-efi.img 作为虚拟磁盘,另外也可以使用 dd 命令对其进行扩容。
dd if=/dev/zero bs=1G count=64 >> istoreos-22.03.7-2024120615-x86-64-squashfs-combined-efi.img
启动虚拟机后,在控制台输入 quickstart修改LAN地址,使得能够访问。
v2rayA
v2rayA 是一个易用而强大的,跨平台的 V2Ray 客户端。
- 全局透明代理:透明代理可为几乎所有应用程序提供代理服务,而不必考虑该应用程序是否支持。在 Linux 系统,v2rayA 支持一键开启透明代理,省去了繁琐的配置操作。在 Windows 和 MacOS 支持一键配置系统代理。
- 外部访问:对于无图形界面的操作系统,在安装 v2rayA 之后,借助另一台 PC 或移动设备即可完成对其的操作。这对于远程服务器、路由器是极其方便的。
docker pull mzz2017/v2raya:v2.2.7.1
docker run -d --restart=always --privileged --network=host --name v2raya \
-e TZ="Asia/Shanghai" \
-e V2RAYA_LOG_FILE=/etc/v2raya/v2raya.log \
-e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \
-e V2RAYA_NFTABLES_SUPPORT=off \
-e IPTABLES_MODE=legacy \
-v /lib/modules:/lib/modules:ro \
-v /etc/resolv.conf:/etc/resolv.conf \
-v /mnt/user/appdata/v2raya:/etc/v2raya \
mzz2017/v2raya:v2.2.7.1
安装完成之后,打开 http://192.168.5.3:2017 即可访问 v2rayA 主页。
jellyfin
Jellyfin 是一款免费开源的多媒体管理系统,专为管理和流式传输个人媒体库(如电影、电视剧、音乐、图片等)而设计。PVE 下面我们使用 LXC 方式,且镜像基于 Debain 构建。这里我们使用 docker,镜像基于 Ubuntu 构建,而且每通过 docker 修改一次配置,容器内的数据就会被删除(比如安装包、字体)。
最近发现了 Jellyfin中国特供版,作者是中国人,很厉害,佩服。
显卡直通硬解
对于 英特尔® 酷睿™ i5-9600K 处理器,在 Unraid 添加所需的 i915 内核参数以启用加载 GuC 和 HuC 固件:
# blacklist i915 # 如果阻止加载 i915 模块,下面的设置将不起作用
options i915 enable_guc=2
如果安装了 Intel-GVT-g 插件,那么就不需要手动修改 /etc/modprobe.d/i915.conf 文件(修改了重启后也会被覆盖掉)。在 Guide 标签页下找到 GuC/HuC Firmware loading:,选择 3 = Enable Guc/Huc。
如果客户端播放视频提示 该客户端与媒体不兼容,服务器未发送兼容的媒体格式,则大概率上述配置没配置好。
创建直通时,将 /dev/dri 映射至 jellyfin 容器中(配置类型选择 设备,不是 路径),然后在 播放 选项卡中设置硬件加速 Intel QuickSync (QSV)。
命令行创建,则为
--device=/dev/dri
11 代之前的处理器仅支持启用低电压模式的 Intel H.264 硬件编码器。
启用色调映射
设置完整后,可以播放一个视频,然后选择一个比较低的质量播放。最后在 unRaid 命令行运行 intel_gpu_top,观察核显的利用率是否有变化。
docker run -d --name=jellyfin --hostname Jellyfin \
-e TZ=Asia/Shanghai \
-e JELLYFIN_PublishedServerUrl='http://192.168.5.3:8096' \
-e PUID=99 \
-e PGID=100 \
-e UMASK=022 \
-p 8096:8096/tcp \
-p 7359:7359/udp \
-v /mnt/user/AdultVideo:/mnt/user/AdultVideo \
-v /mnt/user/Animes:/mnt/user/Animes \
-v /mnt/user/AnimeTheaters:/mnt/user/AnimeTheaters \
-v /mnt/user/Movies:/mnt/user/Movies \
-v /mnt/user/Teleplays:/mnt/user/Teleplays \
-v /mnt/user/appdata/jellyfin:/config \
--net=bridge \
--restart=unless-stopped \
--device=/dev/dri nyanmisaka/jellyfin:251029-amd64
docker run -d --name=jellyfin-linuxserver --hostname Jellyfin \
-e TZ=Asia/Shanghai \
-e JELLYFIN_PublishedServerUrl='http://192.168.5.3:8096' \
-e PUID=99 \
-e PGID=100 \
-e UMASK=022 \
-p 8096:8096/tcp \
-p 7359:7359/udp \
-v /mnt/user/AdultVideo:/mnt/user/AdultVideo \
-v /mnt/user/Animes:/mnt/user/Animes \
-v /mnt/user/AnimeTheaters:/mnt/user/AnimeTheaters \
-v /mnt/user/Movies:/mnt/user/Movies \
-v /mnt/user/Teleplays:/mnt/user/Teleplays \
-v /mnt/user/appdata/jellyfin-linuxserver:/config \
--net=bridge \
--restart=unless-stopped \
--device=/dev/dri lscr.io/linuxserver/jellyfin
乱码
docker exec -it jellyfin bash
sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
apt update && apt upgrade -y
apt install -y fonts-noto-cjk-extra
exit # 退出容器
docker restart jellyfin
这个出现乱码的原因是一些字幕文件(例如.ass)里面指定了字体,但是系统没有这个字体,所以就会导致出现乱码。解决的办法就是将字符放入docker容器可访问的路径下,然后在 控制台 ➡ 播放 下找到 备用字体文件路径,将字体文件路径填入,并勾选 启用备用字体 来使能 Fallback 机制。
反向代理
在 管理 ➡ 控制台 ➡ 高级 ➡ 网络 中将基础 URL设为 /jellyfin。设置 nginx 规则:
upstream jellyfin {
server 192.168.5.3:8096;
}
# Security / XSS Mitigation Headers
# NOTE: X-Frame-Options may cause issues with the webOS app
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "0"; # Do NOT enable. This is obsolete/dangerous
add_header X-Content-Type-Options "nosniff";
# Permissions policy. May cause issues with some clients
add_header Permissions-Policy "accelerometer=(), ambient-light-sensor=(), battery=(), bluetooth=(), camera=(), clipboard-read=(), display-capture=(), document-domain=(), encrypted-media=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), keyboard-map=(), local-fonts=(), magnetometer=(), microphone=(), payment=(), publickey-credentials-get=(), serial=(), sync-xhr=(), usb=(), xr-spatial-tracking=()" always;
# Content Security Policy
# See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
# Enforces https content and restricts JS/CSS to origin
# External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
# NOTE: The default CSP headers may cause issues with the webOS app
add_header Content-Security-Policy "default-src https: data: blob: ; img-src 'self' https://* ; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'";
# Jellyfin
location /jellyfin {
proxy_pass http://jellyfin/;
}
# The / at the end is significant.
# https://www.acunetix.com/blog/articles/a-fresh-look-on-reverse-proxy-related-attacks/
location /jellyfin/ {
# Proxy main Jellyfin traffic
proxy_pass http://jellyfin;
proxy_pass_request_headers on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
proxy_buffering off;
}
location /jellyfin/socket {
# Proxy Jellyfin Websockets traffic
proxy_pass http://jellyfin;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
}
Collabora-CODE
Collabora-CODE 是一个支持在线Office编辑的后台服务应用,我们可以在unRaid应用商店添加,给后续 Nextcloud 使用。
docker run -d --name collabora --restart always --privileged \
-e TZ="Asia/Shanghai" \
-e username=amass \
-e 'password'='your_password' \
-e 'dictionaries'='de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' \
-e 'domain'='office.amass.fun' \
-p 9980:9980 collabora/code
如果需要外网访问(外网通过Nextcloud访问 Office 文档也算),需要添加 Nginx 的反向代理。实际使用中,发现其完全可以与Jellyfin共用一个Nginx反向代理服务配置。这样就可以减少一个frp端口的映射。
Home Assistant
Home Assistant 是一个自由开源的智能家居自动化平台。
docker run -d \
--name homeassistant \
--privileged \
--restart=unless-stopped \
-e TZ="Asia/Shanghai" \
-v /mnt/user/appdata/homeassistant:/config \
-v /run/dbus:/run/dbus:ro \
--network=host \
homeassistant/home-assistant:2025.3.1
访问主页:http://192.168.5.3:8123。在做反向代理时,需要添加如图下配置,否则服务会返回400:
http:
use_x_forwarded_for: true
trusted_proxies:
- 111.173.106.175 # Add the IP address of the proxy server
- 127.0.0.1
配置 MQTT
要启用 SSL 登录,填写 代理地址、端口(SSL监听端口)、用户名、密码之后,打开【高级选项】。提交之后,就会出现高级选择设置菜单,将【代理证书验证】设置为 自动(我们从 Let’s Encrypt 申请的证书)。【MQTT协议】默认选择 3.1.1 。点击【提交】即可成功连接 MQTT Broker。
Home Assistant Community Store
HACS 是一个很重要的插件,更新很及时。Home Assistant 默认自带的插件,基本都用不了。
docker exec -it homeassistant bash
wget -O - https://get.hacs.xyz | bash - # 创建 custom_components 文件夹,然后将 hacs 下载解压至该目录
docker restart homeassistant # 安装任何 custom_components 都重启容器
Xiaomi Miot For HomeAssistant
Xiaomi Miot Auto 提供了接入米家设备
kiosk-mode
kiosk-mode 可以用来自定义是否显示一些页面组件,例如标题栏。隐藏标题栏后,如果想让标题栏暂时显示,即kiosk-mode暂时生效,可以在当前 url 路径后添加 ?disable_km。
Homebox
Homebox 是一个方便家庭进行资产管理的系统。虽然自己没啥东西,但是对于经常健忘,忘记买了啥东西,要用的时候先用 Homebox 找一找自己以前有没有买过,还是很实用的。
reader
在 Github 上找到了国人开发 reader 的项目
docker run -d --restart=always --name=reader \
-p 8088:8080 \
-v /mnt/user/appdata/reader/logs:/logs \
-v /mnt/user/appdata/reader:/storage \
hectorqin/reader java -jar /app/bin/reader.jar \
--spring.profiles.active=prod \
--reader.app.secure=true \
--reader.app.secureKey=管理密码 \
--reader.app.inviteCode=注册邀请码
User Scripts
User Scripts 是 Unraid 的一个插件,本质上就是 Cron 的一个前端GUI集成面板。
要添加自己的用户脚本,在 /boot/config/plugins/user.scripts/scripts 文件夹中创建一个新的文件夹用于存放脚本(文件夹名称可以随意,但只能包含以下字符:字母([A-Za-z])、数字([0-9])、连字符("-")、下划线("_")、冒号(":")、句点(".")和空格(" ")。其他字符会影响脚本后台运行的功能)。在该文件夹中,创建一个名为 description 的文件,其中包含脚本的描述。
创建一个名为 script 的文件,其中包含实际的脚本。在执行之前,#!/bin/bash 会自动添加到脚本开头。如果脚本有任何依赖项(例如:其他脚本),可以像往常一样调用,但请注意在执行期间,脚本不是从闪存驱动器运行的(即:请包含任何依赖脚本的完整路径)。
使用 SSH 备份远程服务器
我们将公私钥复制到 /boot/config/ssh/root 下(/root/.ssh的实际路径),
#!/bin/bash
#description=备份阿里云服务器
REMOTE_USER="root"
REMOTE_HOST="47.107.32.69"
REMOTE_DIR="/root/Server"
LOCAL_DIR="/mnt/user/Backup/Appdata"
DATE=$(date +%Y%m%d)
REMOTE_BASE_DIR=$(dirname "$REMOTE_DIR")
REMOTE_TARGET=$(basename "$REMOTE_DIR")
TAR_FILE="/tmp/Server-$DATE.tar.gz"
ssh -o StrictHostKeyChecking=no $REMOTE_USER@$REMOTE_HOST "\
tar --exclude='$REMOTE_DIR/logs' \
--exclude='$REMOTE_DIR/proxy_temp' \
--exclude='$REMOTE_DIR/resources/live2d' \
-czvf $TAR_FILE \
-C $REMOTE_BASE_DIR \
$REMOTE_TARGET"
scp -o StrictHostKeyChecking=no $REMOTE_USER@$REMOTE_HOST:$TAR_FILE $LOCAL_DIR
ssh -o StrictHostKeyChecking=no $REMOTE_USER@$REMOTE_HOST "rm $TAR_FILE"
echo "Backup completed for $DATE"
virsh
virsh 命令来自英文词组“virtualization shell”的缩写,中文译为虚拟化终端,其功能是用于管理虚拟机系统,virsh 是用于管理虚拟化环境中客户机和 Hypervisor 的命令行工具,是 libvirt 项目中的开源软件。
Unraid 使用 libvirt 管理 KVM。这里记录下常用的 virsh 命令,以便排查问题。
| 命令 | 解释 |
|---|---|
| virsh list --all | 列出所有虚拟机 |
virsh dominfo <名字 or ID> | 显示虚拟机硬件信息 |
virsh start <名字 or ID> | 开启虚拟机 |
virsh shutdown <名字 or ID> | 关闭虚拟机 |
virsh destroy <名字 or ID> | 强制关闭虚拟机 |
virsh undefine <名字 or ID> | 删除虚拟机,彻底删除需要确认删除 /mnt/user/domains/<名字> 目录 |
virsh edit <名字 or ID> | 编辑虚拟机配置。默认使用 vi 作为编辑器,可以修改:export EDITOR=nano |
virsh autostart <名字 or ID> | 设置虚拟机为自动启动 |
virsh autostart --disable <名字 or ID> | 取消虚拟机自动启动 |
硬件选型
NAS:
- 畅网 N355 CPU+主板:1647 ¥
- 英睿达DDR5 4800MHZ 32GB:559 ¥
- 最大功率:75W,平均功率:60W
