基于Linux的超算系统中Windows应用程序运行环境探究*

2022-09-21 08:36徐海坤谢一曼
计算机工程与科学 2022年9期
关键词:计算资源镜像虚拟化

徐海坤,谢一曼,吴 青,陈 军,邹 有

(中南大学信息与网络中心,湖南 长沙 410083)

1 引言

高性能计算是现代科学研究最重要的技术手段之一,国内许多高校和研究机构都建立了超算系统,以满足学科建设和科研工作中日益增长的计算需求[1 - 4]。目前,绝大部分超算系统都是基于Linux操作系统搭建的,以CentOS、Red Hat和Ubuntu为主。近年来,国内高性能计算蓬勃发展,集群和用户规模不断扩大,用户需求也逐渐多样化,部分用户产生了在超算系统中运行Windows应用程序的需求。这种需求在当前的超算领域中虽然不是主流,但却是每个超算系统都需要面对的问题。一方面由于Linux系统和Windows系统互不兼容,大量Windows应用程序没有基于Linux系统的版本;另一方面由于Windows系统具有良好的图形界面,部分用户习惯使用Windows操作系统。在高校环境中,缺乏Linux系统使用经验的用户比例大,这一需求显得尤为突出。部分建设了校级超算系统的高校对科研人员自行采购的计算硬件有严格控制,造成了科研人员Windows系统使用需求与校级超算系统环境之间的矛盾。此外,随着云计算的普及,各大商业云服务商提供的弹性伸缩计算服务ECS(Elastic Compute Service)为用户使用Windows操作系统提供了便捷的途径,这一趋势也造成了Windows系统的超算用户流失。

目前,计算资源比较充裕的商业超算中心针对Windows应用程序运行需求,大多采用“裸金属”计算资源租用,或搭建专门的云平台提供Windows实例来解决。这2种方法的优点是:计算环境搭建较简单,用户使用便捷;缺点是:需要划分专门的计算资源用于提供Windows服务,资源利用不够灵活,需要额外的运维管理成本和独立的计费系统。此外,对于同时需要Linux系统和Windows系统的用户,实现2种系统的文件共享配置很复杂,用户对Windows实例的管理员权限也会带来一定的安全隐患。为解决这些问题,本文选择基于Linux操作系统运行Windows应用的思路,探寻对用户和运维人员都更便捷的解决方案。

2 Linux操作系统下运行Windows应用程序

目前在超算Linux系统上运行Windows应用程序的主流技术方案有2种[5]:一种是基于兼容层的API转换技术;另一种是基于软件层的虚拟机VM(Virtual Machine)技术。两者的本质区别是兼容层模拟的是Windows应用程序,而虚拟机技术模拟的是整个Windows操作系统。

2.1 基于兼容层的API转换技术

兼容层API转换技术是将Windows API调用翻译成动态的POSIX(Portable Operating System Interface)调用,以运行Windows应用程序。最早使用该方法的软件是Wine。Wine从体系结构上体现为一个Wine Server进程和一组动态链接库的集合,其图形界面通过X11转发。实际运行时系统至少会启动3个进程以运行Windows应用程序:应用进程本身、Wine服务进程和X11服务进程。Wine的体系结构如图1[6]所示。

Figure 1 Architecture of Wine图1 Wine体系结构

Wine不像虚拟机或者模拟器一样模仿内部的Windows逻辑,而是运用API转换技术开发出Linux到Windows相对应的函数来调用动态链接库(DLL),以降低性能损耗和资源占用。但是,Windows DLL库都是封闭源码,Wine开发人员需要耗费大量的时间和精力从底层开始重新设计、开发和测试,因此目前版本的Wine功能还不够完善,主要表现为支持的应用不多,已有的应用运行不够稳定等。具有类似功能的软件还有CrossOver。CrossOver是基于Wine开发的商业软件,为主流的Windows应用软件提供商业支持,相较于Wine更稳定。

2.2 虚拟机技术

虚拟机VM是一种特殊的软件,可以在计算机平台和终端用户之间创建一种环境,终端用户基于该软件所创建的环境来操作其他软件。

从虚拟化的实现方式来看,常见的虚拟化架构有2种:裸机型和托管型[7,8]。裸机型是指虚拟机监控程序直接运行在主机的物理硬件上,不必预先加载底层操作系统,如图2a[7,8]所示,直接访问底层硬件而无需其他软件(如操作系统和设备驱动程序),代表性软件有VMware ESXI。托管型是指虚拟机监控程序安装在现有操作系统之上,依赖于主机预先安装的操作系统来管理对CPU、内存、存储和网络资源的调用,如图2b[7,8]所示,代表性软件有Oracle VM VirtualBox、VMware Workstation和KVM(Kernel-based Virtual Machine)。

Figure 2 Types of virtualization图2 虚拟化实现方式

