Marco Nie - 2022年5月 https://blog.niekun.net/2022/05/ zh-CN you are the company you keep... Wed, 25 May 2022 08:56:00 +0800 Wed, 25 May 2022 08:56:00 +0800 esxi 配置 GPU 显卡直通给虚拟机使用 https://blog.niekun.net/archives/2705.html https://blog.niekun.net/archives/2705.html Wed, 25 May 2022 08:56:00 +0800 admin 最近在我家里的 Ubuntu 上安装了 jellyfin 媒体中心,发现局域网内播放高码率视频卡顿严重,原因是默认设置的是软解码导致 cpu 负载很高,在设置里可以开启硬件解码,但是配置后发现播放视频会报错:

客户端配置文件存在问题,服务器未发送兼容的媒体格式

看后台 log 日志,发现在 ffmpeg 解码时有如下报错信息:

[AVHWDeviceContext @ 0x558b80b15a80] libva: vaGetDriverNameByIndex() failed with unknown libva error, driver_name = (null)
[AVHWDeviceContext @ 0x558b80b15a80] Failed to initialise VAAPI connection: -1 (unknown libva error).
Device creation failed: -5.
Failed to set value 'vaapi=va:/dev/dri/renderD128' for option 'init_hw_device': Input/output error
Error parsing global options: Input/output error

查找原因

测试在 docker-compose.yml 中开启全部权限,配置 root PUID PGID,以及映射 GPU 设备给 docker:

    environment:
      - PUID=0
      - PGID=0
    devices:
      - /dev/dri:/dev/dri
    privileged: true

重启容器后依然会报错。

报错信息显示无法读取 gpu 驱动名称,这应该不是 docker 的问题,在主机上测试 vainfo 也会报错:

$ vainfo
error: can't connect to X server!
libva info: VA-API version 1.14.0
libva error: vaGetDriverNameByIndex() failed with unknown libva error, driver_name = (null)
vaInitialize failed with error code -1 (unknown libva error),exit

报错内容和 jellyfin 的日志类似,测试添加环境变量强制指定驱动名称:

export LIBVA_DRIVER_NAME=iHD

再次 vainfo:

$ vainfo
error: can't connect to X server!
libva info: VA-API version 1.14.0
libva info: User environment variable requested driver 'iHD'
libva info: Trying to open /usr/local/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_14
DRM_IOCTL_I915_GEM_APERTURE failed: Invalid argument
Assuming 131072kB available aperture size.
May lead to reduced performance or incorrect rendering.
get chip id failed: -1 [22]
param: 4, val: 0
libva error: /usr/local/lib/dri/iHD_drv_video.so init failed
libva info: va_openDriver() returns 18
vaInitialize failed with error code 18 (invalid parameter),exit

现在看来应该是其他问题了,经过查询,esxi 默认是分配了虚拟显卡给虚拟机,导致虚拟机无法调用 gpu 底层的一些功能,从而导致 ffmpeg 等工具硬件解码失效。处理办法就是在 esxi 上配置显卡直通,然后添加给对应虚拟机直接调用硬件资源。

经过下面的尝试,我还是设置显卡直通,导致最终无法实现硬件解码。可能是主板上有限制吧。

显卡直通

显卡直通应该就可以解决上面的问题,但是当我直接进入 esxi 控制台设备管理中却找不到 GPU 设备,需要进入 esxi ssh 查看是否有 GPU 设备类似于:UHD Graphics 630

ssh 登录 esxi 后台,首先查看是否有 GPU相关设备信息,终端命令行执行:

lspci -v

找到显卡设备ID,如图所示:
2022-05-25T00:39:59.png

8086:9bc8 就是显卡设备 ID,其中 8086 是供应商 ID,也就是代表 Intel,9bc8 就是这块显卡的设备硬件 ID。

然后关闭 esxi 对 GPU 的调用,然后手动添加 pci 设备信息,然后就可以在控制台配置直通了。

通过 ssh 登录 esxi,输入如下命令取消显卡占用,注意取消后就不能连接显示器访问 esxi 后台图形界面了:

esxcli system settings kernel set -s vga -v FALSE

后期如果需要取消显卡直通或者登录图形后台需要重新开启显卡调用:

esxcli system settings kernel set -s vga -v TRUE

然后修改 passthru.map 添加 PCIE 设备 ID 信息。

修改/etc/vmware/passthru.map 文件,根据上面找到的设备 ID 信息,在最底部增加以下信息:
2022-05-25T00:41:31.png

完成后保存并退出,然后重启 esxi。

重启完成后就可以从控制台 pci 设备中找到显卡了:
2022-05-25T00:42:58.png

配置好直通后,给对应虚拟机配置显卡。

虚拟机配置

