Wine的使用方法與心得

tags: 程式相關 財金相關

Wine基本說明

  • Wine的原理是去破解C:\windows\system32之下主要的DLL檔的功能,再自己重新implement這些DLL檔,使得所有的Windows程式在執行時call到這些DLL檔時,背後能轉換成POSIX的函式庫,來完成DLL檔原本的工作!!而這樣子比起虛擬機來講,就能少掉虛擬機的那一層虛擬硬體層的overhead了!
  • 但是面對.Net FrameworkVisual C++可轉散發套件時,Wine選擇不自己implement這二者的DLL檔,而是讓使用者自己去安裝Windows版的.Net FrameworkVisual C++可轉散發套件的安裝檔!我想這是因為這二者的DLL檔都比較上層,它們的功能全部都是透過去call更底層的KERNEL32ntdll之類的DLL檔來完成自己的功能!而更底層的DLL檔Wine都已經自己implement完並且轉換成POSIX了!
  • 而有一些Wine已經寫好的DLL檔並不那麼底層,像是winhttpwininet,它們並沒有那麼底層,而且它們也是透過call更底層的DLL檔來完成它們自己的功能的!所以像這種DLL檔我們也有機會選擇安裝Windows原生的安裝檔來把Wine版的winhttpwininet換掉,改成Windows版的winhttpwininet!而這就是DLL檔所謂的builtin (內建)native (原生)的差別了!builtin (內建)是指Wine版的DLL,而native (原生)是指Windows版的DLL!(builtinnative意義太相近了!記法是:Windows原生DLL檔很明顯就是在指Windows版的DLL檔!)
  • 透過Wine的winecfg指令可以設定已經安裝過Windows版的DLL檔,使用者要選擇用Wine版的或Windows版的、或是誰的優先於另一個人的、或是不要發揮功用之類的。
    • winecfg還可以設定Wine目前虛擬的Windows版本是多少,不過實際設定之後感覺作用不大。
  • 執行Wine時建議是要在有XWindow的環境下執行!(是有點麻煩沒錯!)
  • Wine預設會把整個Windows的檔案系統安裝在~/.wine裡!進到~/.wine/drive_c/裡,你可以發現精簡版的Windows C槽的資料夾都在這裡!你可以:
    • 直接執行wine putty.exe來從無到有生出一個~/.wine資料夾後,再執行putty.exe在XWindow下秀出putty!
    • 執行wineboot來從無到有生出一個~/.wine資料夾!但不會執行任何程式。(強烈建議先這樣做!!!)
    • 執行WINEPREFIX=~/.wine32 WINEARCH=win32 wineboot來從無到有生出一個~/.wine32資料夾!而且~/.wine32裡是是32位元的Windows環境!(雖然這只對64位元版的Wine有差而已)
    • 嫌每一次前面都有打WINEPREFIX=~/.wine32 WINEARCH=win32麻煩的話,可以先export一次變數,之後就不用再每次都打這麼長一串了!
$ export WINEPREFIX=~/.wine32
$ export WINEARCH=win32
  • 在32位元下的Ubuntu下安裝32位元版的Wine就可以不用這麼麻煩每次都要先export了!(強烈建議!!!)
  • 透過另一個方便的第三方工具winetricks可以輕鬆地下載適合的安裝檔並且只挑其中特定的DLL檔出來蓋掉Wine版的DLL檔。此外winetricks還可以方便地安裝.Net FrameworkVisual C++可轉散發套件,而近來的wiretricks更可以直接幫你安裝Windows遊戲或Office等!真的狂!
  • 不過要注意!一定要直接從Github下載winetricks的bleeding edge版!而不能用apt install安裝!apt install的是2014年版的winetricks!很多東西下載不到,而且安裝檔的相容性也沒有顧到!
  • 安裝winetricks
$ wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
$ chmod +x ./winetricks
  • 使用winetricks
$ winetricks list-all  (列出所有可以安裝的套件)
$ winetricks list-installed  (列出所有已經安裝的套件)
$ winetricks vcrun2010  (安裝VC++2010的可轉散發套件)
$ winetricks vcrun2015  (安裝VC++2015的可轉散發套件)
$ winetricks dotnet40  (安裝.Net Framework 4.0)
$ winetricks winhttp  (安裝Windows 2000 SP4版的winhttp.dll,測試後沒有用故不會裝)
$ winetricks wininet  (安裝Windows 7 SP1版的wininet.dll,測試後沒有用故不會裝)
$ winetricks wininet_win2k  (安裝Windows 2000 SP4版的wininet.dll,測試後沒有用故不會裝)
$ winetricks win7  (設定.wine的環境為Windows 7,測試後沒有感覺差別故不會裝)
$ winetricks winxp  (設定.wine的環境為Windows XP,測試後沒有感覺差別故不會裝)
  • 若要debug查看執行wine putty.exe時DLL層的執行細節的話,可以使用WINEDEBUG變數來印出更多細節!(WINEDEBUG官方說明)
$ WINEDEBUG=+relay,+seh,+tid wine ./putty.exe > ~/putty.log 2>&1
  • 執行wine control可以叫出控制台!不過只有三個圖示而已,看得出來這個控制台是Wine自製的!然後要匯入根憑證檔要來這個控制台匯入,而不是執行wine ./iexplorer.exe打開IE5然後找選項匯入!
    • 執行wine uninstaller可以叫出剛剛控制台三個圖示之一的解除安裝管理員!裡面可以看到winetricks裝過的套件!不曉得它解安裝winetricks裝過的套件之後,執行winetricks list-installed會不會還看得到該套件,以及該套件是否還有作用。(我沒試那麼深入)
  • Wine目前連GTA 5也可以執行了!(GTA 5是Wine支援度最高級的遊戲,是白金級的支援程度!) 所以幸運的是,在連日來的熬夜之下,我已經確定群益的API SKCOM.dll也可以利用Wine在Linux上執行了!

