Wine编译环境搭建及使用完整流程详细笔记
- 1. 背景及资源文件下载
- 1.1 背景说明(实现目标)
- 1.2 VMWare下载地址:
- 1.3 Debian安装文件地址
- 1.34 Ubuntu安装文件地址
- 1.5 Wine源码下载地址
- 1.5.1 Web下载地址
- 1.5.2 Git下载地址
- 2. 常用文档
- 2.1 Wine Document
- 2.2 Build Wine Document
- 3. 清华源配置Apt 包镜像库
- 4. 安装必要资源包
- 5. 用debootstrap做环境隔离(可选)
- 6. 安装docker做环境隔离(可选)
- 6.1 卸载旧版docker
- 6.2 允许apt使用https
- 6.3 下载Docker官方GPG密钥
- 6.4 添加安装源
- 6.4.1 先确认系统版本信息
- 6.4.2 确认处理器和软件的架构信息
- 6.4.3 编辑apt配置源的文件
- 6.5 用apt安装docker
- 6.6 docker下安装debian10系统
- 6.7 docker下载过慢或卡住问题解决
- 6.7.1 新建一个docker目录:
- 6.7.2 添加配置文件到docker目录
- 6.7.3 将镜像和docker重启
- 6.8 启动docker下的容器debian
- 6.9 带界面的docker容器
- 6.10 容器与宿主机文件传输
- 6.11 docker使用必备需知
- 6.11.1 查看已创建的容器列表
- 6.11.2 启动一个已存在容器
- 6.11.3 进入一个已启动的容器
- 6.11.4 删除一个已创建的容器
- 7. 磁盘空间扩展
- 8. 编译wine源码(32和64位兼容)
- 8.1 添加32位架构的支持
- 8.2 安装编译所需的依赖包
- 8.3 获取wine编译为WoW64
- 8.3.1 编译64位wine
- 8.3.2 编译32位wine
- 9. 使用编译好的wine
- 9.1 在容器系统中安装wine
- 9.2 在容器系统中运行winecfg
- 9.2 在容器系统中运行winetricks(可选)
- 9.3 通过wine运行一个exe应用程序
1. 背景及资源文件下载
1.1 背景说明(实现目标)
本教程记录的是基于i7CPU的MacBookPro电脑、为了不影响mac系统环境、安装Vmware虚拟机、Vmware上安装的是debian12的系统、基于debian12系统安装了docker、docker容器安装debian10、基于debian10配置编译环境进行编译和测试、可跳跃查看。
1.2 VMWare下载地址:
Linux/Windows:https://www.vmware.com/products/workstation-pro.html
MacOS:https://www.vmware.com/products/fusion.html
1.3 Debian安装文件地址
选择安装64位的系统
https:/www.debian.org/download
1.34 Ubuntu安装文件地址
https://cn.ubuntu.com/download/desktop
如果是Mac M1 M2芯片可以用Ubuntu
1.5 Wine源码下载地址
1.5.1 Web下载地址
https://www.winehq.org/
1.5.2 Git下载地址
https://gitlab.winehq.org/wine/wine
2. 常用文档
2.1 Wine Document
https://www.winehq.org/documentation
2.2 Build Wine Document
https://wiki.winehq.org/Building_Wine#Satisfying_Build_Dependencies
3. 清华源配置Apt 包镜像库
debian和ubuntu的地址:
https://mirrors.tuna.tsinghua.edu.cn/help/debian/
https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
将下面文件备份后, 上边的deb全部copy到该文件中
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
vi sources.list
sudo cp ./sources.list /etc/apt/sources.list
更新apt镜像列表
sudo apt-get update
sudo apt-get upgrade
4. 安装必要资源包
为了使用vmware共享剪切板,先将这两个安装后重启虚拟机
sudo apt install open-vm-tools
sudo apt install open-vm-tools-desktop
5. 用debootstrap做环境隔离(可选)
debootstrap是一套基本的系统(根文件系统)。生成的目录符合Linux文件系统标准(FHS),即包含了/boot、/etc、/bin、/usr等等目录,但它比发行版本的Linux体积小很多
安装debootstrap
sudo apt-get install debootstrap
sudo debootstrap --arch amd64 bullseye ~/arch/debian https://mirrors.tuna.tsinghua.edu.cn/debian/
sudo debootstrap --variant=buildd --arch amd64 bullseye ~/arch/debian https://mirrors.tuna.tsinghua.edu.cn/debian/
安装成功后,进入目录切换环境
cd arche/debian
sudo chroot .
有时中文会有问题、以英文环境运行某些命令
sudo env LANGUAGE=en
6. 安装docker做环境隔离(可选)
6.1 卸载旧版docker
不确定是否已经安装过,必须先尝试卸载旧版
sudo apt-get remove docker docker-engine docker.io containerd runc
6.2 允许apt使用https
apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
6.3 下载Docker官方GPG密钥
先安装curl再用curl下载
sudo apt-get install curl
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
6.4 添加安装源
6.4.1 先确认系统版本信息
cat /etc/os-release
可以看到code name:bullseye
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
也可以通过lsb-release -a命令来查看
6.4.2 确认处理器和软件的架构信息
uname -a
如果下列i686或者i386, 就说明是32位系统,下边的步骤不用看了,你可以考虑用vmware,选择64位架构重新安装系统,也可以找其它的32位安装的方式、如果是Mac M1/M2的芯片、需要安装Arm版本、本文不做介绍;
Linux debian 5.10.0-23-686-pae #1 SMP Debian 5.10.179-1 (2023-05-12) i686 GNU/Linux
如果是x86_64(amd64)的系统,恭喜你,一切安装流程将更加顺利
6.4.3 编辑apt配置源的文件
编辑sudo vi /etc/apt/sources.list文件,最后一行添加阿里云的镜像,其中的arch是cpu架构,sign-by是6.3节下载的密钥路径
deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian/ bullseye stable
添加完成后,执行更新命令
sudo apt-get update
显示结果如下:
获取:1 https://mirrors.tuna.tsinghua.edu.cn/debian bookworm InRelease [147 kB]
获取:2 https://mirrors.tuna.tsinghua.edu.cn/debian bookworm-updates InRelease [52.1 kB]
获取:3 https://mirrors.tuna.tsinghua.edu.cn/debian bookworm-backports InRelease [49.7 kB]
获取:4 https://mirrors.tuna.tsinghua.edu.cn/debian bookworm/main amd64 Packages [8,904 kB]
命中:5 https://security.debian.org/debian-security bookworm-security InRelease
6.5 用apt安装docker
apt install docker-ce docker-ce-cli containerd.io
6.6 docker下安装debian10系统
搜索docker下的debian镜像
sudo docker search debian
下载debian10的镜像文件
sudo docker pull debian:10
6.7 docker下载过慢或卡住问题解决
docker下安装debian10系统如果在国内可能会出现下载过慢或卡住不动的情况,这时我们可以替换阿里的镜像
6.7.1 新建一个docker目录:
sudo mkdir -p /etc/docker
6.7.2 添加配置文件到docker目录
在这个目录里daemon.json文件配置一个阿里云的镜像加速地址:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://mjpmak3l.mirror.aliyuncs.com"]
}
EOF
6.7.3 将镜像和docker重启
sudo systemctl daemon-reload
sudo systemctl restart docker
重启后可以用docker pull尝试再次下载, 就可以成功了
6.8 启动docker下的容器debian
启动镜像文件debian:10,会得到容器编号
sudo docker run -itd debian:10 /bin/bash
查看debian10在容器中的情况
sudo docker ps
使用attach命令进入容器(也可以使用ssh、nsenter、exec)
sudo docker attach ada5094c89419e344b727d7d053fc9bd384a10265b0fc0e12008ed25281dc368
下边是运行效果截图、可以看到我们进入容器后系统的版本信息
退出容器可以用 exit 命令
但是这样做并不是我们想要的,因为当电脑重启后,容器中的配置和内容会全部丢失,因些我们需要创建与宿主机关系的卷,来达到宿主机重启后保留容器内的数据和配置
首先我在宿主机创建了docker_debian10,在容器debian10中创建了project目录,用如下方式启动使之关联:
docker run -itd -v /home/xuanwenchao/docker_debian10:/project debian:10 /bin/bash
然后再次进入容器中的debian10系统
6.9 带界面的docker容器
docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/xuanwenchao/docker_debian10:/project debian:10 /bin/bash
解释说明:
-it:以交互式模式运行容器并分配一个终端。
–rm:容器退出后自动删除容器。(这里不添加这个参数)
-e DISPLAY=$DISPLAY:将宿主机的 DISPLAY 环境变量传递给容器,用于 X11 转发。
-v /tmp/.X11-unix:/tmp/.X11-unix:将宿主机的 X11 服务器套接字目录映射到容器内的相同路径,以便容器可以显示图形界面。
-v /home/xuanwenchao/docker_debian10:/project:将宿主机的 /home/xuanwenchao/docker_debian10 目录映射到容器内的 /project 目录,以便容器可以访问该目录下的文件。
debian:10:使用 debian:10 镜像。
/bin/bash:在容器内执行 Bash 终端。
为容器安装必要的X11服务器工具包
apt update
apt install -y xauth x11-apps
apt install -y x11-xserver-utils
export DISPLAY=:0
xhost +local:root
解释说明:
xauth 是 X Window System 的授权机制,用于控制 X 服务器和客户端之间的身份验证和授权。它通过生成和管理授权数据来确保安全访问 X 服务器。
x11-apps 是一个包含多个 X11 应用程序的软件包。这些应用程序提供了一些基本的图形界面工具和实用程序,如终端模拟器、时钟、绘图工具等,用于在 X Window System 环境中进行交互和操作。
安装 xauth 和 x11-apps 可以提供必要的工具和支持,使得在 X Window System 下的图形界面环境中能够正常运行和交互。这些工具对于需要使用图形界面的应用程序或执行一些与 X11 相关的操作非常有用。
xhost +local:root 是一个 X Window System 的命令,用于允许本地 root 用户通过 X 协议访问 X 服务器。通过执行这个命令,X 服务器会将本地 root 用户添加到访问控制列表(Access Control List,简称 ACL),从而允许其连接和显示图形界面。
安装成功后,在容器内执行如下命令、可以测试一下
xeyes
看到如下效果就是成功了
6.10 容器与宿主机文件传输
为容器debian10制作新的sources.list文件,并将文件copy到容器的debian系统中
sudo docker cp ./sources.list ada5094c89419e344b727d7d053fc9bd384a10265b0fc0e12008ed25281dc368:/etc/apt/sources.list
结果显示如下
Successfully copied 2.56kB to ada5094c89419e344b727d7d053fc9bd384a10265b0fc0e12008ed25281dc368:/etc/apt/sources.list
6.11 docker使用必备需知
docker容器第一次启动成功后,这个容器就创建好了,不需要每次重新创建一个新的容器
6.11.1 查看已创建的容器列表
docker ps -a
6.11.2 启动一个已存在容器
docker start <CONTAINER_ID>
6.11.3 进入一个已启动的容器
sudo docker attach <CONTAINER_ID>
6.11.4 删除一个已创建的容器
sudo docker rm <CONTAINER_ID>
7. 磁盘空间扩展
在编译之前一定要提前确认是否有足够的磁盘空间, 如果可用空间少于5G最好提前做好扩展,虚拟机默认分配20G,如果编译过程中发现空间不足很尴尬,会导致系统启动出错、就像下图这样:
如果想要不丢失数据扩展vmware/debian12的磁盘空间,首先要在vmware中操作,我将原来的20G扩大到35G
但是扩展之后,启动debian12系统、你依然可以看到可用空间没有变化
使用sudo fdisk -l 命令查看当前状态
sudo fdisk -l
可以看到空间没有变化、有一行红色的提示语、意思是说: GPT(GUID 分区表)中的 PMBR(Protective MBR)大小不匹配。PMBR 是用来保护 GPT 的主引导记录(Master Boot Record),以防止意外修改或破坏分区表,说白了,就是后来增加的空间没有被用上。
输入sudo fdisk
sudo fdisk
进入fdisk的命令行模式,输入m显示帮助菜单
输入p查看当前的分区表、当前有三个分区sda1、sda2、sda3
为了不影响现有系统中的数据、只能创建一个新的分区、输入n ,前边有三个分区、新的分区编号用4、然后需要告诉起动和结束的sector位置、如果想全部空间都用上就直接回车就可以了、创建完成后再次输入p 可以看到分区有四个了、输入w保存分区退出。
接下来对新创建的分区进行格式化
接下来走一波操作就可以成功了;
在设备 /dev/sda4 上创建物理卷(Physical Volume)。
sudo pvcreate /dev/sda4
将 /dev/sda4 分区添加到逻辑卷组 debian-vg 中:
sudo vgextend debian-vg /dev/sda4
扩展 debian-vg 卷组中的逻辑卷 root,以利用新添加的分区空间:
sudo lvextend -r -l +100%FREE /dev/debian-vg/root
下边的运行的效果图
再次查看可用空间、可以看到扩展成功了
8. 编译wine源码(32和64位兼容)
8.1 添加32位架构的支持
因为当前是64位系统、首先添加对32位架构的支持,注意如果容器中只有一个root用户,不用添加sudo
sudo dpkg --add-architecture i386
sudo apt update
运行效果如下:
8.2 安装编译所需的依赖包
按官方文档给出的信息:https://wiki.winehq.org/Building_Wine
执行批量安装命令
sudo apt install flex bison gcc make gcc-mingw-w64 libasound2-dev libpulse-dev libdbus-1-dev libfontconfig1-dev libfreetype6-dev libgnutls28-dev libjpeg62-turbo-dev libpng-dev libtiff-dev libunwind-dev libx11-dev libxml2-dev libxslt1-dev libfaudio-dev libgstreamer1.0-dev libmpg123-dev libosmesa6-dev libudev-dev libvkd3d-dev libvulkan-dev libcapi20-dev liblcms2-dev libcups2-dev libgphoto2-dev libsane-dev libgsm1-dev libkrb5-dev libldap2-dev ocl-icd-opencl-dev libpcap-dev libusb-1.0-0-dev libv4l-dev libopenal-dev libjxr-dev libasound2-dev:i386 libpulse-dev:i386 libdbus-1-dev:i386 libfontconfig1-dev:i386 libfreetype6-dev:i386 libgnutls28-dev:i386 libjpeg62-turbo-dev:i386 libpng-dev:i386 libtiff-dev:i386 libunwind-dev:i386 libx11-dev:i386 libxml2-dev:i386 libxslt1-dev:i386 libfaudio-dev:i386 libgstreamer1.0-dev:i386 libgstreamer-plugins-base1.0-dev:i386 libmpg123-dev:i386 libosmesa6-dev:i386 libsdl2-dev:i386 libudev-dev:i386 libvkd3d-dev:i386 libvulkan-dev:i386 libcapi20-dev:i386 liblcms2-dev:i386 libcups2-dev:i386 libgphoto2-dev:i386 libsane-dev:i386 libgsm1-dev:i386 libkrb5-dev:i386 libldap2-dev:i386 ocl-icd-opencl-dev:i386 libpcap-dev:i386 libusb-1.0-0-dev:i386 libv4l-dev:i386 libopenal-dev:i386 libjxr-dev:i386
然后就等待安装完成
8.3 获取wine编译为WoW64
WoW64(Windows 32-bit on Windows 64-bit)是一种Windows操作系统的子系统,它允许在64位版本的Windows操作系统上运行32位的应用程序和系统组件。它为兼容性目的而设计,以确保32位的应用程序能够在64位的Windows操作系统上正常运行。
创建两个新的目录,分别是win32和win64,安装git获取代码,将wine完整的代码分别copy一份到新目录中
apt install git
git clone https://gitlab.winehq.org/wine/wine
mkdir win64
mkdir win32
cp -a ./wine ./win64
cp -a ./wine ./win32
8.3.1 编译64位wine
因为64位所需的依赖包与32位是不一样的,因此每次编译不同架构版本之前,需要重新安装依赖包
同时将不需要依赖包删除掉
cd win64/wine
apt install libgstreamer-plugins-base1.0-dev libsdl2-dev
apt autoremove
执行configure查看结果是否有错误
./configure --enable-win64
如果执行configure没有错误、就可以make了,为了提高编译速度,编译前可以使用lscp命令确认CPU的核心数量
lscpu
如果Cpu(s)显示数量为1则说明只有一个内核,如果硬件是多核的,这个值可以用vmware来自行分配
如果是多核可以使用 make -jN 命令提高编译速度
make -j2
8.3.2 编译32位wine
查询本机架构:
dpkg --print-architecture
amd64
打开本机多架构支持:
dpkg --print-foreign-architectures
i386
添加i386架构并更新:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get upgrade
apt-get install gcc-multilib g++-multilib
因为64位所需的依赖包与32位是不一样的,因此每次编译不同架构版本之前,需要重新安装依赖包
同时将不需要依赖包删除掉
cd ../../win32/wine
apt install libgstreamer-plugins-base1.0-dev:i386 libsdl2-dev:i386
apt autoremove
编译32位版本wine时通过–with-wine64参数,指定了已编译完成的wine64位的目录,这样编译32位wine时,程序会注入64位版本处理32位程序所需的库, 如果不需要64位的,就不加任何参数就可以,执行configure查看结果是否有错误
./configure --with-wine64=/project/win64/wine
执行make编译32位wine,需要一点时间…
make -j2
9. 使用编译好的wine
9.1 在容器系统中安装wine
在win32/wine目录下执行安装命令、再到win64/wine下执行安装命令
make install
cd ../../win64/wine
make install
9.2 在容器系统中运行winecfg
安装完成后首选需要执行winecfg来配置环境
winecfg
配置会先在容器系统中安装Mono
Mono 是一个开源的实现了 Microsoft .NET Framework 的跨平台框架。在 Wine 中,可以使用 Mono 来运行和支持基于 .NET 的应用程序。
执行 winecfg MONO 命令会打开一个专门用于配置 Mono 的窗口。
如果未检测到wine-gecko还会继续安装,容器中已经包含了,所以不需要安装了,
安装界面关闭重新回到命令行状态,再次输入winecfg 会出现Wine configuration配置界面。
配置Windows版本:在 “Applications” 选项卡中,选择合适的Windows版本,以匹配你要运行的应用程序的要求。
配置图形选项:在 “Graphics” 选项卡中,根据你的系统和需求,调整图形设置。你可以选择启用或禁用桌面集成、允许窗口管理器控制窗口和启用虚拟桌面等选项。
配置音频选项:在 “Audio” 选项卡中,选择合适的音频驱动程序,以确保应用程序在 Wine 环境中正确地播放声音。
配置库文件:在 “Libraries” 选项卡中,你可以添加或修改特定的库文件设置,以解决应用程序在 Wine 中的依赖关系或兼容性问题。例如,你可以添加某些 DLL 文件来模拟 Windows 环境中缺失的库。
配置外观和行为:在 “Desktop Integration” 和 “Staging” 选项卡中,你可以根据个人偏好进行设置,以改变 Wine 窗口的外观、行为和性能。
也可以先用默认的什么都不配置。
9.2 在容器系统中运行winetricks(可选)
首先通过apt安装winetricks然后再运行
apt-get install winetricks
winetricks
Winetricks并不是必须执行的步骤,但它是一个非常有用的工具,可以帮助你安装和配置一些常见的 Windows 组件、运行库和其他必要的依赖项,以提高在 Wine 环境下运行 Windows 程序的兼容性和性能。
使用 Winetricks,你可以轻松地安装和配置诸如 DirectX、.NET Framework、Visual C++ 运行库等常见的 Windows 组件。这些组件对于许多 Windows 程序的正确运行是必要的。
有明确目标需要时、可以通过winetricks来尝试解决。
9.3 通过wine运行一个exe应用程序
我下载了一个Notepad++的exe应用程序,我们先尝试一下运行:
root@e47effab5c82:/project# wine Notepad++_12_10031411.exe
可以看到如下错误信息:
008c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
008c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
008c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
008c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
0024:err:winediag:ntlm_check_version ntlm_auth was not found. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
0024:err:ntlm:ntlm_LsaApInitializePackage no NTLM support, expect problems
0110:fixme:ver:GetCurrentPackageId (0350FEF0 00000000): stub
0024:fixme:richedit:editor_handle_message EM_SETLANGOPTIONS: stub
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 130 (MIT-SHM)
Minor opcode of failed request: 3 (X_ShmPutImage)
Value in failed request: 0x2de
Serial number of failed request: 276
Current serial number in output stream: 284
因为缺少NTLM的支持、所以无法启动
Debian 系统中,你可以运行以下命令安装 winbind 软件包,该软件包通常提供了 ntlm_auth 工具:
apt install winbind
安装成功后再次尝试启动exe
wine Notepad++_12_10031411.exe
可以看到安装向导界面已经出现了
exe应用程序已经成功启动了。