vdsm / virtual-dsm

Virtual DSM in a Docker container.
MIT License
2.64k stars 353 forks source link

添加直通GPU参数后报错! #334

Closed gzxiexl closed 1 year ago

gzxiexl commented 1 year ago
docker create
  --name='Virtual-DSM'
  --net='bridge'
  -e TZ="Asia/Shanghai"
  -e HOST_OS="Unraid"
  -e HOST_HOSTNAME="Tower"
  -e HOST_CONTAINERNAME="Virtual-DSM"
  -e 'DISK_SIZE'='10T'
  -e 'RAM_SIZE'='2048M'
  -e 'CPU_CORES'='2'
  -e 'DHCP'='N'
  -e 'ALLOCATE'='N'
  -e 'DEBUG'='Y'
  -e 'GPU'='Y'
  -l net.unraid.docker.managed=dockerman
  -l net.unraid.docker.webui='http://[IP]:[PORT:5000]'
  -l net.unraid.docker.icon='https://cdn.jsdelivr.net/gh/xushier/HD-Icons/border-radius/Synology_A.png'
  -p '5000:5000/tcp'
  -p '5001:5001/tcp'
  -v '/mnt/user/appdata/Virtual-dsm':'/storage':'rw'
  --device='/dev/dri'
  --device='/dev/vhost-net'
  --device='/dev/kvm'
  --stop-timeout 60
  --cap-add NET_ADMIN
  --device-cgroup-rule='c 241:* rwm' 'kroese/virtual-dsm:latest'
gzxiexl commented 1 year ago

日志如下:

++ ip link add dev dockerbridge type bridge
++ rc=0
++ ((  rc != 0  ))
++ ip address add 20.20.20.1/24 broadcast 20.20.20.255 dev dockerbridge
++ ip link set dockerbridge up
++ ip tuntap add dev dsm mode tap
++ ip link set dsm up promisc on
++ ip link set dev dsm master dockerbridge
+++ ip address show dev eth0
+++ grep inet
+++ awk '/inet / { print $2 }'
+++ cut -f1 -d/
++ IP=172.17.0.15
++ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
++ iptables -t nat -A PREROUTING -i eth0 -d 172.17.0.15 -p tcp -j DNAT --to 20.20.20.21
++ iptables -t nat -A PREROUTING -i eth0 -d 172.17.0.15 -p udp -j DNAT --to 20.20.20.21
++ ((  KERNEL > 4  ))
++ iptables -A POSTROUTING -t mangle -p udp --dport bootpc -j CHECKSUM --checksum-fill
++ /usr/sbin/dnsmasq --dhcp-range=20.20.20.21,20.20.20.21 --dhcp-host=02:11:32:28:41:aa,,20.20.20.21,VirtualDSM,infinite --dhcp-option=option:netmask,255.255.255.0 --dhcp-option=option:dns-server,10.0.0.1,208.67.220.220 --dhcp-option=option:router,20.20.20.1
+ echo 129
+ qemu-system-x86_64 -nodefaults -boot strict=on -display egl-headless,rendernode=/dev/dri/renderD128 -device virtio-vga,id=video0,max_outputs=1,bus=pcie.0,addr=0x1 -smp 2,sockets=1,dies=1,cores=2,threads=1 -m 2048M -machine type=q35,usb=off,dump-guest-core=off,hpet=off,accel=kvm -enable-kvm -cpu host -monitor telnet:localhost:7100,server,nowait,nodelay -serial mon:stdio -device virtio-serial-pci,id=virtio-serial0,bus=pcie.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev socket,id=charchannel0,host=127.0.0.1,port=12345,reconnect=10 -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=vchannel -netdev tap,ifname=dsm,script=no,downscript=no,id=hostnet0,vhost=on,vhostfd=40 -device virtio-net-pci,romfile=,netdev=hostnet0,mac=02:11:32:28:41:aa,id=net0 -device virtio-scsi-pci,id=hw-synoboot,bus=pcie.0,addr=0xa -drive file=/storage/DSM_VirtualDSM_64561.boot.img,if=none,id=drive-synoboot,format=raw,cache=none,aio=native,discard=on,detect-zeroes=on -device scsi-hd,bus=hw-synoboot.0,channel=0,scsi-id=0,lun=0,drive=drive-synoboot,id=synoboot0,rotation_rate=1,bootindex=1 -device virtio-scsi-pci,id=hw-synosys,bus=pcie.0,addr=0xb -drive file=/storage/DSM_VirtualDSM_64561.system.img,if=none,id=drive-synosys,format=raw,cache=none,aio=native,discard=on,detect-zeroes=on -device scsi-hd,bus=hw-synosys.0,channel=0,scsi-id=0,lun=0,drive=drive-synosys,id=synosys0,rotation_rate=1,bootindex=2 -device virtio-scsi-pci,id=hw-userdata,bus=pcie.0,addr=0xc -drive file=/storage/data.img,if=none,id=drive-userdata,format=raw,cache=none,aio=native,discard=on,detect-zeroes=on -device scsi-hd,bus=hw-userdata.0,channel=0,scsi-id=0,lun=0,drive=drive-userdata,id=userdata0,rotation_rate=1,bootindex=3 -device virtio-balloon-pci,id=balloon0,bus=pcie.0,addr=0x4 -object rng-random,id=objrng0,filename=/dev/urandom -device virtio-rng-pci,rng=objrng0,id=rng0,bus=pcie.0,addr=0x1c
MESA-LOADER: failed to open iris: /usr/lib/dri/iris_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
failed to load driver: iris
MESA-LOADER: failed to open zink: /usr/lib/dri/zink_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
failed to load driver: zink
MESA-LOADER: failed to open kms_swrast: /usr/lib/dri/kms_swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
failed to load driver: kms_swrast
MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
failed to load swrast driver
qemu-system-x86_64: egl: gbm_create_device failed
qemu-system-x86_64: egl: render node init failed
❯ Starting Virtual DSM for Docker v4.17...
❯ Container IP is 172.17.0.15 with gateway 172.17.0.1

