本文介绍如何为GTX1060显卡开启vGPU功能。消费级显卡不支持nvidia GRID vGPU功能。在2021年初,疫情激发了黑客的创作热情,给出了一个vgpu_unlock的补丁,可以让消费级显卡支持vGPU。但是vgpu_unlock 和 Proxmox 配合起来有好多坑。

首先,Proxmox 不在nvida vGPU的官方支持支持的hypervisor内,不是每个Proxmox 版本都能稳定的支持nvidia vgpu。我的上一篇文章《DoraCloud for Proxmox桌面云上启用NVIDIA Tesla P4的vGPU功能》讲到了在Proxmox 5.4 上为 Tesla P4 启动vGPU功能。 为啥是Proxmox 5.4,主要是这个版本的内核和nvidia vgpu配合起来比较稳定。 PVE 6.4,PVE7.x貌似都无法和nvida vgpu稳定的工作。

其次,Proxmox降低到 5.4后,5.4是源于Debian 9的。Debian 9 自带 Python 3.5。 但是Python 3.5 和 vgpu_unlock的python部分的代码不兼容。需要升级python3.6 或者 3.7。但是在PVE 5.4上安装Python 3.6/3.7,特别费劲。 虽然也成功的让 vgpu_unlock 成功启用过。但是总有说不清的混乱出现。 另外为了运行 mdevctl,还需要加载 rust 的工具链和cargo包管理工具。感觉一个小补丁牵出了一头牛。

经过探索,vgpu_unlock已经衍生出C和语言版本,以及 RUST语言版本。 于是选择RUST版本的vgpu_unlock,替代vgpu_unlock的Python配置vgpu服务的部分。

整体的安装过程与之前的Proxmox 5.4上支持P4 vGPU的过程相似。

与P4的安装过程相比,unlock的过程增加了如下环节:

1、下载vgpu_unlock项目,执行对nvidia  DKMS驱动打补丁的部分。 而对于vgpu service修改部分的不要执行,由 vgpu_unlock-rs 部分完成。

国内位置:https://gitee.com/deskpool/vgpu_unlock.git

2、下载安装 RUST工具链和cargo包管理器,并切换 USTC的源。

3、下载vgpu_unlock-rs项目,编译配置使用vgpu_unlock-rs来启用 unlock的服务。

国内位置:https://gitee.com/deskpool/vgpu_unlock-rs

1、下载安装Proxmox 5.4.1

 
推荐中科大( USTC)的源下载 ISO,然后使用 rufus 制作 启动U盘。 
 

2、修改中科大源,更新

替换中科大的源,更新升级系统。

cp /etc/apt/sources.list /etc/apt/sources.list.backup
sed -i 's|^deb http://ftp.debian.org|deb https://mirrors.ustc.edu.cn|g' /etc/apt/sources.list
sed -i 's|^deb http://security.debian.org|deb https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list mv /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak
CODENAME=`cat /etc/os-release |grep PRETTY_NAME |cut -f 2 -d "(" |cut -f 1 -d ")"`
echo "deb https://mirrors.ustc.edu.cn/proxmox/debian $CODENAME pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list #更新
apt update && apt dist-upgrade -y

安装DKMS 依赖包

#安装 DKMS 依赖包
apt install pve-headers dkms git pve-headers-4.15.18-12-pve -y

3、启用 IOMMU

服务器为Intel 处理器,通过如下脚本启用IOMMU,如果是AMD处理器,配置有差异。

# 复制如下脚本,启用IO-MMU

# /etc/default/grub 的GRUB_CMDLINE_LINUX_DEFAULT,增加 intel_iommu=on iommu=pt
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"/g' /etc/default/grub update-grub # 加载 vfio vfio_iommu_type1 vfio_pci vfio_virqfd 4个Modules
echo vfio >> /etc/modules
echo vfio_iommu_type1 >> /etc/modules
echo vfio_pci >> /etc/modules
echo vfio_virqfd >> /etc/modules echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf update-initramfs -u
reboot 

执行完毕脚本,会自动重启服务器,然后查看日志,确认 IOMMU已经启用。

root@pveserver:~# dmesg | grep -e DMAR -e IOMMU
[ 0.000000] ACPI: DMAR 0x0000000079A48648 0000A8 (v01 INTEL EDK2 00000002 01000013)
[ 0.000000] DMAR: IOMMU enabled
[ 0.004000] DMAR: Host address width 39
[ 0.004000] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[ 0.004000] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap 1c0000c40660462 ecap 19e2ff0505e
[ 0.004000] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[ 0.004000] DMAR: dmar1: reg_base_addr fed91000 ver 1:0 cap d2008c40660462 ecap f050da

  

