linux完美模拟windows尝试(独家)

windows

wine

https://github.com/winegui/WineGUI

looking glass

应用场景:一台游戏本(amd集显+nvidia独显) + 一个外接显示器
looking glass会将外接显示器的画面低延迟回传到集显显示屏(也就是焊在笔记本上的屏幕)。重点是有obs插件,可以在linux宿主机捕获虚拟机的画面,不需要虚拟机再装一个obs(其实也没必要)。
或者用一个hdmi假头,插进去激活独显,这时looking glass就有用了,你带游戏本出差,要开windows虚拟机,高性能显示就得靠looking glass回传画面(不知道与libvirt自带的qxl显示的差别)。
其实应用场景还是很有限,需要虚拟机与宿主机在同一台电脑上。

winapps

https://nowsci.com/#/winapps/?id=installation

qemu/kvm + virtio + GPU直通/virGL

GPU直通

99%成功教程,我的教程不成功再用: https://www.reddit.com/r/VFIO/comments/u0z1j5/cannot_get_xorg_to_let_go_of_nvidia_510_driver/

  • 启用 Nvidia DRM 的目的是什么:双gpu游戏本,减少在核显上,独显运行游戏的画面撕裂(更好的垂直同步)。
    与多显示器支持有关。
    由于它会强制与Xorg挂钩,必须放到blacklist。
  • 启用 Nvidia UVM 的目的:开发人员写CUDA时申请统一内存,好管理cudaMallocManaged(&x, N*sizeof(float));
    允许CPU和GPU共享同一块虚拟内存。这使得GPU可以直接访问CPU的内存,而不需要显式地复制数据,从而提高了性能。
  • 启用nvidia modeset的目的:配合集显,nvidia-prime-offload-render功能,感觉是。需要配合下方的配置文件xorg.conf.d,重点是给集成显卡的驱动是modesetting而不是amdgpu,用nvidia的modesetting驱动覆盖集显的原驱动。
    是X.org的一个显示驱动,它使用了DRM/KMS (Kernel Mode Setting)框架来管理图形硬件。
    让nvidia听得懂xorg的配置:支持多显示器配置和旋转显示器等高级功能。

nvidia-drm与nvidia-modeset原理

参数 配置文件 后操作
nogpumanager /etc/default/grub update-grub && reboot
options vfio-pci ids=10de:25e2 和 blacklist /etc/modprobe.d/vfio.conf update-initramfs -u && reboot

用blacklist是为了xorg启动时不要自动加载nvidia四大驱动。这意味着你不能在保持xorg桌面环境下启动虚拟机。
其实后面你手动modprobe -i nvidia之类的,然后启动systemctl start lightdm,xorg会自动把nvidia四大驱动自动加载上。

vfio.conf

options vfio-pci ids=10de:25e2,10de:2291

#blacklist nvidia_uvm
#blacklist nvdia_drm
#blacklist nvidia_modeset
#blacklist nvidia
#install nvidia_uvm /bin/false
install nvdia_drm /bin/false
#install nvidia_modeset /bin/false
install nvidia /bin/false

必须配合install MOD /bin/false,不然还是会强制加载

退出桌面环境会丢弃所有未保存的工作,确保其余进程全部关闭再开启虚拟机

evdev鼠标,点击、滚轮会回中

移除usb-tablet设备
https://www.reddit.com/r/VFIO/comments/leb8ap/gpuevdev_passthrough_big_sur_mouse_issues/

GPU虚拟化:virGL

与CPU虚拟化类似,宿主机和虚拟机同时使用一个GPU
仍然是很实验性的功能
仓库:https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24223
讨论:https://news.ycombinator.com/item?id=37105653

why not 双系统

windows更新会随机搞坏grub引导

文件系统

一块512G的硬盘用lvm-ext4,linux程序需要ext4,也是担心linux把NTFS写坏
1TB的硬盘做数据盘,保留已有的NTFS,因为ext4只支持向右拓展,NTFS支持双向拓展

然而,Linux Mint 使用的软件绝不应该位于 NTFS 格式的文件系统上。 Linux 软件应始终位于正版 Linux 文件系统上,例如。 ext4,这是最常见的 Linux 文件系统。
The reason is that Windows (NTFS filesystem) and Linux Mint (ext4 e.g.) use totally different ways of managing object owners, their groups and others and of managing access permissions granted to objects owners, their groups and others.
原因是 Windows(NTFS 文件系统)和 Linux Mint(例如 ext4)使用完全不同的方式来管理对象所有者、其组和其他人,以及管理授予对象所有者、其组和其他人的访问权限。
Keep Windows software on NTFS formatted filesystems. Keep Windows user profile folders on NTFS formatted filesystems.
将 Windows 软件保留在 NTFS 格式的文件系统上。将 Windows 用户配置文件文件夹保留在 NTFS 格式的文件系统上。
Keep Linux Mint software on ext4 formatted filesystems. Keep Linux Mint user home directories on ext4 formatted filesystems.
将 Linux Mint 软件保留在 ext4 格式的文件系统上。将 Linux Mint 用户主目录保留在 ext4 格式的文件系统上。
Use NTFS formatted filesystems for data, which you access from Windows and from Linux Mint side.
使用 NTFS 格式的文件系统存储数据,您可以从 Windows 和 Linux Mint 端访问这些数据。