/etc/resolv.conf:

# Generated by dhcpcd from eth0.dhcp6, eth0.ra
# Generated by rc.inet1
nameserver 10.0.0.1
nameserver 208.67.220.220
nameserver fdc7:356b:2220::1

❯ QEMU emulator version 7.2.5 
char device redirected to /dev/pts/0 (label charserial0)

** 按任意键关闭此窗口 ** 

删除GPU=Y -/dev/dri 后又正常了

kroese commented 1 year ago

The GPU drivers need to be installed during the installation of DSM, so is this an existing/old installation where you added GPU=Y or did you start with a fresh/new install?

gzxiexl commented 1 year ago

So if I want to keep my data, what files can I delete to reinstall the system?image

Kissycat commented 1 year ago

Emm, @kroese 为了控制docker镜像的大小,目前暂时把gpu驱动的安装放在了install.sh里,这个脚本只有全新安装的时候才会执行,所以你应该是需要手动安装驱动

kroese commented 1 year ago

@gzxiexl You can delete everything except data.img and then it will keep your existing files during re-install.

gzxiexl commented 1 year ago
VirtualDSM login: [   28.986926] iSCSI:target_core_rodsp_server.c:1025:rodsp_server_init RODSP server started, login_key(ee18f58af596).
[   28.992795] iSCSI:extent_pool.c:766:ep_init syno_extent_pool successfully initialized
[   29.000100] iSCSI:target_core_device.c:612:se_dev_align_max_sectors Rounding down aligned max_sectors from 4294967295 to 4294967288
[   29.001654] iSCSI:target_core_configfs.c:5763:target_init_dbroot db_root: cannot open: /etc/target
[   29.003082] iSCSI:target_core_lunbackup.c:366:init_io_buffer_head 2048 buffers allocated, total 8388608 bytes successfully
[   29.017474] iSCSI:target_core_file.c:152:fd_attach_hba RODSP plugin for fileio is enabled.
[   29.018738] iSCSI:target_core_file.c:159:fd_attach_hba ODX Token Manager is enabled.
[   29.019924] iSCSI:target_core_multi_file.c:91:fd_attach_hba RODSP plugin for multifile is enabled.
[   29.021249] iSCSI:target_core_ep.c:795:ep_attach_hba RODSP plugin for epio is enabled.
[   29.022435] iSCSI:target_core_ep.c:802:ep_attach_hba ODX Token Manager is enabled.
[   29.078771] workqueue: max_active 1024 requested for vhost_scsi is out of range, clamping between 1 and 512
[   31.300657] findhostd uses obsolete (PF_INET,SOCK_PACKET)
[   33.338396] fuse init (API version 7.23)

