玩命加载中 . . .

Winapps:在 Ubuntu 上使用 MSOffice


最近发现了一个十分好用的项目:winapps,GitHub地址:https://github.com/Fmstrat/winapps。这个项目可以让你在 Ubuntu 或者其他 Linux 发行版和 GNOME/KDE 桌面上直接使用 Windows 虚拟机或 RDP 服务器上的 Win 应用,并且可以表现得就像是 Linux 原生应用一样,十分的牛。研究了一天,下面把使用方法和改进操作写一下。

安装虚拟机

如果你没有虚拟机或RDP服务器的话,首先要装一个。官方使用的是 KVM,至于其他的 VM …… 我尝试了使用 Virtualbox 里装的 Windows 虚拟机,没有成功,所以这里还是推荐大家用 KVM 来装。

下载 KVM 及虚拟系统管理器

第一步要下载 KVM,还有一个可视化的虚拟系统管理器,便于我们操作。在 Ubuntu 下,执行下面的指令:

sudo apt install -y virt-manager

安装 Windows 系统

我们需要安装 Windows 10 专业版系统,首先下载系统镜像以及一个工具:

  • Windows 10 ISO:https://www.microsoft.com/en-us/software-download/windows10ISO
  • KVM VirtIO drivers:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

下载完成后,打开虚拟系统管理器

接下来,选择编辑->首选项,然后选中Enable XML editing。选中后直接新建一个虚拟机

接下来按照图中选择:

然后选择下载好的 Win10 镜像:

官方推荐内存和CPU设置如下,实际上应该可以更多,按需选择:

选择虚拟机占用空间大小,这里是指最大空间,实际上虚拟机用多少它会占多少。上面的选项会自动在默认位置创建一个磁盘镜像,也可以选下面那个选项自己选择存储位置:

下一步尤其注意:把名称改为 RDPWindows,这样之后的操作时 FreeRDP 会自动找到你的虚拟机。同时选中在安装前自定义配置

接下来在 CPUs 选项卡中选中复制主机CPU配置

💡 Note:

有时这个选项会在安装完后自动关闭,需要再次选中。

然后在去 XML 标签页,找到 <clock> 部分,将内容改为如下:

<clock offset="localtime">
    <timer name="rtc" tickpolicy="catchup"/>
    <timer name="pit" tickpolicy="delay"/>
    <timer name="hpet" present="yes"/>
    <timer name="hypervclock" present="yes"/>
</clock>

点击应用

然后在内存选项卡中将 当前分配 改为官方推荐的1024,如果内存多可以更高。

引导选项 中选中主机引导时启动虚拟机。

SATA 磁盘 1 中的高级选项里,将 磁盘总线 选为 VirtIO

NIC 中将 设备型号 改为 virtio

选择添加硬件,选择存储,选择之前下载的那个工具,然后将 设备类型 改为 CDROM 设备 :

完成后就可以开始安装了,安装过程和一般系统安装过程大同小异,一步一步来即可,注意要安装 专业版,只有专业版才有远程桌面。

到了选择安装位置这一步,你会发现没有位置让你选,此时按照下图操作:

这样就 OK 了,后面选择网络时不要连网,现在还连不上网。

系统设置

安装完成进入系统后,还是进入挂载着刚刚下载的工具的磁盘,安装 virtio-win-gt-x64.exe

装完就可以联网了,联网后需下载一个文件 RDPApps.reg,这个文件在 GitHub 上,网络原因可能下载不下来,可以到 gitee 上找到一个此项目的镜像来下载:https://gitee.com/Nucleon14_N14/winapps/raw/develop/install/RDPApps.reg,直接 Ctrl+s 保存。下载后右击该文件,选择合并,把这个文件合并到注册表里去。

接下来在系统设置中,找到 关于 ,然后 重命名这台电脑 把名字改成 RDPWindows ,但先不要重启,在远程桌面选项卡启用远程桌面。此时即设置完毕。

宿主机设置

接下来在宿主机进行设置:

Run KVM in user mode

运行下面的指令可以让 KVM 以非 root 用户运行:

sudo sed -i "s/#user = "root"/user = "$(id -un)"/g" /etc/libvirt/qemu.conf
sudo sed -i "s/#group = "root"/group = "$(id -gn)"/g" /etc/libvirt/qemu.conf
sudo usermod -a -G kvm $(id -un)
sudo usermod -a -G libvirt $(id -un)
sudo systemctl restart libvirtd
sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/