首先编辑虚拟机,CPU虚拟化这三个选项全部取消,未取消开启虚拟机会报错:由于硬件或软件支持不可用,因此无法为 0:2.0 注册设备 pciPassthru0:
2022-05-25T00:44:00.png

内存勾选预留所有客户机内存(全部锁定)选项,不勾选启动虚拟机会报错:
2022-05-25T00:44:56.png

最后添加显卡:
2022-05-25T00:45:30.png
2022-05-25T00:45:40.png

然后配置虚拟机自定义参数:

进入虚拟机选项 → 高级 → 配置参数 → 编辑配置添加以下参数:

hypervisor.cpuid.v0FALSE

此参数的作用:不让操作系统识别是在虚拟机环境运行,一般直通独立显卡需要这样设置,核显可忽略,但设置也无妨。

如下图所示:
2022-05-25T00:47:09.png
2022-05-25T00:47:24.png
2022-05-25T00:47:35.png

由于虚拟机默认有一个虚拟显卡,我们又添加了一个直通显卡,现在就有了两个显卡,但我们只想要直通的显卡工作,可以在配置参数里添加一行:

svga.presentFALSE

2022-05-25T00:52:18.png

这样操作后,我们开启虚拟机后再 /dev/dri 目录下就只会有一个 renderD128:

ls -l /dev/dri/

total 0
crw-rw---- 1 root video 226,   0 Oct 23 20:41 card0
crw-rw---- 1 root video 226, 128 Oct 23 20:41 renderD128

查看 pci 设备信息:

<> sudo lspci -v -s  04:00.0
04:00.0 VGA compatible controller: Intel Corporation HD Graphics 530 (rev 06) (prog-if 00 [VGA controller])
    Subsystem: Hewlett-Packard Company Device 82bf
    Physical Slot: 161
    Flags: bus master, fast devsel, latency 64, IRQ 67
    Memory at fc000000 (64-bit, non-prefetchable) [size=16M]
    Memory at d0000000 (64-bit, prefetchable) [size=256M]
    I/O ports at 7000 [size=64]
    Expansion ROM at <unassigned> [disabled]
    Capabilities: [40] Vendor Specific Information: Len=0c <?>
    Capabilities: [70] Express Endpoint, MSI 00
    Capabilities: [ac] MSI: Enable+ Count=1/1 Maskable- 64bit-
    Capabilities: [d0] Power Management version 2
    Capabilities: [100] Process Address Space ID (PASID)
    Capabilities: [200] Address Translation Service (ATS)
    Capabilities: [300] Page Request Interface (PRI)
    Kernel driver in use: i915
    Kernel modules: i915

这样显卡就直接直通给了虚拟机,注意这样配置后包括 esxi 本身和其他虚拟机就没有显卡可用了,导致没有图形界面。

参考链接

ESXI 7.02 Intel 核心显卡直通开启3D加速
ESXi 6.5 Passthrough Video Card/GPU to Plex VM
HW Transcoding - VAAPI - Intel not working
Deploying Hardware-Accelerated Graphics with VMware Horizon
Esxi 6.7核显直通问题求教各位恩山大神
Name: UHD Graphics 630

]]>
0 https://blog.niekun.net/archives/2705.html#comments https://blog.niekun.net/feed/2022/05/
Ubuntu 开启 RDP 远程连接 https://blog.niekun.net/archives/2703.html https://blog.niekun.net/archives/2703.html Mon, 23 May 2022 10:18:00 +0800 admin 之前介绍过通过安装 TightVNC vnc server 远程连接 Ubuntu 桌面的教程,Windows 下常用的是 RDP 方式远程,使用体验非常流畅,不占用带宽。Linux 下也可以通过安装 Xrdp 的方式实现 rdp 连接。

参考教程:Ubuntu desktop 配置 vnc server

xrdp 是对 Windows rdp 协议的开源实现。

安装

我的系统是 Ubuntu desktop 20.04,首先需要保证有一个已经安装的桌面环境,desktop 版默认是 genome,也可以安装其他的如 xfce:

sudo apt install ubuntu-desktop

安装 xrdp:

sudo apt install xrdp

安装完成后,xrdp 会自动启动,可以通过命令查看状态:

$  sudo systemctl status xrdp
 
