hiroの長い冒険日記

主にコンピュータ周辺の興味を持った内容を綴ります

Windows11 WSL2 & WSLg Ubuntu の初期設定

Windows11 では WSLg が install 直後から使えるようになっています。特に設定しなくても WSL2 の command line で GUI application を実行すれば、Windows11 側で window が開いて表示されます。しかしながら、初期状態では日本語の表示と入力が出来ず、また Windows11 では 150% scaling されているのに対して、WSLg Ubuntu の表示は等倍で非常に小さく表示されてしまいます。これらの事を含めた WSL2 & WSLg の初期設定についてまとめて記載します。

日本語環境を整える

実機や仮想マシンUbuntu 等の Linux Distribution を install する際には、一番初めに「言語の選択」があり、日本語を選択する事が出来ます。それ以降の installer の表示は日本語で進める事ができ、install が終了して再起動した際にも日本語がちゃんと表示できる状態になります。昔の Linux では日本語環境を整えるだけでも一苦労でしたが、現在は installer の段階から日本語が表示できるというのは、これまで Linux に関わってきた方々の取組の結果であり感謝します。

Windows Terminal を使用すると、WSL2 の環境でも日本語が正常に表示できます。Windows Terminal で起動している Ubuntu の terminal に Windows11 の IME から入力して日本語名のフォルダを作成したり cd で移動したりする事も可能です。

しかし、install した後の素の状態では、Error Message や Man page が英語表示であり、GUI application の menu も英語です。日本語入力も出来ません。Windows 側の日本語入力は (今のところは) 使用することが出来ません。

まずは、WSLg の環境で

  • locale を ja_JP.utf8 にして日本語環境にする
  • 日本語のフォントを使用できるようにする
  • 日本語入力を GUI application で使えるようにする

という3点について使えるようにしてみました。

以下の page を参考にしました。
zenn.dev
astherier.com
kazblog.hateblo.jp

locale を ja_JP.utf8 にして日本語環境にする

まずは日本語の locale (ja_JP.utf8) を install、setting します。

$ sudo apt install language-pack-ja
$ sudo update-locale LANG=ja_JP.utf8
$ sudo apt install manpages-ja manpages-ja-dev

これで一旦 logout して login する (Ubuntu を終了してもう一度起動する) と、LANG 環境変数に ja_JP.utf8 が設定されます。この段階で、Windows Terminal 上の Ubuntu では、error message は日本語表示になりますし、man page も日本語が表示されます。

しかし、GUI application の menu 等は日本語で表示しようとするのですが、font が見つからずに乱れた表示となります。

日本語のフォントを使用できるようにする

Windows Terminal 以外でちゃんと日本語を表示させるためには、font を追加する必要があります。Ubuntu にも日本語の font が含まれていますが、Windows11 の Truetype font も使用できますので、こちらを追加して使えるようにします。

fontconfig が入っていない場合には install します。

$ sudo apt install fontconfig

/etc/fonts/local.conf を新規に作成して以下を追加します。

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>

これで Windows11 の Truetype font が使えるようになります。

$ fc-list | grep 'MS UI'
/mnt/c/Windows/Fonts/msgothic.ttc: MS UI Gothic:style=標準,Regular
$

日本語入力を GUI application で使えるようにする

fcitx-mozc を install します。これまで X 周りの application を install していない場合には大量に install されると思いますが、気にせずに進めます。

$ sudo apt install fcitx-mozc dbus-x11
$ sudo sh -c "dbus-uuidgen > /var/lib/dbus/machine-id"

.profile に追記します。

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
if [ $SHLVL = 1 ] ; then
  (fcitx-autostart > /dev/null 2>&1 &)
  xset -r 49  > /dev/null 2>&1
fi

一旦 WSL2 を終了して再起動します。
command prompt :

> wsl --shutdown
> ubuntu

fcitx-config-gtk3 で入力切替が Ctrl + Space になっているか確認します。

$ fcitx-config-gtk3

f:id:hiro20180901:20220211204001p:plain:w600
ここまでの設定で、GUI application で日本語が表示、入力できます。

