先放两张张混淆视听的图:
在Ubuntu上玩原神。
在Ubuntu上使用VS开发.net平台应用。
前言
在Linux上运行Windows程序的需求历来已久,实现思路各有千秋。最根本的方式是直接开发对应的Linux程序,这样无疑增加了开发者的负担;最直接的想法是开一个虚拟机,但是对硬件的要求会很多,还会不得不运行诸多不必要的程序;还有在Linux上实现Windows依赖的wine,毕竟不是原生,会有一些地方不尽如人意。
当然,这次介绍的方法也不是完美无暇的,本质上还是借用了VM的力量,对硬件条件有一定的要求,但是就表现而言,非常接近Linux原生应用,体验很不错。
也就是说,并不是真的原生应用,而是使用体验上十分接近原生应用。
KVM是基于内核的虚拟机,它和VMware的区别可以参考Redhat的KVM虚拟机和VMware区别这篇文章,我也不怎么懂,反正就是快点。
WinApps的介绍是这样的:
Run Windows apps such as Microsoft Office/Adobe in Linux (Ubuntu/Fedora) and GNOME/KDE as if they were a part of the native OS, including Nautilus integration.
翻译过来就是在linux上像原生应用一样使用Windows应用。emm,基于KVM。
从下开始的步骤可以看作本人对WinApps中Readme.md#installation与KVM.md的个人翻译、整理与补充。
使用KVM创建虚拟机
这一步将使用KVM创建一个win10的虚拟机。如果已经创建,只需要注意修改计算机名称为RDPWindows以及在虚拟机内安装RDPApps.reg即可跳过。
安装KVM
使用以下命令安装KVM以及虚拟机系统管理器
1 | sudo apt-get install -y virt-manager |
一般而言这个时候 需要重启一下才能正常使用虚拟机系统管理器。
下载Windows镜像与KVM虚拟IO驱动
为了正常使用,需要使用Windows 10专业版或企业版,家庭版不能正常使用,同时,为了更好的表现以及更低的系统资源占用,需要安装KVM虚拟IO驱动,可以通过以下链接下载:
Windows 10 ISO:https://www.microsoft.com/zh-cn/software-download/windows10ISO
在非Windows系统下打开这个界面,可以下载最新的Windows 10镜像
但我个人更推荐使用LTSC版本,这样可以避免Windows更新造成的愈加臃肿。
最新的LTSC版本是基于1809的Windows 10 Enterprise LTSC 2019,ed2k链接整理自I Tell You
ed2k://|file|cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24.iso|4478906368|E7C526499308841A4A6D116C857DB669|/
KVM虚拟IO驱动:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
创建虚拟机
首先打开虚拟机系统管理器
接着,点开编辑
->首选项
,勾选Enable XML editing
,之后点击关闭
接下来就可以新建虚拟机
了。
选择本地安装介质(ISO映像或者光驱)
,然后点击前进
现在选中下载Windows 10 ISO镜像的位值,然后勾选Automatically detect from the installation media / source
,应该可以检测出选择的是Microsoft Windows 10系统。
接下来设置内存与CPU,推荐设置2
核CPU以及4096MB
内存。(是的,这个配置跑得起来,当然更高点也没大问题)
值得说明的是,这里的4096MB
并不是指从内存中扣除一块专门给KVM,而是最大使用这么多的内存。
选择虚拟磁盘的大小,和上文相同,这是指最多占用这么多空间。
接下来给虚拟机命名为RDPWindows
,只有这样的命名才能让WinApps检测到虚拟机,然后选择在安装前自定义配置
在点击完成
之后,确保在CPU的配置下复制主机CPU
配置被选中,然后点击应用
注意:在Windows虚拟机安装结束后,有可能这个选项会被勾掉,因此应在安装结束后再次检查。
接下来,在XML
标签里,编辑<clock>
部分为:
1 | <clock offset='localtime'> |
然后点击应用
,这将大大减少空闲的CPU使用率。
接下来,在内存配置界面,将当前分配
降低至1024MB
,这是VM最少使用内存的用量。(还真能跑得动)点击应用
。
在引导选项
配置界面,勾选主机启动时启动虚拟机
,相当于开机自启,记得点击应用
。
对于SATA磁盘1
,将磁盘总线
设置为VirtIO
,点击应用
。
对于NIC
,将设备型号
设置为virtio
,点击应用
。
点击位于左下角的添加硬件
按钮,选中存储
。对于设备类型
,选择CDROM设备
,然后选择前文提到过的虚拟IO驱动
。最后,点击完成
以添加新的CDROM
设备。
现在可以点击开始安装
了。
接下来开始安装虚拟机
安装虚拟机
像正常安装那样安装Windows 10。
当出现你想将Windows安装在哪里?
这个界面时,点击加载驱动程序
然后选中VirtIO
,一般来讲是在E:\
盘
选择正确的驱动,一般而言是带着w10
的那个
然后就能看到安装的磁盘了,点击下一步
接下来就全权交给它了,在安装过程中可能会重启多次。
然后按照个人意愿选择配置Windows 10,注意先不要联网。
在安装结束后,登录进入安装的Windows系统,进到E:\
盘,就是那个VirtIO的镜像那个盘。双击virt-win-gt-64.exe
启动驱动安装。
一切保持默认就好。
驱动安装结束后,需要修改一下注册表,访问https://github.com/Fmstrat/winapps/blob/main/install/RDPApps.reg下载RDPApps.reg
可以通过右键单击Raw
然后点击链接另存为
下载完成后,右键文件,选择合并
,接下来一路确认。
之后,重命名操作系统为RDPWindows
,然后点击下一步,暂时不要重启。
最后,启用远程桌面。
在这之后就可以重启计算机然后进行自定义的设置了。
或者安装一些软件诸如Visual Studio或者office之类的,在之后会用到。
如果需要的话,可以安装Spice Guest Tools,这样就能实现桌面大小的自适应和主机与虚拟机的复制粘贴。
一切结束后,重启虚拟机,但是不要登录,关闭虚拟系统管理器与虚拟机界面就好。
安装WinApps
第一步:设置虚拟机
就是上文所说的那些,相当长的过程。
第二步:下载WinApps
并做预准备
具体而言,执行如下命令
1 | sudo apt-get install -y freerdp2-x11 |
第三步:创建WinApps配置文件
新建一个配置文件,路径为:~/.config/winapps/winapps.conf
,写进如下的信息
1 | RDP_USER="MyWindowsUser" |
这个用户名和密码填写为Windows 10虚拟机设置的用户名与密码,值得注意的是,不能使用PIN码。
至于其它几个可选项(不很能理解,就贴原文了):
- When using a pre-existing non-KVM RDP server, you can use the
RDP_IP
to specify it's location- If you are running a VM in KVM with NAT enabled, leave
RDP_IP
commented out and WinApps will auto-detect the right local IP- For domain users, you can uncomment and change
RDP_DOMAIN
- On high-resolution (UHD) displays, you can set
RDP_SCALE
to the scale you would like [100|140|160|180]- To add flags to the FreeRDP call, such as
/audio-mode:1
to pass in a mic, use theRDP_FLAGS
configuration option- For multi-monitor setups, you can try enabling
MULTIMON
, however if you get a black screen (FreeRDP bug) you will need to revert back- If you enable
DEBUG
, a log will be created on each application start in~/.local/share/winapps/winapps.log
第四步:运行WinApps的安装脚本
首先检查一下是否能连接,相应的,使用如下命令:
1 | bin/winapps check |
一切正常的话,会通过远程界面登录虚拟机,并在最后弹出Windows 10的文件资源管理器窗口,这代表连接成功。然后就可以关闭文件资源管理器,按下Ctrl-C
取消输出。
如果没有连接成功,尝试重新启动虚拟机,或者检查是否是以下原因:
- 没有携带
check
参数 - 没有在虚拟机里器用远程桌面
- 如果设置了IP,是否无法连接到IP地址
- 在
~/.config/winapps/winapps.conf
配置文件中,没有正确填写用户名或者密码 - 在虚拟机里没有合并注册表
RDPApps.reg
接着最后一步运行安装脚本安装已下载的软件:
1 | ./installer.sh |
我已经安装了Visual Studio,并且做了选择,因此在安装结束后我会看到这些图标:
并能使用Visual Studio进行C#的.net开发,就很梦幻。
甚至完成了下面两张图的效果。
添加预定义应用
Visual Studio,powershell以及CMD之所以可以直接使用,是因为对它们进行了配置,这些配置文件可以在apps
里找到,对于每个文件夹,都有一个ison.svg
与info
,ison.svg
是这个软件在Ubuntu上显示的图标,info
里则记录了该软件的名称,路径等信息。
之后,使用installer.sh
时,会遍历这些配置文件,找到哪些软件已经安装,并展示出来,接着,由用户选择对哪些已安装建立连接,最后再以原生应用的体验进行使用。
在linux上玩原神
那么,一系列的环境都已经搭建好了,来尝试下在linux上玩玩原神。
首先,在虚拟机里安装原神,这一步没什么好说的,进入原神官网,选择PC下载
,下载安装原神游戏本体。
然后写配置文件,在apps
文件夹下新建一个文件夹,命名为Genshin-Impact
,先找个原神的logo,注意必须是svg格式,放进去重命名为 icon.svg
,下面这张是我自己用的。
然后新建一个文件,命名为info
,编辑这个文件,写进去下面这些内容
1 | # GNOME shortcut name |
再调用installer.sh
脚本,进行安装。
一切都很美好,然后点击开始游戏
然后我们得知虚拟机不能运行原神。
但是虚拟机都有绕开虚拟机的方式,KVM也不例外,根据这个回答,改一下设置就好。
具体而言,打开CPU
的设置,选择XML
标签页,修改<cpu mode='host-model' check='partial'/>
这一项,在里面增加一项,最终的效果为:
1 | <cpu mode='host-model' check='partial'> |
然后在<features>
这里也添加一项,效果:
1 | <features> |
重启一下虚拟机,就可以绕开虚拟机检测了。
我这里本来应该放上游戏内的画面,但是限于我的硬件条件十分一般,延迟会稍微有点高,正常进入游戏是没问题,但是流畅玩耍就有点不行。
回头换个好点的配置试试。
尾声
我在进行实验时,对它的期望不算很高,毕竟在我的认知里,通过虚拟机(特指VMware)使用另一个系统时,一定有相当大的延迟,交互还不是很好。
但是KVM + WinApps的组合让我感觉很不错,我在一块旧的机械硬盘上进行的实验,CPU也是几年前的i5,但是对与CPU以及内存的占用都没有飙升到特别高,KVM的虚拟机是后台常驻的,但是在不使用程序时,几乎感知不到它的存在,而且貌似是因为加载程序时不需要完整运行整个系统,延迟也很低,配合上复制粘贴,和原生应用的体验已经十分的相像了。
我曾经对卸载Windows,将Linux作为唯一的日常系统这一想法有些踌躇,但是KVM + WinApps的组合让我感觉可以向前迈进一大步了,说不定下次准备更换计算机,使用更高性能的机器时,已经可以完全做到抛弃双系统这一妥协方案了。