admin管理员组

文章数量:1627747

之前根据B站教程《在linux上安装微软office》:在linux上安装微软office_哔哩哔哩_bilibili

写过一篇使用KVM虚拟机安装Microsoft Office+RDP远程控制的文章,根据B站的教程安装后,发现有远程控制延迟的问题,比如拖动Office窗口时会延迟,搜狗输入法扫一下就闪退,插入形状后无法调整大小,无法调整图片大小等问题。而且最大的问题是,如果你不提前关闭KVM虚拟机,就得等待Linux关机时杀掉KVM虚拟机的'libvirt' 进程,导致关机需要很长时间。已知Linux开机时会同步开启KVM虚拟机的'libvirt' 进程,这个'libvirt' 进程经常导致Linux系统崩溃,开机时黑屏。停留在只有一条白色下杠的页面。

因此,Winapps最新版本提供了解决方案,推荐用户使用Docker或者Podman安装Microsoft Office + RDP远程控制。降低了系统崩溃的概率。接下来我将带大家如何进行安装和设置。

系统:Ubuntu24.04

前提:已经安装了Docker

(不会安装Docker的,请查看《Ubuntu24.04安装Docker》的文章)

一、从github下载winapps

在必应搜索“winapps github”

复制HTTPS的下载链接:https://github/Fmstrat/winapps.git

进入/opt目录,通过git clone把winapps下载到/opt目录下

yammie@my-pc >/opt 
$ git clone https://github/Fmstrat/winapps.git

为了后续执行不受权限的干扰,给winapps中的所有文件授予777权限。

yammie@my-pc >/opt 
$ sudo chmod 777 -r ./winapps

 
此时winapps的所有者和权限如图:

进入winapps/docs,阅读docker.md的安装步骤。里面提示可以通过docker或者podman进行安装,此处我们选择docker。

二、阅读并修改compose.yaml

1. compose.yaml的内容

打开compose.yaml,阅读里面的设置要点。修改为以下内容,复制粘贴即可

name: "winapps"
volumes:   # Linux系统中通过建立'_data'目录来作为Docker镜像的数据卷
  # 此处默认注释,执行compose.yaml时,它也会默认安装到下面的目录
  # Located @ '/var/lib/docker/volumes/winapps_data/_data' (Docker).
  # Located @ '/var/lib/containers/storage/volumes/winapps_data/_data' or '~/.local/share/containers/storage/volumes/winapps_data/_data' (Podman).
  data:
services: # 服务器
  windows:  # Windows的镜像容器
    image: dockurr/windows  # 指定从github中下载dockur/windows的Docker镜像
    container_name: WinApps  # 创建Docker容器名称为WinApps
    environment:                # 要配置的Windows镜像版本环境。要选择Windows版本,请访问:
      VERSION: "core11"  # https://github/dockur/windows ; 下拉即可看到各种Windows版本。
      RAM_SIZE: "4G"      # 内存: 4G
      CPU_CORES: "4"    # CPU核心数:4
      DISK_SIZE: "64G"   # 主硬盘存储空间: 64G
      #DISK2_SIZE: "32G"  # 第二块硬盘存储空间:32G。如果你要取消该注释,需要保证提供了该硬盘给虚拟机运行
      LANGUAGE: "Chinese"  # 此处必须要指定安装语言为Chinese,不然默认安装English
      REGION: "zh-CN"         # 此处必须要指定地区为:zh-CN,不然默认安装English
      KEYBOARD: "zh-CN"   # 此处必须要指定键盘为zh-CN,不然默认安装English
      USERNAME: "Docker"  # Windows虚拟机的用户名默认是Docker,你可以取消注释,重命名为其他名字。建议默认
      PASSWORD: "123456me"  # Windows虚拟机登录密码,自定义即可。不能为空。
      HOME: "${HOME}"  # 设置Linux用户主文件夹的路径
    privileged: true  # 授予Windows 虚拟机扩展权限
    ports:
      - 8006:8006  # 将Linux主机上的“8006”映射到Windows 虚拟机上的“8006”→用于VNC Web界面http://127.0.0.1:8006.
      - 3389:3389/tcp  # 将Linux主机上的“3389”映射到Windows 虚拟机上的“3389”→用于远程桌面协议(RDP)
      - 3389:3389/udp # 将Linux主机上的“3389”映射到Windows 虚拟机上的“3389”→用于远程桌面协议(RDP)
    stop_grace_period: 120s     # 停止宽限期 ;当你去关闭Windows虚拟机时,等待120秒后才会发送SIGTERM信号去终止Windows的镜像容器进程。SIGTERM 信号提供了一种优雅的方式来终止程序。
    restart: on-failure     # 如果退出代码指示错误,将重新启动Windows VM
    volumes:       # Windows虚拟机的数据卷
      - data:/storage  # 挂载上面Linux系统中的'_data'数据卷,作为Windows虚拟机的C盘
      - ${HOME}:/shared  # 挂载Linux用户的home目录,作为Windows虚拟机的远程网络共享目录,名称为: \\host.lan\Data'.
      #- /path/to/second/hard/disk:/storage2 # 确保上面指定了第二块硬盘,取消注释,就会为Windows虚拟机加载第二块硬盘
      - ./oem:/oem    # 自动触发“oem/install.bat”的安装,应用含有'oem/RDPApps.reg'的Windows注册表修改。
      - /opt/winapps/iso/tiny11_core11.iso:/custom.iso #取消注释,使用自己下载的Windows.iso文件。一旦使用自己的iso文件,上面environment设定的  VERSION: "core11"  将会被忽略。
    devices:  # 设备
      - /dev/kvm # 启动 KVM.
      #- /dev/sdX:/disk1 # 取消注释,直接在Windows VM中挂载磁盘(注意:“disk1”将作为主驱动器挂载)
      #- /dev/sdY:/disk2 # 取消注释,直接在Windows VM中装载磁盘(注意:“disk2”及更高版本将作为辅助驱动器装载

有关文档、常见问题解答、其他配置选项和技术帮助,请访问:GitHub的dockurr/windows的Docker镜像容器https://github/dockur/windows

(1) 注意:请不要使用Tab来调整注释位置,yaml文件不能识别Tab,不然执行会报错:
yaml: line 19: found character that cannot start any token
 

(2) 原来的compose.yaml中, - ./oem:/oem  - /opt/winapps/iso/tiny11_core11.iso:/custom.iso 默认是注释掉的。意味着我们默认从environment设定的  VERSION: "core11"  来下载Tiny 11 Core版本的Win11,网速不够快的情况下,用时超长。

因此,我们建议取消对- ./oem:/oem  - /opt/winapps/iso/tiny11_core11.iso:/custom.iso的注释。直接从指定的网站下载我们需要的iso文件。iso文件放在/opt/winapps/iso/目录下。iso目录需要我们自行创建。

指定本地的iso文件后,直接忽略了environment设定的  VERSION: "core11"  的下载 ,加快了加载win11的速度。

(3) image: dockurr/windows是 ‘‘rr’’结尾,但是github里面该项目是dockur/windows,少了1个r,可能是创作者过往遗留的路径名称问题,compose.yaml使用的是"rr"结尾的dockurr/windows!不要写错了。

2、疑难解答

(1) 什么是数据卷(Volumes)

Docker镜像被存储在一系列的只读层中。当我们创建一个容器时,Docker会读取镜像(只读),并在其顶部添加一层读写层。如果正在运行中的容器修改了现有文件,该文件将会被拷贝出底层的只读层,放到最顶层的读写层中。读写层中原来的旧版本文件(未被更改过的文件)仍然存在于镜像中。

所以当Docker容器被删除后,再基于原来的镜像创建容器时,将创建一个没有任何数据更改的容器,在之前那个容器中的数据更改会丢失掉。只读层和读写层的组合被Docker称为联合文件系统(Union File System)。

为了能够持久化这些更改过的数据,并且能够很容易实现容器间共享数据,Docker提出了Volume的概念。Volume是外部默认的联合文件系统或者是存在于宿主文件系统中正常的文件或文件夹。


(2) 为什么需要数据卷

这得从Docker容器的文件系统说起。出于效率等一系列原因,Docker容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:

不能在宿主机上很方便地访问容器中的文件。
无法在多个容器之间共享数据。
当容器删除时,容器中产生的数据将会丢失。
为了解决这些问题,Docker引入了数据卷(Volume) 机制。数据卷以独立于Docker文件系统的形式存在于宿主机中。数据卷的最大特点是:其生存周期独立于容器的生存周期。

数据卷的设计目的就是数据的持久化,因为其生存周期独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。所以数据卷可以带来以下好处:

数据卷可在容器之间共享或重用数据。
数据卷的更改可以直接生效。
数据卷的生命周期一直持续到没有容器使用它为止。
对数据卷操作不会影响到镜像本身。
数据卷可以完成容器到宿主机、宿主机到容器以及容器到容器之间的数据共享。

(3) 什么是 SIGTERM(信号 15)

SIGTERM(信号 15)在基于 Unix 的操作系统(如 Linux)中用于终止进程。SIGTERM 信号提供了一种优雅的方式来终止程序,使其有机会准备关闭并执行清理任务,或者在某些情况下拒绝关闭。Unix/Linux 进程可以以多种方式处理 SIGTERM,包括阻塞和忽略。

SIGTERM 是 Unix/Linux kill 命令的默认行为,当用户执行 kill 时,操作系统会在后台向进程发送 SIGTERM。如果过程不在 Docker 容器中,通过 SIGTERM 信号终止的容器在其日志中显示退出码 143。如果您是 Kubernetes 用户,本文将帮助您了解 Kubernetes 终止容器时幕后发生的情况,以及如何在 Kubernetes 中使用 SIGTERM 信号。

(4) KVM是什么

 KVM,是Keyboard Video Mouse的缩写,KVM 通过直接连接键盘、视频或鼠标 (KVM) 端口,能够访问和控制计算机。KVM 技术无需目标服务器修改软件。这就意味着可以在BIOS环境下,随时访问目标计算机。KVM 提供真正的主板级别访问,并支持多平台服务器和串行设备。

三、下载指定的Windows系统的iso

因为上面compose.yaml默认从下面的网站下载iso文件,所以我们就从这里进去,选定要安装的Windows版本。

dockurr/windows指定的Windows系统下载区https://filexiaobai/Windows/%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E5%8C%85/


此处我选择tiny11 core x64 beta 1.iso下载。下载位置为:/opt/winapps/iso/
一定要跟compose.yaml指定的iso文件路径对应上!!

四、通过docker compose启动compose.yaml,安装Windows系统到dockurr/windows的镜像容器

yammie@my-pc >/opt 
$ cd ./winapps


yammie@my-pc >/opt/winapps 
$ docker compose --file ./compose.yaml up

接着终端提示进入http://127.0.0.1:8006的端口,在浏览器中进行Windows系统的安装。

安装过程略。

五、把修改后的compose.yaml复制到~/.config/winapps

安装完毕后,修改 /opt/winapps/compose.yaml,把以下内容注释掉:

     # - ./oem:/oem   
     #- /opt/winapps/iso/tiny11_core11.iso:/custom.iso

接着把修改后的compose.yaml复制到~/.config/winapps

yammie@my-pc >/opt 
$ sudo mkdir ~/.config/winapps


yammie@my-pc >/opt 
$ sudo cp ./compose.yaml ~/.config/winapps

六、停掉并删除 /opt/compose.yaml启动的容器,然后通过~/.config/winapps/compose.yaml启动新的容器

yammie@my-pc >/opt 
$ docker compose --file ./compose.yaml down


yammie@my-pc >/opt 
$ docker compose --file ~/.config/winapps/compose.yaml up


打开http://localhost:8006/,看到Windows系统能够运行即可。记住用户名为:Docker,以及你自定义的密码:123456me。等会用来写WinApps的配置文件。
 

七、进入Windows系统后,进行各种安装和设置

1、设置系统名称为RDPWindows

开始→设置→主页:点击重命名→命名为RDPWindows

2、在微软商店下载浏览器

我下载的是火狐浏览器

3、在浏览器中下载搜狗输入法并安装

