CANARYPWN'S NATÏVE BLOG

618电脑指北

Manjaro + Windows
Canarypwn
Jul 7, 2020
It takes 12 minutes to read this article.

618

由于笔者的笔记本(六代标压i5 + gtx965m)已经跟不上笔者剪辑4K视频和机器学习的需求了。所以在618的时候拿到了预算,有能力购入一台新电脑。

新电脑旨在追求长期性价比,并且尽量追求边际效应最小化。笔者是计算机科学的学生,因此未来可能会写CUDA,大型编译以及多系统的需求。适逢AMD的Zen2架构和英伟达图灵显卡大降价,因此618可以算是购入电脑的一个好时机。

配置

AMD 锐龙9 3900X 处理器 JD 3286.33

华硕(ASUS)PRO WS X570-ACE 主板 JD 2890.00

32G ECC UDIMM DDR4 3200内存 TAOBAO 1100.00

Intel/英特尔P4500 1T SSD U.2 TAOBAO 787.50

利民(Thermalright) FS140 霜灵 双塔散热器 JD 228.00

美商海盗船 (USCORSAIR) 额定850W RM850x 全模组电脑电源 JD 818.17

索泰(ZOTAC)RTX2060super霹雳版OC HA JD 2491.00

先马(SAMA)黑洞 黑色 中塔式机箱 JD 247.00

外加一根 U.2连接线

外加问同学暂时借了块970, 以后会收一块RX580 给 Linux 用

**ALL 11848 **