● xrdp.service - xrdp daemon
     Loaded: loaded (/lib/systemd/system/xrdp.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-05-23 09:50:43 CST; 20min ago
       Docs: man:xrdp(8)
             man:xrdp.ini(5)
    Process: 83586 ExecStartPre=/bin/sh /usr/share/xrdp/socksetup (code=exited, status=0/SUCCESS)
    Process: 83594 ExecStart=/usr/sbin/xrdp $XRDP_OPTIONS (code=exited, status=0/SUCCESS)
   Main PID: 83595 (xrdp)
      Tasks: 2 (limit: 9459)
     Memory: 26.4M
     CGroup: /system.slice/xrdp.service
             ├─83595 /usr/sbin/xrdp
             └─83597 /usr/sbin/xrdp

默认 rdp 端口为 3389.

配置

xrdp 安装后,会自动将一个 ssl key ssl-cert-snakeoil.key 放入 /etc/ssl/private/ 文件夹,需要将 xrdp 用户添加到 ssl-cert 用户组确保 xrdp 可以读取这个 ssl key:

sudo adduser xrdp ssl-cert

默认配置测试访问会有黑屏问题,显示不出来界面,需要修改 /etc/xrdp/startwm.sh 文件,在文件最后的 test -x /etc/X11/Xsession 前面加入如下内容:

unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR

重启 xrdp 服务:

sudo systemctl restart xrdp

现在就可以正常通过 rdp 连接到 Ubuntu了。

在使用中,我出现了输入用户密码后停留在解锁界面无法登录进去的问题,经过查询 xdrp 目前不可以同时在多个设备上尝试登录。同时登录 xrdp 的用户如果和正常在主机上登录的是同一个用户,需要删除 dbus-user-session 包,用 dbus-x11 代替。第三点,需要保证 gdm3 运行,执行下面的命令:

sudo apt remove dbus-user-session
sudo apt install dbus-x11

sudo systemctl set-default graphical
sudo systemctl isolate graphical

重启 xrdp 服务:

sudo systemctl restart xrdp

此时应该就可以正常通过 rdp 客户端链接 ubuntu 界面了。

但是我测试发现,第一次登录进去没问题,关闭后过一会儿再次尝试链接发现卡在登录界面没反应了,尝试执行如下命令:

echo xfce4-session > $HOME/.xsession
chmod +x .xsession

发现问题似乎解决了,但是调用的事 xfce 桌面环境。

远程登录

在局域网下访问比较流畅,但是在外网下发现没法达到 Windows rdp 流畅的效果。解决方法可以是在外网通过 rdp 链接一个局域网下 Windows 设备,然后在 Windows 设备下通过 rdp 链接局域网内的 ubuntu 设备。

参考链接

How to Install Xrdp on Ubuntu 20.04
Xrdp stuck on login, after password is entered, unblocked if I unlock from the ubuntu rdp server
Using the console and XRDP together in Debian / Ubuntu / Mint
XRDP session immediately closes after loggin in

]]>
0 https://blog.niekun.net/archives/2703.html#comments https://blog.niekun.net/feed/2022/05/
使用曲线匹配颜色 in Photoshop https://blog.niekun.net/archives/2672.html https://blog.niekun.net/archives/2672.html Thu, 12 May 2022 10:36:00 +0800 admin 2022-05-12T01:50:32.png
之前介绍过几种色彩匹配的方法,通过对亮度、颜色、饱和度的进行匹配,也可以通过设置曲线的黑、灰、白场来匹配颜色。下面介绍通过通过提取源图像和目标图像的黑白灰色彩,然后通过曲线将他们进行色彩匹配达到最终的效果。

参考教程:
精细匹配颜色 in Photoshop
简易匹配颜色 in Photoshop

用到的技术:曲线,拾色器

原图如下:
2022-05-12T01:52:28.png

我们的目标是将左边的衣服颜色转换为右边衣服的色彩。

首先在背景图层上新建两个空白图层,用来提取两人的衣服的黑白灰色彩信息:
2022-05-12T02:35:57.png

通过拾色工具分别拾取两个衣服的黑白灰部区域的色彩,并通过画笔工具记录在两个图层中,注意拾取颜色的时候设置为 3×3 或 5×5:
2022-05-12T02:40:27.png
2022-05-12T02:40:42.png

新建曲线图层,放在最上方:
2022-05-12T02:42:15.png

首先提取右侧衣服色彩 rgb 信息,快捷键 I 选择拾色工具然后按 shift + alt 键分别在三条色彩上点击,注意操作的时候要选择到最上方的图层,否则拾取的颜色会不对:
2022-05-12T02:48:26.png

可以看到面板中保存了三个点位的rgb信息,我们后续需要将左侧的三条色条匹配为这里记录的颜色。

下面在曲线图层中操作,我们需要在曲线中找到左侧三条颜色所在的位置,按 shift + ctrl 点击左侧第一条线,在曲线图层中会自动创建一个锚点就是拾取颜色所在的位置,在 rgb,red,green,blue 通道中都会有一个点:
2022-05-12T02:53:06.png
2022-05-12T02:53:23.png
2022-05-12T02:53:44.png

同样的方法将左侧三条颜色都在曲线中获取锚点:
2022-05-12T03:01:37.png

我们需要在 red green blue 通道的锚点中,将 output 信息修改为目标颜色的对应通道数值,比如右侧第一条亮部 rgb 为:216,92,59。我们就将刚才每个通道的 output 信息修改为这个值:
2022-05-12T02:58:28.png

