All IN One NAS【开荒(踩坑)指南】 一站式PVE+Win+Truenas+Docker+远程游戏+影音服务器搭建指南

作者1121个月前 (03-05)PVE40

前言

上期主要跟大家介绍了我的ALL In One NAS家庭服务器搭建硬件篇,大家十分热情,我也从评论区中学到了很多。相信大家都想明白一个问题,ALL In One NAS究竟能做些什么?本期来跟大家介绍一下软件篇,分享一下我的踩坑心得。 如果你还没有进行部署,刚好可以看这期视频,有一个方向,如果已经部署过了,也可以查缺补漏。前排提示,本期内容全程干货,可能有些地方比较晦涩难懂,我也会以通俗易懂的语言解释,那我们现在开始。

Ventoy无法安装PVE?

大家可能以为,踩坑指南要从PVE安装完毕后开始,没想到步子还没迈开就被绊了一跤。 安装PVE镜像时,我们有很多工具可以选择,比如rufus,Balena Etcher(BE),不过我还是喜欢使用Ventoy,只需要把PVE镜像放入u盘根目录,开机时选择即可。不过在我安装PVE8.1时老是报错,找不到镜像。



no device with valid ISO found, please check your installation medium unable to continue (type exit or CTRL-D to reboot) 我以为是镜像出错了,又下载一遍发现还是如此。最后在GitHub中查询发现大家都有这种问题,后来Ventoy发布了新版本解决了这个bug。如果现在大家想用Ventoy安装pve的话记得先升级哦



参考链接: 问题来源

系统安装完毕后屏幕上会显示登录IP,我们在浏览器中输入,就到了最基础的PVE设置

PVE基础设置

我们要做的有换源,禁用企业源,更改CPU调度模式,频率温度面板显示等等。 这里我推荐大家使用pvetools进行部署,点击节点,Shell,将这串代码粘贴到命令行中回车即可。

echo "nameserver  8.8.8.8" >> /etc/resolv.conf && rm -rf pvetools && rm -rf /etc/apt/sources.list.d/pve-enterprise.list && export LC_ALL=en_US.UTF-8 && apt update && apt -y install git && git clone https://github.com/ivanhao/pvetools.git && echo "cd /root/pvetools && ./pvetools.sh" > pvetools/pvetools && chmod +x pvetools/pvetools* && ln -s /root/pvetools/pvetools /usr/local/bin/pvetools && pvetools

在这里我建议大家进行换源,安装配置CPU省电,开启直通支持,安装配置温度、CPU频率显示,去除订阅提示。

GitHub - ivanhao/pvetools: proxmox ve tools script(debian9+ can use it).Including email, samba, NFS set zfs max ram, nested virtualization ,docker , pci passthrough etc. for english user,please look the end of readme.

GVT-G核显拆分

前排提醒:如果你想用核显进行显示器输出,请用直通,不要拆分。

如果跟我一样既想在Docker里面使用核显硬解视频,又想在Windows里用核显硬件加速或者还想在DSM中实现视频解码,人脸识别。那么不妨试试核显虚拟化,把一个核显拆成多个来用。

下面的方法适用于intel10代及以下CPU,11代以上可以使用SR-IOV核显虚拟化,这样效率更高

大家在进行核显拆分之前记得给核显足够的显存,我给了512MB,要不然拆分不了核显。

接着就是运行下面命令进行GRUB配置,添加内核模块,进行核显拆分。

硬件虚拟化 显卡直通与GVT-g教程 PVE8.1+核显gvt-g+黑群晖教程 同时独显直通和核显虚拟化

成功后,后续创建虚拟机时,我们可以在【硬件】-->【添加】-->【PCI设备】原始设备中,选择我们的显卡,在mdev类型中选择你想用的显存及分辨率即可。



独显VGPU

前排提醒:如果你想用独显进行显示器输出,请用直通,不要拆分。

如果你的CPU没有核显,只用一张显卡做到(在linux系统下)影音服务器硬解+Windows云游戏双用。可以使用VGPU,把独显拆分成多个显卡。 可能有同学会问,我好像听说只有Tesla卡才能拆分,GeForce或Quadro卡没这个功能啊。 的确,只有Tesla卡才能做VGPU。但是也有大神开发出了vGPU Unlock,在家用卡上也能做VGPU。

NVIDIA vGPU Guide

当然也是有条件的,你的卡必须是Maxwell 2.0,Pascal,Turing架构,也就是我们常说的,9系,10系,16系,20系,30系之后就不支持了。


由于下面操作比较复杂,再加之粉丝们的要求,所以跟大家实机演示一下,出一期自己的教程。

由于我之前装过vGPU驱动了,所以我先停用使用vGPU的虚拟机,再在PVE主机中卸载驱动。

If you are upgrading from a previous version of this guide, you should uninstall the old driver by running nvidia-uninstall first.下面正式开始

P4 VGPU UNLOCK教程

更新并安装依赖

apt update
apt dist-upgrade

安装更多的软件包,如 git、编译器和其他一些工具

apt install -y git build-essential dkms pve-headers mdevctl