然后重启电脑。

WinApps 安装

下载软件和依赖

运行下面的指令下载软件和依赖:

sudo apt-get install -y freerdp2-x11
git clone https://github.com/Fmstrat/winapps.git
cd winapps

创建 WinApps 配置文件

创建文件 ~/.config/winapps/winapps.conf,加入如下内容:

RDP_USER="MyWindowsUser"
RDP_PASS="MyWindowsPassword"
#RDP_DOMAIN="MYDOMAIN"
#RDP_IP="192.168.123.111"
#RDP_SCALE=100
#RDP_FLAGS=""
#MULTIMON="true"
#DEBUG="true"

各参数的作用可以去 GitHub 上 官方文档 里去看。

运行 WinApps installer

首先要验证 RDP 连接:

bin/winapps check

正常的话应该会输出让你选择是否接受证书,选择y即可,然后会弹出一个 Windows 的文件管理器,说明连接正常。接下来就可以安装 Win 下的软件了:

./installer.sh

💡 Note:

如果运行后有说什么目录不存在的报错,自己去建一个目录就好了。

运行效果

运行完成后你应该就可以看到 Win 下的应用出现在了 Linux 里,简直和原生的一样

Ubuntu 下的 Word

合理 👍

一些改进

大家可能发现了,当使用 WinApps 时,家目录会作为网络位置挂载到虚拟机中,并且十分牛的是,可以直接在 Ubuntu 中用 Win 下的应用打开文档。但实际上,我的文档大部分都放在其他硬盘里,我想在任何位置都能直接打开文档。因此需要对脚本做一些改动。

💡 Note:

需要说明的是,我的电脑有两块硬盘,常用的3个分区,分别在宿主机 Ubuntu 下挂载在 /media/D/media/E/media/F 这3个位置,下面的设置请根据自己的情况灵活调整。

将硬盘挂载至虚拟机

更改上面的配置文件 ~/.config/winapps/winapps.conf,在 RDP_FLAGS 中填入内容,如下:

RDP_USER="MyWindowsUser"
RDP_PASS="MyWindowsPassword"
#RDP_DOMAIN="MYDOMAIN"
#RDP_IP="192.168.123.111"
#RDP_SCALE=100
RDP_FLAGS="/drive:D,/media/D /drive:E,/media/E /drive:F,/media/F"
MULTIMON="true"
#DEBUG="true"

/drive:GuestPath,HostPath 其中的参数 GuestPath 是指映射到虚拟机下的位置,HostPath 是指要映射过去的文件夹的位置。

调整脚本

下一步更改 ./bin/winapps 文件,之前第99行至第102行的内容如下:

dprint "HOME:${HOME}"
FILE=$(echo "${2}" | sed 's|'"${HOME}"'|\\\\tsclient\\home|;s|/|\\|g;s|\\|\\\\|g')
dprint "FILE:${FILE}"
xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /wm-class:"${FULL_NAME}" /app:"${WIN_EXECUTABLE}" /app-icon:"${ICON}" /app-cmd:"\"${FILE}\"" 1> /dev/null 2>&1 &

将其替换为如下内容:

dprint "HOME:${HOME}"

   FOLDERS=( $(mount | grep /media | grep /dev | gawk '{print $3}') )
   FILE="X"
   unset FOUND
   for i in ${FOLDERS[@]}; do
       if grep -q "${i}" <<< "$2"; then
           FOLDERNAME=$(basename "${i}")
           FILE=$(echo "${2}" | sed 's|'"${i}"'|\\\\tsclient\\'"${FOLDERNAME}"'|;s|/|\\|g;s|\\|\\\\|g')
           FOUND=true
           break
       fi
   done
   if [ ! $FOUND ]; then
       FILE=$(echo "${2}" | sed 's|'"${HOME}"'|\\\\tsclient\\home|;s|/|\\|g;s|\\|\\\\|g')
   fi
   dprint "FILE:${FILE}"
   xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /wm-class:"${FULL_NAME}" /app:"${WIN_EXECUTABLE}" /app-icon:"${ICON}" /app-cmd:"\"${FILE}\"" 1> /dev/null 2>&1 &

然后重新运行 installer.sh 脚本安装应用,此时就可以在任何位置打开文档了:

打开非家目录下的一个文档

合理​ 👍

参考内容

WinApps Doc | GitHub


文章作者: Mond
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 Mond !
  目录