Linux系统使用虚拟机能完整地模拟Windows操作系统,各种Windows应用软件基本上都能在虚拟上安装并稳定运行。虽然使用虚拟机技术在资源优化和性能上有较大的缺陷,但是对于需要使用不同操作系统或是有特别需求的应用软件,是一个不错的选择。它可以有效地降低超算集群的运维成本,提升管理效率。

表1对使用Wine和虚拟机2种解决方案的优缺点进行了对比。本文的解决方案将基于Wine和托管型虚拟化开展。

Table 1 Comparison of Wine and virtual machine

3 基于超算调度系统启用Windows应用程序运行环境

常规的超算系统通常包括硬件系统和软件系统2部分。硬件系统由计算节点、高速计算网络、存储和登录管理节点组成;软件系统由底层操作系统、作业调度系统、文件系统和计算环境(编译环境、应用软件等)组成。用户使用超算系统开展计算时,首先需要使用终端登录工具访问登录节点,通过作业调度系统申请计算资源,然后使用系统分配的计算资源开展计算。登录节点和计算节点通过共享文件系统保持数据一致性。

使用超算系统开展计算相较于直接使用Linux主机计算有2个主要差别:一是需要使用远程登录终端登录;二是需要通过作业调度系统申请资源。因此,需要进行一些必要的配置,使之满足Windows应用程序的运行条件。

3.1 X11转发配置

用户在超算系统中使用Windows应用程序的需求中,绝大部分都需要图形界面,因此需要借助X11转发技术在用户本地启动远程超算系统上的图形界面[9]。首先,用户需要选用支持X11转发的客户端工具,如Xming、XShell和MobaXterm等。其次,超算系统的登录和计算节点需要启用X11转发配置。最后,使用调度系统申请计算资源,并通过X11参数使得计算节点上的图形界面可以转发到用户终端。具体步骤如下:

第1步:超算服务器修改文件/etc/ssh/sshd_config启用X11转发。配置“X11Forwarding yes”。

第2步:使用调度系统申请计算资源,如node01,则可以通过“ssh -X node01”访问计算资源来转发计算节点的图形界面。如果作业调度系统支持图形转发,则可直接申请计算资源。以SLURM作业调度系统为例,直接运行“srun -n 1 --exclusive --x11 commnad”即可完成资源申请和图形程序启动。

3.2 基于Wine的运行配置

基于Wine的Windows应用程序运行环境配置中,需要安装与操作系统版本兼容的Wine软件,并启动对应的Windows应用程序,对于需要安装的Windows应用程序,也可以基于Wine启动安装过程,Wine将模拟Windows目录结构部署应用软件。下面是在SLURM调度环境下,使用Wine运行Windows版本notepad程序的示例:

srun -n 1 --exclusive --x11 wine notepad.exe

参照该示例,可以运行其他Windows应用程序。

3.3 基于虚拟机的运行配置

基于托管型虚拟机运行Windows应用程序的方案需要在计算节点安装虚拟机环境,并为用户准备Windows操作系统镜像和访问Windows计算环境的VNC(Virtual Network Console)客户端。由于虚拟机中运行的是独立的操作系统,默认情况下,用户无法通过虚拟机访问其在超算平台的数据文件。为解决这一问题,本文在Windows操作系统镜像中预置了SSH(Secure SHell)文件系统SSHFS(Secure SHell File System)[10],用于通过SSH连接来挂载用户在宿主机上的文件目录。这种方式配置简洁,且安全性高。用户通过NAT(Network Address Translation)模式访问宿主机即可挂载数据目录,避免了用户滥用虚拟机的管理员权限配置虚拟网络带来的安全风险。本文在SLURM作业调度器中,采用libvirt开源虚拟化套件运行Windows虚拟机,详细步骤如下所示:

第1步确认计算节点启用的支持虚拟化的设置,下述命令有输出即代表支持虚拟化:

grep -E "(vmx|svm)" /proc/cpuinfo

第2步在计算节点安装libvirt相关虚拟化环境,以Centos 7操作系统为例,执行:

yum install -y libvirt virt-install

第3步准备Windows操作系统镜像,从微软官方获取Windows 10操作系统的VMware镜像,然后转换为KVM镜像格式。Windows 10官方VMware镜像下载地址为:https://az792536.vo.msecnd.net/vms/VMBuild_20190311/VMware/MSEdge/MSEdge.Win10.VMware.zip。

通过以下qemu-img工具完成镜像格式转换:

qemu-img convert -f vmdk -O qcow2 MSEdge-Win10-VMware-disk1.vmdk win20g.qcow2

第4步启动镜像,安装SSHFS软件和WinFSP软件用于挂载用户位于宿主机的文件系统。以下批处理文件可供自动挂载:

@echo off

echo 请输入平台用户名和密码加载数据到X盘

echo 注意:关闭此窗口X盘将断开!

