Wine飲みてえ

飲みてえ(完全に理解してえ)。

Wineに限ったことではないのですが、数ヶ月前にデスクトップ環境で色々と不都合を感じることが多くなった折、
それを受けてOSレベルからの再セットアップを行いました。
試行錯誤……というほどでもないものの、だいぶポカも多かったので同じ轍を踏まぬようにこの記事を備忘録としておきます。

Windows boot manager(WBM) と Linux側のboot loaderのお話

Wineと言いつつまずはこちらから。
前にLinux環境をクリーンインストールし(ようとしてWindows10環境が入ったパーティションを潰してしまっ)た時、
改めてArch Wikiに目を通してみました。
すると、Linux環境を先にインストールするパターンもあることが判明。
ボクはそれまで、Windows環境をインストールした際にできたUEFIパーティションを使ってLinuxをインストールするパターンしか知らなかったもので、
その時以来新しく知った前者のパターンを使ってみることに。
で、それが案外簡単なモノだったのです。
(おそらく後述のboot loader修復コマンドbcdbootがよしなにしてくれる)
従って今回もそのパターンで行くことにしました。

> bcdboot C:\Windows /s P:

予めLinux側からboot loader(以前はsystemd-bootで今はrEFInd)をインストールしておいたパーティションに対し
Windows10のブータブルメディアからプロンプトを起動して、
diskpartassign letter(ここではassign letter=P)した後上のコマンドを実行すると、
WBMがboot loader側から検知されるようにインストールできます。

この時注意点が3つ。
WBMをインストールすると、起動ドライブの順序が勝手に変えられます。BIOSからLinux側のboot loaderが入ったドライブを最上位にもってきます。
更にbcdbootは他にも様々なオプションをもっており、間違ってそれを使うとboot loaderがクリーンインストールされる憂き目に合ったりします。今回はここで1ミス。
bcdbootを直接使った記憶はあまりなかったので今回はきっちり記憶に残すことができそうです(白目)。
もう1つとして、boot loaderが入ったパーティションのマウントポイントはデュアルブート時/boot/efiとするのが前提です。

rEFIndインストール時のルートディレクトリ指定

WBMにbcdbootなるインストーラがあれば、Linux側のboot loaderにもインストーラは存在します。
systemd-bootの時はbootctl installでした。最近使い始めたrEFIndだとrefind-installがそれに当たります。
しかし、rEFIndが入ったパーティションのマウントポイントが/boot以外だと、単純にrefind-installしてもinitramfsがきちんと認識されないことがあります(再現性が確定しているワケではありませんがその可能性もありそう、くらい)。ここで今回2ミス目。
というワケで、--rootオプションでルートディレクトリを指定してやらなければなりません。

$ refind-install --root /mnt

これはArch Linuxのインストーラ内で/mntに環境を作った後arch-chroot /mntする前に実行したコマンドだったので、
chrootした後なら--root /としてやれば大丈夫……だと思います。

chrootで入ってからrefind-installするとrefind.confがarchのインストーラを起動ディスクとして扱う設定になってしまうようで(仮想環境にてテスト)、
入る前に実行するのが無難らしい。

Wine実行時の諸問題

さて、ようやくWineの話。
ボクはWindowsのみ対応のゲームをLinux側で遊ぶこともしばしばあるのですが、以前インストールした環境ではいくつか問題点を抱えていました。

  1. 日本語フォントが機能せず、文字化けする
  2. 通常の文字キーがWine上で反応しない

1点目については、日本語ロケールの解放忘れと環境変数の設定に起因する問題でした。
/etc/locale.genからja_JP.UTF-8をコメントアウトしlocale-genをやり直すと、環境変数LANG(あるいはLC_ALL)の変更が有効になりました。
その上で、今回は/usr/local/bin/LC_ALLを指定したシェルスクリプトファイルwineを配置。
これで端末側からの実行でも、ファイルマネージャからの実行でも日本語が文字化けせず表示されるように。
(ちなみにLinux環境全体のロケールは英語に設定しており、それを覆したくはないのでこういう設定をしています)

2点目はまだ完全解決していない問題で、どうやらWineがキーボードを英語配列として認識していることが原因らしく……
Wine側で設定のしかたがイマイチ分からず、現状IMEに英語配列を入れておくことで対処しています。 最初に記事を書いた頃はこれ以上の解決策が浮かびませんでしたが、もう少し負担を軽減するため策で以下のようにしました。

  1. Xorgのキーボード配列設定を一度リセットする
  2. wine実行時のみ、変数XMODIFIERSを使ってキーボード配列を英語にする

1点目は環境セットアップの際にlocalectlで生成したXorg用のキーボード設定/etc/X11/xorg.conf.d/00-keyboard.confを削除。

2点目は先のwineスクリプトに変数指定を追加(en)することで、差し当たり常用するキーはwineでも使えるようになりました。
……まあ理想はwineでもキーボードがきちんと日本語配列として認識されることなんですけどね。

Written on January 11, 2021