以此类推将左侧三条颜色所在锚点的 output 修改为右侧记录的颜色 rgb 值:
2022-05-12T03:03:41.png

将 reference 图层放到曲线上方,可以看到记录的两个衣服色彩的 reference 和 target 图层颜色已经完全一致了:
2022-05-12T03:05:13.png

选中拾色器工具,同样的 shift + alt 点击三个之前创建的锚点可以删除它们。

下面需要选出左侧衣服部分,临时关闭除背景外的其他图层,使用钢笔工具或其他你常用的工具提取出左侧衣服部分的选区,然后给曲线图层添加图层蒙版:
2022-05-12T03:09:46.png

根据实际情况,可以对曲线每个锚点的位置进行微调,以达到最佳效果。

最终效果如下:
2022-05-12T03:15:55.png

以上就完成了简单的颜色匹配。

]]>
1 https://blog.niekun.net/archives/2672.html#comments https://blog.niekun.net/feed/2022/05/
制作水坑效果 in Photoshop https://blog.niekun.net/archives/2642.html https://blog.niekun.net/archives/2642.html Sat, 07 May 2022 14:53:00 +0800 admin 2022-05-07T06:30:42.png

今天介绍给晴朗路面添加雨天水坑效果,实际效果还不错。

用到的技术:vanishing point,channel,puddle texture材质。

原图如下:
2022-05-07T06:34:42.png

首先我们创建路面部分的立体平面,选择 filter - vanishing point:
2022-05-07T06:36:49.png

点击 create plant tool:
2022-05-07T06:40:46.png

根据路面形状,通过点击绘制出一个大致的梯形,注意如果轨迹不符合路面形状会显示为红色:
2022-05-07T06:42:23.png

拖拽线段扩展到整个路面:
2022-05-07T06:43:34.png

以上就完成了平面的构建,点击确认返回。

首先复制背景图层。

然后我们通过钢笔工具或者其他工具建立地面的选区:
2022-05-07T06:47:59.png

给复制的图层建立图层蒙版:
2022-05-07T06:53:54.png

然后解锁蒙版和图层的锁,否则后面颠倒图层蒙版也会动:
2022-05-07T06:56:50.png

然后选中图层而不是蒙版,点击 edit - transform - flip vertical:
2022-05-07T06:58:20.png

调整图层位置到合适:
2022-05-07T06:59:03.png

然后临时关闭路面倒影的图层,我们制作水坑的效果。

首先需要一个水坑素材图片,如下图:
2022-05-07T07:00:57.png

导入 ps 后选中材质图层,按住 ctrl 点击图层全选材质图层,点击 ctrl c 复制图层,然后就可以关闭材质图层了:
2022-05-07T07:02:23.png

新建一个空白图层,再次打开 vanishing point,按 ctrl v 复制材质图层到界面:
2022-05-07T07:04:18.png

首先按ctrl T适当缩小图像,然后拖拽图层到下方创建的平面内:
2022-05-07T07:05:57.png

按住 ctrl 拖拽图层,复制多个图层铺满整个路面:
2022-05-07T07:07:04.png

完成后点击确认返回 ps,会将填充的平面内容在新图层上:
2022-05-07T07:07:33.png

我们需要利用涂层的黑白部分反差作为模拟水滩效果,所以首先提高图层反差,新建曲线图层并设置只影响材质图层,提高亮部:
2022-05-07T07:13:18.png

然后临时关闭其他图层,只保留材质图层:
2022-05-07T07:14:17.png

进入通道,选择一个通道按住 ctrl 点击通道获取选区:
2022-05-07T07:15:15.png

然后关闭材质图层,打开背景图层和路面反转图层,并将反转图层单独建立一个组:
2022-05-07T07:16:40.png

选中组,点击创建蒙版:
2022-05-07T07:17:12.png

这样我们就有了基本效果啦。

下面微调效果,首先倒影是在路面上形成的,所以他的颜色分布也应该符合路面的色彩分布,所以我们在反转组内建立一个 gradient map 图层并锁定之影响下方图层:
2022-05-07T07:20:46.png

修改 map 颜色,亮部选区一个路面上较量区域的色彩,同样的暗部选取一个路面较暗的区域色彩,注意选择 3×3 拾取颜色:
2022-05-07T07:23:13.png

根据情况调节 gradient map 不透明度:
2022-05-07T07:24:26.png

水坑里的倒影一般会有一定的模糊,我们先将倒影图层转换为 smart object 然后选 filter - blur galley - path blur:
2022-05-07T07:26:48.png

根据情况可以适当加强一下饱和度,新建 vibrate 图层,调节饱和度:
2022-05-07T07:28:05.png

最终效果对比:
2022-05-07T07:30:20.png

]]>
1 https://blog.niekun.net/archives/2642.html#comments https://blog.niekun.net/feed/2022/05/