跳到主要内容

NAS实践

阅读量: 101
阅读人次: 102

在折腾完软路由之后,发现其还可以做很多事,但是R86s只能插一个NVME的固态硬盘,很容易数据损坏。

IP分配

设备IP作用
猫棒/光猫192.168.1.1桥接
爱快/路由器192.168.5.1主路由,PPPoe拨号,内网管理
iStoreOS192.168.5.2旁路由,安装各种插件
NAS(unRaid)192.168.5.3NAS服务器,存储资料,24小时开机
工作站(PVE/unRaid)192.168.5.4CPU性能比较强,可以用来干点其它的事,但是费电
fnOS192.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版。

安装

在安装完成后,最先碰到的问题就是无法下载应用插件。

  1. 首先先在 设置日期和时间 更新国内能正常访问的 NTP 服务器,设置正确的时区,确保时间正确。
  2. 因为 unraid 的插件基本上都是存放在 github 上的,而国内不知道为啥总是污染 raw.githubusercontent.com 这个域名的解析,导致下载失败。所以我们可以将正确的 IP 地址解析加入 /etc/hosts 文件中。

DNS Lookup 搜索 raw.githubusercontent.com 的 IP 为 185.199.110.133。修改 /etc/hosts:

/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设备已经没有了。

针对无法使用管理网口的问题:

  1. 首先,我们需求查看 vfio-pci.cfg 文件,来确定这个网口是不是被直通了。如果被直通了,那就将它的编号删除,然后重启。

  2. 通过 virsh 将使用了直通网口的虚拟机(或者全部虚拟机)关掉自启动,排除下是不是因为虚拟机导致无法使用管理网口。

  3. 检查 /boot/config/network.cfg 文件,

  4. 最后实在搞不定,终结大招就是把上述 vfio-pci.cfgnetwork.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 内核的启动参数:

/boot/syslinux/syslinux.cfg
label Unraid OS
menu default
kernel /bzimage
append vfio-pci.ids=8086:10ed initrd=/bzroot

如上,我们指定参数 vfio-pci.ids 的值为虚拟物理网卡的总线ID 8086:10ed,以使总线上的虚拟物理网卡能够被虚拟机绑定。然后把命令写入到go文件中,以使每次 Unraid 开机自动开启虚拟设备:

/boot/config/go
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
注意

实际物理网口需要处于打开状态,如果在宿主机处于关闭状态,即使插上网线,虚拟机也是断开连接状态,为了省事,可以在 Unraid 的 设置网络设置 ➡ 将对应的实际物理接口和能够访问 Unraid 的接口绑定使用。这样使用,有一个问题就是使用虚拟网卡的虚拟机无法与宿主机互相访问,省事起见,我们也可以只启用网口,但是关闭在宿主机的 IPv4、IPv6功能,仅作虚拟机使用:

屏幕截图 2024 12 05 224323

使能 SR-IOV 的网卡也不能开启硬件直通,否则对应的虚拟网卡会失效。

虚拟物理网卡不需要在 工具系统设备,像硬件直通那样点击 在系统引导时绑定已选项至 VFIO,以支持虚拟机直通,直接在虚拟机设置中

Docker及端口占用

设置Docker 中,设置使用目录方法存储 Docker 相关文件,而不是虚拟镜像 img 文件,这样方便磁盘空间管理。

端口号组件作用
80Unraid访问Unraid
1022Ubuntu SSH用于开发调试,ssh 端口
1443NextCloud私有云盘
2022Gitea ssh用于 pull/push 仓库
3000Gitea仓库镜像备份
3100HomeBox物品收纳管理
3306MySQL被NextCloud所用
8085librespeed用于内网测速
8087Code Server用于在线编写代码
8088reader电纸书阅读
8089Chevereto图片分享,图床
8096Jellyfin影音播放
8920Jellyfin HTTPShttps接口,通过 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 配置:

C:/Users/amass/.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 固件:

/etc/modprobe.d/i915.conf
# 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:

configuration.yaml
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