卡在这里了

Kissycat commented 1 year ago

卡在这里了

这里已经进系统了吧,是不是你自己限定的cgroup权限不够..

gzxiexl commented 1 year ago

卡在这里了

这里已经进系统了吧,是不是你自己限定的cgroup权限不够..

停止后再启动可以了

gzxiexl commented 1 year ago

image but

gzxiexl@VirtualDSM:~$ sudo ls /dev/dri
ls: cannot access '/dev/dri': No such file or directory
kroese commented 1 year ago

If gzxiexl@VirtualDSM is inside the SSH console of DSM then it's normal that you don't see /dev/dri, because it's running inside a VM. So /dev/dri is passed to the host (Debian) docker container, and not to the DSM VM.

gzxiexl commented 1 year ago

If gzxiexl@VirtualDSM is inside the SSH console of DSM then it's normal that you don't see /dev/dri, because it's running inside a VM. So /dev/dri is passed to the host (Debian) docker container, and not to the DSM VM.

这样意味着GPU直通的使用目的或者场景是怎样的呢?并不能给DSM VM用于emby转码之类的吗?

kroese commented 1 year ago

Yes the passthrough should work. But it goes like this:

/dev/dri --> Docker ---> Container (Debian) --> QEMU

Then QEMU creates a virtual device from it so it continues like:

QEMU graphics card ---> DSM (virtual machine)

So all Im saying its normal that you dont see a folder called/dev/dri inside DSM.

Kissycat commented 1 year ago

这样意味着GPU直通的使用目的或者场景是怎样的呢?并不能给DSM VM用于emby转码之类的吗?

场景就是你在想的那几个场景,但因为这是Virtual DSM,所以vdsm里用的是虚拟GPU,没有dri目录的,驱动就该装在容器宿主机,否则完全直通进去的话,你就得在vdsm镜像里装驱动了,这就不太合适了。

毕竟它正确的使用环境就是白群晖自己开的虚拟机,项目就是在模拟这个环境。

gzxiexl commented 1 year ago

这样意味着GPU直通的使用目的或者场景是怎样的呢?并不能给DSM VM用于emby转码之类的吗?

场景就是你在想的那几个场景,但因为这是Virtual DSM,所以vdsm里用的是虚拟GPU,没有dri目录的,驱动就该装在容器宿主机,否则完全直通进去的话,你就得在vdsm镜像里装驱动了,这就不太合适了。

毕竟它正确的使用环境就是白群晖自己开的虚拟机,项目就是在模拟这个环境。

在容器控制台ls/dev/dri已经有了 说明 GPU 直通成了 但是没懂 vdsm 里如何设置能用到 GPU 呢,比如 emby 转码

jinlife commented 1 year ago

这样意味着GPU直通的使用目的或者场景是怎样的呢?并不能给DSM VM用于emby转码之类的吗?

场景就是你在想的那几个场景,但因为这是Virtual DSM,所以vdsm里用的是虚拟GPU,没有dri目录的,驱动就该装在容器宿主机,否则完全直通进去的话,你就得在vdsm镜像里装驱动了,这就不太合适了。 毕竟它正确的使用环境就是白群晖自己开的虚拟机,项目就是在模拟这个环境。

在容器控制台ls/dev/dri已经有了 说明 GPU 直通成了 但是没懂 vdsm 里如何设置能用到 GPU 呢,比如 emby 转码

这个是虚拟的docker的虚拟GPU,显卡没有直通到docker里面去。不过确实能用GPU相关的功能了,很牛的方案,我这边十代的10400 CPU都能人脸识别了。之前用虚拟机直通显卡只能硬解视频,不能人脸识别。

