UbuntuにWineをインストール、環境として持ち運ぶ【Ubuntu上の証明書について追記】

Posted by 雅楽斎 on Tuesday, October 27, 2020

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ベース)です。

Ubuntu - WineHQ Wiki

# 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用のリポジトリを追加します。

Ubuntu - WineHQ Wiki

# 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

Wine missing ntlm_auth 3.0.25

I'm attempting to run a setup.exe file in wine which operates fine until I reach this error: err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= ...

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パッケージをインストールするように促すダイアログを表示しますが、これらが不要な場合は環境変数WINEDLLOVERRIDESmscoree,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がどの値を変更しているのか調べた結果、実際に変更している箇所のソースは恐らく以下です。

wine-mirror/wine

Contribute to wine-mirror/wine development by creating an account on GitHub.

この先頭に書かれている構造体定義が各バージョンの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の下のCurrentMajorVersionNumberCurrentMinorVersionNumberは変更後のレジストリでは見つけられませんでした。

(日本語)フォントを表示できるようにする

メニュー等のフォントは日本語の表示は問題ないんですが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/"

Installing other fonts on wine

Is there a way to install fonts on wine? I'm looking to install fonts so i can use them to render text differently on various apps. Specifically myriad.

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プログラムを実行する

プログラムのインストールでデスクトップに作られるメニューは複数の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環境の作成とプログラムのインストール・アンインストール、プログラムを起動するためのシェルスクリプトの作成をまとめました。

その他、全体的に参考にしたのは以下のサイトになります。

Wine環境(WINEPREFIX)を分けてWindowsアプリを上手に管理する

本記事は Wine 環境(WINEPREFIX)についてとこれを利用したWindowsアプリケーションの管理について書かれたものとなる。 元の記事は2007年11月に書かれたが、内容のほとんどを書き直している。

【追記】現在の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のルート証明書を使って接続していて、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実行時だけこのルート証明書を使いたいけど方法を見つけられず…)

スポンサーリンク


  1. backportsに入れてほしいなぁ… [return]
  2. 但し、Wine環境のディレクトリは~を指定すると展開されずにエラーになるため、絶対パスで指定するか$HOME等で展開させて代入させておく必要があるようです [return]
  3. Linux上のフォントを拾ってる? [return]

comments powered by Disqus