[{"data":1,"prerenderedAt":274},["ShallowReactive",2],{"archive-2022-11-1":3},{"title":4,"articles":5,"hot_article":59,"month_arch":122,"total":270,"cover":271},"2022年11月 - 独孤影的博客",[6,18,29,40,49],{"id":7,"title":8,"uri":9,"author":10,"tags":11,"created_at":15,"view_count":16,"content":17},85,"pve显卡虚拟化","nvidia-graphic-card-virtualization-in-pve","duguying",[12,13,14],"pve","显卡","虚拟化","2022-11-29 09:11:29",2133,"\u003Cp>家里闲置一段时间了的x79洋垃圾被我安装pve当做服务器了，但是它上面插了一张 nvidia GTX1060 6G 显卡，一直没用上，最近看到云游戏架构介绍之后，了解到显卡也可以虚拟化，决定自己动手将这张显卡用起来，在pve上虚拟化，这样一来可以在linux系统使用同时也可以在windows系统使用，让显卡发挥它的作用，以免浪费。\u003C\u002Fp>\n\n\u003Cp>\u003Cstrong>环境介绍\u003C\u002Fstrong>：\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>pve: 7.3\u003C\u002Fli>\n\u003Cli>显卡: nvidia GTX1060 6G\u003C\u002Fli>\n\u003Cli>主机平台: x79 E5 双路, 64G内存\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>一开始我参考\u003Ca href=\"https:\u002F\u002Ffoxi.buduanwang.vip\u002Fvirtualization\u002F1683.html\">这篇\u003C\u002Fa>文章，\u003Cstrong>首先在宿主机上安装必须软件以及显卡驱动\u003C\u002Fstrong>。注意其中显卡驱动和\u003Ccode class=\"inline-code\">mdevctl\u003C\u002Fcode>是核心服务软件。\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>apt update \u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;&amp;\u003C\u002Fspan> apt install dkms  git build-essential pve-kernel-5.15 pve-headers-5.15 dkms cargo jq uuid-runtime -y\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>wget -P \u002Fopt\u002F http:\u002F\u002Fftp.br.debian.org\u002Fdebian\u002Fpool\u002Fmain\u002Fm\u002Fmdevctl\u002Fmdevctl_0.81-1_all.deb\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>dpkg -i \u002Fopt\u002Fmdevctl_0.81-1_all.deb\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>然后，配置内核\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>echo vfio &gt;&gt; \u002Fetc\u002Fmodules \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>echo vfio_iommu_type1 &gt;&gt; \u002Fetc\u002Fmodules \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>echo vfio_pci &gt;&gt; \u002Fetc\u002Fmodules \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>echo vfio_virqfd &gt;&gt; \u002Fetc\u002Fmodules\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>echo  \u003Cspan style=\"color:#a5d6ff\">&#34;blacklist nouveau&#34;\u003C\u002Fspan> &gt;&gt; \u002Fetc\u002Fmodprobe.d\u002Fblacklist.conf\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>echo \u003Cspan style=\"color:#a5d6ff\">&#34;options kvm ignore_msrs=1&#34;\u003C\u002Fspan> &gt; \u002Fetc\u002Fmodprobe.d\u002Fkvm.conf \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\"># 更新 initramfs\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>update-initramfs -k all -u\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>\u003Cstrong>配置引导\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">#编辑grub，请不要盲目改。根据自己的环境，选择设置\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>nano \u002Fetc\u002Fdefault\u002Fgrub \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">#在里面找到：\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#79c0ff\">GRUB_CMDLINE_LINUX_DEFAULT\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;quiet&#34;\u003C\u002Fspan> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">#然后修改为：\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#79c0ff\">GRUB_CMDLINE_LINUX_DEFAULT\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;quiet intel_iommu=on&#34;\u003C\u002Fspan> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">#如果是amd cpu请改为：\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#79c0ff\">GRUB_CMDLINE_LINUX_DEFAULT\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;quiet amd_iommu=on&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">#更新引导\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>update-grub\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>\u003Cstrong>重启宿主机一次\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003Cp>\u003Cstrong>检查\u003Ccode class=\"inline-code\">iommu\u003C\u002Fcode>是否开启成功\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>出现有如下iommu group说明成功\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>root@pve3:~# dmesg |grep iommu\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    0.000000\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> Command line: \u003Cspan style=\"color:#79c0ff\">BOOT_IMAGE\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u002Fboot\u002Fvmlinuz-5.11.22-7-pve \u003Cspan style=\"color:#79c0ff\">root\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u002Fdev\u002Fmapper\u002Fpve-root ro quiet \u003Cspan style=\"color:#79c0ff\">iommu\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>pt \u003Cspan style=\"color:#79c0ff\">intel_iommu\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>on\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    0.075784\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> Kernel command line: \u003Cspan style=\"color:#79c0ff\">BOOT_IMAGE\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u002Fboot\u002Fvmlinuz-5.11.22-7-pve \u003Cspan style=\"color:#79c0ff\">root\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u002Fdev\u002Fmapper\u002Fpve-root ro quiet \u003Cspan style=\"color:#79c0ff\">iommu\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>pt \u003Cspan style=\"color:#79c0ff\">intel_iommu\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>on\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    0.352588\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> iommu: Default domain type: Passthrough \u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>set via kernel command line\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373583\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:00.0: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373592\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:02.0: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">1\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373605\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:14.0: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">2\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373613\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:17.0: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">3\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373623\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:1c.0: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">4\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373637\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:1d.0: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">5\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373647\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:1d.2: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">6\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373656\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:1d.3: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">7\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373675\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:1f.0: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">8\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373683\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:1f.2: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">8\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373691\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:1f.3: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">8\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373699\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:1f.4: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">8\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373707\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:00:1f.6: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">9\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373717\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:01:00.0: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">10\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373726\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:03:00.0: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">11\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.373735\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> pci 0000:05:00.0: Adding to iommu group \u003Cspan style=\"color:#a5d6ff\">12\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>    1.656483\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan>     \u003Cspan style=\"color:#79c0ff\">intel_iommu\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>on\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>注意，上面日志中必须出现\u003Ccode class=\"inline-code\">iommu group\u003C\u002Fcode>相关内容，否则是\u003Ccode class=\"inline-code\">iommu\u003C\u002Fcode>开启失败，具体原因很可能是机器的bios中没有开启或者没有完全开启\u003Ccode class=\"inline-code\">VT-d\u003C\u002Fcode>，请将\u003Ccode class=\"inline-code\">VT-d\u003C\u002Fcode>及相关bios选项设置为\u003Ccode class=\"inline-code\">enabled\u003C\u002Fcode>状态，重启机器后再执行上述\u003Ccode class=\"inline-code\">dmesg\u003C\u002Fcode>命令查看日志是否正常。\u003C\u002Fp>\n\n\u003Cp>\u003Cstrong>安装驱动\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\"># 将驱动下载至\u002Fopt目录\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>wget https:\u002F\u002Ffoxi.buduanwang.vip\u002Fpan\u002Ffoxi\u002FVirtualization\u002FvGPU\u002FNVIDIA-Linux-x86_64-460.73.01-grid-vgpu-kvm-v5-5.15.run -P \u002Fopt\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\"># 给驱动添加可执行权限\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>chmod +x \u002Fopt\u002FNVIDIA-Linux-x86_64-460.73.01-grid-vgpu-kvm-v5-5.15.run\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\"># 安装\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>sh -c \u002Fopt\u002FNVIDIA-Linux-x86_64-460.73.01-grid-vgpu-kvm-v5-5.15.run \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>安装过程可以参考上文中所指出的引用文章\u003C\u002Fp>\n\n\u003Cp>\u003Cstrong>配置 vgpu_unlock\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003Cp>vgpu_unlock 是为消费级显卡虚拟化功能解锁，nvidia消费级显卡默认是不能开启vgpu虚拟化的，想要专业的支持虚拟化的显卡，需要购买 nvidia Tesla 等型号的显卡。我们这里是 GTX1060 所以需要使用 vgpu_unlock 进行 vpgu 解锁。\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\"># 下载vgpu_unlock-rs版本\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>cd \u002Fopt\u002F \u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;&amp;\u003C\u002Fspan> git clone https:\u002F\u002Fgithub.com\u002Fmbilker\u002Fvgpu_unlock-rs.git \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\"># 编译\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>cd \u002Fopt\u002Fvgpu_unlock-rs \u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;&amp;\u003C\u002Fspan> git checkout v2.0.1 \u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;&amp;\u003C\u002Fspan> cargo build --release\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\"># 安装 vgpu_unlock\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>cp \u002Fopt\u002Fvgpu_unlock-rs\u002Ftarget\u002Frelease\u002Flibvgpu_unlock_rs.so \u002Flib\u002Fnvidia\u002Flibvgpu_unlock_rs.so\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>\u003Cstrong>重启宿主机一次\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003Cp>验证显卡驱动及 vgpu_unlock 是否成功。重启之后，使用nvidia-smi 确认是否如下，显示GPU信息。\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>➜  ~ nvidia-smi\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Tue Nov \u003Cspan style=\"color:#a5d6ff\">29\u003C\u002Fspan> 09:31:35 \u003Cspan style=\"color:#a5d6ff\">2022\u003C\u002Fspan>       \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>+-----------------------------------------------------------------------------+\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>| NVIDIA-SMI 460.73.01    Driver Version: 460.73.01    CUDA Version: 11.2     |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>|-------------------------------+----------------------+----------------------+\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>| Fan  Temp  Perf  Pwr:Usage\u002FCap|         Memory-Usage | GPU-Util  Compute M. |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>|                               |                      |               MIG M. |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>|\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>+\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>+\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>|\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>|   \u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>  GeForce GTX 106...  On   | 00000000:03:00.0 Off |                  N\u002FA |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>| 10%   53C    P8     9W \u002F 120W |   4084MiB \u002F  6143MiB |      0%      Default |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>|                               |                      |                  N\u002FA |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>+-------------------------------+----------------------+----------------------+\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>                                                                               \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>+-----------------------------------------------------------------------------+\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>| Processes:                                                                  |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>|        ID   ID                                                   Usage      |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>|\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>|\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>|  No running processes found                                                 |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>+-----------------------------------------------------------------------------+\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>使用mdevctl types 验证是否出现mdev设备\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>➜  ~ mdevctl types\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>0000:03:00.0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-156\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-2B\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-215\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-2B4\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-241\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-1B4\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=24\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-283\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-4C\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=4096x2160, max_instance=6\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-284\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-6C\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=6144M, max_resolution=4096x2160, max_instance=4\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-285\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-8C\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=4096x2160, max_instance=3\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-286\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-12C\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=12288M, max_resolution=4096x2160, max_instance=2\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-287\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-24C\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=24576M, max_resolution=4096x2160, max_instance=1\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-46\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-1Q\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=60, framebuffer=1024M, max_resolution=5120x2880, max_instance=24\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-47\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-2Q\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=60, framebuffer=2048M, max_resolution=7680x4320, max_instance=12\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-48\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-3Q\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=60, framebuffer=3072M, max_resolution=7680x4320, max_instance=8\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-49\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-4Q\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=60, framebuffer=4096M, max_resolution=7680x4320, max_instance=6\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-50\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-6Q\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=60, framebuffer=6144M, max_resolution=7680x4320, max_instance=4\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-51\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-8Q\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=60, framebuffer=8192M, max_resolution=7680x4320, max_instance=3\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-52\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-12Q\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=60, framebuffer=12288M, max_resolution=7680x4320, max_instance=2\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-53\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-24Q\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=60, framebuffer=24576M, max_resolution=7680x4320, max_instance=1\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-54\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-1A\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=1024M, max_resolution=1280x1024, max_instance=24\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-55\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 10\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-2A\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=2048M, max_resolution=1280x1024, max_instance=12\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-56\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-3A\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=3072M, max_resolution=1280x1024, max_instance=8\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-57\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-4A\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=1280x1024, max_instance=6\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-58\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-6A\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=6144M, max_resolution=1280x1024, max_instance=4\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-59\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-8A\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=1280x1024, max_instance=3\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-60\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-12A\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=12288M, max_resolution=1280x1024, max_instance=2\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-61\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-24A\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=1, frl_config=60, framebuffer=24576M, max_resolution=1280x1024, max_instance=1\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  nvidia-62\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Available instances: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Device API: vfio-pci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Name: GRID P40-1B\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    Description: num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=24\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>如果上面两个验证不正常，请检查 \u003Ccode class=\"inline-code\">nvidia-vgpud\u003C\u002Fcode> 服务和 \u003Ccode class=\"inline-code\">nvidia-vgpu-mgr\u003C\u002Fcode> 服务的日志输出，命令如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>journalctl -u  nvidia-vgpud\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>journalctl -u  nvidia-vgpu-mgr\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>请根据日志错误自行谷歌，然后尝试修复。\u003C\u002Fp>\n\n\u003Cp>配置 vgpu 参数，即前面安装的 vgpu_unlock-rs 的配置文件，路径 \u003Ccode class=\"inline-code\">\u002Fetc\u002Fvgpu_unlock\u002Fprofile_override.toml\u003C\u002Fcode>。内容如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#f85149\">➜\u003C\u002Fspan>  \u003Cspan style=\"color:#f85149\">~\u003C\u002Fspan> cat \u003Cspan style=\"color:#f85149\">\u002F\u003C\u002Fspan>etc\u003Cspan style=\"color:#f85149\">\u002F\u003C\u002Fspan>vgpu_unlock\u003Cspan style=\"color:#f85149\">\u002F\u003C\u002Fspan>profile_override.toml\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[profile.nvidia-55]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>num_displays = \u003Cspan style=\"color:#a5d6ff\">1\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>display_width = \u003Cspan style=\"color:#a5d6ff\">1920\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>display_height = \u003Cspan style=\"color:#a5d6ff\">1080\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>max_pixels = \u003Cspan style=\"color:#a5d6ff\">2073600\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>cuda_enabled = \u003Cspan style=\"color:#a5d6ff\">1\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>frl_enabled = \u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>注意：\u003Ccode class=\"inline-code\">framebuffer\u003C\u002Fcode>，\u003Ccode class=\"inline-code\">pci_id\u003C\u002Fcode>，\u003Ccode class=\"inline-code\">pci_device_id\u003C\u002Fcode> 这三个选项不要配置，因为这三个参数的值你拿不准，会导致后续创建虚拟机虚拟显卡后，虚拟机无法启动，常见报错如下\n注意：我这里选择 \u003Ccode class=\"inline-code\">nvidia-55\u003C\u002Fcode> 这个虚拟显卡，它显存是2G，我6G显卡可以虚拟出3个这个型号的显卡，你也可以选择其他显卡，具体显卡对应参数，参见上面\u003Ccode class=\"inline-code\">mdevctl types\u003C\u002Fcode>的输出内容。\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>Input\u002Foutput error Verify all devices in group 29 are bound to vfio-&lt;bus&gt; or pci-stub and not already in use\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>具体配置可以参考 vgpu_unlock-rs 项目\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmbilker\u002Fvgpu_unlock-rs\">主页\u003C\u002Fa>。\u003C\u002Fp>\n\n\u003Cp>接下来就可以在pve-web上创建虚拟显卡了，首先设备选择 \u003Ccode class=\"inline-code\">GTX 1060\u003C\u002Fcode>\u003C\u002Fp>\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimage.duguying.net\u002F2022\u002F11\u002F0of8azqz.webp\" alt=\"0of8azqz\" \u002F>\u003C\u002Fp>\n\n\u003Cp>然后 \u003Ccode class=\"inline-code\">MDev\u003C\u002Fcode> 选择前面 \u003Ccode class=\"inline-code\">vgpu_unlock\u002Fprofile_override.toml\u003C\u002Fcode> 里配置的 \u003Ccode class=\"inline-code\">nvidia-55\u003C\u002Fcode>\u003C\u002Fp>\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimage.duguying.net\u002F2022\u002F11\u002Feshvg6wq.webp\" alt=\"eshvg6wq\" \u002F>\u003C\u002Fp>\n\n\u003Cp>显卡创建完毕，虚拟机开机，windows系统中设备管理器可以看到未知的显示设备，安装驱动，从\u003Ca href=\"https:\u002F\u002Ffoxi.buduanwang.vip\u002Fpan\u002Ffoxi\u002FVirtualization\u002FvGPU\u002Fguestdrivers\u002F\">这里\u003C\u002Fa>下载，选择\u003Ccode class=\"inline-code\">grid_win10\u003C\u002Fcode>原生驱动即可，也可以去NVIDIA官网下载grid驱动，但是据说虚拟机里的驱动版本不能比宿主机驱动版本高，具体我没验证。安装完毕如下\u003C\u002Fp>\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimage.duguying.net\u002F2022\u002F11\u002F2wc85256.webp\" alt=\"2wc85256\" \u002F>\u003C\u002Fp>\n\n\u003Cp>接下来我们在我们的 \u003Ccode class=\"inline-code\">ubuntu-20.04\u003C\u002Fcode> 虚拟机上也添加一个显卡，添加步骤相同，看结果\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>root@ubuntu-gpu:~# lspci\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC \u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>Natoma\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> \u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>rev 02\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA \u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>Natoma\u002FTriton II\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE \u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>Natoma\u002FTriton II\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB \u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>Natoma\u002FTriton II\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> \u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>rev 01\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:01.3 Bridge: Intel Corporation 82371AB\u002FEB\u002FMB PIIX4 ACPI \u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>rev 03\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:02.0 VGA compatible controller: Device 1234:1111 \u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>rev 02\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:03.0 Unclassified device \u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>00ff\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan>: Red Hat, Inc. Virtio memory balloon\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:05.0 PCI bridge: Red Hat, Inc. QEMU PCI-PCI bridge\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:10.0 VGA compatible controller: NVIDIA \u003Cspan style=\"color:#f85149\">C\u003C\u002Fspan>orporation GP102GL \u003Cspan style=\"color:#ff7b72;font-weight:bold\">[\u003C\u002Fspan>Tesla P40\u003Cspan style=\"color:#ff7b72;font-weight:bold\">]\u003C\u002Fspan> \u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>rev a1\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:12.0 Ethernet controller: Red Hat, Inc. Virtio network device\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:1e.0 PCI bridge: Red Hat, Inc. QEMU PCI-PCI bridge\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>00:1f.0 PCI bridge: Red Hat, Inc. QEMU PCI-PCI bridge\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>01:01.0 SCSI storage controller: Red Hat, Inc. Virtio SCSI\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>可以看到我们的NVIDIA显卡，表示虚拟显卡添加正常，驱动可以自己去官网下载安装Grid驱动。\u003C\u002Fp>\n\n\u003Cp>可惜的是，显卡虚拟化成功了，但是需要买 nvidia 的 License 才能在虚拟机中用。老黄的刀法，不得不服啊……😅\u003C\u002Fp>\n",{"id":19,"title":20,"uri":21,"author":10,"tags":22,"created_at":26,"view_count":27,"content":28},84,"初学rust，数组vector的自增","how-vector-auto-increased-in-rust",[23,24,25],"rust","vector","自增","2022-11-25 15:03:29",207,"\u003Cp>在golang中经常会踩一个坑，那就是slice append，golang的动态数组也称为slice，使用append可以对动态数组进行添加元素，但是slice空间不够之后golang会自动重新分配内存空间，每次重新分配的内存空间是原空间的2倍，而且有个更坑的是，golang中slice每次重新分配内存都是重新分配一片 \u003Cspan v-katex:auto>2N\u003C\u002Fspan> 大小的内存，然后把原来的数据拷贝过去，这样一来，性能损耗更大了。\u003C\u002Fp>\n\n\u003Cp>那么rust中的数组是怎么处理动态增长的呢，我们来一段代码测试一下。\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">main\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>vec\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Vec::with_capacity(\u003Cspan style=\"color:#a5d6ff\">100\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F The vector contains no items, even though it has capacity for more\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">vec.len: \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>vec.len());\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">vec.cap: \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>vec.capacity());\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F These are all done without reallocating...\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>i\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">in\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">..\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">100\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>vec.push(i);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">vec.len: \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>vec.len());\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">vec.cap: \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>vec.capacity());\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F ...but this may make the vector reallocate\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>vec.push(\u003Cspan style=\"color:#a5d6ff\">101\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">vec.len: \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>vec.len());\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">vec.cap: \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>vec.capacity());\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>输出如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>vec.len: 0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>vec.cap: 100\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>vec.len: 100\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>vec.cap: 100\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>vec.len: 101\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>vec.cap: 200\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>可以看到，rust中，当vector数组存储满了之后，再往里面添加元素，vector就会重新分配内存，新分配的内存也是原来空间的2倍，但是，他是在原来的内存上扩充的，而不是像golang一样重新分配一片2N的内存空间替换旧的内存。性能损耗上，相比golang少了copy数据和释放旧空间。所以在高性能场景下，这里依然不建议使用vector的自动增长特性，自动增长的内存分配会消耗存储空间，而且 \u003Cspan v-katex:auto>2N\u003C\u002Fspan> 的增长步长会很容易导致内存泄漏，你如果依赖这个自动增长特性，你将会发现你使用的内存可能会发生 \u003Cspan v-katex:auto>2^n\u003C\u002Fspan> 指数级增长。这绝对会在大部分边界条件下导致你的程序迅速的发生OOM。\u003C\u002Fp>\n\n\u003Cp>远离动态数组，远离bug。\u003C\u002Fp>\n",{"id":30,"title":31,"uri":32,"author":10,"tags":33,"created_at":37,"view_count":38,"content":39},83,"nginx upstream DNS解析问题","nginx-upstream-dns-resolve",[34,35,36],"nginx","upstream","dns","2022-11-14 11:20:44",362,"\u003Cp>最近发现我香港服务器上放置的几个 web 站点经常会偶尔出现无法访问的情况，这个香港服务器上放置的是 trojan 加 nginx，流量从trojan进入，部分转发出去，另外部分是web站点的流量，转发到nginx，从而实现流量代理和web访问。\u003C\u002Fp>\n\n\u003Cp>这个香港节点出现web访问异常，之前也遇到过几次，都是重启nginx就正常了。这次决定仔细看下是什么情况，登陆节点，首先查看trojan日志，发现在正常转发，再看下nginx的日志，如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>2022\u002F11\u002F14 01:27:11 [error] 22#22: *473474 upstream timed out (110: Connection timed out) while connecting to upstream, client: 61.177.173.46, server: 0.0.0.0:22, upstream: &#34;36.36.106.166:23000&#34;, bytes from\u002Fto client:0\u002F0, bytes from\u002Fto upstream:0\u002F0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>2022\u002F11\u002F14 01:27:27 [error] 22#22: *473486 upstream timed out (110: Connection timed out) while connecting to upstream, client: 203.205.141.115, server: 0.0.0.0:22, upstream: &#34;36.36.106.166:23000&#34;, bytes from\u002Fto client:0\u002F0, bytes from\u002Fto upstream:0\u002F0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>2022\u002F11\u002F14 01:28:36 [error] 22#22: *473490 upstream timed out (110: Connection timed out) while connecting to upstream, client: 203.205.141.115, server: 0.0.0.0:22, upstream: &#34;36.36.106.166:23000&#34;, bytes from\u002Fto client:0\u002F0, bytes from\u002Fto upstream:0\u002F0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>2022\u002F11\u002F14 01:29:19 [error] 22#22: *473492 upstream timed out (110: Connection timed out) while connecting to upstream, client: 61.177.173.52, server: 0.0.0.0:22, upstream: &#34;36.36.106.166:23000&#34;, bytes from\u002Fto client:0\u002F0, bytes from\u002Fto upstream:0\u002F0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>发现nginx日志显示有连接超时，于是我决定判断一下是否真的连接不上，telnet\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>➜  trojan git:\u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>master\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan> telnet 36.36.106.166 \u003Cspan style=\"color:#a5d6ff\">23000\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Trying 36.36.106.166...\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>^C\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>果然连接不上，我web站点配置如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">server\u003C\u002Fspan> {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">listen\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">10110\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">ssl\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">http2\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">server_name\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">xxx.duguying.net\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">root\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">index\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">index.php\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">index.html\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">ssl_certificate\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">\u002Fdata\u002Fcerts\u002F_.duguying.net.crt\u003C\u002Fspan>; \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">ssl_certificate_key\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">\u002Fdata\u002Fcerts\u002F_.duguying.net.key\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">ssl_stapling\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff;font-weight:bold\">on\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">ssl_stapling_verify\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff;font-weight:bold\">on\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">add_header\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">Strict-Transport-Security\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">&#34;max-age=31536000&#34;\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">location\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">\u002F\u003C\u002Fspan> {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">include\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">git.deny\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_set_header\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">X-Forwarded-For\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff\">$remote_addr\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_set_header\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">Host\u003C\u002Fspan>            \u003Cspan style=\"color:#79c0ff\">$http_host\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_set_header\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">Upgrade\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff\">$http_upgrade\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_set_header\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">Connection\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">&#34;upgrade&#34;\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_pass\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">http:\u002F\u002Fjxx.duguying.net:****\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_buffering\u003C\u002Fspan>    \u003Cspan style=\"color:#79c0ff;font-weight:bold\">off\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_buffer_size\u003C\u002Fspan>  \u003Cspan style=\"color:#a5d6ff\">128k\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_buffers\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">100\u003C\u002Fspan>  \u003Cspan style=\"color:#a5d6ff\">128k\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>}\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>web站点的流量经香港节点转发到 \u003Ccode class=\"inline-code\">jxx.duguying.net\u003C\u002Fcode> ，dig一下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>➜  ~ dig jxx.duguying.net\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>; &lt;&lt;&gt;&gt; DiG 9.11.5-P4-5.1+deb10u7-Debian &lt;&lt;&gt;&gt; jxx.duguying.net\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;; global options: +cmd\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;; Got answer:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;; -&gt;&gt;HEADER\u003Cspan style=\"color:#a5d6ff\">&lt;&lt;- opco\u003C\u002Fspan>de: QUERY, status: NOERROR, id: \u003Cspan style=\"color:#a5d6ff\">25787\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: \u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;; QUESTION SECTION:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;jxx.duguying.net.             IN      A\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;; ANSWER SECTION:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>jxx.duguying.net.      \u003Cspan style=\"color:#a5d6ff\">60\u003C\u002Fspan>      IN      A       222.248.21.219\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;; Query time: \u003Cspan style=\"color:#a5d6ff\">22\u003C\u002Fspan> msec\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;; SERVER: 192.168.1.1#53\u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>192.168.1.1\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;; WHEN: 一 11月 \u003Cspan style=\"color:#a5d6ff\">14\u003C\u002Fspan> 11:17:24 CST \u003Cspan style=\"color:#a5d6ff\">2022\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>;; MSG SIZE  rcvd: \u003Cspan style=\"color:#a5d6ff\">51\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>发现nginx转发的节点居然不是目前upstream域名解析的节点，这说明我upstream域名dns更新了，但是nginx上upstream域名解析没更新。网上查询之后才知道，域名作为upstream，它的解析节点并不会时事更新。解决方案\u003C\u002Fp>\n\n\u003Cp>方案一：每次dns有变化，重启Nginx （最开始出现故障重启nginx恢复就是这种解决方案）\u003Cbr \u002F>\n方案二：使用Nginx Resolver\u003Cbr \u002F>\n方案三：使用 Nginx-upstream-dynamic-server （nginx模块）\u003Cbr \u002F>\n方案四：使用 ngx_upstream_jdomain （nginx模块）\u003C\u002Fp>\n\n\u003Cp>这里介绍一下方案二，添加resolver相关配置，只需要将nginx配置改为如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">server\u003C\u002Fspan> {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">listen\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">10110\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">ssl\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">http2\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">server_name\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">xxx.duguying.net\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">resolver\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">127\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">.0.0.1\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">valid=60s\u003C\u002Fspan>;    \u003Cspan style=\"color:#ff7b72\">\u002F\u002F\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">这里设置dns服务器\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#a5d6ff\">resolver_timeout\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">3s\u003C\u002Fspan>;             \u003Cspan style=\"color:#ff7b72\">\u002F\u002F\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">这里设置dns解析超时时间\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#a5d6ff\">root\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">\u002Fusr\u002Fshare\u002Fnginx\u002Fhtml\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">index\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">index.php\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">index.html\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">ssl_certificate\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">\u002Fdata\u002Fcerts\u002F_.duguying.net.crt\u003C\u002Fspan>; \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">ssl_certificate_key\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">\u002Fdata\u002Fcerts\u002F_.duguying.net.key\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">ssl_stapling\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff;font-weight:bold\">on\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">ssl_stapling_verify\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff;font-weight:bold\">on\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">add_header\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">Strict-Transport-Security\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">&#34;max-age=31536000&#34;\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">location\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">\u002F\u003C\u002Fspan> {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">include\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">git.deny\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_set_header\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">X-Forwarded-For\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff\">$remote_addr\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_set_header\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">Host\u003C\u002Fspan>            \u003Cspan style=\"color:#79c0ff\">$http_host\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_set_header\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">Upgrade\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff\">$http_upgrade\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_set_header\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">Connection\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">&#34;upgrade&#34;\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_pass\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">http:\u002F\u002Fjxx.duguying.net:****\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_buffering\u003C\u002Fspan>    \u003Cspan style=\"color:#79c0ff;font-weight:bold\">off\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_buffer_size\u003C\u002Fspan>  \u003Cspan style=\"color:#a5d6ff\">128k\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#ff7b72\">proxy_buffers\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">100\u003C\u002Fspan>  \u003Cspan style=\"color:#a5d6ff\">128k\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>}\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n",{"id":41,"title":42,"uri":43,"author":10,"tags":44,"created_at":46,"view_count":47,"content":48},82,"初学rust，优雅的解包Option","rust-beginer-extract-option",[23,45],"option","2022-11-07 20:02:42",787,"\u003Cp>rust中，Option表示一个可能不存在值的复合类型。其定义如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">enum\u003C\u002Fspan> Option\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>T\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>None,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Some(T),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>可以看到，它里面的值要么就是类型T的值，要么就是None（也表示不存在值）。通常，我们在获取到可能为空的值时，Option类型很有用，它要求你必须去处理可能为None的情况。它有方法 is_none, is_some 等，可以判定是否为空。但是如果你使用这两个方法来解包 Option，免不了if else判断，代码会比较难看。比如\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x: Option\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">u32\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Some(\u003Cspan style=\"color:#a5d6ff\">2\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>value: \u003Cspan style=\"color:#ff7b72\">u32\u003C\u002Fspan> \u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">if\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x.is_none()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>value\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>default;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">else\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>value\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x.unwrap();\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F unwrap 方法可以解一切包，但是遇到 None 会 panic\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>可以看到上面的代码用了2条语句，首先是初始化value值，然后判定是否为None，根据不同的情况，对value重新赋值，明显复杂，我解个Option还得分两步，而且申明的value还必需是mut类型。那么，对于“我需要解包Option，如果Option为None则给默认值”这个需求，有更优雅的写法吗？有，如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x: Option\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">u32\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Some(\u003Cspan style=\"color:#a5d6ff\">2\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 方法一：利用 match，和语句块\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>value\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">match\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Some(val)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>val,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>None\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>default,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>};\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 方法二：利用 if-let，和语句块\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>value\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">if\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Some(val)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>val\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">else\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>default\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>};\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>上述两种方法都是借助语句块一步到位的解包Option，并且没有调用任何方法。\u003C\u002Fp>\n",{"id":50,"title":51,"uri":52,"author":10,"tags":53,"created_at":56,"view_count":57,"content":58},81,"给iPhone XS更换电池","replace-battery-for-iphone-xs",[54,55],"iphone","电池","2022-11-01 10:05:11",1097,"\u003Cp>最近手机电池不耐用了，而且经常发生剩余电量20%就自动关机，充电到80%就充不进的情况。于是决定换一下电池。\u003C\u002Fp>\n\n\u003Cp>关于给iPhone换电池我之前也干过，之前给iPhone SE换电池，按照网上的教程拉电池胶，结果一再拉断，最后只能掰电池，撬电池，弄下来之后电池已经不成样子了。后面给macbook也换过电池，macbook电池是因为使用时间太久导致电池鼓包，电池损耗到太高提醒电池维修，拆卸过程中遇到的同样是电池胶的问题，不得不暴力撕下电池。后来听说电子洗涤剂很容易除电池胶，正好之前玩flash芯片买了一瓶电子洗涤剂，试了一下，真香。电子洗涤剂从缝里一喷，原本难以撕开的电池，自动的轻松分离开了。\u003C\u002Fp>\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimage.duguying.net\u002F2022\u002F11\u002F3qnjp5vj.webp\" alt=\"3qnjp5vj\" \u002F>\u003C\u002Fp>\n\n\u003Cp>备注：这个手机是二换电池了，5月份买了块品胜电池，用了5个月就不行了，看样子品胜电池次品率还挺高。这次换个德赛电池试一下。\u003C\u002Fp>\n\n\u003Cp>对于换电池的小伙伴，这里强烈推荐电子洗涤剂来除胶，根本用不着像教学视频里一点点的卷胶，洗涤剂会让你轻而易举的就能拆卸下电池。还有一点需要注意，据说电子洗涤剂有毒，请妥善保存。\u003C\u002Fp>\n",{"title":60,"list":61},"最热文章",[62,68,74,80,86,92,98,104,110,116],{"id":63,"title":64,"uri":65,"author":10,"created_at":66,"view_count":67},28,"docker容器目录与主机目录同步","\u002Farticle\u002Fdocker容器目录与主机目录同步","2014-12-31 12:34:08",15570,{"id":69,"title":70,"uri":71,"author":10,"created_at":72,"view_count":73},21,"beego中使用fis","\u002Farticle\u002Fbeego中使用fis","2014-12-03 10:47:56",9250,{"id":75,"title":76,"uri":77,"author":10,"created_at":78,"view_count":79},20,"用github登录，oauth开发","\u002Farticle\u002F用github登录，oauth开发","2014-11-23 13:33:37",9113,{"id":81,"title":82,"uri":83,"author":10,"created_at":84,"view_count":85},18,"windows服务注册工具nssm","\u002Farticle\u002Fwindows服务注册工具nssm","2014-10-31 21:34:39",9047,{"id":87,"title":88,"uri":89,"author":10,"created_at":90,"view_count":91},49,"用latex排版中文书籍","\u002Farticle\u002F用latex排版中文书籍","2016-10-31 11:12:02",8634,{"id":93,"title":94,"uri":95,"author":10,"created_at":96,"view_count":97},19,"texlive中文书签乱码","\u002Farticle\u002Ftexlive中文书签乱码","2014-11-15 02:54:01",8461,{"id":99,"title":100,"uri":101,"author":10,"created_at":102,"view_count":103},6,"Windows上的软件包管理器chocolatey","\u002Farticle\u002FWindows上的软件包管理器chocolatey","2014-08-10 15:55:22",8009,{"id":105,"title":106,"uri":107,"author":10,"created_at":108,"view_count":109},3,"利用开源和免费资源搭建CI环境","\u002Farticle\u002F利用开源和免费资源搭建CI环境","2014-07-04 16:54:58",7732,{"id":111,"title":112,"uri":113,"author":10,"created_at":114,"view_count":115},16,"php-fpm网站目录权限配置","\u002Farticle\u002Fphp-fpm网站目录权限配置","2014-10-18 01:36:10",7274,{"id":117,"title":118,"uri":119,"author":10,"created_at":120,"view_count":121},27,"sublime text 2插件开发，外部修改文件无法重新加载","\u002Farticle\u002Fsublime text 2插件开发，外部修改文件无法重新加载","2014-12-26 20:24:13",7054,{"title":123,"list":124},"按月归档",[125,129,132,135,138,141,144,148,152,155,158,161,165,168,171,175,178,181,184,188,191,194,197,200,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,252,255,258,261,264,267],{"title":126,"uri":127,"view_count":128},"2026年7月","\u002Farchive\u002F2026\u002F7\u002F1","[1]",{"title":130,"uri":131,"view_count":128},"2026年1月","\u002Farchive\u002F2026\u002F1\u002F1",{"title":133,"uri":134,"view_count":128},"2025年4月","\u002Farchive\u002F2025\u002F4\u002F1",{"title":136,"uri":137,"view_count":128},"2024年6月","\u002Farchive\u002F2024\u002F6\u002F1",{"title":139,"uri":140,"view_count":128},"2024年5月","\u002Farchive\u002F2024\u002F5\u002F1",{"title":142,"uri":143,"view_count":128},"2024年4月","\u002Farchive\u002F2024\u002F4\u002F1",{"title":145,"uri":146,"view_count":147},"2023年12月","\u002Farchive\u002F2023\u002F12\u002F1","[6]",{"title":149,"uri":150,"view_count":151},"2023年11月","\u002Farchive\u002F2023\u002F11\u002F1","[2]",{"title":153,"uri":154,"view_count":128},"2023年10月","\u002Farchive\u002F2023\u002F10\u002F1",{"title":156,"uri":157,"view_count":128},"2023年7月","\u002Farchive\u002F2023\u002F7\u002F1",{"title":159,"uri":160,"view_count":151},"2023年6月","\u002Farchive\u002F2023\u002F6\u002F1",{"title":162,"uri":163,"view_count":164},"2023年5月","\u002Farchive\u002F2023\u002F5\u002F1","[3]",{"title":166,"uri":167,"view_count":151},"2023年4月","\u002Farchive\u002F2023\u002F4\u002F1",{"title":169,"uri":170,"view_count":151},"2023年3月","\u002Farchive\u002F2023\u002F3\u002F1",{"title":172,"uri":173,"view_count":174},"2023年2月","\u002Farchive\u002F2023\u002F2\u002F1","[5]",{"title":176,"uri":177,"view_count":128},"2023年1月","\u002Farchive\u002F2023\u002F1\u002F1",{"title":179,"uri":180,"view_count":151},"2022年12月","\u002Farchive\u002F2022\u002F12\u002F1",{"title":182,"uri":183,"view_count":174},"2022年11月","\u002Farchive\u002F2022\u002F11\u002F1",{"title":185,"uri":186,"view_count":187},"2022年10月","\u002Farchive\u002F2022\u002F10\u002F1","[4]",{"title":189,"uri":190,"view_count":147},"2022年9月","\u002Farchive\u002F2022\u002F9\u002F1",{"title":192,"uri":193,"view_count":174},"2022年8月","\u002Farchive\u002F2022\u002F8\u002F1",{"title":195,"uri":196,"view_count":128},"2019年7月","\u002Farchive\u002F2019\u002F7\u002F1",{"title":198,"uri":199,"view_count":128},"2019年2月","\u002Farchive\u002F2019\u002F2\u002F1",{"title":201,"uri":202,"view_count":128},"2018年9月","\u002Farchive\u002F2018\u002F9\u002F1",{"title":204,"uri":205,"view_count":128},"2018年8月","\u002Farchive\u002F2018\u002F8\u002F1",{"title":207,"uri":208,"view_count":128},"2017年11月","\u002Farchive\u002F2017\u002F11\u002F1",{"title":210,"uri":211,"view_count":128},"2017年8月","\u002Farchive\u002F2017\u002F8\u002F1",{"title":213,"uri":214,"view_count":128},"2017年5月","\u002Farchive\u002F2017\u002F5\u002F1",{"title":216,"uri":217,"view_count":128},"2017年4月","\u002Farchive\u002F2017\u002F4\u002F1",{"title":219,"uri":220,"view_count":128},"2016年11月","\u002Farchive\u002F2016\u002F11\u002F1",{"title":222,"uri":223,"view_count":128},"2016年10月","\u002Farchive\u002F2016\u002F10\u002F1",{"title":225,"uri":226,"view_count":151},"2016年9月","\u002Farchive\u002F2016\u002F9\u002F1",{"title":228,"uri":229,"view_count":128},"2016年8月","\u002Farchive\u002F2016\u002F8\u002F1",{"title":231,"uri":232,"view_count":151},"2016年7月","\u002Farchive\u002F2016\u002F7\u002F1",{"title":234,"uri":235,"view_count":174},"2016年6月","\u002Farchive\u002F2016\u002F6\u002F1",{"title":237,"uri":238,"view_count":128},"2015年12月","\u002Farchive\u002F2015\u002F12\u002F1",{"title":240,"uri":241,"view_count":128},"2015年10月","\u002Farchive\u002F2015\u002F10\u002F1",{"title":243,"uri":244,"view_count":151},"2015年2月","\u002Farchive\u002F2015\u002F2\u002F1",{"title":246,"uri":247,"view_count":128},"2015年1月","\u002Farchive\u002F2015\u002F1\u002F1",{"title":249,"uri":250,"view_count":251},"2014年12月","\u002Farchive\u002F2014\u002F12\u002F1","[8]",{"title":253,"uri":254,"view_count":151},"2014年11月","\u002Farchive\u002F2014\u002F11\u002F1",{"title":256,"uri":257,"view_count":174},"2014年10月","\u002Farchive\u002F2014\u002F10\u002F1",{"title":259,"uri":260,"view_count":164},"2014年9月","\u002Farchive\u002F2014\u002F9\u002F1",{"title":262,"uri":263,"view_count":164},"2014年8月","\u002Farchive\u002F2014\u002F8\u002F1",{"title":265,"uri":266,"view_count":164},"2014年7月","\u002Farchive\u002F2014\u002F7\u002F1",{"title":268,"uri":269,"view_count":151},"2013年9月","\u002Farchive\u002F2013\u002F9\u002F1",5,{"url":272,"title":273},"https:\u002F\u002Fimage.duguying.net\u002F2022\u002F09\u002Fij6x8o4s.webp","老家 摄于2020年秋",1790062262583]