4、下载Microsoft Office安装器

office-toolshttps://otp.landian.vip/zh-cn/

安装步骤:

注意!注意!以前安装过office要先卸载旧的才能安装 ,若是没有安装过的 跳过这一步 直接看下面。
安装过的 点击 工具箱---office工具---移除office后即可
 
① 打开tool plus 按照以下步骤依次执行
 
② 点击 设置---部署---启用显示内部产品和通道
 
③ 点击 部署---更新通道---选择最后一个 beta channel 同时安装模块选择office tool plus
 
④ 点击 添加产品---搜索框中输入 2024 ---选择office LTSC 专业增强版 2024 批量许可 即可( 其他2024 还有专业版同理)同时语言设置中文
 
⑤ 点击部署即可
 

5、激活系统和Microsoft Office


6、重点:注销Docker用户,等会进行WinApps的安装时必须要先注销,不然报错。
 

八、安装WinApps的依赖,并书写配置文件

1、安装WinApps的依赖

yammie@my-pc >/opt 
$ sudo apt-get install dialog   


yammie@my-pc >/opt 
$ sudo apt-get install freerdp3-x11 

2、书写配置文件

(1) 创建设置文件夹

yammie@my-pc >/opt 
$ sudo mkdir ~/.config/winapps

(2) 编辑设置文件

yammie@my-pc >/opt 
$ sudo touch ~/.config/winapps/winapps.conf   

(3) 授予777权限,方便日后我们修改里面的用户名和密码

yammie@my-pc >/opt 
$ sudo chmod 777 ~/.config/winapps/winapps.conf

(4) 写入我们在Win11设置好的用户名和密码

yammie@my-pc >/opt 
$ sudo gedit ~/.config/winapps/winapps.conf 

九、在用户层级安装WinApps

1、修改/opt/installer.sh

定位到/opt/installer.sh的第76、77行,MyWindowsUser修改为Docker,MyWindowsPassword修改为123456me

2、进入/opt目录,执行./installer.sh,安装WinApps

如果是sudo ./installer.sh安装,安装界面会识别成root用户。
如果是./installer.sh安装,安装界面会识别成当前用户。

我们在执行./installer.sh时,建议不要使用sudo ./installer.sh,在root层级安装WinApps,会涉及权限问题。最好是直接执行./installer.sh,在用户层级安装WinApps。方便日后无需权限去修改WinApps相关的内容。

执行以下命令:

yammie@my-pc >/opt 
$ ./installer  

按图选择:

安装成功!!此时双击Word可以成功开启。

请注意,Windows虚拟机请保持Docker用户在注销状态,Linux用户才能通过WinApps远程遥控Windows虚拟机的Microsoft Office。


十、如果~/.config/winapps/compose.yaml发生了修改,需要执行以下命令

如果~/.config/winapps/compose.yaml发生了修改,Windows镜像容器需要被移除和重新创建,这并不会影响磁盘里面的数据。注意,通过查看~/.config文件夹的属性,这是用户层级下创建的文件夹,无需sudo去操作。


1、停止并删除存在的Windows镜像容器

yammie@my-pc >/opt/winapps
$ docker compose --file ~/.config/winapps/compose.yaml down

2、删除存在的FreeRDP证书,移除证书后,WinApps不再起作用

yammie@my-pc >/opt/winapps
$ rm ~/.config/freerdp/server/127.0.0.1_3389.pem 

3、删除WinApps的远程控制以及图标,但是不删除/home/yammie/.config/winapps,因为里面的配置文件我们等会还要用

yammie@my-pc >/opt/winapps 
$ ./installer.sh --user --uninstall

4、重建并启动Windows的镜像容器,此时WinApps并无对该系统进行远程控制

yammie@my-pc >/home/yammie 
$ docker compose --file ~/.config/winapps/compose.yaml up  

5、进入http://localhost:8006,确保你已经注销Docker用户,接着 缩小或者关闭浏览器都行

6、重新执行WinApps的安装程序,才能生成新的pem证书和远程软件图标快捷方式

yammie@my-pc >/opt/winapps 
$ ./installer.sh 

按《八、在用户层级安装WinApps》的教程即可