你不要管在DSM里面运行ls dev/dri没结果,直接装Photos或VideoStation试试。人脸识别和硬解都能用的。Emby转码估计也行,但是如果要选显卡的话,就不知道情况了。 看你用的是Unraid,外面的GPU统计看不到3D渲染的,只是流量大了许多,跟虚拟机直通显卡不一样,不知道是啥原理和机制。 话说Unraid里面可以直接建Emby的Docker啊,没必要在DSM的Docker里面弄。

gzxiexl commented 1 year ago

这样意味着GPU直通的使用目的或者场景是怎样的呢?并不能给DSM VM用于emby转码之类的吗?

场景就是你在想的那几个场景,但因为这是Virtual DSM,所以vdsm里用的是虚拟GPU,没有dri目录的,驱动就该装在容器宿主机,否则完全直通进去的话,你就得在vdsm镜像里装驱动了,这就不太合适了。 毕竟它正确的使用环境就是白群晖自己开的虚拟机,项目就是在模拟这个环境。

在容器控制台ls/dev/dri已经有了 说明 GPU 直通成了 但是没懂 vdsm 里如何设置能用到 GPU 呢,比如 emby 转码

这个是虚拟的docker的虚拟GPU,显卡没有直通到docker里面去。不过确实能用GPU相关的功能了,很牛的方案,我这边十代的10400 CPU都能人脸识别了。之前用虚拟机直通显卡只能硬解视频,不能人脸识别。

你不要管在DSM里面运行ls dev/dri没结果,直接装Photos或VideoStation试试。人脸识别和硬解都能用的。Emby转码估计也行,但是如果要选显卡的话,就不知道情况了。 看你用的是Unraid,外面的GPU统计看不到3D渲染的,只是流量大了许多,跟虚拟机直通显卡不一样,不知道是啥原理和机制。 话说Unraid里面可以直接建Emby的Docker啊,没必要在DSM的Docker里面弄。

我也是10400 系统是unraid 实测下来人脸识别ok 但是VideoStation离线转码和jellyfin试了都不行。unraid下直接建个emby的docker了,么必要在vdsm里,就是测试一下。 image

jinlife commented 1 year ago

这样意味着GPU直通的使用目的或者场景是怎样的呢?并不能给DSM VM用于emby转码之类的吗?

场景就是你在想的那几个场景,但因为这是Virtual DSM,所以vdsm里用的是虚拟GPU,没有dri目录的,驱动就该装在容器宿主机,否则完全直通进去的话,你就得在vdsm镜像里装驱动了,这就不太合适了。 毕竟它正确的使用环境就是白群晖自己开的虚拟机,项目就是在模拟这个环境。

在容器控制台ls/dev/dri已经有了 说明 GPU 直通成了 但是没懂 vdsm 里如何设置能用到 GPU 呢,比如 emby 转码

这个是虚拟的docker的虚拟GPU,显卡没有直通到docker里面去。不过确实能用GPU相关的功能了,很牛的方案,我这边十代的10400 CPU都能人脸识别了。之前用虚拟机直通显卡只能硬解视频,不能人脸识别。 你不要管在DSM里面运行ls dev/dri没结果,直接装Photos或VideoStation试试。人脸识别和硬解都能用的。Emby转码估计也行,但是如果要选显卡的话,就不知道情况了。 看你用的是Unraid,外面的GPU统计看不到3D渲染的,只是流量大了许多,跟虚拟机直通显卡不一样,不知道是啥原理和机制。 话说Unraid里面可以直接建Emby的Docker啊,没必要在DSM的Docker里面弄。

我也是10400 系统是unraid 实测下来人脸识别ok 但是VideoStation离线转码和jellyfin试了都不行。unraid下直接建个emby的docker了,么必要在vdsm里,就是测试一下。 image

人脸识别都行,应该GPU已经起作用了。硬解要找别的原因了。这个图里面是音轨无法识别,貌似跟GPU没啥关系。应该是VideoStation不支持的音轨,需要装个音频解码器。建议提前装好 AME 和 FFMPEG-Patcher 再试试。 或者换个别的音轨的电影试试。

