倾旋的博客

WinApps - Linux平台下运行Windows程序

· 倾旋

前言

我的主力办公电脑是Arch Linux,因此在工作过程中难免需要用到Windows应用工具,但Linux生态下又没有,因此寻找了一些方案来看看能否满足在Linux下无缝运行Windows程序。最早我在多年以前接触过Wine,这个软件是虚拟出一个Windows运行的环境,但会安装很多依赖,并且稳定性需要打一个问号。最后我选择了WinApps这个开源项目,它不需要我在Linux上安装过多的软件,只需要依赖一个RDP客户端(freerdp)和虚拟化技术软件(Podman/Docker/Libvrt)即可。

环境搭建过程

WinApps是一个开源项目,Github链接:

https://github.com/winapps-org/winapps/tree/main

WinApps这个项目的原理其实非常简单,就是在虚拟化软件上创建一个Windows虚拟机,然后开启RDP(远程桌面)服务,再通过简单的配置就可以使用RDP客户端快速连接到虚拟机了,最终我选择了 Libvrt 作为底层虚拟化的基座,我认为Docker更适合跑一些轻量级的应用,不适合在它上面再启动一个操作系统,这一点我有轻微洁癖。

第一步:创建虚拟机

文档链接:https://github.com/winapps-org/winapps/blob/main/docs/libvirt.md

第二步:安装客户端依赖的工具

sudo pacman -Syu --needed -y curl dialog freerdp git iproute2 libnotify openbsd-netcat

第三步:创建配置文件

我有两个虚拟机,一个办公,一个开发(Visual Studio)

╭─arch@archlinux ~
╰─$ virsh list --all

 Id   名称         状态
-------------------------
 1    RDPWindows   运行
 3    Win10        运行

配置文件:$HOME/.config/winapps/winapps.conf

RDP_USER="username"
RDP_PASS="password"
RDP_IP="192.168.0.1"
# 缩放,高分辨率大显示屏需要调整,默认值 100
RDP_SCALE=140
WAFLAVOR="libvirt"
RDP_TIMEOUT=60
DEBUG="true"
# 挂载Home目录
RDP_FLAGS="+home-drive"

在这一步我读了WinApps的脚本文件:https://github.com/winapps-org/winapps/blob/main/bin/winapps

给脚本做了一些优化,方便我可以连接多个虚拟机。

配置文件:$HOME/.config/winapps/winapps-dev.conf

# 要连接的主机名,需要与virsh列出的相同
VM_NAME="Win10"
RDP_USER="username"
RDP_PASS="password"
RDP_IP="192.168.0.1"
# 缩放,高分辨率大显示屏需要调整,默认值 100
RDP_SCALE=140
WAFLAVOR="libvirt"
RDP_TIMEOUT=60
DEBUG="true"
# 挂载Home目录
RDP_FLAGS="+home-drive /cert:ignore"

在39行新增一行即可:

: "${CONFIG_PATH:="$HOME/.config/winapps/winapps.conf"}"

然后再创建Desktop文件,方便Drun可以直接检索到:

╭─arch@archlinux ~
╰─$ cat ~/.local/share/applications/windows.desktop
[Desktop Entry]
Name=Windows
Exec=env LIBVIRT_DEFAULT_URI=qemu:///system /home/arch/.local/bin/winapps windows %F
Terminal=false
Type=Application
Icon=/home/arch/.local/share/winapps/icons/windows.svg
StartupWMClass=Microsoft Windows
Comment=Microsoft Windows RDP Session

╰─$ cat ~/.local/share/applications/windows-dev.desktop
[Desktop Entry]
Name=Windows Dev
Exec=env LIBVIRT_DEFAULT_URI=qemu:///system CONFIG_PATH=/home/arch/.config/winapps/winapps-dev.conf /home/arch/.local/bin/winapps windows %F
Terminal=false
Type=Application
Icon=/home/arch/.local/share/winapps/icons/windows.svg
StartupWMClass=Microsoft Windows
Comment=Microsoft Windows RDP Session