将两个存储库克隆到本地 首先,将此存储库克隆到您的主文件夹(在本例中/root/

git clone https://gitlab.com/polloloco/vgpu-proxmox.git

您还需要 vgpu_unlock-rs 存储库

cd /opt
git clone https://github.com/polloloco/vgpu_unlock-rs.git

之后,安装rust编译器 国内拉取 crates.io 以及安装 Rust 会面临流量出境不稳定的问题这里,使用rsproxy代理

编辑bashrc

nano ~/.bashrc

在底部添加下面两行文字

export RUSTUP_DIST_SERVER="https://rsproxy.cn"
export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"

Ctrl + X,然后按 Y 确认保存,最后按 Enter退出

source ~/.bashrc

刷新bashrc

curl https://sh.rustup.rs -sSf | sh -s -- -y --profile minimal

添加path 现在使 rust 二进制文件在您的 $PATH 中可用(您只需在安装 rust 后第一次执行此操作)

source $HOME/.cargo/env

进入vgpu_unlock-rs目录并编译库。根据您的硬件和互联网连接,可能需要一段时间

cd vgpu_unlock-rs/
cargo build --release

vgpu_unlock-rs 库需要一些文件和文件夹才能正常工作,让我们创建这些文件和文件夹 首先为 vgpu 解锁配置创建文件夹并创建一个空配置文件

mkdir /etc/vgpu_unlock
touch /etc/vgpu_unlock/profile_override.toml

然后,为systemd创建文件夹和文件,以便在启动nvidia vgpu服务时加载vgpu_unlock-rs库

mkdir /etc/systemd/system/{nvidia-vgpud.service.d,nvidia-vgpu-mgr.service.d}
echo -e "[Service]\nEnvironment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" > /etc/systemd/system/nvidia-vgpud.service.d/vgpu_unlock.conf
echo -e "[Service]\nEnvironment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" > /etc/systemd/system/nvidia-vgpu-mgr.service.d/vgpu_unlock.conf

如果你的显卡支持VGPU需要运行下面代码:

echo "unlock = false" > /etc/vgpu_unlock/config.toml

如果你的显卡不支持,或按照流程阅读完毕后仍然无法启动,需要阅读下面教程开启IOMMU gitlab.com/polloloco/vg

获取驱动

由于通过英伟达官方流程获取VGPU驱动十分繁杂,大家可以从佛西大佬的博客获取VGPU驱动,下载zip包即可。 foxi.buduanwang.vip/pan

我的显卡是TESLA P4,从这个表里看,我只能用16驱动,最新的17驱动用不了,我选择了最新的16.4驱动

驱动下载链接 # NVIDIA® Virtual GPU Software Supported GPUs

修补驱动

将驱动包下载完成后,我们需要把包传给PVE,在本地电脑或PVE上解压都行

打开host driver,我们可以看到一个run文件 先给该文件赋权

chmod +x NVIDIA-Linux-x86_64-535.161.05-vgpu-kvm.run

之后修补该驱动,照理说我们P4用驱动应该不用修补,但后面发现不修补安装不了,所以我们还是修补一下。

./NVIDIA-Linux-x86_64-535.161.05-vgpu-kvm.run --apply-patch ~/vgpu-proxmox/535.161.05.patch

出现表示成功: Self-extractible archive "NVIDIA-Linux-x86_64-535.161.05-vgpu-kvm-custom.run" successfully created. 您现在应该有一个名为 的文件NVIDIA-Linux-x86_64-535.161.05-vgpu-kvm-custom.run,这是您修补的驱动程序。

现在已应用所需的补丁,您可以安装驱动程序

./NVIDIA-Linux-x86_64-535.161.05-vgpu-kvm-custom.run --dkms -m=kernel

安装程序会询问您Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later.,回答为Yes

如果一切顺利,您将看到此消息。

Installation of the NVIDIA Accelerated Graphics Driver for Linux-x86_64 (version: 535.161.05) is now complete.

单击Ok退出安装程序。

要完成安装,请重新启动。

reboot

收尾工作

等待服务器重新启动,然后在 shell 中输入以下内容以检查驱动程序安装是否有效

nvidia-smi

您应该得到与此类似的输出

Tue Jan 24 20:21:28 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.07    Driver Version: 525.85.07    CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  On   | 00000000:01:00.0 Off |                  N/A |
| 26%   33C    P8    43W / 260W |     85MiB / 11264MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

要验证 vGPU 解锁是否有效,请输入以下命令

mdevctl types

输出将与此类似

0000:01:00.0
  nvidia-256
    Available instances: 24
    Device API: vfio-pci
    Name: GRID RTX6000-1Q
    Description: num_heads=4, frl_config=60, framebuffer=1024M, max_resolution=5120x2880, max_instance=24
  nvidia-257
    Available instances: 12
    Device API: vfio-pci
    Name: GRID RTX6000-2Q
    Description: num_heads=4, frl_config=60, framebuffer=2048M, max_resolution=7680x4320, max_instance=12
  nvidia-258
    Available instances: 8
    Device API: vfio-pci
    Name: GRID RTX6000-3Q
    Description: num_heads=4, frl_config=60, framebuffer=3072M, max_resolution=7680x4320, max_instance=8
---SNIP---

如果此命令不返回任何输出,则 vGPU 解锁不起作用。

您可以尝试查看您的卡是否被识别为启用 vgpu 的另一个命令是:

nvidia-smi vgpu

如果解锁一切正常,输出应类似于以下内容:

Tue Jan 24 20:21:43 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.07              Driver Version: 525.85.07                 |
|---------------------------------+------------------------------+------------+
| GPU  Name                       | Bus-Id                       | GPU-Util   |
|      vGPU ID     Name           | VM ID     VM Name            | vGPU-Util  |
|=================================+==============================+============|
|   0  NVIDIA GeForce RTX 208...  | 00000000:01:00.0             |   0%       |
+---------------------------------+------------------------------+------------+

但是,如果您得到此输出,则说明出现问题

No supported devices in vGPU mode

如果其中任何命令给出错误的输出,您将无法继续。请务必仔细阅读此处的所有内容。

关闭ECC

对于内存,我们需要ECC纠错来保证数据安全,但这张显卡主要是拿来硬解影音和打游戏,开ecc就没必要了,输入下面代码关闭ecc,会释放占用的500mb内存

nvidia-smi -e 0


到这里vGPU拆分就完成了。

参考链接

针对性优化(请安装完Windows系统后再来看)

在使用vgpu有几个限制,比如虚拟显示器分辨率固定,帧数固定在60帧,要修改也是非常简单。 我们使用nano修改这个文件

nano /etc/vgpu_unlock/profile_override.toml
[profile.nvidia-65] # choose the profile you want here
num_displays = 1
display_width = 1920
display_height = 1080
max_pixels = 2073600

[vm.100]
frl_enabled = 0

这里的[profile.nvidia-65],根据自己选择的显卡编号修改。我就修改为65 显示器长宽(display_width,display_height)根据自身显示器修改,由于我的显示器是2K屏,所以我把它修改为2560x1440 max_pixels用计算器简单相乘,得出结果应是3686400像素

以上是全局设置,下面的部分表示为单个虚拟机设置

[vm.100]表示你需要应用的虚拟机 frl_enabled = 0表示关闭frl,这样就没有60帧帧数限制了。

VGPU授权(请安装完授权容器后再来看)

对于vgpu,nvidia是需要授权的,不过也有大佬制作了获得授权的方法,可以用lxc容器开docker进行容器部署,获得许可证并放在指定位置即可正常使用。

一键安装docker: bash <(curl -sSL https://linuxmirrors.cn/docker.sh)

WORKING_DIR=/opt/docker/fastapi-dls/cert
mkdir -p $WORKING_DIR
cd $WORKING_DIR
# create instance private and public key for singing JWT's
openssl genrsa -out $WORKING_DIR/instance.private.pem 2048 
openssl rsa -in $WORKING_DIR/instance.private.pem -outform PEM -pubout -out $WORKING_DIR/instance.public.pem
# create ssl certificate for integrated webserver (uvicorn) - because clients rely on ssl
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout  $WORKING_DIR/webserver.key -out $WORKING_DIR/webserver.crt
docker volume create dls-db
docker run -e DLS_URL=`hostname -i` -e DLS_PORT=443 -p 443:443 -v $WORKING_DIR:/app/cert -v dls-db:/app/database collinwebdesigns/fastapi-dls:latest

在Linux中获取证书

下载客户端令牌并将其放入/etc/nvidia/ClientConfigToken

curl --insecure -L -X GET https://<dls-hostname-or-ip>/-/client-token -o /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok
# or
wget --no-check-certificate -O /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok https://<dls-hostname-or-ip>/-/client-token

重启nvidia-gridd服务:

service nvidia-gridd restart

重启ubuntu虚拟机

reboot

检查许可状态:

nvidia-smi -q | grep "License"

输出应该类似于:

vGPU Software Licensed Product
    License Status                    : Licensed (Expiry: YYYY-M-DD hh:mm:ss GMT)

完毕。有关详细信息,请查看故障排除部分

在Windows中获取证书:

Power-Shell(以管理员身份运行!)

下载客户端令牌并将其放入C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken

curl.exe --insecure -L -X GET https://<dls-hostname-or-ip>/-/client-token -o "C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken\client_configuration_token_$($(Get-Date).tostring('dd-MM-yy-hh-mm-ss')).tok"

重启NvContainerLocalSystem服务:

Restart-Service NVDisplay.ContainerLocalSystem

检查许可状态:

& 'nvidia-smi' -q  | Select-String "License"

输出应该类似于:

vGPU Software Licensed Product
    License Status                    : Licensed (Expiry: YYYY-M-DD hh:mm:ss GMT)

获取许可证

安装与配置Truenas

安装Truenas的教程网上可以找到很多,这里我就不再赘述了。在直通硬盘时有几点需要注意。直通硬盘有两种方式,第一种是映射直通,第二种是控制器直通。

映射直通适用于硬盘较少的情况(小于6sata),将单个硬盘直通给虚拟机,缺点是不能查看硬盘smart信息。

控制器直通就是字面意思。

如果你使用nvme硬盘作为pve启动盘,我推荐大家使用控制器直通,这样性能更高。如果你用SATA硬盘作为PVE系统盘一定要注意,一旦虚拟机启动,所有硬盘就只能在虚拟机中识别了,pve就认不到了。

所以不要直通控制器并设置truenas开启自启,否则

设置硬盘直通参考链接

建立数据集

我一共建立了三个数据集 pool_backup是一块4T机械硬盘,用于存放每晚的备份 pool_download是一块2T固态硬盘,用于存放truenas的app,临时下载的影片,以及pve的虚拟磁盘 pool1是3块8T机械硬盘组成的RAIDZ1阵列,主要存放重要资料,照片视频,还有电影电视剧等。



SMB与NFS

这应该是两个最常用的文件共享工具了,在Windows中用smb,在Linux中用nfs进行文件互通,选择添加,添加你想共享的路径即可。不过在共享的时候要注意权限问题。



用户与权限

我们可以创建用户,自定义用户名和密码,并勾选samba认证,这样在Windows中就可以访问到nas中的文件了。 linux中的文件权限是十分复杂的,具体可以看这两位大佬的视频,讲的十分清楚明白。



bilibili.com/video/BV1L

bilibili.com/video/BV1B

安装应用

在安装应用前,我们可以把应用池设置到固态硬盘中 对于truenas有两个必备应用就是webdav和filebroswer,webdav用于数据同步。filebroswer用来浏览文件,因为truenas没有可视化的文件管理页面,所以这个应用就显得尤其重要。





硬盘休眠

点击存储,磁盘,我们可以看到硬盘名称以及其所在的池,点进选择编辑,我们可以看到电源管理项目,在这里可以设置多少分钟无活动后硬盘自动休眠。这里有一点要注意,如果设置休眠,硬盘的温度就无法查看了。



数据保护

数据清理和快照都打开,数据清理可以防止静默损坏情况,如果数据丢失或损坏,可以使用快照恢复到特定的时间点。



truenas23.10版本砍掉了onedrive同步功能,如果在用户凭证,备份凭据中没有你想进行云同步的站点,那么或许可以考虑用alist进行中转,对于云同步的使用方法,我们在后面的备份篇中详细讲解。

开启Sftp

为什么要开启sftp呢,因为我进行远程数据同步使用freefilesync软件,该软件只能使用sftp进行同步。如果大家使用webdav,这一步就没必要设置了。点击系统设置,服务,点击ssh的配置,选择TCP端口,勾选允许密码验证,然后使用用户账户密码登录即可开启SFTP。



docker没了?

目前truenas23.10已经全面从docker转移到containerd,通过询问相关专业的同学得到的结论是,Containerd相当于精简版docker,如果要在truenas中安装docker容器也不是不行,就是命令可能有些区别。不过我还是建议大家另外开一个虚拟机安装docker,这样更加简单。



51cto.com/article/76582

安装LXC容器

LXC容器是一个操作系统级别的虚拟化技术。它允许在单一的Linux系统上运行多个隔离的Linux系统(容器)。每个容器都有自己的文件系统、网络配置、进程空间等等,所有的容器都共享同一个内核。容器的启动速度非常快,内存消耗也很低 因为vGPU授权服务占用了443端口,所以在安装linux与ubuntu系统前,我们还要单独安装一个LXC容器,用于进行VGPU授权,授权完毕后关闭即可。

修改lxc源

执行如下命令修改lxc源

cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_back

sed -i 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm

systemctl restart pvedaemon

换源参考文献 接着我们就可以在存储CT模板中看到很多系统镜像,我选择ubuntu23.04。



在创建CT容器时有一项无特权容器的复选框,如果取消勾选该容器就变成了特权容器,可以解锁nfs和smb共享。



听到这里可能有同学可能会问,是不是可以直接把应影音服务器安装在LXC容器里也可以呢,这样更节省资源?

你说的没错。我最开始也是这么操作的,但后面我发现,特权容器不能进行快照备份到NFS,无特权容器又挂载不了NFS。这两点每一点都很头疼,所以我还是决定LXC容器就只做授权用,安装影音服务器我再创一个完全的虚拟机。

LXC容器安装好后,我们运行以下命令,安装docker,并启动授权容器备用。

bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
WORKING_DIR=/opt/docker/fastapi-dls/cert
mkdir -p $WORKING_DIR
cd $WORKING_DIR
# create instance private and public key for singing JWT's
openssl genrsa -out $WORKING_DIR/instance.private.pem 2048 
openssl rsa -in $WORKING_DIR/instance.private.pem -outform PEM -pubout -out $WORKING_DIR/instance.public.pem
# create ssl certificate for integrated webserver (uvicorn) - because clients rely on ssl
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout  $WORKING_DIR/webserver.key -out $WORKING_DIR/webserver.crt

出现下图一直按回车即可



docker volume create dls-db
docker run -e DLS_URL=`hostname -i` -e DLS_PORT=443 -p 443:443 -v $WORKING_DIR:/app/cert -v dls-db:/app/database collinwebdesigns/fastapi-dls:latest

安装Linux(影音服务器+照片备份服务器)

我选择的系统是ubuntu server22.04,分配了四核12G内存,128G固态以及被拆分的核显和独显。



新系统三部曲

安装好系统后我们进行三部曲 换源,下载速度更快

bash <(curl -sSL https://linuxmirrors.cn/main.sh)

开放root登录,这样就可以使用第三方ssh软件,这里我使用的是finalshell,输入命令更方便

sudo apt-get install openssh-server
su - root
nano /etc/ssh/sshd_config


PermitRootLogin 调整为yes,并去除注释

重启ssh

systemctl restart ssh

安装docker和portainer

bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /dockerData/portainer:/data --restart=always --name portainer portainer/portainer-ce:latest


安装独显VGPU驱动

在安装完毕后还有比较重要的步骤就是给独显上驱动 还记得我们前面下载的压缩包吗,我们点击Guest_Drivers,把deb安装文件传到ubuntu的home文件夹里,直接运行安装即可

apt install /home/nvidia-linux-grid-535_535.161.07_amd64.deb

输入nvidia-smi,出现下面提示表示成功。



接着安装依赖

# 添加软件源
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
 && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
   sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
   sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
 
# 安装nvidia-container-toolkit
apt update
apt install -y nvidia-container-toolkit
nvidia-ctk runtime configure --runtime=docker
systemctl restart docker
 
# 测试,如果能正常输出显卡信息则安装成功
docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

如果能正常输出显卡信息则安装成功

参考链接

安装VGPU许可证

安装完毕后我们还要添加许可证 在shell中运行下面代码,注意把ip改为自己LXC容器的IP。

curl --insecure -L -X GET https://<dls-hostname-or-ip>/-/client-token -o /etc/nvidia/ClientConfigToken/client_configuration_token_$(date '+%d-%m-%Y-%H-%M-%S').tok

影音服务器搭建

构成家庭影音服务器需要5个容器 nastool,jellyfin,qb,csf和jeckeet

当我在豆瓣加入想看时,nastool自动为该影视添加订阅,到了指定时间后,nastool会在jackett中自动寻找该影片,如果找到了就会调用qb进行下载,如果没有找到就等到下次继续查找。影片下载完之后,nastool会自动向csf发送请求,查找中文字幕,并自动添加到影片目录中。此时电影还在临时下载文件夹里,我的下载盘是一块固态硬盘,需要把电影传到我的机械存储盘中,通过目录同步,nastool可以自动分类识别重命名,把这部电影放入机械盘-电影-外语电影中。如果下载的影片海报墙不完全,还可以调用tmm进行元数据搜索。之后我们打开jellyfin就可以看到一部刮削完毕,海报墙完整的影视了。



因为我之前使用DSM系统,所以比较习惯在根目录下建立docker文件夹,用于装载docker目录,大家可以根据自己兴趣来。docker文件夹建立后,建立mediaonline文件夹,在里面创建子文件夹,创建docker-compose文件然后运行docker-compose up -d

mkdir -p /docker/mediaonline
cd /docker/mediaonline
nano docker-compose.yaml
version: '3.7'  
    
services:  
  nas-tools:  
    container_name: nas-tools  
    hostname: nas-tools  
    image: nastools/nas-tools:latest    
    ports:  
      - "3003:3000"  
    volumes:  
      - ./nas-tools/config:/config  
      - ./nas-tools/media:/media  
    environment:  
      - PUID=1000  
      - PGID=100  
      - UMASK=000  
      - NASTOOL_AUTO_UPDATE=false  
    restart: unless-stopped  
  qbittorrent:  
    container_name: qbittorrent  
    image: johngong/qbittorrent:latest  
    environment:  
      - QB_WEBUI_PORT=8085  
      - QB_EE_BIN=false  
      - PUID=1000  
      - PGID=100  
      - UMASK=022  
      - TZ=Asia/Shanghai  
    ports:  
      - "6881:6881"  
      - "8085:8085"  
      - "6881:6881/udp"  
    volumes:  
      - ./qbittorrent/config:/config  
      - ./qbittorrent/downloads:/Downloads  
    restart: unless-stopped  
  jellyfin:    
    image: nyanmisaka/jellyfin:latest    
    restart: always    
    container_name: jellyfin    
    volumes:    
      - ./config:/config    
      - ./cache:/cache    
    devices:    
      - /dev/dri/card1:/dev/dri/card1    
      - /dev/dri/renderD128:/dev/dri/renderD128    
    environment:    
      - PUID=1000    
      - PGID=100    
      - TZ=Asia/Shanghai    
      - NVIDIA_DRIVER_CAPABILITIES=all    
      - NVIDIA_VISIBLE_DEVICES=all    
    ports:    
      - "8096:8096"    
      - "8920:8920"    
    labels:    
      gpu: true    
    runtime: nvidia    
    deploy:    
      resources:    
        reservations:    
          devices:    
            - capabilities: [gpu]    
  chinesesubfinder:  
    container_name: chinesesubfinder  
    hostname: chinesesubfinder  
    image: allanpk716/chinesesubfinder:latest  
    volumes:  
      - ./chinesesubfinder/config:/config  
      - ./nas-tools/media:/media  
      - ./chinesesubfinder/browser:/root/.cache/rod/browser  
    environment:  
      - PUID=1000  
      - PGID=100  
      - PERMS=true  
      - TZ=Asia/Shanghai  
      - UMASK=022  
    ports:  
      - "19035:19035"  
      - "19037:19037"  
    logging:  
      driver: json-file  
      options:  
        max-size: "100m"  
  jackett:  
    container_name: jackett  
    image: linuxserver/jackett:latest  
    environment:  
      - PUID=1000  
      - PGID=100  
      - TZ=Asia/shanghai  
      - AUTO_UPDATE=true  
    ports:  
      - "9117:9117"  
    volumes:  
      - ./jackett/config:/config  
      - ./jackett/downloads:/downloads  
    restart: unless-stopped

docker-compose up -d

影音服务器就搭建好了

如果你跟我一样使用核显拆分与独显VGPU,可以直接使用该代码 如果你只进行核显拆分,请注释掉独显部分,要不然会报错
runtime: nvidia deploy: resources: reservations: devices: - capabilities: [gpu]
如果你是核显直通,请把这行命令中的1,dev/dri/card1:/dev/dri/card1中的1去掉即可。

目前我们的下载文件夹和影视库还都是绑定在本地,接着我们需要在portainer中修改位置

在truenas中建立两个共享文件夹,一个名为nastooldownload,用于存放临时下载,另一个命名为media当做影视库。



先把5个容器停止,在portainer中使用nfs挂载容器,先为存储取一个名,然后输入truenas的地址,接着输入文件存放的路径,一个存储就这么建好了



如法炮制两个存储库都建好了

进入portainer替换即可,点击EDIT,替换即可。





对于nastool的具体配置,也有很多现成的教程,大家搜索即可。


jellyfin里我们可以设置核显解码或独显解码,都可以正常调用显卡硬解。



照片视频管理

我认为,群晖自带的photos真的是无敌好用,但是如果你使用这套配置,群晖的photos就没办法使用了,所以我就一直在寻找可以替代photos的照片视频管理应用,目标就尽可能赶上群晖photos。



为此我体验了这6款应用

  1. piwigo

  2. photoprism

  3. liberphotos

  4. photoview

  5. immich

  6. mt-photos

接下来就从我个人实际体验出发,评价一下各款相册应用的优缺点。 我们可以打开下面的网址,也有大佬为此做了详细的对比。

meichthys.github.io/fos

piwigo

首先我们来看piwigo,这是我用过最早的相册之一,我愿意称它为摄影师的相册管理软件,言外之意就是不太适合大众需求。它有非常多的主题,长相酷似个人博客,用来做分享非常好。 piwigo巨大问题就是必须手动导入图片至相册,对视频的支持不太友好,所以是更适合图片摄影师的一款应用。



photoprism

photoprism是一款优秀的的相册管理软件,支持人脸识别,元数据,地点识别,ai识别,三端都有应用可以备份照片。唯一的不足就是时间线有些鸡肋,它不像群晖photos那样右边有一个小时间线可以快速跳转到具体的年月日,而且听说图片多了会卡顿。



librephotos

接下来就是librephotos,这是我寄予厚望的一款应用,时间线,有,照片扫描,有,人脸识别有,AI词云,也有。问题是所有关于AI扫描的模型文件,都需要重新从网上下载,而这些模型大概率又下不下来。最要命的是librephotos的第三方安卓端,好像存在着某种bug,你让他不要用到流量上传,它好像没听到似的还是上传。如果使用官方的app,目前还只能看图,不能上传。不知道IOS端的APP使用情况如何。如果你可以接受,那么这款软件总体还是不错的。



photoview

接着就是photoview 这款应用更像是毛坯房,看起来作者们已经停更了有一段时间了。只支持相册浏览,和人脸识别,任何AI功能都没有,而且时间线跟photoprism一样也是半成品,好在支持本地扫描,如果不想要任何花里胡哨功能的话可以用这个。



immich

immich是我认为,开源软件中最接近群晖photos的,最开始这个软件只支持从终端中导入外部库,后来更新了可视化导入外部库的功能,极大提升了这个软件的可用度。时间线,人脸识别,地点反查都有,手机app做的也非常美观,还支持调用NVENC转码视频,也支持使用ai大模型识别图片内容,可能是我自己的原因,在调用CUDA方面出了一些问题,目前这个功能还没体验到。美中不足的是网页端不支持中文,还有就是缩略图十分庞大,我怀疑我2T的照片视频他就要占去1T的缩略图。



mt-photos

最后,也是我目前决定使用的mt-photos,这款软件集合了immich和群晖photos的各项优点,本地化适配也非常好,支持中文CLIP,如果你想的话也可以调用独显,可以说是从群晖photos转过来的绝佳替代品,不过这款软件不是上面提到的开源软件,而是收费软件,这点就看大家权衡了



由于up的体验时间有限,可能上述有一些错误,还请大家批评指正,如果大家额也有推荐的相册软件也可以留言。

Docker应用分享

我们继续来分享docker应用

talebook

对于书籍管理,我选用的是talebook,主要因为它支持opds,手机也可以直接连接观看


https://www.talebook.org/ (二维码自动识别)


gitea

gitea,用来托管代码,我也是近期才学会git,还没有多人共同协作的计划,目前作为私人代码托管平台



readeck

readeck,稍后阅读应用,目前我把它当作书签来用,这款应用可以让你永久保留的网页,这点是我比较看重的



alist

这也是一款神级软件,支持挂载,几乎所有网盘APP,还记得我们前面说到的truenas23.10把OneDrive砍了吗,没有什么是加一层解决不了的。用alist挂载OneDrive为webdav,就可以正常在truenas中同步了



NGINX Proxy Manager

如果你的家里有公网IP,并且想通过公网访问诸如jellyfin等应用,那么我推荐大家使用反向代理。传统的正向代理理解起来很简单,域名+开放的端口号即可进入,但如果应用多了,记忆端口号也十分麻烦,而且还要单独配置SSL证书。使用npm反向代理就可以帮我们一键配置二级域名,自动生成ssl证书,可以让访问更加快捷安全。



uptime cuma

最后一个容器就是uptimecuma,如果你的服务器突然挂逼了,或者突然无法访问了,umtimecuma就可以自动给你发送一封邮件提醒。方便你找到原因,及时处理。



Windows云游戏服务器部署

下面就到了大家期待的Windows游戏服务器安装

前排提醒 如果你跟我一样想用windows进行游戏的话,在不进行任何配置,打开一些网游大概率会出现虚拟机检测的标识,我建议大家跟我选择一样的操作系统win10(22h2)并跟我一起设置。

系统安装

我们先要提前上传好ISO镜像,一个是win10镜像,一个是virtio驱动,不然后续可能会出现识别不了硬盘,出现没网的情况。

点击创建虚拟机,名称随便填写,这里我们选择win10镜像,机型选择Q35,bios选择UEFI,TPM需要勾选上。磁盘选择SATA,之前也使用过SCSI,不过在过虚拟机检测时出现了一些问题,我还是建议大家选择SATA,磁盘大小大家根据自身情况选择,CPU同样,类别选择host,内存修改一下,后面默认即可,记住,暂时先不要启动













点击硬件,添加PCI设备,我们把显卡加上,我们选择4Q,相当于给显卡分配4G显存,当然,你也可以给它分完全8G,只要把Linux系统中的显卡删除即可。



进入选项,把启动项调一下,留一个sata磁盘就行。



去虚拟化

接下来我们在shell中输入下面代码 cd /etc/pve/qemu-server/,进入该文件夹,输入ls,找到你虚拟机的序号的文件。使用nano进行编辑nano 100.conf

在第一行添加代码args: -cpu host,hypervisor=off,相当于告诉Windows我不是虚拟机,这样就可以启动游玩绝大多数网络游戏,少数网络游戏除外。



也有更详尽去虚拟化方案,大家可以参考李晓流大神的文章自行测试。

安装virtio驱动

系统装完后大家肯定会发现没网,而且pve中的关机也不好使,我们打开virtio驱动光盘 双击64位virtio驱动安装即可,这样电脑就有网了



安装显卡驱动

接下来就要安装显卡驱动了,还记得最初我们下载的驱动安装包吗,没错这里面也有Windows版驱动,我把它放在了truenas共享文件夹中。现在我们就来映射网络驱动器。打开此电脑,点击映射网络驱动器输入反斜杠\<ip地址>+数据集名称,接着输入账号密码,记住,是自己创建的账号密码,不是admin也不是root。 如果提示需要权限进行操作,我们还要在truenas中给自己一下权限。 接着我们双击驱动安装即可。



添加许可证

安装完毕后我们还要添加许可证 在管理员cmd中运行下面代码,注意把ip改为自己LXC容器的IP。

curl.exe --insecure -L -X GET https://<dls-hostname-or-ip>/-/client-token -o "C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken\client_configuration_token_$($(Get-Date).tostring('dd-MM-yy-hh-mm-ss')).tok"



重启Windows,看到已获得NVIDIA许可证,驱动就装好了。但目前在控制台中访问不太方便,我们可以尝试安装parsec,安装完毕后测试可以打开后,我们就可以把虚拟机中的显示关了。





这样一台游戏服务器就搭建完成了 在Docker服务都正常运行的情况下,CPUz单核成绩438.7分,多核1774.9分,差不多是i7-7700水平,算上虚拟化开销还算不错了。显卡方面3dmarktimespy,显卡分4265分,得分在10606G与980之间,原神高画质跑图帧数在50帧左右,古墓丽影暗影特效全高52帧,鲁大师跑分仅供参考,基本达到了预期水平。






神秘计算机 GET!








游戏测试完毕后,又存在一个问题,云游戏说得好,但是有概率parsec在公网中连不上,这怎么办啊?

接下来就到了关键的内网穿透教学环节了!

内网穿透

我们可以新建一个虚拟机,跟前面部署ubuntu虚拟机一样,我是因为想把内网与外网服务分开,所以又新建了一个虚拟机,如果大家没有我这种需求的的话,完全可以在以及建好的ubuntu虚拟机中操作

虚拟机安装完毕后,我们快速搭建一个面板服务器,这里我选用的是1panel。进入官网,复制一键部署代码,粘贴跟着操作流程一步一步走就行

curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh

1panel是一个容器化面板,安装好1panel之后docker也就自动安装好了 我们先进入tailscale官网,注册或登录一个账号 打开设置点击key选项,打开右侧的Generate auth key,将里面的Reusable打开确认后点击copy,将秘钥复制到记事本保存备用 接着我们回到ubuntu虚拟机,新建docker文件夹,在文件夹内创建tailscale文件夹



接着运行下面代码

docker run -d --name=tailscaled -v /var/lib:/var/lib -v /dev/net/tun:/dev/net/tun --network=host --cap-add=NET_ADMIN --cap-add=NET_RAW --env TS_AUTHKEY=tskey-auth-xxxxxxxxxxxxxxxxxxx --env TS_ROUTES=192.168.x.0/24 tailscale/tailscale

将原先保存的密钥复制到TS_AUTH_KEY=后面 将路由器主机网段填写到TS_ROUTES=后,比如我路由器网关是192.168.123.1,我就填写192.168.123.0/24 回车运行即可 此时我们登录1panel后台,就可以看见tailscale已经成功运行



回到tailscale网页端,将主机的Edit route settings打开,关闭自动过期。主机端就设置好了



接着设置你的常用电脑,下载完客户端后安装登录,关闭自动过期。 你会惊奇的发现,即使你连着手机热点,依然可以直接通过局域网IP访问家里的服务,parsec也是如此,就跟在局域网内一样。

1panel还有很多服务可以一键安装,比如个人博客,我的世界服务器面板,还有各种有用的容器,受限于时间,我就不在这期视频里讲了,如果大家有需要,麻烦弹幕评论私信告诉我,我也会继续为大家制作相应内容。



群晖

不是安装PVE后就必须使用truenas来做文件存储中心,你当然可以安装unraid,群晖DSM这些系统当作你的nas服务器,而且还更加简单。 可能有同学又有疑惑,upup,你都装了truenas了还装群晖干什么呀?

唉,还记得前面我提了一嘴的备份吗?

All in boom?NO!

目前公认较好的备份原则 就是321原则, 3:至少保留3份(一份主备份,两份副本)。 2:将备份保存到两个不同的存储设备或位置。 1:在不同的位置至少保留一份备份副本。

目前手机拍摄的照片,可以通过mt-photos自动传到nas上



使用相机拍摄的视频,照片,剪辑的工程文件,可以通过freefilesync,goodsync等同步软件备份到nas上。



PVE中的虚拟机,也可以设置自动备份,我从truenas的备份盘通过NFS挂载了名为backup的存储到PVE上,设置为每天凌晨两点自动备份,这样所有PVE虚拟机的备份都保存在了truenas中,只要truenas阵列不损坏,PVE的虚拟机就永远可以恢复。



那么问题来了,如果阵列损坏了怎么办? 当然这已经是非常极限的想法了,除非我一次性坏两块硬盘阵列才会损坏。不过也有办法,我们还可以进行云同步,把所有数据,包括备份镜像,通过alist中转,上传到OneDrive上,具体链接onedrive的方法大家可以看alist文档,里面介绍的非常详细,按步骤抄作业就行。

点击添加云同步任务,方向选择推送,传输模式大家根据自身需要选,我选择复制,接着选择你想同步的文件夹,下面的传输其实就是任务并行数量,在这里要注意,如果你的上传带宽比较小的话建议选择最小即可,因为rclone的传输方式不支持断点续传。如果传输超大文件时意外中断会很难受。



如果你想更精细的控制带宽,可以设置带宽限制,我的设置是每日0:00开始限制3mb的上传速度,每日12:00时限制2mb。

针对重要文件可以设置加密。


这应该是目前最为经济的321备份法实践了。

但是,不出意外要出意外了哈 面对超大文件(>100G),truenas使用alist中转可能会出现405 Method Not Allowed的情况,查询相关问题后发现可能是OneDrive自身问题,但我之前用群晖怎么就没遇到过这个问题呢?



所以我就开始了实验,从truenas中分隔一块1TB的硬盘给群晖,接着初始化,安装群晖cloud sync,使用webdev将pve备份镜像全部拉到群晖中,注意这里raw和qcow2的虚拟磁盘要排除在外,备份他们没有任何意义。最后再将pve备份镜像全部推到onedrive中,这么一实践还真没发现问题。只要不超过250G的大文件都可以正常备份。所以我估计应该是的接口的问题。



最后,还可能有一种情况,如果PVE系统盘崩了怎么办?你可能会说,唉,没事的,系统盘有什么用,只要虚拟机在就行。 的确,对于pve虚拟机本身,重新配置并不难,只需要重新看一遍这个视频就行。 但是,有没有一种方法,把虚拟机本体也备份了,这样不是连重新配置的步骤都省了吗?

备份PVE本体

如果你也安装了DSM系统,可以使用里面的Active Backup for Business套件,直接备份Linux系统,最后通过镜像进行还原。但是 synology.cn/zh-cn/dsm/7 但目前abb只支持到debian11,内核支持到5.15。我目前的debian版本是12.5,内核版本是6.5.13-1-pve 显然不行

之后还想到可以用再生龙克隆系统,但是必须要停机 有没有不停机还能备份系统本体的软件? 还真让我找到了 veeam这款软件可以在系统开机的情况下备份,而且还有免费的社区版,还原也是通过镜像还原,我将veeam的备份目录也设置到了pve备份目录中,这样可以一同进行云备份。



不知道大家有没有发现,我并没有把网络放在pve上,因为我知道,只要网络不崩,这台服务器就永远不会boom。

总结

OK,本期PVE开荒教程到这里就结束了,感谢大家能看到这里。

原本这期的稿子早就写完了,但是看到了大家的评论和弹幕发现的确有很多关键的点需要点到,原本写好的稿子改了又改,加了又加,希望大家一键三连支持一下。

经过两期的铺垫,终于来到最后一期云游戏篇,横跨3000公里的云游戏体验究竟如何?希望大家支持一下,我们下期拭目以待。