gzxiexl commented 1 year ago

这样意味着GPU直通的使用目的或者场景是怎样的呢?并不能给DSM VM用于emby转码之类的吗?

场景就是你在想的那几个场景,但因为这是Virtual DSM,所以vdsm里用的是虚拟GPU,没有dri目录的,驱动就该装在容器宿主机,否则完全直通进去的话,你就得在vdsm镜像里装驱动了,这就不太合适了。 毕竟它正确的使用环境就是白群晖自己开的虚拟机,项目就是在模拟这个环境。

在容器控制台ls/dev/dri已经有了 说明 GPU 直通成了 但是没懂 vdsm 里如何设置能用到 GPU 呢,比如 emby 转码

这个是虚拟的docker的虚拟GPU,显卡没有直通到docker里面去。不过确实能用GPU相关的功能了,很牛的方案,我这边十代的10400 CPU都能人脸识别了。之前用虚拟机直通显卡只能硬解视频,不能人脸识别。 你不要管在DSM里面运行ls dev/dri没结果,直接装Photos或VideoStation试试。人脸识别和硬解都能用的。Emby转码估计也行,但是如果要选显卡的话,就不知道情况了。 看你用的是Unraid,外面的GPU统计看不到3D渲染的,只是流量大了许多,跟虚拟机直通显卡不一样,不知道是啥原理和机制。 话说Unraid里面可以直接建Emby的Docker啊,没必要在DSM的Docker里面弄。

我也是10400 系统是unraid 实测下来人脸识别ok 但是VideoStation离线转码和jellyfin试了都不行。unraid下直接建个emby的docker了,么必要在vdsm里,就是测试一下。 image

人脸识别都行,应该GPU已经起作用了。硬解要找别的原因了。这个图里面是音轨无法识别,貌似跟GPU没啥关系。应该是VideoStation不支持的音轨,需要装个音频解码器。建议提前装好 AME 和 FFMPEG-Patcher 再试试。 或者换个别的音轨的电影试试。

AME 和 FFMPEG-Patcher都装了试了,包括emby和jellyfin,都无法硬解,不知道photos是如何调用GPU的 如果有大佬能研究出来估计也适用于视频解码。

Kissycat commented 1 year ago

AME 和 FFMPEG-Patcher都装了试了,包括emby和jellyfin,都无法硬解,不知道photos是如何调用GPU的 如果有大佬能研究出来估计也适用于视频解码。

建议自查一下部署细节,实测在正确安装上述软件后音视频解码都不会有问题..

gzxiexl commented 1 year ago

AME 和 FFMPEG-Patcher都装了试了,包括emby和jellyfin,都无法硬解,不知道photos是如何调用GPU的 如果有大佬能研究出来估计也适用于视频解码。

建议自查一下部署细节,实测在正确安装上述软件后音视频解码都不会有问题..

能否贴下您的docker命令

gzxiexl commented 1 year ago

AME 和 FFMPEG-Patcher都装了试了,包括emby和jellyfin,都无法硬解,不知道photos是如何调用GPU的 如果有大佬能研究出来估计也适用于视频解码。

建议自查一下部署细节,实测在正确安装上述软件后音视频解码都不会有问题..

确定视频可以GPU转码??emby jellyfin的转码设置我都试了 只能软解啊

vincenthsing commented 6 months ago

同样的问题,人脸识别正常,在vdsm里面安装了jellyfin的套件。试过QSV硬解,播放失败,日志提示没有找到解码设备之类的,也试过VAAPI,这个需要指定/dev/dri/renderD128的路径,但实际在vdsm里这个路径根本不存在,所以播放也是失败,日志也是类似没有解码设备。

显卡通给了lxc,再通给容器(容器里有/dev/dri),但是没法通给vdsm(没有/dev/dri),这种情况下vdsm人脸识别正常,但是vdsm里安装的jellyfin套件硬解又没法找到解码设备.

QSV硬解错误日志:

No VA display found for any default device.
Device creation failed: -22.
Failed to set value 'vaapi=va:,kernel_driver=i915,driver=iHD' for option 'init_hw_device': Invalid argument
Error parsing global options: Invalid argument