购买理由

  • 3900X 一共拥有 2 个CCD,总共十二核心,二十四线程。 每个CCD分表包含着6个核心和十二个线程 (id: 0-5, 12-17)(i: 6-11, 18-23) ,一共 64M 的三级缓存(虽然跨CCD时延迟会很大)。三级缓存对编译的提升是很大的,同时多核心更利于虚拟机运行。

  • 华硕(ASUS)PRO WS X570-ACE 主板 是一块工作站主板,特点是支援ECC UDIMM内存, 主板用料较好, 有一个华硕自家的远程管理系统( 类 IPMI ), 共有三条pcie插槽(pcie 3.0 16+ pcie 3.0 * 8)。

  • 因为上科大水电网免费学习需要,所以预计是24*7工作。ECC内存对于系统稳定性的提升是很大的。

  • P4500, 英特尔企业级SSD,TLC颗粒, U.2接口

  • 利民虽然各种参数上都不如猫扇(例如风压),但口碑较为不错,已经在学校内见到一个有组织的传教团队了(

  • 因为会上双卡,所以上了850W的电源

  • 目前,

    • 由于英伟达在CUDA领域较早的布局和在教育行业的疯狂送卡行为(一个电话连夜免费快递六块V100),AMD目前在机器学习和教育领域的生态已经落后n个身位了
    • 机器学习要求显存8G起步(测试结果来自 @ murez 用openai跑历史的期末论文,注,后来他又自己写了一篇)
    • 同一个核心的丐版和顶级非公的性能差距不会超过5%
    • CPU更容易成为性能瓶颈
    • 2060S是20系列当前性价比较高的一张卡
    • 堆料索,售后走京东
    • 其它需求可以白嫖学校

    所以我决定采用索泰的丐版2060S

  • 机箱随便买的

装机

装机过程将会在BILIBILI见面

双系统

因为学习需求,所以准备采用 host 系统上通过虚拟机来运行若干个 guest 系统。目前主流的方案有 proxmox, unraid, Hyper-V, kvm 等。为了更加开放和性能损失更小,所以选择了用 manjaro 作为 Host , 跑 kvm ,再用 pcie passthrough 将显卡直通给 guest 系统的 Windows 。

所以我将借来的GTX 970 插在了靠近CPU的pcie槽,作为Manjaro的显示输出。将2060S插在了第二根pcie槽,作为将来直通给WIndows的显卡。未来,将显示线插在970上就可以显示Manjaro,将显示线插在2060S就可以显示Windows。非常方便。

经过简单的配置,Manjaro到了可用的程度。

这里顺便吐槽一下学校的图书与信息中心,连交大的镜像源都会劫持。因此多了一步添加host。

host

检查CPU对虚拟化的支持

可以用该命令来查看CPU是否支持虚拟化

$ LC_ALL=C lscpu | grep Virtualization
Output: Virtualization:                  AMD-V

通常情况下的CPU都支持虚拟化。注意要在BIOS中开启。对于Intel处理器来说是VT-x,对于AMD处理器来说是AMD-V。

AMD-V

检查内核

# 这里输出中需要包含 kvm kvm_intel
$ lsmod | grep kvm

# 这里输出中需要包含 virtio
$ lsmod | grep virtio

# 没有 virtio 时执行
$ sudo modprobe virtio

安装所需的软件包


$ sudo pacmna -Sy qemu libvirt ebtables dnsmasq bridge-utils openbsd-netcat
# 图形化的管理界面,如果使用带桌面环境的操作系统可选安装。我这里安装
$ sudo pacman -Sy virt-manager
  • qemu QEMU 软件,提供 qemu-img 等命令
  • libvirt 提供管理虚拟机、存储、网络的功能
  • ebtables 桥接网络管理,用于 default NAT 网络
  • dnsmasq DHCP DNS 服务,用于 default NAT 网络
  • bridge-utils 桥接网络管理,用于桥接网络
  • openbsd-netcat 用于通过 SSH 管理

启动服务

# 启动虚拟机管理后台服务开机自启
sudo systemctl enable libvirtd

# 启动虚拟机管理后台服务
sudo systemctl start libvirtd

配置显卡直通

参考: https://github.com/pavolelsig/passthrough_helper_manjaro

有视频,也有脚本,挺清晰的。

配置虚拟机

具体配置和 配置显卡直通 部分类似不过有几个点需要注意。

virtio

Virtio是一种半虚拟化技术。用VIrtio虚拟的网卡和硬盘,其性能相比Nat和SATA有很大的提升。

https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html

首先将硬盘改成virtio总线以增加性能

disk

下载virtio驱动预备

下载地址页面:https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html

如:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

创建一个光驱,把驱动放进去

virtio

可以再做一个准备,把网卡也virtio化

网卡

同时也可以把 usb host 作为 pcie 设备直通给 WIndows ,这样速度和便利性都比较好。但这样 Manjaro 上面就无法访问 usb 设备了。 如果你有多余的 pcie 槽, 可以考虑买一个 pcie 转 usb 的转接卡,某宝大概几十块的样子。

pcie

在 windows 安装时,需要加载硬盘驱动,驱动文件夹地址是 E:\viostor\w10\amd64

当开机成功后,右键计算机 - 管理 - 设备管理器 , 然后对于未知的 pcie 设备选择安装驱动。 将驱动文件夹指向 你的光盘即可。 目前我一共装了三个驱动。 分别是硬盘,网卡还有一个virtio ballon,用于CPU的调配。

win

显卡

注意开了显卡以后就不用再开虚拟显卡和虚拟显示器了

英伟达显卡的设置稍有不同。

要让显卡直通,先要启用iommu,然后让pcie设备使用修改的rom。启动iommu在主板里就可以设置,关键是昨天的那个rom file那一行xml。

rom

这是一个显卡的修改bios。首先要获得显卡的原生Bios。

最简单的办法是在Windows上的GPU-Z上导出Bios

GPUZ

如果已经装好了 Manjaro,也可以在这个网站找到显卡BIOS

https://www.techpowerup.com/vgabios/

然后就是修改ROM了。首先用 WINHEX 或者 HXD 来打开十六进制文件。全文搜索 VGA 。删除 55 AA 的全部内容。前面基本都是 nvflash 啥的信息,这些可能会导致显卡不支持 efi 。

最后的文件应该是55 AA顶格的

结果

然后保存为 .rom 文件, 复制到 Manjaro 里面。在虚拟系统管理系统中的xml文件中加一行<rom file = >用于加载显卡bios

当然事情没有那么简单,NVIDIA屏蔽了消费级显卡的驱动在虚拟机上的加载 (黄氏刀法.JPG) 所以我们需要编辑 kvm 的配置文件来骗过老黄。

https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF

$ sudo EDITOR=nano virsh edit win10

win10替换为你的虚拟机的“域”名字

win10.xml

添加一个 12 位的 字母数字混合的 vender_id 然后开启 kvm hide

之后就可以当正常显卡使用了,安装驱动后跑 CUDA 和 3D 项目没有发现明显的问题。

CPU

之前碰到了一个问题是虚拟机可以检测到12个逻辑核心,但从任务管理器中只有两个逻辑核心被用上了。后面发现是CPU的配置问题。

这是我的设置。因为 3900X 是胶水总线的设计,跨 CCD 的延迟较高。所以我将在一个CCD上的物理核心对应的物理核心分配给虚拟机(也就是0-5 12-17的逻辑核心,3900X 瞬间变成 3600X)。当然你也可以将12核24线程全部分配给虚拟机,这样的话cinebench 可以跑到 7300分 (我做过超频,全核4.3GHZ, 在原生windows上可以跑到7700),但某些应用会出现无响应和推出的情况。所以我暂时还是选择分配一般的核心的方案。

CPU

CPU

参考与致谢