十一、当Windows镜像容器卡死,如何解决

注意:有时候RDP Windows 相关的进程会卡死,通过
docker compose --file ~/.config/winapps/compose.yaml kill
也无法kill掉docker容器的情况下。

需要通过搜索:ps -aux|grep RDP
找到RDP的PID,第二个16677就是了

yammie@my-pc >/home/yammie 
$ ps -aux|grep RDP
                                         
yammie  16677  0.0  0.0   9304  2304 pts/0    S+   02:27   0:00 grep --color=auto RDP
 

 然后kill -9 <PID>即可。一定要添加-9选项,不然不能强制kill掉RDP进程

yammie@my-pc >/home/yammie 
$ kill -9 16677

然后通过容器重启:

yammie@my-pc >/home/yammie 
$ docker compose --file ~/.config/winapps/compose.yaml start

十二、docker的其它命令

docker compose --file ~/.config/winapps/compose.yaml start # 启动Windows镜像容器
docker compose --file ~/.config/winapps/compose.yaml pause # 暂停Windows镜像容器
docker compose --file ~/.config/winapps/compose.yaml unpause # 唤醒Windows镜像容器
docker compose --file ~/.config/winapps/compose.yaml restart # 重启Windows镜像容器
docker compose --file ~/.config/winapps/compose.yaml stop #优雅关闭Windows镜像容器,用时很长
docker compose --file ~/.config/winapps/compose.yaml kill #暴力关闭Windows镜像容器,用时很短
docker compose --file ~/.config/winapps/compose.yaml down #停止并删除Windows镜像容器

十三、创建启动和暴力关闭Windows镜像容器的桌面快捷方式

1、创建图标

(1) 进入 /opt/winapps/icons,复制windows.svg 2次,创建两个副本,分别命名为:close_Winapps.svg 和 open_Winapps.svg


(2) 分别编辑close_Winapps.svg 和 open_Winapps.svg的颜色代码,设置如下:

  ① close_Winapps.svg

      <stop offset="0" stop-color="orange"/>
      <stop offset=".4" stop-color="orange"/>
      <stop offset="1" stop-color="orange"/>

  ② open_Winapps.svg

      <stop offset="0" stop-color="#CCFF66"/>
      <stop offset=".4" stop-color="#CCFF66"/>
      <stop offset="1" stop-color="#CCFF66"/>

(3) 在~/桌面创建两个desktop文件

yammie@my-pc >/home/yammie/桌面 
$ touch close_Winapps.desktop


yammie@my-pc >/home/yammie/桌面 
$ touch open_Winapps.desktop

close_Winapps.desktop

​[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=关闭WinApps
#图标路径
Icon=/opt/winapps/icons/close_Winapps.svg
Terminal=true
Exec=bash /opt/winapps/Winapps_close_open/close_Winapps.sh

open_Winapps.desktop

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=打开WinApps
#图标路径
Icon=/opt/winapps/icons/open_Winapps.svg
Terminal=true
Exec=/opt/winapps/Winapps_close_open/open_Winapps.sh

此处设置Terminal=true,弹出终端框,是为了让用户看到该程序执行状态。

2、创建脚本

(1) 在/opt/winapps下创建Winapps_close_open目录

yammie@my-pc >/opt/winapps 
$ mkdir Winapps_close_open

(2) 创建脚本

yammie@my-pc >/opt/winapps/Winapps_close_open 
$ touch close_Winapps.sh


yammie@my-pc >/opt/winapps/Winapps_close_open 
$ touch open_Winapps.sh

close_Winapps.desktop

#!/bin/bash
docker compose --file ~/.config/winapps/compose.yaml kill # 暴力关闭WinApps

open_Winapps.desktop

#!/bin/bash
docker compose --file ~/.config/winapps/compose.yaml start # 开启WinApps

3、右键图标→允许运行

双击黄色图标,关闭WinApps。
双击绿色图标,开启WinApps。

建议关闭Linux前,先关闭WinApps。不然杀后台进程需要挺长时间,导致关机时间也会延长。

本文标签: 远程控制DockerLinuxMicrosoftRDP