linux完美模拟windows尝试(独家)
更新
~/.profile
一定要加unmask 002
,只屏蔽其他组的可读可写,让用户组可以rwx,方便后面设置rdp登录时,另一个账户能使用你的文件
windows
wine
https://github.com/winegui/WineGUI
运行unity游戏等,失去窗口焦点则游戏再无响应
解决方法:
- 使用 Wine 打开 Regedit(
~/.wine/drive_c/windows/regedit.exe
或/home/$(whoami)/.wine/drive_c/windows/syswow64/regedit.exe
)- 转到
HKEY_CURRENT_USER\Software\Wine\X11 Driver
(如果不存在,则再创建X11 Driver
新键)。- 新建一个名为
UseTakeFocus
的字符串项,值为 “N”。
https://www.reddit.com/r/wine_gaming/comments/mly6sn/window_freeze_after_unfocusing/
looking glass
应用场景:一台游戏本(amd集显+nvidia独显) + 一个外接显示器
looking glass会将外接显示器的画面低延迟回传到集显显示屏(也就是焊在笔记本上的屏幕)。重点是有obs插件,可以在linux宿主机捕获虚拟机的画面,不需要虚拟机再装一个obs(其实也没必要)。
或者用一个hdmi显卡欺骗头,插进去激活独显,这时looking glass就有用了,你带游戏本出差,要开windows虚拟机,高性能显示就得靠looking glass回传画面(不知道与libvirt自带的qxl显示的差别)。
其实应用场景还是很有限,需要虚拟机与宿主机在同一台电脑上。
启动参数
#!/bin/bash
virsh start win11
looking-glass-client -f /dev/kvmfr0 -m KEY_NUMLOCK egl:vsync win:size=1919x1080 win:position=center -d input:grabKeyboardOnFocus
1919x1080
这个分辨率是为了搭配cinnamon桌面的“边缘滚动工作区”插件,我不用老按左右alt-alt
在宿主与虚拟机频繁切换。
为了消除1919x1080造成的不完美渲染:
参考:https://superuser.com/questions/1209385/create-a-custom-resolution-on-windows-10
添加virtio鼠标键盘
在windows虚拟机关机时,添加virtio键盘与鼠标(鼠标可以用virtio tablet,在xml里改成virtio mouse)
slackaduts — 2024/07/16 11:33
在使用 LG 与 spice guest 工具时,有人遇到过 windows 键无法打开开始菜单和按住键没有响应(但游戏却莫名其妙地正常?我可以确认按下 Windows 键时,Windows 本身是可以接收的,只是无法打开开始菜单。
解决:原来是 Windows 没有将 virtio 鼠标/键盘与 vioinput 驱动程序关联起来。在设备管理器中手动将两者指向它,就解决了我的问题,无需安装完整的 virtio guest 工具,也不会弄坏东西。
SOLVED: Turns out windows wasn't associating the virtio mouse/keyboard with the vioinput driver. Pointing both to it manually in device manager solved my issue without having to install full fat virtio guest tools and break things.
samba网络共享
详见: qemu/kvm/virt-manager 无法与windows虚拟机共享文件;挂载多磁盘
因为looking glass的kvmfr模块与virtiofs冲突,必须使用samba
virsh auto suspend and resume
https://abishekmuthian.com/auto-suspend-and-resume-kvm-virtual-machine-with-the-host/
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的配置:支持多显示器配置和旋转显示器等高级功能。
参数 | 配置文件 | 后操作 |
---|---|---|
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/
显存分配错误
vfio_region_write(0000:01:00.0 ) failed: Cannot allocate memory
https://github.com/Kinsteen/win10-gpu-passthrough/issues/1
modprobe无法加载nvidia模块
modprobe: ERROR: ../libkmod/libkmod-module.c:968 kmod_module_insert_module() could not find module by name='nvidia'
改名vfio.conf.bak,update-initramfs -u后再尝试重新安装。因为/bin/false会阻止dkms编译时链接nvidia驱动文件。更新完驱动后也可以再禁止。
GPU虚拟化
与CPU虚拟化类似,宿主机和虚拟机同时使用一个GPU
仍然是很实验性的功能
virGL
文字教程:https://www.cnblogs.com/nolca/p/18375753
视频教程:https://www.youtube.com/watch?v=pH7cCDZIAnI
仓库:https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24223
讨论:https://news.ycombinator.com/item?id=37105653
venus on qemu
类似virgl,不过venus是vulkan转义,而virgl是opengl转义
https://www.reddit.com/r/VFIO/comments/1cv1krg/what_is_venus_virtio/
演示:https://www.youtube.com/watch?v=Vk6ux08UDuA
虚拟机用宿主机的代理
更新:宿主用TUN即可,无须再手动设置http代理
与宿主机的firewall防火墙有关,规则如下:
zc:允许
方向:两者都both
接口:所有接口(vnet0)
日志:不要记录
协议:both
从:空
到:192.168.xxx.1(端口留空)
其中xxx可以在virtmanager里查看/重置。
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
darwinKVM
https://github.com/royalgraphx/DarwinKVM
darling
跟wine一样,做转义层
仅支持shell和一个很老的macOS文件管理器 https://docs.darlinghq.org/known-partial-software.html
linux
星火应用商店,但是我不太需要
android
waydroid
窗口化
https://github.com/waydroid/waydroid/discussions/928
scrcpy
连接已有安卓屏。详见教程:电脑手机互通协作软件
其他好物
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