4、安装DKMS 和 NVIDIA 内核驱动程序

#下载nvidia 驱动
wget http://www1.deskpool.com:9000/software/NVIDIA-Linux-x86_64-460.32.03-grid.run
wget http://www1.deskpool.com:9000/software/NVIDIA-Linux-x86_64-460.32.04-vgpu-kvm.run chmod +x NVIDIA-Linux-x86_64-460.32.04-vgpu-kvm.run #安装驱动
./NVIDIA-Linux-x86_64-460.32.04-vgpu-kvm.run -dkms 

为了让DoraCloud桌面云系统能够使用nvidia 的GPU资源,需要对Proxmox 5.4 打一个补丁。 该补丁对Proxmox的 API进行了增强。

wget http://www1.deskpool.com:9000/software/patch.tar.gz
tar -zxvf patch.tar.gz -C /

NVIDIA 驱动安装成功后,运行如下命令,重启Proxmox 服务器。

systemctl daemon-reload
reboot

如果GPU是支持NVIDA GRID的专业GPU,那么vGPU的驱动已经安装好了。由于GPU是消费级GPU,需要执行vgpu_unlock。

5、安装vgpu_unlock,对nvida 驱动源代码打补丁

git clone https://gitee.com/deskpool/vgpu_unlock.git
chmod -R +x vgpu_unlock
sed -i 's/#include "nv-time.h"/#include "nv-time.h"\n\n#include "\/root\/vgpu_unlock\/vgpu_unlock_hooks.c"/g' /usr/src/nvidia-460.32.04/nvidia/os-interface.c echo "ldflags-y += -T /root/vgpu_unlock/kern.ld" >>/usr/src/nvidia-460.32.04/nvidia/nvidia.Kbuild
dkms remove -m nvidia -v 460.32.04 --all
dkms install -m nvidia -v 460.32.04

6、安装rust工具链和cargo包管理器

Proxmox 5.4 自带的cargo版本太旧,会有问题。需要从rust官网安装。以下为从中科大(USTC)源安装 rust 和 cargo

执行如下脚本,并选择 Y,通过 rustup 方式安装 rust 和 cargo

#设置rustup的source为 USTC
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
wget -qO- https://cdn.jsdelivr.net/gh/rust-lang-nursery/rustup.rs/rustup-init.sh |sh

设置cargo的镜像为 USTC

