文章目录
前言
银河麒麟是基于linux发行版ubuntu开发的自主可控操作系统,为我国信息基础建设提供了重要支撑。截至目前,银河麒麟v10的软件仓库已经提供了大量国产软件,但在特定情况下,我们可能还是希望使用一些windows软件,本文介绍了如何在arm版本银河麒麟v10上安装windows位软件,用于技术交流,以备不时之需,但希望读者继续支持国产软件,支持自主可控软件生态。
虽然麒麟软件商城提供了crossover商业平台,可以安装部分windows软件,但是其版本较低,软件兼容性有限,本文介绍的方法主要思路与crossover类似,利用开源box64+wine64以及box86+wine分别实现arm版银河麒麟安装64位和32位windows软件,需要注意的是,该方案是在麒麟系统中实现了windows的调用库,与基于qemu的虚拟机完全不同,因此其运行性能远高于虚拟机。
这里只介绍box64+wine64的安装和配置方法,可以安装运行64位windows软件,box86+wine的安装方法与其类似,不再赘述,如有问题可以留言。
除了本文给的方案,wine还提供了开源项目hanover,给出了基于fex、qemue和box的异构平台方案,其中box方案实质上是把box64/box86作为库文件集成到wine,但不幸的是,本机测试无法运行,而qemue虚拟机方案性能较差,fex方案存在大量bug。
本文测试环境为arm版银河麒麟kylin-desktop-v10-sp1-general-release-2303-arm64,cpu为飞腾d2000。
警告:本安装过程可能替换系统运行库,操作不慎可能导致麒麟ukui桌面无法运行,请备份系统后谨慎操作
一、简介
2.1 wine/wine64
官网介绍:wine (“wine is not an emulator” 的首字母缩写)是一个能够在多种 posix-compliant 操作系统(诸如 linux,macos 及 bsd 等)上运行 windows 应用的兼容层。wine 不是像虚拟机或者模拟器一样模仿内部的 windows 逻辑,而是將 windows api 调用翻译成为动态的 posix 调用,免除了性能和其他一些行为的内存占用,让你能够干净地集合 windows 应用到你的桌面。
简单地说,就是wine在非windows系统上,实现了底层的windows的api,从而可以安装和运行windows应用。但是,wine并没有实现cpu架构的转换,也就是x86/x64架构的系统只能运行x86/x64架构的windows应用,而arm架构的系统只能运行arm架构的windows软件,因此我们需要box86/box64实现cpu架构的转换。
2.2 box86/box64
github项目介绍:box64 可以在非 x86_64 linux 系统(比如 arm64)上运行 x86_64 linux 程序(比如游戏),注意主机系统需要是 64 位小端。由于 box64 使用一些“系统”库的原生版本,如 libc、libm、sdl 和 opengl 等,因此很容易与大多数应用程序集成和使用,并且在许多情况下性能会相当不错。可以在这里查看一些性能测试的样例。
box64 集成了适用于 arm64 和 rv64 平台的 dynarec(动态重编译器),速度可以比纯解释模式快 5 到 10 倍。可以在这里找到有关 dynarec 工作原理的一些信息。
一些 x64 内部操作码使用 “realmode x86 emulator library” 的部分内容,有关版权详细信息,请参见 license。
二、配置运行环境
2.1 安装aarch64运行库
直接执行以下命令进行安装:
sudo apt-get install libasound2:arm64 libc6:arm64 libglib2.0-0:arm64 libgstreamer-plugins-base1.0-0:arm64 libgstreamer1.0-0:arm64 libldap-2.4-2:arm64 libpcap0.8:arm64 libvkd3d1:arm64 libx11-6:arm64 libxext6:arm64 libasound2-plugins:arm64 ocl-icd-libopencl1:arm64 libncurses6:arm64 libncurses5:arm64 libcap2-bin:arm64 libdbus-1-3:arm64 libfontconfig1:arm64 libfreetype6:arm64 libglu1-mesa:arm64 libglu1:arm64 libgnutls30:arm64 libgssapi-krb5-2:arm64 libkrb5-3:arm64 libodbc1:arm64 libosmesa6:arm64 libsdl2-2.0-0:arm64 libv4l-0:arm64 libxcomposite1:arm64 libxcursor1:arm64 libxfixes3:arm64 libxi6:arm64 libxinerama1:arm64 libxrandr2:arm64 libxrender1:arm64 libxxf86vm1 libc6:arm64
本机测试未出现依赖冲突。
2.2 安装armhf运行库
2.2.1 添加32位armhf架构支持
输入以下命令添加armhf架构:
sudo dpkg --add-architecture armhf
输入以下命令更新apt缓存:
sudo apt update
2.2.2 检查运行库依赖
输入以下命令查看运行库是否存在依赖冲突:
sudo apt-get install libasound2:armhf libc6:armhf libglib2.0-0:armhf libgstreamer-plugins-base1.0-0:armhf libgstreamer1.0-0:armhf libldap-2.4-2:armhf libpcap0.8:armhf libvkd3d1:armhf libx11-6:armhf libxext6:armhf libasound2-plugins:armhf ocl-icd-libopencl1:armhf libncurses6:armhf libncurses5:armhf libcap2-bin:armhf libdbus-1-3:armhf libfontconfig1:armhf libfreetype6:armhf libglu1-mesa:armhf libglu1:armhf libgnutls30:armhf libgssapi-krb5-2:armhf libkrb5-3:armhf libodbc1:armhf libosmesa6:armhf libsdl2-2.0-0:armhf libv4l-0:armhf libxcomposite1:armhf libxcursor1:armhf libxfixes3:armhf libxi6:armhf libxinerama1:armhf libxrandr2:armhf libxrender1:armhf libxxf86vm1 libc6:armhf
注意:这里没有列出libopenal1:armhf(用于跨平台声音输出)、libgphoto2-6:armhf、libgphoto2-port12:armhf、libsane1:armhf (用于图像扫描软件如扫描仪软件)、libudev1:armhf(与libsdl2库功能相同) libusb-1.0-0:armhf(usb直连,通常不需要)、libcups2(用于连接打印机),因为在本机测试可能会导致ukui冲突,无法进入桌面,这些库不安装可能导致相关应用无法运行
如果没有错误提示,那么恭喜你,基本后续安装不会出现什么问题,但是大部分情况下,运行库可能出现依赖冲突,下一节,以本机实测的安装过程为例,介绍如何进行解决。
2.2.3 解决依赖冲突
本机实测在执行2.2.2节所述安装命令时,出现以下提示:
提示很清楚, libfontconfig1:armhf和libglib2.0-0:armhf库存在依赖冲突。
对于libglib2.0-0:armhf,提示依赖: libmount1:armhf (>= 2.28) 但是它将不会被安装,输入以下命令看一下是哪个库导致libmount1:armhf无法安装:
sudo apt install libmount1:armhf
提示如下
输入以下命令查看libblkid1和libblkid1:armhf的版本:
apt policy libblkid1 libblkid1:armhf
提示如下:
这里可以发现,libblkid1:armhf无法安装的可能原因是,apt包管理器默认安装最新版本,并且与libblkid1一致,但libblkid1的最新版本是2.34-0.1kylin19k0.1,本机并未安装,且libblkid1:armhf没有对应的2.34-0.1kylin19k0.1版本,从而导致安装失败。
由于libblkid1:armhf可用的版本为2.34-0.1kylin18k0.2,与libblkid1当前已安装版本一致,因此直接指定libblkid1:armhf版本号进行安装:
sudo apt install -y libblkid1:armhf=2.34-0.1kylin18k0.2
类似的,首先输入以下命令查看libmount1和libmount1:armhf版本信息:
apt policy libmount1 libmount1:armhf
提示与libblkid1和libblkid1:armhf的版本类似,这里不再赘述,直接输入以下命令安装libmount1:armhf
sudo apt install -y libmount1:armhf=2.34-0.1kylin18k0.2
最后直接安装libglib2.0-0:armhf
sudo apt install -y libglib2.0-0:armhf
对于libfontconfig1:armhf,采用与上述相同的方法安装指定版本,如果还有其它冲突,请参考进行解决。
本机测试时,发现libopenal1:armhf(音频支持库)、libdbus-1-3:armhf(简单的进程间消息系统)、libasound2-plugins:armhf(蓝牙音频支持库)等运行库需要更新麒麟sdk库libkysdk-config:armhf和libkysdk-utils:armhf,但是出现以下错误,强制安装则导致系统崩溃,暂时未找到解决方案,因此本机未安装这几个库,可能导致特定windows软件无法运行。
2.2.4安装运行库
这里提供了一个安装脚本,会逐个安装麒麟官方源中提供的最高版本armhf运行库,使用sudo bash执行该脚本进行安装:
注意,如果某个运行库安装时,提示需要卸载ukui相关运行库或重要的系统库,请选择n不要安装,否则将导致无法进入ukui桌面或系统崩溃
#!/bin/bash
# 定义要安装的armhf包列表
armhf_packages=("libasound2:armhf" "libc6:armhf" "libglib2.0-0:armhf" "libgstreamer-plugins-base1.0-0:armhf" "libgstreamer1.0-0:armhf" "libldap-2.4-2:armhf" "libpcap0.8:armhf" "libvkd3d1:armhf" "libx11-6:armhf" "libxext6:armhf" "ocl-icd-libopencl1:armhf" "libncurses6:armhf" "libncurses5:armhf" "libcap2-bin:armhf" "libfontconfig1:armhf" "libfreetype6:armhf" "libglu1-mesa:armhf" "libglu1:armhf" "libgnutls30:armhf" "libgssapi-krb5-2:armhf" "libkrb5-3:armhf" "libodbc1:armhf" "libosmesa6:armhf" "libsdl2-2.0-0:armhf" "libv4l-0:armhf" "libxcomposite1:armhf" "libxcursor1:armhf" "libxfixes3:armhf" "libxi6:armhf" "libxinerama1:armhf" "libxrandr2:armhf" "libxrender1:armhf" "libxxf86vm1") # 省略其他包以简化示例
# 函数:查询并返回armhf包的最新版本
get_armhf_version() {
local pkg="$1"
local version=$(apt-cache madison "$pkg" | tail -n 1 | awk '{print $3}')
echo "$version"
}
# 函数:尝试安装特定版本的armhf包
attempt_install() {
local pkg="$1"
local version="$2"
sudo apt-get install "$pkg"="$version" && {
echo "successfully installed $pkg version $version"
return 0
} || {
echo "failed to install $pkg version $version"
return 1
}
}
# 遍历armhf包列表,并尝试安装对应版本的armhf包
for pkg in "${armhf_packages[@]}"; do
# 获取arm64包名(去掉:armhf)
arm64_pkg="${pkg%:armhf}"
echo "processing" $arm64_pkg
# 检查arm64包是否已安装
if dpkg -s "$arm64_pkg" &> /dev/null; then
# 获取arm64包的版本号
arm64_version=$(dpkg -s "$arm64_pkg" | grep '^version:' | awk '{print $2}')
echo "arm64 version is" $arm64_version
fi
# 检查armhf包是否已安装
if ! dpkg -s "$pkg" &> /dev/null; then
# 如果不存在,尝试找到可用的armhf包版本
armhf_versions=$(apt-cache madison "$pkg" | awk '{print $3}')
if [[ -n "$armhf_versions" ]]; then
# 从最高版本开始尝试安装
for armhf_version in $armhf_versions; do
if attempt_install "$pkg" "$armhf_version"; then
break # 安装成功,跳出循环
fi
done
if [[ -z "$armhf_version" ]]; then
echo "no suitable version of $pkg found for armhf"
fi
else
echo "no versions of $pkg available for armhf"
fi
else
armhf_version=$(dpkg -s "$pkg" | grep '^version:' | awk '{print $2}')
echo "armhf version is" $armhf_version
fi
done
三、安装box64
输入以下命令安装最新版的box64,也可以通过源码编译安装:
sudo wget https://cdn05042023.gitlink.org.cn/shenmo7192/box64-debs/raw/branch/master/box64-cn.list -o /etc/apt/sources.list.d/box64.list
wget -qo- https://cdn05042023.gitlink.org.cn/shenmo7192/box64-debs/raw/branch/master/key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/box64-debs-archive-keyring.gpg
sudo apt update
sudo apt install box64 -y
这里也提供32位的box86安装方法,如有需要可以输入以下命令安装最新版的box86,也可以通过源码编译安装:
sudo wget https://itai-nelken.github.io/weekly-box86-debs/debian/box86.list -o /etc/apt/sources.list.d/box86.list
wget -qo- https://itai-nelken.github.io/weekly-box86-debs/debian/key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/box86-debs-archive-keyring.gpg
sudo apt update && sudo apt install box86 -y
如果无法添加源,也可以直接在下载页面下载最新的.deb安装包,然后通过dpkg -i安装。
四、安装wine
注意:这里需要安装x64版本的wine64和x86版本的wine,不能安装arm版本的wine64,arm版的wine64只能安装arm版的windows软件
将以下shell脚本保存至本地,根据需要修改branch分支信息和version版本信息,然后sudo bash执行以下shell脚本安装wine64:
# note: can only run on aarch64 (since box64 can only run on aarch64)
# box64 runs wine-amd64, box86 runs wine-i386.
### user-defined wine version variables ################
# - replace the variables below with your system's info.
# - note that we need the amd64 version for box64 even though we're installing it on our arm processor.
# - note that we need the i386 version for box86 even though we're installing it on our arm processor.
# - wine download links from winehq: https://dl.winehq.org/wine-builds/
branch="staging" #example: devel, staging, or stable (wine-staging 4.5+ requires libfaudio0:i386)
version="9.7" #example: "7.1"
id="ubuntu" #example: debian, ubuntu
dist="focal" #example (for debian): bullseye, buster, jessie, wheezy, ${version_codename}, etc
tag="-1" #example: -1 (some wine .deb files have -1 tag on the end and some don't)
########################################################
# clean up any old wine instances
wineserver -k # stop any old wine installations from running
rm -rf ~/.cache/wine # remove any old wine-mono/wine-gecko install files
rm -rf ~/.local/share/applications/wine # remove any old program shortcuts
# backup any old wine installs
rm -rf ~/wine-old 2>/dev/null; mv ~/wine ~/wine-old 2>/dev/null
rm -rf ~/.wine-old 2>/dev/null; mv ~/.wine ~/.wine-old 2>/dev/null
sudo mv /usr/local/bin/wine /usr/local/bin/wine-old 2>/dev/null
sudo mv /usr/local/bin/wine64 /usr/local/bin/wine-old 2>/dev/null
sudo mv /usr/local/bin/wineboot /usr/local/bin/wineboot-old 2>/dev/null
sudo mv /usr/local/bin/winecfg /usr/local/bin/winecfg-old 2>/dev/null
sudo mv /usr/local/bin/wineserver /usr/local/bin/wineserver-old 2>/dev/null
# wine download links from winehq: https://dl.winehq.org/wine-builds/
# lnka="https://dl.winehq.org/wine-builds/${id}/dists/${dist}/main/binary-amd64/" #amd64-wine links
lnka="https://mirrors.tuna.tsinghua.edu.cn/wine-builds/${id}/dists/${dist}/main/binary-amd64/" #amd64-wine links
deb_a1="wine-${branch}-amd64_${version}~${dist}${tag}_amd64.deb" #wine64 main bin
deb_a2="wine-${branch}_${version}~${dist}${tag}_amd64.deb" #wine64 support files (required for wine64 / can work alongside wine_i386 main bin)
#deb_a3="winehq-${branch}_${version}~${dist}${tag}_amd64.deb" #shortcuts & docs
# lnkb="https://dl.winehq.org/wine-builds/${id}/dists/${dist}/main/binary-i386/" #i386-wine links
lnkb="https://mirrors.tuna.tsinghua.edu.cn/wine-builds/${id}/dists/${dist}/main/binary-i386/" #i386-wine links
deb_b1="wine-${branch}-i386_${version}~${dist}${tag}_i386.deb" #wine_i386 main bin
deb_b2="wine-${branch}_${version}~${dist}${tag}_i386.deb" #wine_i386 support files (required for wine_i386 if no wine64 / conflicts with wine64 support files)
#deb_b3="winehq-${branch}_${version}~${dist}${tag}_i386.deb" #shortcuts & docs
# install amd64-wine (64-bit) alongside i386-wine (32-bit)
echo -e "downloading wine . . ."
wget -q ${lnka}${deb_a1}
#echo ${lnka}${deb_a1}
wget -q ${lnka}${deb_a2}
wget -q ${lnkb}${deb_b1}
#wget -q ${lnkb}${deb_b2} # 32-bits wine
echo -e "extracting wine . . ."
dpkg-deb -x ${deb_a1} wine-installer
dpkg-deb -x ${deb_a2} wine-installer
dpkg-deb -x ${deb_b1} wine-installer
#dpkg-deb -x ${deb_b2} wine-installer # 32-bits wine
echo -e "installing wine . . ."
mv wine-installer/opt/wine* /home/${sudo_user}/wine
安装完成后,执行以下命令创建软链接并添加执行权限:
# install symlinks
sudo ln -s ~/wine/bin/wine /usr/local/bin/wine
sudo ln -s ~/wine/bin/wine64 /usr/local/bin/wine64
sudo ln -s ~/wine/bin/wineboot /usr/local/bin/wineboot
sudo ln -s ~/wine/bin/winecfg /usr/local/bin/winecfg
sudo ln -s ~/wine/bin/wineserver /usr/local/bin/wineserver
sudo chmod +x /usr/local/bin/wine /usr/local/bin/wine64 /usr/local/bin/wineboot /usr/local/bin/winecfg /usr/local/bin/wineserver
五、初始化wine配置
执行以下命令对wine进行初始化,可能出现一些错误提示,会影响特定windows软件运行,暂时不用理会:
wine64 wineboot
将自动在当前用户根目录下创建.wine文件夹,里面存放了运行windows系统必备的库文件。
安装过程中,终端窗口会有错误提示,暂时不用理会。wine mono安装器会有以下提示,需要安装.net运行库,安装时间较长,如果不需要安装基于.net架构的windows软件,可以点击取消,后续需要的时候再安装。
运行完成之后,打开~/.wine/drive_c目录,我们可以找到熟悉的windows系统文件夹,包含了运行windows应用所必须的库文件。
将64位windows应用的安装包上传到银河麒麟系统,然后可以通过以下命令直接安装windwos应用,将${pathtoyourprogramname}改为windows安装包的路径:
wine64 ${pathtoyourprogramname}
这里只测试了常用的压缩软件7z,其它软件大家可以根据需要进行测试,由于部分运行库尚未安装,可能出现一些运行问题。
这里选择安装目录为c:\program files\,也可以选择其它安装位置,安装完成后,进入~/.wine/drive_c/‘program files’/目录下,可以看到7-zip已经安装好了。
输入以下命令即可启动7-zip程序:
wine64 7zfm.exe
应用窗口启动了,但是出现了乱码,这是由于缺少中文字体导致的,参考,直接复制windows 系统c:/windows/fonts 目录到 ~/.wine/drive_c/windows/fonts ,然后重新启动应用即可解决。
总结
本文介绍了基于box64和wine64实现在国产arm版本银河麒麟系统上安装64位windows应用,如果需要安装32位应用,其安装过程类似,只需将第三节更改为安装box86,将第四节脚本关于wine64的部分注释掉,更改为下载和安装deb_b1和deb_b2即可。
由于不可描述的原因,也测试了xx版的银河麒麟,但是存在大量依赖冲突,无法安装,尝试了添加ubuntu源,box64+wine64安装成功,但是ukui界面无法使用,无奈安装了slim和xfce桌面,使用上是没问题,但是ukui是用不了了,如有需要,可以留言交流安装方法。
在撰写本文之前,查阅了大量前辈的文章,但是截止目前,还没有找到完整的arm版银河麒麟运行windows软件的文章,因为不可描述的原因,无奈下定决心解决这一问题,前前后后大概用了半个月的时间,总算有所收获。其实主要问题在于银河麒麟官方源的运行库存在大量冲突,稍有不慎,就可能导致ukui无法运行,原生的arm版ubuntu基本不存在依赖冲突,可以直接安装。
发表评论