TOC
今まで何度か取り上げているWineですが、今回は現時点の最新版であるWine5.0と、Wine環境を持ち運ぶ運用方法についてまとめてみました。確認環境はUbuntu MATE 20.04(amd64)です。
WineHQが配布するPPAのWine 6.0をインストール(Ubuntu 18.04の場合)
Acer Chromebook C720のSSDを交換して同じ手順でインストールしようとしたら追加でパッケージのインストールが必要だったのでこの節を書き直します。確認環境はGalliumOS 3.1 x86_64(Xubuntu 18.04ベース)です。
# wget -qO - https://dl.winehq.org/wine-builds/winehq.key | apt-key add -
# dpkg --add-architecture i386
# apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic main'
インストールするパッケージを
- winehq-stable
- winehq-devel
- winehq-staging
から選びます。今回はwinehq-stable
をインストールします。大量のパッケージがインストールされます。
# apt-get install winehq-stable --install-recommends
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:
以下のパッケージには満たせない依存関係があります:
winehq-stable : 依存: wine-stable (= 6.0.1~focal-1)
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
表示されるメッセージはwine-stable (= 6.0.1~focal-1)
に依存を設定できないというものですが、これを追いかけていくと
パッケージ libfaudio0 は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。
パッケージ libfaudio0:i386 は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。
E: パッケージ 'libfaudio0' にはインストール候補がありません
E: パッケージ 'libfaudio0:i386' にはインストール候補がありません
というところに行き着きます。libfaudio0
パッケージがないので、それに依存するパッケージのインストールができないというエラーです。
ちなみに
https://forum.winehq.org/viewtopic.php?f=8&t=32192
Note: FAudio for Ubuntu 19.10 and later, and Debian bullseye and later, are provided by those distros. If you are unable to install them from your distro repository, ask for help on your distro’s forum.
とのことなので、libfaudio0パッケージがないのはUbuntu 19.10よりも前(Debian bullseyeよりも前)なので、Ubuntu 19.10以降とDebian bullseye以降ではこの追加手順は必要ありません。1
# wget -qO - https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/Release.key | apt-key add -
# apt-add-repository 'deb https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/ ./'
一般ユーザーで鍵を追加する場合はこうですね。
$ wget -qO - https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/Release.key | sudo apt-key add -
$ sudo apt-add-repository 'deb https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/ ./'
不足パッケージへの依存が追加されたので改めてインストールします。
# apt-get install winehq-stable --install-recommends
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
gcc-8-base:i386 gstreamer1.0-plugins-base:i386 krb5-locales
libapparmor1:i386 libasn1-8-heimdal:i386 libasound2:i386
libasound2-plugins:i386 libasyncns0:i386 libatomic1:i386
libavahi-client3:i386 libavahi-common-data:i386 libavahi-common3:i386
libblkid1:i386 libbsd0:i386 libc6:i386 libcairo2:i386 libcap2:i386
libcapi20-3 libcapi20-3:i386 libcdparanoia0:i386 libcom-err2:i386
libcomerr2:i386 libcups2:i386 libdb5.3:i386 libdbus-1-3:i386
libdrm-amdgpu1:i386 libdrm-intel1:i386 libdrm-nouveau2:i386
libdrm-radeon1:i386 libdrm2:i386 libedit2:i386 libegl-mesa0:i386
libegl1:i386 libelf1:i386 libexif12:i386 libexpat1:i386 libfaudio0
libfaudio0:i386 libffi6:i386 libflac8:i386 libfontconfig1:i386
libfreetype6:i386 libgbm1:i386 libgcc1:i386 libgcrypt20:i386 libgd3:i386
libgl1:i386 libgl1-mesa-dri:i386 libgl1-mesa-glx:i386 libglapi-mesa:i386
libglib2.0-0:i386 libglu1-mesa:i386 libglvnd0:i386 libglx-mesa0:i386
libglx0:i386 libgmp10:i386 libgnutls30:i386 libgpg-error0:i386
libgphoto2-6:i386 libgphoto2-port12:i386 libgpm2:i386 libgsm1:i386
libgssapi-krb5-2:i386 libgssapi3-heimdal:i386
libgstreamer-plugins-base1.0-0:i386 libgstreamer1.0-0:i386
libhcrypto4-heimdal:i386 libheimbase1-heimdal:i386 libheimntlm0-heimdal:i386
libhogweed4:i386 libhx509-5-heimdal:i386 libicu60:i386 libidn2-0:i386
libieee1284-3:i386 libjack-jackd2-0:i386 libjbig0:i386 libjpeg-turbo8:i386
libjpeg8:i386 libk5crypto3:i386 libkeyutils1:i386 libkrb5-26-heimdal:i386
libkrb5-3:i386 libkrb5support0:i386 liblcms2-2:i386 libldap-2.4-2:i386
libllvm10:i386 libltdl7:i386 liblz4-1:i386 liblzma5:i386 libmount1:i386
libmpg123-0:i386 libncurses5:i386 libnettle6:i386 libodbc1 libodbc1:i386
libogg0:i386 libopenal1:i386 libopus0:i386 liborc-0.4-0:i386 libosmesa6
libosmesa6:i386 libp11-kit0:i386 libpcap0.8:i386 libpciaccess0:i386
libpcre3:i386 libpixman-1-0:i386 libpng16-16:i386 libpulse0:i386
libroken18-heimdal:i386 libsamplerate0:i386 libsane1:i386 libsasl2-2:i386
libsasl2-modules:i386 libsasl2-modules-db:i386 libsdl2-2.0-0:i386
libselinux1:i386 libsensors4:i386 libsndfile1:i386 libsndio6.1:i386
libspeexdsp1:i386 libsqlite3-0:i386 libssl1.1:i386 libstdc++6:i386
libsystemd0:i386 libtasn1-6:i386 libtheora0:i386 libtiff5:i386
libtinfo5:i386 libudev1:i386 libunistring2:i386 libusb-1.0-0:i386
libuuid1:i386 libv4l-0:i386 libv4lconvert0:i386 libvisual-0.4-0:i386
libvorbis0a:i386 libvorbisenc2:i386 libwayland-client0:i386
libwayland-cursor0:i386 libwayland-egl1:i386 libwayland-egl1-mesa:i386
libwayland-server0:i386 libwebp6:i386 libwind0-heimdal:i386 libwrap0:i386
libx11-6:i386 libx11-xcb1:i386 libxau6:i386 libxcb-dri2-0:i386
libxcb-dri3-0:i386 libxcb-glx0:i386 libxcb-present0:i386 libxcb-render0:i386
libxcb-shm0:i386 libxcb-sync1:i386 libxcb-xfixes0:i386 libxcb1:i386
libxcomposite1:i386 libxcursor1:i386 libxdamage1:i386 libxdmcp6:i386
libxext6:i386 libxfixes3:i386 libxi6:i386 libxinerama1:i386
libxkbcommon0:i386 libxml2:i386 libxpm4:i386 libxrandr2:i386
libxrender1:i386 libxshmfence1:i386 libxslt1.1:i386 libxss1:i386
libxxf86vm1:i386 libzstd1:i386 ocl-icd-libopencl1 ocl-icd-libopencl1:i386
wine-stable wine-stable-amd64 wine-stable-i386:i386 zlib1g:i386
提案パッケージ:
gvfs:i386 glibc-doc:i386 locales:i386 rng-tools:i386 libgd-tools:i386
gnutls-bin:i386 gphoto2:i386 gpm:i386 krb5-doc:i386 krb5-user:i386
libvisual-0.4-plugins:i386 gstreamer1.0-tools:i386 jackd2:i386 libmyodbc
odbc-postgresql tdsodbc unixodbc-bin libmyodbc:i386 odbc-postgresql:i386
tdsodbc:i386 unixodbc-bin:i386 libportaudio2:i386 opus-tools:i386 hplip:i386
libsasl2-modules-gssapi-mit:i386 | libsasl2-modules-gssapi-heimdal:i386
libsasl2-modules-ldap:i386 libsasl2-modules-otp:i386
libsasl2-modules-sql:i386 lm-sensors:i386 sndiod:i386 opencl-icd
opencl-icd:i386
以下のパッケージが新たにインストールされます:
gcc-8-base:i386 gstreamer1.0-plugins-base:i386 krb5-locales
libapparmor1:i386 libasn1-8-heimdal:i386 libasound2:i386
libasound2-plugins:i386 libasyncns0:i386 libatomic1:i386
libavahi-client3:i386 libavahi-common-data:i386 libavahi-common3:i386
libblkid1:i386 libbsd0:i386 libc6:i386 libcairo2:i386 libcap2:i386
libcapi20-3 libcapi20-3:i386 libcdparanoia0:i386 libcom-err2:i386
libcomerr2:i386 libcups2:i386 libdb5.3:i386 libdbus-1-3:i386
libdrm-amdgpu1:i386 libdrm-intel1:i386 libdrm-nouveau2:i386
libdrm-radeon1:i386 libdrm2:i386 libedit2:i386 libegl-mesa0:i386
libegl1:i386 libelf1:i386 libexif12:i386 libexpat1:i386 libfaudio0
libfaudio0:i386 libffi6:i386 libflac8:i386 libfontconfig1:i386
libfreetype6:i386 libgbm1:i386 libgcc1:i386 libgcrypt20:i386 libgd3:i386
libgl1:i386 libgl1-mesa-dri:i386 libgl1-mesa-glx:i386 libglapi-mesa:i386
libglib2.0-0:i386 libglu1-mesa:i386 libglvnd0:i386 libglx-mesa0:i386
libglx0:i386 libgmp10:i386 libgnutls30:i386 libgpg-error0:i386
libgphoto2-6:i386 libgphoto2-port12:i386 libgpm2:i386 libgsm1:i386
libgssapi-krb5-2:i386 libgssapi3-heimdal:i386
libgstreamer-plugins-base1.0-0:i386 libgstreamer1.0-0:i386
libhcrypto4-heimdal:i386 libheimbase1-heimdal:i386 libheimntlm0-heimdal:i386
libhogweed4:i386 libhx509-5-heimdal:i386 libicu60:i386 libidn2-0:i386
libieee1284-3:i386 libjack-jackd2-0:i386 libjbig0:i386 libjpeg-turbo8:i386
libjpeg8:i386 libk5crypto3:i386 libkeyutils1:i386 libkrb5-26-heimdal:i386
libkrb5-3:i386 libkrb5support0:i386 liblcms2-2:i386 libldap-2.4-2:i386
libllvm10:i386 libltdl7:i386 liblz4-1:i386 liblzma5:i386 libmount1:i386
libmpg123-0:i386 libncurses5:i386 libnettle6:i386 libodbc1 libodbc1:i386
libogg0:i386 libopenal1:i386 libopus0:i386 liborc-0.4-0:i386 libosmesa6
libosmesa6:i386 libp11-kit0:i386 libpcap0.8:i386 libpciaccess0:i386
libpcre3:i386 libpixman-1-0:i386 libpng16-16:i386 libpulse0:i386
libroken18-heimdal:i386 libsamplerate0:i386 libsane1:i386 libsasl2-2:i386
libsasl2-modules:i386 libsasl2-modules-db:i386 libsdl2-2.0-0:i386
libselinux1:i386 libsensors4:i386 libsndfile1:i386 libsndio6.1:i386
libspeexdsp1:i386 libsqlite3-0:i386 libssl1.1:i386 libstdc++6:i386
libsystemd0:i386 libtasn1-6:i386 libtheora0:i386 libtiff5:i386
libtinfo5:i386 libudev1:i386 libunistring2:i386 libusb-1.0-0:i386
libuuid1:i386 libv4l-0:i386 libv4lconvert0:i386 libvisual-0.4-0:i386
libvorbis0a:i386 libvorbisenc2:i386 libwayland-client0:i386
libwayland-cursor0:i386 libwayland-egl1:i386 libwayland-egl1-mesa:i386
libwayland-server0:i386 libwebp6:i386 libwind0-heimdal:i386 libwrap0:i386
libx11-6:i386 libx11-xcb1:i386 libxau6:i386 libxcb-dri2-0:i386
libxcb-dri3-0:i386 libxcb-glx0:i386 libxcb-present0:i386 libxcb-render0:i386
libxcb-shm0:i386 libxcb-sync1:i386 libxcb-xfixes0:i386 libxcb1:i386
libxcomposite1:i386 libxcursor1:i386 libxdamage1:i386 libxdmcp6:i386
libxext6:i386 libxfixes3:i386 libxi6:i386 libxinerama1:i386
libxkbcommon0:i386 libxml2:i386 libxpm4:i386 libxrandr2:i386
libxrender1:i386 libxshmfence1:i386 libxslt1.1:i386 libxss1:i386
libxxf86vm1:i386 libzstd1:i386 ocl-icd-libopencl1 ocl-icd-libopencl1:i386
wine-stable wine-stable-amd64 wine-stable-i386:i386 winehq-stable
zlib1g:i386
アップグレード: 0 個、新規インストール: 182 個、削除: 0 個、保留: 0 個。
209 MB のアーカイブを取得する必要があります。
この操作後に追加で 1,486 MB のディスク容量が消費されます。
続行しますか? [Y/n]
長旅の始まりです。インストールが完了したらバージョンを確認します。
$ wine --version
wine-6.0.1
やっぱりwinbind
パッケージをインストールしてしまいます。
# apt-get install winbind
【旧情報】WineHQが配布するPPAのWine 5.0をインストール(Ubuntu 20.04)
今回はUbuntuのパッケージではなく、Ubuntu用のWineHQのパッケージをインストールします。Ubuntu MATE 20.04で使うので、Ubuntu 20.04用のリポジトリを追加します。
# wget -qO - https://dl.winehq.org/wine-builds/winehq.key | apt-key add -
# dpkg --add-architecture i386
# apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'
インストールするパッケージを
- winehq-stable
- winehq-devel
- winehq-staging
から選びます。今回はwinehq-stable
をインストールします。大量のパッケージがインストールされます。
# apt-get install winehq-stable --install-recommends
バージョンを確認します。
$ wine --version
wine-5.0.2
また、今回色々確認している途中に
0060:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
というエラーが出たので、先にwinbind
パッケージをインストールします。
# apt-get install winbind
https://askubuntu.com/questions/1090094/wine-missing-ntlm-auth-3-0-25
Wineの環境をアプリごとに作る
Wineを使っていく中で色々調べてわかったんですが、Wineの環境すなわちWindows互換環境はディスクスペースの許す限りいくつでも作ることが可能です。
Windowsアプリはファイルの入出力の他にレジストリという巨大でシステムワイドなデータベースに色々な情報を保存・参照して動作しますが、Wineでは任意のディレクトリにWine環境を作ることが可能であり、このWine環境を異なる場所にすることで、Windowsアプリごとに別々のWine環境を使うこともできます。
使用するPCを変える場合などにWine環境を持ち運べるようにしておくことでPCに依存しないWindows互換環境も作れます。
ということで、今回はWine環境を構築しながら、極力ポータブルなWine環境を仕上げて環境ごとの持ち運びをしてみようというテーマで作業します。
Wine環境の概要
よくVirtualBoxなどの仮想化アプライアンスではスナップショットをコピーして世代管理することがあると思いますが、基本的にはそれと同じように基本になるWine環境を作ってしまい、それぞれに必要なアプリケーションをインストールします。密接に関係するWindowsアプリは1つの環境に押し込めて、そうでないアプリは基本的には単独のWine環境で動作させるようにしたいと思います。
Wine環境は「環境変数WINEPREFIXで指定するディレクトリ」
Wine環境は基本的にC~Zドライブとレジストリがあれば良いようで、wineboot
コマンドを実行することで作成できます。wine関連のコマンドの実行時に環境変数WINEPREFIXが定義されている場合はそのディレクトリをWine環境としてコマンドを実行、定義されていない場合は~/.wine
がWine環境として使われます。
今回はひとまず~/firstwineというディレクトリ2を環境変数WINEPREFIXに指定してWine環境を構築します。wineboot
コマンドの実行時、MonoとGeckoパッケージをインストールするように促すダイアログを表示しますが、これらが不要な場合は環境変数WINEDLLOVERRIDES
にmscoree,mshtml=
を設定します。
$ export WINEPREFIX="${HOME}/firstwine"
$ export WINEDLLOVERRIDES="mscoree,mshtml="
$ wineboot
以降の手順では断りがない限り環境変数WINEPREFIXが設定されている前提でコマンドを記載します。
WINEDLLOVERRIDESを設定せずにwinebootコマンドを実行すると以下のダイアログが表示されます。
必要に応じてインストールすれば良いと思います。
この状態のWine環境のファイル(主要ディレクトリのみ)は以下の通りです。
firstwine/
├── dosdevices
│ ├── c: -> ../drive_c
│ └── z: -> /
└── drive_c
├── Program Files
│ ├── Common Files
│ │ └── System
│ │ ├── ADO
│ │ └── OLE DB
│ ├── Internet Explorer
│ └── Windows NT
├── Program Files (x86)
│ ├── Common Files
│ │ └── System
│ │ ├── ADO
│ │ └── OLE DB
│ ├── Internet Explorer
│ └── Windows NT
├── ProgramData
│ └── Microsoft
│ └── Windows
│ ├── Start Menu
│ │ └── Programs
│ │ ├── Administrative Tools
│ │ └── StartUp
│ └── Templates
├── users
│ ├── Public
│ │ ├── Desktop
│ │ ├── Documents
│ │ ├── Favorites
│ │ ├── Music
│ │ ├── Pictures
│ │ └── Videos
│ └── hogehoge
│ ├── AppData
│ │ └── LocalLow
│ ├── Application Data
│ │ └── Microsoft
│ │ └── Windows
│ │ └── Themes
│ ├── Desktop -> /home/hogehoge/Desktop
│ ├── Downloads -> /home/hogehoge/Downloads
│ ├── Local Settings
│ │ ├── Application Data
│ │ │ └── Microsoft
│ │ ├── History
│ │ └── Temporary Internet Files
│ ├── My Documents -> /home/hogehoge/Documents
│ ├── My Music -> /home/hogehoge/Music
│ ├── My Pictures -> /home/hogehoge/Pictures
│ ├── My Videos -> /home/hogehoge/Videos
│ ├── Recent
│ ├── SendTo
│ ├── Start Menu
│ │ └── Programs
│ │ ├── Administrative Tools
│ │ └── StartUp
│ ├── Temp
│ └── Templates -> /home/hogehoge/Templates
└── windows
├── Fonts
├── command
├── help
├── inf
├── system
├── system32
│ ├── WindowsPowerShell
│ ├── catroot
│ ├── drivers
│ ├── gecko
│ │ └── plugin
│ ├── mui
│ ├── spool
│ │ ├── drivers
│ │ │ └── color
│ │ └── printers
│ ├── tasks
│ └── wbem
├── syswow64
│ ├── WindowsPowerShell
│ ├── drivers
│ ├── gecko
│ │ └── plugin
│ ├── mui
│ └── wbem
├── tasks
├── temp
├── twain_32
├── twain_64
└── winsxs
おおよそWindowsのファイルが一式あって、ご丁寧にユーザーのディレクトリはDesktop、Download等がシンボリックリンクで張られています。また、Wine環境直下にあるsystem.reg
user.reg
userdef.reg
はそれぞれHKEY_LOCAL_MACHINE(HKLM)、HKEY_CURRENT_USER(HKCU)、HKEY_USERS.Defaultに対応するレジストリファイルだそうです。
Windows8.1にする
今回使うWineの5.0.2はデフォルトではWindows7互換環境ですが、Windows8.1がリリースされて7年経っていることから多くのWindowsアプリケーションがサポート対象をWindows8.1にしていると考えられることから、Windows8.1互換環境としてWineを動かすことにします。
Wineのレジストリを変更することでWindows8.1相当に変更できます。一般的にはwinecfgを使って変更しますが、winecfg実行前後でレジストリを比較した結果、以下のレジストリ変更をすればWindows8.1にできることを確認したので、今回はこのregファイルをWineに適用することで進めます。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion]
"CSDVersion"=""
"CurrentBuild"="9600"
"CurrentBuildNumber"="9600"
"CurrentVersion"="6.3"
"ProductName"="Microsoft Windows 8.1"
[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion]
"CSDVersion"=""
"CurrentBuild"="9600"
"CurrentBuildNumber"="9600"
"CurrentVersion"="6.3"
"ProductName"="Microsoft Windows 8.1"
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Windows]
"CSDVersion"=dword:00000000
このファイルを改行コードCRLF、文字コードはBOM付きのUNICODEならおそらくOKで適当な名前(win81fromdefault.reg)で保存して、wineに登録します。
$ wine regedit win81fromdefault.reg
細かい話
winecfgがどの値を変更しているのか調べた結果、実際に変更している箇所のソースは恐らく以下です。
この先頭に書かれている構造体定義が各バージョンのWindowsに対応する定義値
struct win_version
{
const char *szVersion;
const char *szDescription;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
const char *szCSDVersion;
WORD wServicePackMajor;
WORD wServicePackMinor;
const char *szProductType;
};
static const struct win_version win_versions[] =
{
{ "win10", "Windows 10", 10, 0, 0x4563,VER_PLATFORM_WIN32_NT, "", 0, 0, "WinNT"},
{ "win81", "Windows 8.1", 6, 3, 0x2580,VER_PLATFORM_WIN32_NT, "", 0, 0, "WinNT"},
{ "win8", "Windows 8", 6, 2, 0x23F0,VER_PLATFORM_WIN32_NT, "", 0, 0, "WinNT"},
{ "win2008r2", "Windows 2008 R2", 6, 1, 0x1DB1,VER_PLATFORM_WIN32_NT, "Service Pack 1", 1, 0, "ServerNT"},
{ "win7", "Windows 7", 6, 1, 0x1DB1,VER_PLATFORM_WIN32_NT, "Service Pack 1", 1, 0, "WinNT"},
{ "win2008", "Windows 2008", 6, 0, 0x1772,VER_PLATFORM_WIN32_NT, "Service Pack 2", 2, 0, "ServerNT"},
{ "vista", "Windows Vista", 6, 0, 0x1772,VER_PLATFORM_WIN32_NT, "Service Pack 2", 2, 0, "WinNT"},
{ "win2003", "Windows 2003", 5, 2, 0xECE, VER_PLATFORM_WIN32_NT, "Service Pack 2", 2, 0, "ServerNT"},
#ifdef _WIN64
{ "winxp64", "Windows XP", 5, 2, 0xECE, VER_PLATFORM_WIN32_NT, "Service Pack 2", 2, 0, "WinNT"},
#else
{ "winxp", "Windows XP", 5, 1, 0xA28, VER_PLATFORM_WIN32_NT, "Service Pack 3", 3, 0, "WinNT"},
{ "win2k", "Windows 2000", 5, 0, 0x893, VER_PLATFORM_WIN32_NT, "Service Pack 4", 4, 0, "WinNT"},
{ "winme", "Windows ME", 4, 90, 0xBB8, VER_PLATFORM_WIN32_WINDOWS, " ", 0, 0, ""},
{ "win98", "Windows 98", 4, 10, 0x8AE, VER_PLATFORM_WIN32_WINDOWS, " A ", 0, 0, ""},
{ "win95", "Windows 95", 4, 0, 0x3B6, VER_PLATFORM_WIN32_WINDOWS, "", 0, 0, ""},
{ "nt40", "Windows NT 4.0", 4, 0, 0x565, VER_PLATFORM_WIN32_NT, "Service Pack 6a", 6, 0, "WinNT"},
{ "nt351", "Windows NT 3.51", 3, 51, 0x421, VER_PLATFORM_WIN32_NT, "Service Pack 5", 5, 0, "WinNT"},
{ "win31", "Windows 3.1", 3, 10, 0, VER_PLATFORM_WIN32s, "Win32s 1.3", 0, 0, ""},
{ "win30", "Windows 3.0", 3, 0, 0, VER_PLATFORM_WIN32s, "Win32s 1.3", 0, 0, ""},
{ "win20", "Windows 2.0", 2, 0, 0, VER_PLATFORM_WIN32s, "Win32s 1.3", 0, 0, ""}
#endif
};
下にあるstatic void set_winver(const struct win_version *version)
がコンボボックスで異なる値が選ばれた時に実行される関数で、Windows8.1を選んだ際はcaseのVER_PLATFORM_WIN32_NT
が実行されます。
case VER_PLATFORM_WIN32_NT:
snprintf(Buffer, sizeof(Buffer), "%d.%d", version->dwMajorVersion,
version->dwMinorVersion);
set_reg_key(HKEY_LOCAL_MACHINE, szKeyNT, "CurrentVersion", Buffer);
set_reg_key_dword(HKEY_LOCAL_MACHINE, szKeyNT, "CurrentMajorVersionNumber", version->dwMajorVersion);
set_reg_key_dword(HKEY_LOCAL_MACHINE, szKeyNT, "CurrentMinorVersionNumber", version->dwMinorVersion);
set_reg_key(HKEY_LOCAL_MACHINE, szKeyNT, "CSDVersion", version->szCSDVersion);
snprintf(Buffer, sizeof(Buffer), "%d", version->dwBuildNumber);
set_reg_key(HKEY_LOCAL_MACHINE, szKeyNT, "CurrentBuild", Buffer);
set_reg_key(HKEY_LOCAL_MACHINE, szKeyNT, "CurrentBuildNumber", Buffer);
snprintf(Buffer, sizeof(Buffer), "Microsoft %s", version->szDescription);
set_reg_key(HKEY_LOCAL_MACHINE, szKeyNT, "ProductName", Buffer);
set_reg_key(HKEY_LOCAL_MACHINE, szKeyProdNT, "ProductType", version->szProductType);
set_reg_key_dword(HKEY_LOCAL_MACHINE, szKeyWindNT, "CSDVersion",
MAKEWORD( version->wServicePackMinor,
version->wServicePackMajor ));
set_reg_key(HKEY_LOCAL_MACHINE, szKeyEnvNT, "OS", "Windows_NT");
set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "VersionNumber", NULL);
set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "SubVersionNumber", NULL);
set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "ProductName", NULL);
set_reg_key(config_key, keypath(""), "Version", NULL);
break;
設定するレジストリキーは2箇所に定義が別れています
static const char szKey9x[] = "Software\\Microsoft\\Windows\\CurrentVersion";
static const char szKeyNT[] = "Software\\Microsoft\\Windows NT\\CurrentVersion";
static const char szKeyProdNT[] = "System\\CurrentControlSet\\Control\\ProductOptions";
static const char szKeyWindNT[] = "System\\CurrentControlSet\\Control\\Windows";
static const char szKeyEnvNT[] = "System\\CurrentControlSet\\Control\\Session Manager\\Environment";
なので、Windows7からではなく全てのバージョンからWindows8.1に変更する場合の変更するレジストリは以下の通りです。(HKEY_LOCAL_MACHINE)
- Software\Microsoft\Windows NT
- CurrentVersion 6.3
- CSDVersion 空文字
- CurrentBuild 0x2580(10進数で9600)
- CurrentBuildNumber 0x2580(10進数で9600)
- ProductName Microsoft Windows 8.1
- ProductType WinNT
- System\CurrentControlSet\Control\Windows
- CSDVersion 0
- System\CurrentControlSet\Control\Session Manager\Environment
- OS Windows_NT
- Software\Microsoft\Windows\CurrentVersion
- VersionNumber NULL
- SubVersionNumber NULL
- ProductName NULL
また、HKEY_LOCAL_MACHINE\Software\Wow6432Node\
はHKEY_LOCAL_MACHINE\Software
のシンボリックリンクらしいので同じ値が入っていること、HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion
の下のCurrentMajorVersionNumber
とCurrentMinorVersionNumber
は変更後のレジストリでは見つけられませんでした。
(日本語)フォントを表示できるようにする
メニュー等のフォントは日本語の表示は問題ないんですが3、アルファベット以外の文字を入力するとその文字が真っ黒な豆腐になります。
Wineでの日本語フォントの解決法としてwinetricksを実行するというのがありますが、手元ではなんの変化もなかったので以下を参照。
Ubuntu日本語フォーラム / Ubuntu 18.04 LTS でWineがインストールできない
今回はレジストリの設定値にマルチバイト文字を含むため、必ず文字コードをShift-JIS、改行コードをCRLFで以下の内容で拡張子regのファイルを作ります。例ではゴシック体を全部VLゴシックに変えていますが、この文字列はfc-list
コマンドを実行した結果通りの文字列(空白が全角だったりする場合はそのまま)でないと駄目だと思います。このファイルをwine_fonts_replacement.reg
という名前で保存することにして、先ほどと同じようにレジストリに登録します。
REGEDIT4
[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]
"MS Pゴシック"="VL Pゴシック"
"MS PGothic"="VL Pゴシック"
"MS P明朝"="IPA P明朝"
"MS UI Gothic"="VL Pゴシック"
"MS ゴシック"="VL ゴシック"
"MS Gothic"="VL ゴシック"
"MS 明朝"="IPA明朝"
$ wine regedit winesetup/reg/wine_fonts_replacement.reg
$ fc-list | grep VL
/usr/share/fonts/truetype/vlgothic/VL-PGothic-Regular.ttf: VL Pゴシック,VL PGothic:style=regular
/usr/share/fonts/truetype/fonts-japanese-gothic.ttf: VL ゴシック,VL Gothic:style=regular
/usr/share/fonts/truetype/vlgothic/VL-Gothic-Regular.ttf: VL ゴシック,VL Gothic:style=regular
もう一度notepadを起動して文字入力すると今度はバッチリ。IPA明朝は今は入れてないので明朝体フォントの場合は黒豆腐になるかと思います。
フォントをWine環境に入れておく
Wineはホスト上のフォントを自動的に探してくれますが、環境としてのWineにフォントファイル自体を入れておけばどんな環境でもWindowsアプリでの日本語を表示できないという事態は避けられるはずなので、Wine環境にフォントファイルをコピーします。
$ cp /usr/share/fonts/truetype/vlgothic/VL-* "${WINEPREFIX}/drive_c/windows/Fonts/"
Wine環境のコピー
このあたりで一旦WINEPREFIXのディレクトリをコピーしても良いと思います。
$ cp -pr "${WINEPREFIX}" "${WINEPREFIX}"_`date "+%Y%m%d_%H%M%S"`
何か作業で失敗したり、やり直したい場合にはバックアップを取ったディレクトリに環境変数WINEPREFIXを変更すればもう一度やり直せるという算段です。
この時点でWine環境のディレクトリはおよそ800MB、tar.xzで圧縮しても180MBになりました。
プログラムのインストール
ではWine環境にプログラムをインストールします。wineコマンドの引数に実行ファイルを指定します。msi形式の場合はwine msiexec -i msiファイル名
でインストールします。ここではサンプルとしてCalibreをインストールします。現在最新の5.2.0ではWindows 64bit/32bitともにインストール後の起動に失敗したので、以下のリンクからインストーラーをダウンロードしてインストールします。今回は64bitのインストーラーを使いました。
https://download.calibre-ebook.com/3.48.0/
$ wine msiexec -i calibre-64bit-3.48.0.msi
インストーラーはWindows上と特に変わりなく進んでいきます。
Calibreの設定についてはLinux版と特に変わったところはないため、以前書いた記事を参照いただければと思います。
総務省発行の情報通信白書で学ぶ!マルチプラットフォーム多機能電子書籍管理ソフトCalibreのご紹介
Calibreの場合、デスクトップにcalibre 64bit - E-book management
というアイコンが作成されますが、この中身はテキストファイル(calibre 64bit - E-book management.desktop)でその中身は以下の通りです。
[Desktop Entry]
Name=calibre 64bit - E-book management
Exec=env WINEPREFIX="/home/hogehoge/firstwine" wine C:\\\\Program\\ Files\\\\Calibre2\\\\calibre.exe
Type=Application
StartupNotify=true
Comment=Manage your e-book collection and download news
Icon=EEF1_calibre.0
StartupWMClass=calibre.exe
Execの行に書かれているのが実行されるコマンドと推測します。この場合は起動時に引数は必要なさそうです。(後述)
プログラムのアンインストール
exe単独で実行するプログラムではなく、インストーラーでインストールしたWindowsアプリは、インストール情報を残していればアンインストールが可能です。
以下のコマンドを実行します。
$ wine uninstaller
インストール済みのアプリケーションが表示されるので、アンインストールするプログラムを選んで削除をクリックします。
アンインストールで削除されないデスクトップ上のファイルの他、以下のファイルも手動で削除する必要があるようです。
~/.config/menus/applications-merged/wine-Programs-*.menu
~/.local/share/applications/wine/Programs/*.desktop
~/.local/share/icons/*
~/.local/share/mime/*
~/.local/share/desktop-directories/wine-Programs-*.directory
Wine環境指定でWineプログラムを実行する
プログラムのインストールでデスクトップに作られるメニューは複数のWine環境を同時に動かすとぐちゃぐちゃになるので、独立して起動するプログラムをシェルスクリプトで作成することにします。また、このシェルスクリプト内で環境変数WINEPREFIXを指定することで、複数のWine環境がある場合でも特定のWine環境のプログラムを実行することも目的です。
多くのプログラムが単純に実行するexeファイルをメニューやデスクトップアイコンから実行しているだけなので、基本的には以下のシェルスクリプトをデスクトップに作成します。もしプログラムの起動時に何か引数が必要な場合はwineコマンドの実行行にそのまま指定します。
#!/bin/bash
# WINE環境を環境変数WINEPREFIXに指定
export WINEPREFIX="${HOME}/firstwine"
# wineコマンドの引数にexeファイルを指定する
wine "${WINEPREFIX}/drive_c/Program Files/Calibre2/calibre.exe"
このファイルの名前をcalibre_wine.sh
としてデスクトップに置いた場合、実行権を付与します。
$ chmod +x Desktop/calibre_wine.sh
Ubuntu MATEの場合、右クリックして開くを選ぶと実行するというのが候補にあるので、実行を選ぶとプログラムが起動します。
端末内で実行するを選ぶとターミナルを開いてその中でシェルスクリプトを実行するので、何かのきっかけにプログラムが落ちたりする場合はエラーメッセージが表示されることがあり、便利に使えると思います。
デスクトップやメニューに作成される.desktopファイルにPath=行がある場合は、シェルスクリプト内でwineコマンドを実行する前に該当ディレクトリにcdした方がいいかもしれません。
あとがき
持ち運び前提のWine環境の作成とプログラムのインストール・アンインストール、プログラムを起動するためのシェルスクリプトの作成をまとめました。
その他、全体的に参考にしたのは以下のサイトになります。
【追記】現在のUbuntuではKindle for PC 1.17.1がネットワークに接続できない→1.30を使うか旧Symantecのルート証明書を手動で読み込めるようにする
KindleのデスクトップアプリはLinux版が存在しないため、ブラウザ経由で閲覧するのが正規の方法になっていますが、Wine経由でWindows用のKindle for PCを使うことで閲覧が可能です。
ただ、個人的に以前最新バージョンのKindle for PCを試したところ全く動かなかったので動作実績のある旧バージョンを使用していましたが、今年に入っていつからか全く通信できなくなってしまいました。
どうも環境依存でUbuntuは駄目だけどFedoraのrawhideではOKみたいな感じで対応方法が全く思いつかなかったので気が向いた時に原因が解明されていないか検索したりしてはいたのですが、さっきやっと原因を特定した人のツイートを発見しました。
手元でも旧Symantecのルート証明書(VeriSign Class 3 Public Primary Certification Authority - G5)を入れることでWineでKindle 1.17.1が使えるようになりました。ただ私としては、証明書の追加なしでKindle 1.30が動くことを https://t.co/fjT55ZKuTa で確認したので、新版の利用をおすすめします。
— さがわ (@sagawa_aki) February 19, 2021
Ubuntuではca-certificatesパッケージでルート証明書が提供されており、Wineもそれを利用しています。Ubuntu 20.10のca-certificates 20200601では旧Symantecのルート証明書が含まれないようになり、Ubuntu 20.04 LTSでも2月上旬に配信された20210119~20.04.1から含まないようになったようです。
— さがわ (@sagawa_aki) February 19, 2021
削除された旧Symantecのルート証明書を使って接続していて、Ubuntuでは今年の2月にパッケージのアップデートで該当ルート証明書が削除されたとのこと。
削除されるにも理由は有る訳で、インポートされていると信用が保てなくなるので削除されているはずなのですが、今回はリスクを踏まえた上でこの削除されたルート証明書を手動でインポートします。
現在インストールされているca-certificates
パッケージを確認する
環境はUbuntu MATE 20.04 amd64、WineのバージョンはWineHQのwinehq-stable 6.0.0~focal-1です。
$ apt-cache policy ca-certificates
ca-certificates:
インストールされているバージョン: 20210119~20.04.1
候補: 20210119~20.04.1
バージョンテーブル:
20210119build1 99
99 http://jp.archive.ubuntu.com/ubuntu hirsute/main amd64 Packages
*** 20210119~20.04.1 990
990 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
990 http://archive.ubuntu.com/ubuntu focal-updates/main i386 Packages
990 http://archive.ubuntu.com/ubuntu focal-security/main amd64 Packages
990 http://archive.ubuntu.com/ubuntu focal-security/main i386 Packages
100 /var/lib/dpkg/status
20190110ubuntu1 990
990 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages
990 http://archive.ubuntu.com/ubuntu focal/main i386 Packages
現在インストールされている20210119~20.04.1がfocalでの更新版ですが、focalリリース時の20190110ubuntu1もそのまま見えるようになっているので、今回はこれを使います。
aptでパッケージファイルを取得(インストールしない)
適当なディレクトリを掘って、対象のパッケージファイルをダウンロードします。
$ mkdir tmp3
$ cd tmp3/
$ apt-get download ca-certificates=20190110ubuntu1
取得:1 http://archive.ubuntu.com/ubuntu focal/main amd64 ca-certificates all 20190110ubuntu1 [146 kB]
146 kB を 0秒 で取得しました (560 kB/s)
対象のルート証明書を抜き出して証明書ディレクトリにコピー、インポート
debファイルを分解します。
$ ar vx ca-certificates_20190110ubuntu1_all.deb
x - debian-binary
x - control.tar.xz
x - data.tar.xz
$ tar Jxvf data.tar.xz
./
./etc/
./etc/ca-certificates/
(snip)
./usr/share/ca-certificates/mozilla/VeriSign_Class_3_Public_Primary_Certification_Authority_-_G5.crt
(snip)
抜き出したルート証明書を/usr/local/share/ca-certificates/
にコピーします。私の場合別件でこのディレクトリを使っているのでディレクトリはありましたが、もしない場合は作成する必要があります。
SlackクローンのRocket.ChatをRaspberry Pi 4で運用する
$ sudo cp usr/share/ca-certificates/mozilla/VeriSign_Class_3_Public_Primary_Certification_Authority_-_G5.crt /usr/local/share/ca-certificates/
rootユーザーでupdate-ca-certificates
を実行してインポートします。
# update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
Adding debian:VeriSign_Class_3_Public_Primary_Certification_Authority_-_G5.pem
done.
Updating Mono key store
Mono Certificate Store Sync - version 6.12.0.122
Populate Mono certificate store from a concatenated list of certificates.
Copyright 2002, 2003 Motus Technologies. Copyright 2004-2008 Novell. BSD licensed.
Importing into legacy system store:
I already trust 132, your new list has 131
Certificate added: C=US, O="VeriSign, Inc.", OU=VeriSign Trust Network, OU="(c) 2006 VeriSign, Inc. - For authorized use only", CN=VeriSign Class 3 Public Primary Certification Authority - G5
Certificate added: CN=internal
2 new root certificates were added to your trust store.
Import process completed.
Importing into BTLS system store:
I already trust 132, your new list has 131
Certificate added: C=US, O="VeriSign, Inc.", OU=VeriSign Trust Network, OU="(c) 2006 VeriSign, Inc. - For authorized use only", CN=VeriSign Class 3 Public Primary Certification Authority - G5
Certificate added: CN=internal
2 new root certificates were added to your trust store.
Import process completed.
Done
done.
これでKindle for PC 1.17.1がAmazonに繋がるようになりました。(本当はWine実行時だけこのルート証明書を使いたいけど方法を見つけられず…)
スポンサーリンク
comments powered by Disqus