│#加载cargo的环境变量
source ~/.cargo/env #设置cargo的源镜像为 USTC
cat >>~/.cargo/config <<EOF
[source.crates-io]
replace-with = 'ustc' [source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
EOF

7、安装rust工具链和cargo包管理器

#下载 vgpu_unlock-rs 项目
git clone https://gitee.com/deskpool/vgpu_unlock-rs
cd vgpu_unlock-rs/
cargo build --release
#nvidia-vgpud 的unlock 服务
mkdir /etc/systemd/system/nvidia-vgpud.service.d
cat >>/etc/systemd/system/nvidia-vgpud.service.d/vgpu_unlock.conf <<EOF
[Service]
Environment=LD_PRELOAD=/root/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so
EOF #nvidia-vgpu-mgr 的unlock服务
mkdir /etc/systemd/system/nvidia-vgpu-mgr.service.d
cat >>/etc/systemd/system/nvidia-vgpu-mgr.service.d/vgpu_unlock.conf <<EOF
[Service]
Environment=LD_PRELOAD=/root/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so
EOF #描述文件,控制GPU的显示配置,以及cuda
mkdir /etc/vgpu_unlock
cat >>/etc/vgpu_unlock/profile_override.toml <<EOF
[profile.nvidia-55]
num_displays = 1
display_width = 1920
display_height = 1080
max_pixels = 2073600
cuda_enabled = 1
frl_enabled = 0
EOF

重启动完毕后,观察syslog日志,确定vgpu unlock 是否启动

1 root@pveserver:~# cat /var/log/syslog |grep unlock
2 Dec 17 15:28:22 pveserver nvidia-vgpud: PID file unlocked.
3 Dec 17 15:41:36 pveserver nvidia-vgpud: PID file unlocked.

再观察一下识别的vGPU类型,可以看到 GTX-1060已经被模拟成了P40

 1 root@pveserver:~# cat /var/log/syslog |grep VGPU |grep GRID
2 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x3e: GRID P40-1B Class: NVS
3 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x2e: GRID P40-1Q Class: Quadro
4 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x2f: GRID P40-2Q Class: Quadro
5 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x30: GRID P40-3Q Class: Quadro
6 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x31: GRID P40-4Q Class: Quadro
7 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x32: GRID P40-6Q Class: Quadro
8 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x33: GRID P40-8Q Class: Quadro
9 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x34: GRID P40-12Q Class: Quadro
10 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x35: GRID P40-24Q Class: Quadro
11 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x36: GRID P40-1A Class: NVS
12 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x37: GRID P40-2A Class: NVS
13 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x38: GRID P40-3A Class: NVS
14 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x39: GRID P40-4A Class: NVS
15 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x3a: GRID P40-6A Class: NVS
16 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x3b: GRID P40-8A Class: NVS
17 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x3c: GRID P40-12A Class: NVS
18 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x3d: GRID P40-24A Class: NVS
19 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x9c: GRID P40-2B Class: NVS
20 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0xd7: GRID P40-2B4 Class: NVS
21 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0xf1: GRID P40-1B4 Class: NVS
22 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x11f: GRID P40-24C Class: Compute
23 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x11b: GRID P40-4C Class: Compute
24 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x11c: GRID P40-6C Class: Compute
25 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x11d: GRID P40-8C Class: Compute
26 Dec 17 15:41:36 pveserver nvidia-vgpud: VGPU Type 0x11e: GRID P40-12C Class: Compute

通过nvidia-smi看一下GPU卡的原始信息

 1 root@pveserver:~# nvidia-smi
2 Fri Dec 17 16:28:13 2021
3 +-----------------------------------------------------------------------------+
4 | NVIDIA-SMI 460.32.04 Driver Version: 460.32.04 CUDA Version: N/A |
5 |-------------------------------+----------------------+----------------------+
6 | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
7 | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
8 | | | MIG M. |
9 |===============================+======================+======================|
10 | 0 GeForce GTX 106... On | 00000000:01:00.0 Off | N/A |
11 | 21% 29C P8 7W / 130W | 19MiB / 6143MiB | 0% Default |
12 | | | N/A |
13 +-------------------------------+----------------------+----------------------+
14
15 +-----------------------------------------------------------------------------+
16 | Processes: |
17 | GPU GI CI PID Type Process name GPU Memory |
18 | ID ID Usage |
19 |=============================================================================|
20 | No running processes found |
21 +-----------------------------------------------------------------------------+

验证一下 Proxmox的API。是否支持vGPU。其中的 name 字段,是上面的补丁(patch.tar.gz)安装后的增强。便于DoraCloud的API使用。

 1 root@pveserver:~# pvesh get /nodes/pveserver/hardware/pci/01:00.0/mdev
2 ┌───────────┬──────────────────────────────────────────────────────────────────────────────────────────┬──────────────┬────────────┐
3 │ available │ description │ name │ type │
4 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
5 │ 1 │ num_heads=1, frl_config=60, framebuffer=24576M, max_resolution=4096x2160, max_instance=1 │ GRID P40-24C │ nvidia-287 │
6 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
7 │ 1 │ num_heads=4, frl_config=60, framebuffer=24576M, max_resolution=7680x4320, max_instance=1 │ GRID P40-24Q │ nvidia-53 │
8 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
9 │ 1 │ num_heads=1, frl_config=60, framebuffer=24576M, max_resolution=1280x1024, max_instance=1 │ GRID P40-24A │ nvidia-61 │
10 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
11 │ 2 │ num_heads=1, frl_config=60, framebuffer=12288M, max_resolution=4096x2160, max_instance=2 │ GRID P40-12C │ nvidia-286 │
12 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
13 │ 2 │ num_heads=4, frl_config=60, framebuffer=12288M, max_resolution=7680x4320, max_instance=2 │ GRID P40-12Q │ nvidia-52 │
14 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
15 │ 2 │ num_heads=1, frl_config=60, framebuffer=12288M, max_resolution=1280x1024, max_instance=2 │ GRID P40-12A │ nvidia-60 │
16 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
17 │ 3 │ num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=1280x1024, max_instance=3 │ GRID P40-8A │ nvidia-59 │
18 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
19 │ 3 │ num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=4096x2160, max_instance=3 │ GRID P40-8C │ nvidia-285 │
20 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
21 │ 3 │ num_heads=4, frl_config=60, framebuffer=8192M, max_resolution=7680x4320, max_instance=3 │ GRID P40-8Q │ nvidia-51 │
22 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
23 │ 4 │ num_heads=1, frl_config=60, framebuffer=6144M, max_resolution=1280x1024, max_instance=4 │ GRID P40-6A │ nvidia-58 │
24 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
25 │ 4 │ num_heads=1, frl_config=60, framebuffer=6144M, max_resolution=4096x2160, max_instance=4 │ GRID P40-6C │ nvidia-284 │
26 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
27 │ 4 │ num_heads=4, frl_config=60, framebuffer=6144M, max_resolution=7680x4320, max_instance=4 │ GRID P40-6Q │ nvidia-50 │
28 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
29 │ 6 │ num_heads=4, frl_config=60, framebuffer=4096M, max_resolution=7680x4320, max_instance=6 │ GRID P40-4Q │ nvidia-49 │
30 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
31 │ 6 │ num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=1280x1024, max_instance=6 │ GRID P40-4A │ nvidia-57 │
32 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
33 │ 6 │ num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=4096x2160, max_instance=6 │ GRID P40-4C │ nvidia-283 │
34 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
35 │ 8 │ num_heads=4, frl_config=60, framebuffer=3072M, max_resolution=7680x4320, max_instance=8 │ GRID P40-3Q │ nvidia-48 │
36 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
37 │ 8 │ num_heads=1, frl_config=60, framebuffer=3072M, max_resolution=1280x1024, max_instance=8 │ GRID P40-3A │ nvidia-56 │
38 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
39 │ 12 │ num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12 │ GRID P40-2B │ nvidia-156 │
40 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
41 │ 12 │ num_heads=4, frl_config=60, framebuffer=2048M, max_resolution=7680x4320, max_instance=12 │ GRID P40-2Q │ nvidia-47 │
42 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
43 │ 12 │ num_heads=1, frl_config=60, framebuffer=2048M, max_resolution=1280x1024, max_instance=12 │ GRID P40-2A │ nvidia-55 │
44 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
45 │ 12 │ num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12 │ GRID P40-2B4 │ nvidia-215 │
46 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
47 │ 24 │ num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=24 │ GRID P40-1B4 │ nvidia-241 │
48 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
49 │ 24 │ num_heads=4, frl_config=60, framebuffer=1024M, max_resolution=5120x2880, max_instance=24 │ GRID P40-1Q │ nvidia-46 │
50 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
51 │ 24 │ num_heads=1, frl_config=60, framebuffer=1024M, max_resolution=1280x1024, max_instance=24 │ GRID P40-1A │ nvidia-54 │
52 ├───────────┼──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────┤
53 │ 24 │ num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=24 │ GRID P40-1B │ nvidia-62 │
54 └───────────┴──────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────┘

8、使用vGPU

到这里,Proxmox虚拟化平台下,vGPU功能已经成功开启。 接下来,还需要创建 VM,并安装 nvidia grid 的guest 驱动。另外还涉及到 nvidia grid license 的申请。具体请参考Proxmox 以及nvidia vgpu的文档。

如果您使用DoraCloud管理桌面,可以直接部署DoraCloud,通过DoraCloud下载桌面模板。桌面模板已经集成了nvidia vgpu驱动。

请参考我上一篇文章,第4部分部署 DoraCloud

https://www.cnblogs.com/doracloud/p/proxmox_doracloud_telsa_p4.html

DoraCloud for Proxmox的安装

https://www.doracloud.cn/downloads/2-cn.html

版权所有,转载请注明

Proxmox 5.4使用vgpu_unlock,为GTX1060开启vGPU支持的更多相关文章

  1. Tomcat7开启CGI支持的方法

    tomcat默认没有开启cgi支持,因此有了tomat开启cgi的探索.因为原本对tomcat没多了解,所以中间或多或少走了点弯路.还好最终配置成功了,现在jy也用上这个方法了.    该方法在apa ...

  2. Java SpringBoot注解方式开启异步支持

    package task.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import ...

  3. datax开启hana支持以及dolphinscheduler开启datax任务

    datax开启hana支持以及dolphinscheduler开启datax任务 前面(@,@) 前段时间因为要做异构数据导入导出,所以搜了下,发现这类工具收费的居多,使用起来未必趁手~ 于是我找了下 ...

  4. Nginx 开启PATHINFO支持ThinkPHP框架实例

    ThinkPHP支持通过PATHINFO和URL rewrite的方式来提供友好的URL,只需要在配置文件中设置 'URL_MODEL' => 2 即可.在Apache下只需要开启mod_rew ...

  5. android webview开启html5支持

    最近做的一个小项目需要用到webview.虽然只是一个简单的网页,但是由于以前用的都只是显示本地文件,没有显示网页文件.现在需要显示网页文件,发现许多网站的webapp做的挺不错的,无论是显示还是用户 ...

  6. Web Api Session开启会话支持

        1.WebApi中默认是没有开启Session会话支持的.需要在Global中重写Init方法来指定会话需要支持的类型           //代码如下 public override voi ...

  7. springboot开启事务支持时报代理错误

    问题:The bean 'xxx' could not be injected as a 'com.github.service.xx' because it is a JDK dynamic pro ...

  8. 关于在 java 8 下开启 TLS_RSA_WITH_3DES_EDE_CBC_SHA 支持 xp ie8 tls1.0 的正常访问

    最近为 aioserver 增加了ssl支持. 在 myssl.com 上测试了一下,关于[客户端握手模拟]发现 ie8 xp tls1.0  这一项提示:握手失败 (服务器断开连接) 我又试了一下 ...

  9. WebApi开启CORS支持跨域POST

    概念:CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpRequest请求 ...

随机推荐

  1. 220v-5v稳压电路

    5V整流电路原理 先对电路进行整流 整流电路:利用单向导电器件将交流电转换成脉动直流电路,再用电容进行滤波 滤波电路:利用储能元件(电感或电容)把脉动直流电转换成比较平坦的直流电,然后对电路进行稳压 ...

  2. 微信小程序加密数据(encryptedData)解密中的PHP代码,php7.1报错

    问题描述 最近在开发微信小程序涉及到加密数据(encryptedData)的解密,用的是PHP代码,在运行后报错mcrypt_module_ xxx is deprecated,提示方法已过时了 经研 ...

  3. 使用 IDEA 创建 SpringBoot 项目(详细介绍)+ 源码案例实现

    使用 IDEA 创建 SpringBoot 项目 一.SpringBoot 案例实现源码 二.SpringBoot 相关配置 1. 快速创建 SpringBoot 项目 1.1 新建项目 1.2 填写 ...

  4. jquery 常用选择器和方法以及遍历(超详细)

    jQuery 常用选择器和和方法 学习总结 一.JQuery 介绍 1. 什么是 jQuery 2. jQuery 版本介绍 3. jQuery 文件介绍 二.jQuery 对象 1. jQuery ...

  5. window.location.href用法与a标签的比较

    1.在使用这两种方法进行页面的跳转时,这两种方法都能够有效的实现该功能 但是其原理不尽相同 第一:window.location.href()方法必须书写在js中 <html> <h ...

  6. 升级DLL plugin 到AutoDllPlugin

    为了使打包构建速度加快使用的DLLPlugin,但是我们还是需要手动把dll文件引入文件, HTMLwebpackplugin 结合autoDLLplugin可以自动引入打包文件, 十份地方便

  7. 一篇文章带你整明白HTTP缓存知识

    最近看了很多关于缓存的文章, 每次看完,看似明白但是实际还是没明白,这次总算搞明白协商缓存是怎么回事了 首先,服务器缓存分强制缓存和协商缓存(也叫对比缓存) 强制缓存一般是服务端在请求头携带字段Exp ...

  8. Python入门-变量与命名

    在上一篇中,我们定义了很多变量,变量格式是啥?变量名字可以随意么?有啥命名规范么?下面细讲 变量格式 变量名称 = 常量 把常量赋值给变量的过程,就是定义变量. 定义变量 Python中的变量不需要声 ...

  9. 不仅仅是一把瑞士军刀 —— Apifox的野望和不足

    声明:本文内容不涉及任何 Apifox 的功能介绍,一来网上这方面的文章已经汗牛充栋,二来 Apifox 本身的用户体验做的非常好,对于开发者而言学习成本基本为零. 阮一峰:不管你是前端开发还是后端开 ...

  10. 挖矿病毒分析(centos7)

    因为我在工作的时候被各种挖矿病毒搞过几次,所以在这里整理下我遇到的病毒以及大神们的解决方案. 服务器中挖矿病毒后,最基本的一个特征就是CPU使用率瞬间飙升,此时可以通过top命令进行查看,确认是否有异 ...