del C:Userswinhpc。sshknown_hosts 1>nul 2>nul

set /p user=username:

start /B cmd /C " set "PATH=C:Program FilesSSHFS-Winin;%PATH%" && "C:Program FilesSSHFS-Wininsshfs.exe"-o idmap=user-o StrictHostKeyChecking=no %user%@10.0.2.2:X:"

运行上述批处理文件,并输入正确的用户名和密码后,用户可以在系统中通过盘符X访问自己在宿主机上的文件。

第5步为用户准备VNC桌面查看工具,在登录节点上安装vncviewer:yum install -y tigervnc

第6步为用户准备作业提交模板,以SLURM作业调度系统为例,用户提交作业并成功分配计算资源后,即可在作业输出文件中获取访问Windows实例的命令和口令。SLURM作业模板如下所示:

#!/bin/bash

#SBATCH --job-name=win

#SBATCH --exclusive

#SBATCH --nodes=1

#SBATCH -p winPartition

if [ !-f "$HOME/win20g.qcow2" ];then

echo "Preparing image file..."

cp/public/sourcecode/vm/win20g.qcow2 $HOME/ win20g.qcow2

echo "Image file is ready!"

fi;

PASSWD=$RANDOM

echo

echo "Please use the following command and passwd to visit your windows instance."

echo "vncviewer $HOSTNAME:5$UID"

echo "Password:$PASSWD"

echo

echo

ssh $HOSTNAME virsh undefine $USER-winvm >&/dev/null

ssh $HOSTNAME virt-install--name $USER-winvm --ram 168000 --vcpus=sockets=2,cores=24,threads=1 --import --disk path=$HOME/win20g.qcow2 --graphics vnc,password=$PASSWD,listen=0.0.0.0,port=5$UID --os-variant win10 --network default --check path_in_use=off

4 方案实践与测试

为检验所述2种解决方案的效果,本文在中南大学校级超算平台上进行了实际部署与测试。与实验相关的主要软硬件配置如下所示:操作系统:CentOS Linux release 7.5.1804;作业调度系统:SLURM 20.02.3;并行文件系统:Lustre 2.12.3;管理节点和登录节点硬件:2×Intel Xeon Gold 6248R CPU,192 GB内存,240 GB SSD硬盘;Wine版本:6.3;Libvirt版本:3.9.0。

4.1 应用启动测试

根据上述步骤描述,2种方案中用户都可以成功启用并运行Windows应用程序,效果如图3和图4所示。

Figure 3 Starting the Windows application based on Wine图3 基于Wine启动Windows应用程序

Figure 4 Starting the Windows VM based on the virtualization solution图4 基于虚拟化方案启动Windows虚拟机

4.2 应用运行性能测试

为检验上述2种运行Windows应用程序方案的计算性能,本文选择了基于OpenMP的多线程矩阵乘法算例进行测试。采用相同版本的编译器和参数将代码分别编译为Linux版本和Windows版本,编译软件均采用GCC 8.1.0,测试矩阵规模3600×3600,填充随机值。其中,Windows版本分别在Wine环境和KVM虚拟机环境下运行。测试结果如表2所示。

Table 2 Efficiency of OpenMP multi-threaded matrix multiplication running in different environments

从表2可以看出,应用程序基于Wine运行效率较高,与纯Linux环境下几乎没有差别;而基于KVM虚拟机的运行性能损失较大,效率约为纯Linux环境和Wine的1/4。因此,对于运行环境复杂度不高的Windows应用,可以优先采用基于Wine的方案;对于复杂的Windows应用,在综合考量运行稳定性和效率的情况下,可以采用基于虚拟机的方案。

5 结束语

本文就Linux超算系统中构建Windows应用程序运行环境的方案进行了探究,针对主流超算系统中无法便捷管理和运行Windows应用程序这一问题,探索了基于Wine和虚拟机技术2种解决方案,并对比了各自方案的优缺点。这2种解决方案相较于独立部署Windows计算节点或提供ECS云服务,均具有部署简单、管理方便和应用安全便捷等特点,同时兼容现有作业调度系统和计费系统。2种解决方案也在中南大学校级超算平台上得到了应用与实践,可供其他超算中心参考。在未来的工作中,如何提高基于Wine方案的稳定性以及降低基于虚拟机方案的性能损失,均有待进一步研究。

猜你喜欢
计算资源镜像虚拟化
基于模糊规划理论的云计算资源调度研究
镜像
改进快速稀疏算法的云计算资源负载均衡
基于OpenStack虚拟化网络管理平台的设计与实现
镜像
对基于Docker的虚拟化技术的几点探讨
基于Wi-Fi与Web的云计算资源调度算法研究
耦合分布式系统多任务动态调度算法
浅析虚拟化技术的安全保障
H3C CAS 云计算管理平台上虚拟化安全防护的实现