試しに gedit を使用してみます。

$ sudo apt install gedit language-pack-gnome-ja

gedit で日本語を入力している状態です。

f:id:hiro20180901:20220212143625p:plain:w600

language-pack-gnome-ja を入れると menu が日本語になります。

fcitx の window が入力している文字の近くにないのは、今の所どうしようもないのでしょうね。徐々に完成度が高くなるのを期待します。

表示を 150% 拡大する

私の Monitor は 27inch の 4k (3840 x 2160) で、Windows11 の標準では 150% の拡大表示となっています。若干大きめですが、老眼が進んできた私の眼には丁度良い感じです。しかし、WSLg では等倍表示となっているので、文字が小さく見難い状態でした。今後は改善されるかもしれませんが、WSLg でも Windows11 と同じ 150% の scaling となるように調整しました。

調べてみると、3種類の方法がありました。

gsettings による方法

此方の page を参考にしました。
zenn.dev

gsettings command で text の拡大率を指定できます。

$ gsettings set org.gnome.desktop.interface text-scaling-factor 1.5

これで text が 150% で表示されるようになります。動的に反映されて再起動しても有効です。おそらく gnome application には有効だと思います。1.0 を設定すれば元に戻ります。

gnome-tweaks による方法

反映される個所は同じだと思いますが、gnome-tweaks を使用すると GUI で設定できます。

$ sudo apt install gnome-tweaks
$ gnome-tweaks &

f:id:hiro20180901:20220212154243p:plain:w600

左側の menu から「フォント」を選択して、倍率を「1.50」とすれば 150% に scaling されます。変更すれば直ぐに反映されます。また、上部でフォントの種類を指定できますので、gsettings よりも使いやすいかと思います。とりあえず MS UI Gothic と MS Pゴシックを使用するように設定しました。

gsettings でも gnome-tweaks でも、どちらでも text を 150% に scaling 表示させる事が出来ました。とりあえずは font の設定もできる gnome-tweaks を使ってみる事にしました。

.wslgconfによる方法

これまでの方法は、gnome の text を scaling する方法で、拡大された文字が綺麗に表示される反面、icon や graphic 画面は拡大されませんでした。icon については gnome-tweaks で適切な theme を選べば 反映されるかもしれませんが、graphic 画面についてはどうしようもありません。

どうしても graphic 画面を拡大表示したい場合には、WSLg の GUI を担当する Wayland が起動している仮想マシンの方の設定を変更する必要があります。

WSLg Configuration Options for Debugging
github.com

管理者で起動した Windows Terminal 内の WSL2 Ubuntu や、管理者で起動した Notepad じゃないと編集できません。

/mnt/c/ProngramData/Microsoft/WSL/.wslgconfig :

[system-distro-env]
;hi-dpi
WESTON_RDP_DISABLE_HI_DPI_SCALING=false
WESTON_RDP_DISABLE_FRACTIONAL_HI_DPI_SCALING=false
;100 to 500
WESTON_RDP_DEBUG_DESKTOP_SCALING_FACTOR=200

WESTON_RDP_DEBUG_DESKTOP_SCALING_FACTOR に % で指定します。WSL2 を shutdown して再起動すると反映されます。

command prompt :

> wsl --shutdown
> ubuntu

150 も設定できますが、単純に1.5倍するので表示が汚くなります。200 だと粗が目立ちません。こちらの設定では、例えば qemuSDL の表示も大きくなります。

流石に 200% scaling だと大きすぎるので、graphic 表示はガマンして text の 150% scaling で使ってみる事にします。

参考

5ch に参考になるログがありましたので引用します。(link は広告が色々とアレなのでやめておきます)

BashWindows Subsystem for Linux【WSL】10 の 959 :

wayland/gtk3アプリのウィンドウフレーム含むテーマは
gnome-tweaksで簡単に設定できます。