macos

darling

跟wine一样,做转义层
仅支持shell和一个很老的macOS文件管理器 https://docs.darlinghq.org/known-partial-software.html

其他好物

sdkman:快速java切换sdk

bash笔记

awk vs xargs

ls | awk 'NR==1 {print $1}' #没有NR==1,就是匹配多行,执行多行
ls | xargs sh -c 'echo $0' #仅显示匹配的首行,但容易出bug
更多失败、无用的尝试

20-not-use-nvidia.conf

此配置文件能让17个xorg占用减少到3个xorg占用,停用外置显示器(linux没有拓展桌面)。
但3个占用也导致无法解占用。

# 20-not-use-nvidia.conf
Section "Device"
    Identifier "Device0"
    Driver "amdgpu"
    BusID "PCI:6:0:0"
    Option "PrimaryGPU" "true"
EndSection

Section "ServerFlags"
    Option "AutoAddGPU" "false"
EndSection

nvidia-xconfig

# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 545.29.06
Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0"
    Option "AllowNVIDIAGPUScreens"
EndSection

Section "Device"
    Identifier     "iGPU"
    Driver         "modesetting"
    VendorName     "AMD Corporation"
    BusID          "PCI:6:0:0"
EndSection

Section "Device"
    Identifier     "dGPU"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BusID          "PCI:1:0:0"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "iGPU"
EndSection

Section "ServerFlags"
    Option "AutoAddGPU" "false"
EndSection

不要使用:driverctl

#softdep drm pre: vfio-pci
#softdep nvidia pre: vfio-pci
#不用加上面,上面会导致vfio抢占nvidia私有驱动的启动,导致无法进入系统界面

使用了blacklist则无须使用下面的配置,但也不一定:

参数 配置文件 后操作
options nvidia-drm modeset=0 /etc/modprobe.d/nvidia-graphics-drivers-kms.conf update-initramfs -u && reboot
PrimaryGPU AutoAddGPU /etc/X11/xorg.conf.d/20-not-use-nvidia.conf 注销或sudo systemctl restart lightdm

直通的无痕切换?

https://www.youtube.com/watch?v=LtgEUfpRbZA
我跟着这个教程,最后总结出,rmmod nvidia_drm nvidia_modeset是做不到的,x11会自动占用n卡。
需要退出桌面环境才能卸载n卡模块。
期间也试过:

  • 强制x11使用集成显卡,但又会导致无法连接外接显示器
  • 开机禁用nvidia_drm,或modeset=0,但手动启动后又无法卸载了modprobe -i nvidia_drm, modprobe -r nvidia_drm

    modprobe: FATAL: Module nvidia_drm is in use.

  • nvidia-prime使用intel模式(集成显卡),重启后无法手动加载nvidia驱动模块modprobe -i nvidia

    modprobe nvidia modprobe: ERROR: ../libkmod/libkmod-module.c:838 kmod_module_insert_module() could not find module by name='off'

xrandr --listproviders

Providers: number : 2
Provider 0: id: 0x53 cap: 0x9, Source Output, Sink Offload crtcs: 4 outputs: 1 associated providers: 1 name:Unknown AMD Radeon GPU @ pci:0000:06:00.0
Provider 1: id: 0x1d4 cap: 0x2, Sink Output crtcs: 4 outputs: 6 associated providers: 1 name:NVIDIA-G0

假设你有一个笔记本电脑,它有一个集成的 Intel GPU(我们称之为 GPU A)和一个独立的 Nvidia GPU(我们称之为 GPU B)。你的笔记本电脑的显示器(我们称之为 Display 1)连接到 GPU A,你还连接了一个外部显示器(我们称之为 Display 2)到 GPU B。

"Source Output"(源输出):这是指 GPU 能够生成图像数据并发送到一个显示设备。在我们的例子中,GPU A 和 GPU B 都有源输出能力,因为它们都可以生成图像数据并发送到它们连接的显示器。
"Sink Output"(接收器输出):这是指一个显示设备能够接收和显示来自 GPU 的图像数据。在我们的例子中,Display 1 和 Display 2 都有接收器输出能力,因为它们都可以接收和显示来自它们连接的 GPU 的图像数据。
"Source Offload"(源卸载):这是指 GPU 能够将渲染任务卸载到另一个 GPU。在我们的例子中,如果 GPU A 能够将一些渲染任务卸载到 GPU B,那么我们就可以说 GPU A 有源卸载能力。
"Sink Offload"(接收器卸载):这是指一个 GPU 能够接收和处理来自另一个 GPU 的卸载渲染任务。在我们的例子中,如果 GPU B 能够接收和处理来自 GPU A 的卸载渲染任务,那么我们就可以说 GPU B 有接收器卸载能力。——BING GPT

posted @ 2024-05-12 12:15  Nolca  阅读(4)  评论(0编辑  收藏  举报