安裝說明

  • 建議使用Ubuntu 32位元的作業系統來安裝Wine,因為Wine目前64位元的支援很差,它主要是以執行32位元的Windows程式為主!而且Ubuntu 64位元的函式庫正常來講我都會安裝得很完整;但是32位元的函式庫我就幾乎不會裝了,就無法確定Wine是否會因為call不到底層32位元的函式庫而運作異常!
  • 建議是透過compile Wine原始碼的方式來安裝Wine,而非加入Wine官方PPA再執行apt install來安裝Wine!一樣也是為了避免Ubuntu 32位元的函式庫我裝得不夠完整!Wine的configure非常強大!它會在執行完後歸納出系統會因為缺少什麼函式庫的開發套件而會有什麼功能執行不到!(仔細想想,我在用原始碼安裝Wine之後,fixme出現的次數變少非常非常多!原來fixme不一定是提醒Wine的開發者而已!)

安裝步驟

  • 基本上來講,我會安裝以下的套件來初始化我剛裝好的Ubuntu 16.04
$ sudo apt update; apt upgrade
$ sudo apt install openssh-client openssh-server vim python-software-properties software-properties-common gcc g++ vim subversion automake autoconf perl patch build-essential libtool doxygen bison flex zlib1g-dev gperf tofrodos wget curl screen git samba vsftpd bash-completion ftp colordiff libkrb5-dev rar unrar unzip vnstat libssl-dev
  • 用root帳號登入Ubuntu環境!
  • 先把Wine的git repository上的code拉下來!
$ mkdir -pv /root/packages ; cd /root/packages
$ time git clone https://github.com/wine-mirror/wine
  • 先執行一次./configure
$ cd ./wine
$ time ./configure
  • 應該會看到以下的訊息!
checking for X... no
configure: error: X development files not found. Wine will be built
without X support, which probably isn't what you want. You will need
to install development packages of Xlib at the very least.
Use the --without-x option if you really want this.
  • 若只有安裝X Windows的library而已的話,可能大概會看到以下類似的Info訊息和Warning訊息!這代表SOP那一篇文章裝的套件還不夠多!
configure: MinGW compiler not found, cross-compiling PE files won't be supported.
configure: libhal development files not found, no legacy dynamic device support.
configure: libSDL2 development files not found, SDL2 won't be supported.
configure: libFAudio development files not found, XAudio2 won't be supported.
configure: libvulkan and libMoltenVK development files not found, Vulkan won't be supported.
configure: vkd3d development files not found (or too old), Direct3D 12 won't be supported.
configure: WARNING: No OpenGL library found on this system.
OpenGL and Direct3D won't be supported.
configure: WARNING: libxml2 development files not found (or too old), XML won't be supported.
configure: WARNING: libxslt development files not found, xslt won't be supported.
configure: WARNING: libgnutls development files not found, no schannel support.
configure: WARNING: libjpeg development files not found, JPEG won't be supported.
configure: WARNING: No sound system was found. Windows applications will be silent.
configure: Finished.  Do 'make' to compile Wine.
  • 安裝所有剩下所需的套件以盡量減少部分Info訊息和所有Warning訊息!(我是參考這一篇的!重要!)
$ time apt install gnome-devel libx11-dev flex bison qt4-qmake libjpeg-dev libxslt1-dev libglu1-mesa-dev freeglut3-dev prelink libasound2-dev libfreetype6-dev libpng-dev libxml2-dev libxrender-dev libgl1-mesa-dev libgphoto2-dev libmpg123-dev libtiff-dev libpulse-dev liblcms2-dev libcapi20-dev libldap-dev libopenal-dev libv4l-dev libsane-dev libcups2-dev libgsm1-dev libosmesa6-dev libgnutls28-dev libpcap0.8-dev oss4-dev libcdk5-dev libgstreamer-plugins-base1.0-dev libarrayfire-opencl-dev
$ time apt install libsdl2-dev libvulkan-dev
  • 清除一下apt-get抓下來的殘餘檔
$ apt clean
  • 接下來再執行./configure一次!
$ time ./configure
  • 你會發現Info訊息和所有Warning訊息大概只剩下這樣,這樣就差不多了。
configure: MinGW compiler not found, cross-compiling PE files won't be supported.
configure: libhal development files not found, no legacy dynamic device support.
configure: libFAudio development files not found, XAudio2 won't be supported.
configure: vkd3d development files not found (or too old), Direct3D 12 won't be supported.
  • 接下來編譯並且安裝它!編譯的過程會花一些時間!(大約42分鐘)
$ time make
$ time make install
  • 接下來安裝好用的winetricks!直接從github wget下來就可以用了!
$ mkdir -pv /opt/bin ; cd /opt/bin
$ wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
$ chmod +x ./winetricks
$ ./winetricks -V
20190615-next - sha256sum: 47304e177f259d6f9c05af01ab42c06531fd8a9716e2751d2fadcd664130feea
  • 安裝結束!大功告成!

使用心得

  • winhttp win7版有bug,所以winetricks目前不支援!詳情請直接打開winetricks找到安裝winhttp的那一行!
  • 其他有關於使用Wine來跑群益API寫出來的程式的心得,請參考另一篇文章「使用Wine來跑群益API」!
Select a repo