自分はjava/node.js/pythonとかの開発目的
DOS窓PowerShellで苦労するのは時間の無駄
WSLgではemacs/zeal/electron等ほんといくつかさえ動けばいいい
日本語はemacsでしか入力しないからIMEも要らん
VS CodeIntellijWindows側からシームレスに使えるし
WSLgでざっとやったことは

  • waylandアプリの4K 150%スケーリング

C:\ProgramData\Microsoft\WSL\.wslgconfに
[system-distro-env]
WESTON_RDP_DISABLE_FRACTIONAL_HI_DPI_SCALING=false

環境変数設定
export GDK_DPI_SCALE=1.5
export QT_SCALE_FACTOR=1.5
export QT_QPA_PLATFORMTHEME=gtk2
export GTK2_RC_FILES=/usr/share/themes/Materia-dark-compact/gtk-2.0/gtkrc

  • emacsのwaylandアプリ化

お勧めhttps://github.com/flatwhatson/emacs.git

  • vGPU対応mesaのインストール

sudo add-apt-repository ppa:kisak/kisak-mesa
sudo apt-get update

簡単でしょw

私は emacs は使いませんし、vGPU mesa も今の所は使用しませんが、前半部分は非常に参考になりました。QT_SCALE_FACTOR 等は KDE application に有効だと思います(未確認)。

daemon の起動

WSL2 では Microsoft 独自の init が PID 1 で動作しています。その為、Ubuntu を含む最近の distribution で使用されている systemd では daemon を起動できません。かと言って runlevel で切り替える昔ながらの SystemV init という訳でもないようです。/etc/rc5.d/等の folder は存在していますが、runlevel command の結果は

$ runlevel
unknown

unknown であり、ps aux の表示を見ても daemon は殆ど起動していません。日本語入力の際に install した dbus と fcitx が起動しているのみです。

hiro@hiro-pc:~$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   1756  1080 ?        Sl   10:53   0:00 /init
root         8  0.0  0.0   1756    80 ?        S    10:53   0:00 /init
hiro        46  0.0  0.1  73680 18232 ?        Sl   10:53   0:00 /usr/lib/mozc/mozc_server
root        66  0.0  0.0   7036  2140 ?        S    10:54   0:00 dbus-launch --autolaunch c7e7d303d524f8d1ca0c95aa6205f7
root        67  0.0  0.0   7112  2424 ?        Ss   10:54   0:00 /usr/bin/dbus-daemon --syslog-only --fork --print-pid 5
root        69  0.0  0.0 309012  8444 ?        Sl   10:54   0:00 /usr/libexec/at-spi-bus-launcher
root        74  0.0  0.0   7112  3820 ?        S    10:54   0:00 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/
root        81  0.0  0.0 162880  6508 ?        Sl   10:54   0:00 /usr/libexec/at-spi2-registryd --use-gnome-session
root       158  0.0  0.0   1756    80 ?        Ss   13:29   0:00 /init
root       159  0.0  0.0   1756    80 ?        R    13:29   0:00 /init
hiro       160  0.0  0.0   9448  5132 pts/0    Ss   13:29   0:00 -bash
hiro       230  0.0  0.0   7036  2116 pts/0    S    13:29   0:00 dbus-launch --autolaunch c7e7d303d524f8d1ca0c95aa6205f7
hiro       231  0.0  0.0   7112  2496 ?        Ss   13:29   0:00 /usr/bin/dbus-daemon --syslog-only --fork --print-pid 5
hiro       234  0.4  0.2 106216 43492 ?        S    13:29   0:00 fcitx
hiro       241  0.0  0.0   7112  2880 ?        Ss   13:29   0:00 /usr/bin/dbus-daemon --syslog --fork --print-pid 5 --pr
hiro       245  0.0  0.0   5392   208 ?        SN   13:29   0:00 /usr/bin/fcitx-dbus-watcher unix:abstract=/tmp/dbus-rMF
hiro       248  0.0  0.0   9928  3348 pts/0    R+   13:29   0:00 ps aux

WSL2 で systemd を使えるようにする事も出来るようです。後で試してみようと思っています。
snowsystem.net

