如果要在Linux系統跑Windows程式,只要能拿到exe,就有機率能透過"Wine"轉譯技術執行。
它能夠把Windows應用程式變成有如原生Linux程式一樣,讓使用者以接近原生的效能,操作Windows上的軟體。
圖例:Linux系統執行Windows版的WinRAR
本文Ivon詳細介紹Linux系統使用Wine跑Windows軟體的方法。首先簡介Wine的由來,再介紹Wine指令用法,最後附上一些額外的Wine輔助工具。
1. Wine是什麼#
Wine (WineHQ,紅酒) 是從1993年發展至今的exe轉譯軟體,它將Windows exe的指令即時轉譯成Linux的系統呼叫,連3D繪圖指令都一併轉譯,讓使用者能夠在類Unix系統(Linux、FreeBSD、macOS)執行Windows程式。
Wine為自由開源軟體。名字原本為"Wine Is Not an Emulator"的縮寫,代表它不是虛擬機也不是模擬器,而是轉譯器,性能損失很小。
在Wine的加持下,諸如Microsoft Office 2016、Adobe Photoshop CC 2021、Adobe AutoCAD、俠盜獵車手V等程式,都能用Wine在Linux執行,甚至有人回報說Linux跑遊戲比Windows還順暢。
Wine具體能執行的Windows程式有哪些呢?建議到 WineDB和 ProtonDB看看,裡面有收錄各個Windows軟體的運作狀況,還有安裝前的小撇步。
Steam Deck也有採用Wine的技術,叫做Proton。因此有上Steam的Windows遊戲用 Linux版Steam客戶端會更容易啟動,這些遊戲已經由許多Linux系統與Steam Deck玩家測試過了。
除了官方版的WineHQ以外,Wine還有很多分支(fork),例如Steam Proton就是專為遊戲優化的,還有外國玩家維護的GE-Proton、中國人維護的Deepin-Wine等版本。本文使用的是官方版Wine。
2. 給Linux Wine新手的忠告#
這邊我列出三點最重要的事情,免得使用者對Wine有錯誤的期待。
Wine並非萬能#
因為Windows API黑箱的特性,軟體能不能運作要看運氣。
Wine不是虛擬機軟體,無法模擬Windows系統的全部功能,別妄想任何軟體都能用Wine解決。
如果你的軟體需要用到外接硬體設備,得安裝驅動程式,那麼高機率跑不起來,比如繪圖板、印表機。此外需要虛擬化、CUDA、Windows Store的UWP軟體也不行用Wine跑。
需要完整Windows環境又不想安裝雙系統的,請考慮安裝 Windows QEMU/KVM虛擬機
或者尋找Linux系統上同類軟體替代品: Linux電腦必裝軟體
Wine照樣有中毒風險#
甭多說了。Windows指令一翻譯成Linux,勒索病毒照樣可以加密你硬碟的檔案。
這不是說Linux不安全,而是Windows程式的指令經由Wine翻譯成Linux之後就跟系統原生程式沒什麼兩樣了,要搞破壞照樣攔不住。
請不要從來路不明的網站下載exe。
請優先嘗試圖形化界面#
Wine預設是要用指令操作的,這篇文章會使用大量Wine的指令。儘管對Linux用戶來說打指令並非難事,不過如果只是想簡單裝個exe軟體,用別人開發好的圖形前端操作會更簡單,他們可以大大簡化Wine安裝軟體的痛楚。
通用exe我會使用 Bottles for Linux
裝遊戲的話可以用 Steam Proton或 Lutris
3. 如何安裝Wine#
你需要一台x86架構的Linux電腦。因為大部分Windows exe都是x86 (32位元) 或x64 (64位元) 架構的,Wine目前僅支援x86架構的Linux系統。ARM架構的Linux系統(如Raspberry Pi開發板)支援狀況不佳,且會涉及到異構計算的問題。
這裡我提供二種Wine的安裝方式,擇一安裝。
原生套件版#
Ubuntu、Debian、Arch Linux、Manjaro、Fedora、Gentoo、openSUSE等常見的發行版都有收錄Wine套件。
以Ubuntu系統為例,雖然官方套件庫有收Wine套件,但是版本陳舊。 Wine官方文件建議加開發者的套件庫,取得最新版Wine。
給AMD64架構的Ubuntu系統啟用i386支援
sudo dpkg --add-architecture i386
- 新增WineHQ的套件庫
# 取得WineHQ的金鑰
sudo mkdir -pm755 /etc/apt/keyrings
sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
# 加入WineHQ套件庫。注意os變數後面的版本代號,Ubuntu 24.04是為noble
os=noble
sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/$os/winehq-$os.sources
# 更新套件庫
sudo apt update
- 接著安裝穩定版的Wine。
sudo apt install --install-recommends winehq-stable
Flatpak版#
Flatpak版可以透過容器機制,將Wine與主系統隔離。因為Flatpak跨發行版,比較不會遇到系統套件依賴不全的問題。
Flatpak版的Wine內建Winetricks和DXVK。
- 安裝 Flatpak,之後再從Flathub安裝Wine。
flatpak install flathub org.winehq.Wine
- Flatpak的Wine啟動指令都要加上
flatpak run
,因此flatpak run org.winehq.Wine
等於wine
指令。
flatpak run org.winehq.Wine
- Flatpak版所有的WINEPREFIX都會儲存在
~/.var/app/org.winehq.Wine/data
4. Wine指令基本用法#
- Wine的用法:
wine "exe路徑"
我們以簡單的Windows軟體「Notepad++」當例子。
如果你要執行
notepad++.exe
或notepad++.msi
,那麼使用以下指令就可以啟動程式:
wine notepad++.exe
wine notepad++.msi
等一會畫面出來就可以使用了。Notepad++執行狀況良好。
如果Windows軟體需要安裝,那麼Wine會在安裝好後幫你建立桌面捷徑。
另外Wine會自動註冊檔案關聯,你在Linux檔案管理器對exe點兩下,Wine通常會自己打開。若不想要Wine自行關聯Linux程式檔案,請用winecfg指令關閉Manage File Associations。
還請注意不是每個exe都能這樣直接開,有的需要你安裝額外的Windows套件才可以開啟。比如有許多軟體依賴.Net Framework、Visual C++ Redistributable、DirectX等等,或是需要用到中文字體,這些Wine沒有內建,你得用Winetricks安裝(後述)。
你可能會問,Wine把Windows軟體安裝到哪裡去呢?請看下一節的WINEPREFIX概念。
5. 理解WINEPREFIX虛擬C槽的概念#
WINEPREFIX
指的是Wine存放資料的目錄。
Wine初次啟動的時候,會在使用者家目錄建立~/.wine
目錄存放資料,裡面的結構很像Windows的C槽,含有登錄檔、常用系統文件、字體等等。使用者的exe也是安裝到這裡。
WINEPREFIX可以理解為虛擬C槽的概念吧!如果你用wine explorer
指令開啟Wine的檔案總管,就會看到(C:)
槽和(Z:)
槽兩個磁碟,(C:)
對應的路徑是~/.wine
,而(Z:)
即對應整個Linux系統的根目錄了。
你可以使用WINEPREFIX
環境變數,後面接路徑,用於告訴Wine資料存在哪裡。
用法是這樣,在wine指令前面加上環境變數,這樣Wine就會改成在~/.wine32
建立虛擬C槽了。如果不寫WINEPREFIX,Wine資料預設儲存路徑就是~/.wine
。
WINEPREFIX="~/.wine32" wine notepad++.exe
此外,wine還有一個叫做WINEARCH
的環境變數,指定Wine環境是32位元還是64位元。你應該知道有的程式真的沒辦法在64位元執行!
WINEARCH=win32 wine <exe>
預設情況下,Wine建立的環境都是64位元環境。你必須明確指定WINEARCH
才可以用32位元跑。
不過除非是很老的程式,否則64位元的Wine環境跑32位元exe大部分時候是沒什麼問題的,不太需要指定建立純32位元環境。
那麼WINEPREFIX有何用處呢?它常常用來建立多個不同的「Wine容器」,類似多個虛擬C槽的概念。有些很機車的Windows軟體,需要改一堆登錄檔,甚至把架構改32位元才能成功執行,這樣久了Wine的C槽環境不免會亂掉。所以,利用WINEPREFIX建立多重的Wine容器,將不同用途的exe隔離就是個解決辦法。
比如,我可以用這些指令在多個Wine的容器之間切換:
# 專門跑32位元程式的容器
WINEPREFIX="/home/user/.wine32" WINEARCH=win32 wine notepad++.exe
# 專門跑Photoshop 2021的容器
WINEPREFIX="/home/user/.winephotoshop" wine photoshop.exe
6. Wine內建的輔助工具#
Wine本體模擬了一系列Windows系統的程式,輸入指令開啟。
雖說是圖形程式,但他們也可以用指令操作來變更Windows系統設定,方便用在指令稿批次處理。詳情請參考 Wine Wiki
explorer:模擬檔案總管。啟動指令:wine explorer
,下面程式以此類推。
control:模擬控制台,僅能解除安裝程式和調整網路設定
taskmgr:模擬工作管理員。值得一提的是Windows exe的行程在Linux端用htop指令也看得到。
regedit:模擬登錄檔編輯器
notepad:模擬記事本
cmd:命令提示字元,支援DOS指令。
wine-dbg:除錯工具
winecfg:調整Wine設定值。這個比較有用所以我特別講一下winecfg的功能。
應用程式 → 調整模擬的Windows系統版本
顯示 → 螢幕解析度,調整Windows程式的字體大小(DPI)
顯示 → 模擬一個虛擬桌面,可讓Windows程式跑在一個虛擬桌面的視窗。這樣你可以防止某些程式強制進入全螢幕。
桌面整合 → MIME類型,可關閉Wine與Linux系統的檔案關聯機制。
函式庫 → 這裡設定DLL覆寫,設定要使用Wine提供的DLL還是Windows程式提供的DLL。
7. 用Winetricks簡化安裝中文字體流程#
Winetricks是一個指令稿,用於幫使用者快速安裝特定Windows軟體。
比如裝中文字體、修改登錄檔、建立容器等。有些軟體安裝後還要修改登錄檔才能被系統認到,Winetricks可以將這些操作自動化。
- 安裝方法:從 Winetricks的Github下載最新版,並將其移動到系統目錄。
wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
chmod +x winetricks
sudo mv winetricks /usr/bin
Flatpak版Wine已內建Winetricks,啟動指令為:
flatpak run --command=winetricks org.winehq.Wine
Winetricks的使用方法:輸入
winetricks
指令開啟圖形界面,按照畫面指示操作。
或者你可以直接輸入Windows套件名稱,叫Winetricks自動下載安裝。這裡的例子是告訴Winetricks,下載中文字體cjkfonts和dotnet471這二個套件並安裝。
winetricks cjkfonts dotnet471
結合我們上面講過的WINEPREFIX概念,你可以用該變數告訴Winetricks要變更哪一個Wine的容器。
WINEPREFIX=~/.wine winetricks cjkfonts dotnet471
參考資料#
官方文件 Wine User’s Guide