この辺りも今後改善されるかもしれませんが、とりあえずは手動で起動させる方法で使ってみる事にしました。

方法は二種類あります。

/etc/init.d/ 以下の script を実行する

昔ながらの SystemV 方式です。/etc/init.d/ 以下にある daemon の script を使用して、起動・停止します。例えば cron であれば、

$ /etc/init.d/cron status
 * cron is not running
$ sudo /etc/init.d/cron start
 * Starting periodic command scheduler cron                                                                      [ OK ]
$ /etc/init.d/cron status
 * cron is running
$ ps aux | grep cron
root       287  0.0  0.0   7848  2148 ?        Ss   13:36   0:00 /usr/sbin/cron
hiro       296  0.0  0.0   7352   728 pts/0    S+   13:37   0:00 grep --color=auto cron
$ sudo /etc/init.d/cron stop
 * Stopping periodic command scheduler cron                                                                      [ OK ]

と操作できます。

service command を使用する

service command でも同様の事が出来ます。

$ which service
/usr/sbin/service
$ dpkg -S /usr/sbin/service
init-system-helpers: /usr/sbin/service
$ service cron status
 * cron is not running
$ sudo service cron start
 * Starting periodic command scheduler cron                                                                      [ OK ]
$ service cron status
 * cron is running
$ ps aux | grep cron
root       355  0.0  0.0   7848  2144 ?        Ss   13:51   0:00 /usr/sbin/cron
hiro       366  0.0  0.0   7352   728 pts/0    S+   13:57   0:00 grep --color=auto cron
$ sudo service cron stop
 * Stopping periodic command scheduler cron                                                                      [ OK ]

/etc/init.d/ に script が存在しない場合

application によっては、systemd と SystemV の script を分けてpackage としている場合もあります。例えば libvirtd は、

$ apt search libvirt
…略…
libvirt-daemon-system-systemd/focal-updates 6.0.0-0ubuntu8.15 amd64
  Libvirt daemon configuration files (systemd)
libvirt-daemon-system-sysv/focal-updates,now 6.0.0-0ubuntu8.15 amd64 [インストール済み]
  Libvirt daemon configuration files (sysv)
…略…
$ dpkg -L libvirt-daemon-system-sysv
/.
/etc
/etc/init.d
/etc/init.d/libvirt-guests
/etc/init.d/libvirtd
/etc/init.d/virtlogd
/usr
/usr/share
/usr/share/doc
/usr/share/doc/libvirt-daemon-system-sysv
/usr/share/doc/libvirt-daemon-system-sysv/changelog.Debian.gz
/usr/share/doc/libvirt-daemon-system-sysv/copyright
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/libvirt-daemon-system-sysv

となっていますので、libvirt-daemon-system-sysv を install する必要があります。

daemon自動起動させたい場合

どうしても Windows11 の起動時に daemon を起動させたい場合には、Windows11 のタスクスケジューラで起動させる必要があるようです。以下の link 先は docker の場合ですが、別の daemon でも同様に可能でしょう。
qiita.com
ただ、一般ユーザーで password なしで service を起動させる等、私にはちょっと?な方法です。今回は手動で service で起動させますが、どうしても必要な場合には設定しようと思います。

まとめ

今回は、WSL2 & WSLg の初期設定についてまとめてみました。

  • locale を日本語に設定 (ja_JP.utf8)
  • Windows11 の日本語フォントを使用
  • 日本語入力の設定 (fcitx-mozc)
  • text を 150% scaling する設定 (gnome-tweaks)
  • daemon を起動 (/etc/init.d/ 以下の script)

ここまで設定すれば、日常的に WSL2 & WSLg を使用するには困らないと思います。今後も WSLg の update で更に使いやすくなると思いますので、その際にはこの記事に追記しようと考えています。

Kioxia の工場で不純物の混入が発生しているようです。
四日市工場と北上工場の操業について | KIOXIA
Western Digital Comments on Production Status of its Joint Venture Flash Memory Manufacturing Facilities | Business Wire
今の所、Amazon の価格も落ち着いているようです。早期の解決を願っています。