Ubuntu Weekly Recipe

第680回 LXDコンテナ上のWindowsでWSL環境を整える

この記事を読むのに必要な時間:およそ 5.5 分

WSL2の起動と初期設定

Windows Terminalを起動したら「wsl」と入力します。これでWindowsの上でUbuntuのCLI環境が整いました。

図4 Windows TerminalでのWSL

図4

いくつかやっておいたほうが良い設定を列挙しておきましょう。

リポジトリを日本のミラーに変更

日本に住んでいるのなら,日本のミラーリポジトリに変更しておいたほうが便利です。合わせてシステムのパッケージを更新しておきましょう。

$ sudo sed -i 's,//archive.ub,//jp.archive.ub,g' /etc/apt/sources.list
$ sudo apt update
$ sudo apt full-upgrade

もし「is not valid yet」などのエラーメッセージが出る場合は,時刻がずれている可能性があります。Windows側の時刻とタイムゾーンが正しいかどうかを確認の上,ずれているようなら設定の「時刻と言語」から正しい時刻に設定しておきましょう。なおシステム時刻を変更した場合は,WSLを再起動しないと反映されないようです。

なお,WSL環境ではsystemd-timesyncdのようなNTPクライアントは動いていません。そもそもinitがsystemdではなく,各種デーモンも起動していません。よって多少なりともずれが発生することは覚悟しておいてください※3⁠。

※3
WSL2の中でsystemdを動かす方法は存在します。

日本語ロケールの設定

これは人によりけりだと思いますが,もし日本語ロケールで使い,さらに各種メッセージも日本語で表示してほしいなら,次のように設定します。

$ sudo apt install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8

たとえば単に日本語ロケールになれば良く,メッセージの翻訳(Language Packのインストール)までは不要なら,次のような方法も存在します。

$ sudo locale-gen ja_JP.UTF-8
$ sudo update-locale LANG=ja_JP.UTF-8

ただしaptコマンドのように翻訳データがLanguage Pack以外の方法で提供されるソフトウェアについては,日本語で表示されます。

WSLの再起動

systemdが動いていないため,rebootコマンドは使えません。もしどうしても再起動したい場合は,Windows Terminal等から次のように実行します。

> wsl -t ubuntu
> wsl

-tで指定したシステムを終了させます。起動はもう一度wslコマンドを実行するだけです。

WSL起動時のカレントディレクトリを変更する

Windows Terminalを起動すると,自動的に%USERPROFILE%(C:\Users\<ユーザー名>)に移動します。この状態でWSLを起動すると,そのディレクトリのWSL上の表現である/mnt/c/Users/<ユーザー名>となってしまいます。

普通のUbuntuのようにホームディレクトリにしたい場合は,~/.profileの末尾にcd "$HOME/"の行を追加するという方法もありますが,Windows Terminal側でも設定できます。

まずはWindows Terminalのタブの右端にある,プルダウンメニューから「設定」を選択します。次にサイドバーのプロファイルから「Ubuntu」を選択します。⁠ディレクトリの開始」//wsl$/<ディストリビューション>/home/<ユーザー名>にしましょう。ディストリビューションはおそらく「Ubuntu」「Ubuntu-20.04」になるはずです。

図5 Windows Terminalの設定

図5

これによりWindows Terminalのプルダウンメニューもしくはタスクバーのアイコンを右クリックして「Ubuntu」を選べば,ホームディレクトリの位置でWSLが起動するようになります。

なお,Windows Terminalの起動時の状態は,スタートアップ設定の「既定のプロファイル」で設定できます。初期値は「Windows PowerShell」になっているため,PowerShellプロファイルの「ディレクトリの開始」を変更すれば,起動時のディレクトリを常に変更できます。また,既定のプロファイル自体を「Ubuntu」にしてしまえば,Windows Terminalを立ち上げると常にWSL2の中に入った状態で起動できます。

ちなみにWindows TerminalはJSONスクリプトからさらに細かい設定が可能です。好みに応じて追加の設定をすると良いでしょう。

プロンプトの調整方法

WSLはコマンドのプロンプト文字列としてユーザー名@マシン名:カレントディレクトリ$となっています。この部分はbashなり任意のシェルに依存するため,変更方法はUbuntuのときと同じです※4⁠。

※4
「WSL プロンプト」で検索すると高確率で「コマンドプロンプト(cmd.exe⁠⁠」の情報がヒットしてしまいます。CLIにおいてコマンドプロンプト(command prompt)とは,cmd.exeではなく,直前のコマンドが完了し次のコマンドの入力を促す(prompt)ための文字列を意味します。Ubuntuで端末を起動したときに表示されるユーザー名@ホスト名:カレントディレクトリ$がコマンドプロンプトです。これはOSやシェルによって異なりますし,ユーザーが任意の値を設定できます。ちなみにWindowsのコマンドプロンプトはpromptコマンドでコマンドプロンプトを変更できます。言い換えると,Windowsのcmd.exeはpromptコマンドでコマンドプロンプト文字列を変更できるということです。

ただUbuntuホストの時は上記の設定でもそれなりに実用的ではあるのですが,WSLだとマシン名部分が大文字だったり,Windowsのファイルシステムだとディレクトリパスが長くなりがちだったりするので,若干不便です。よってよくある例を元に,bashにおける最低限の調整方法だけ説明しておきましょう。

bashの場合,設定自体は~/.bashrcの末尾に次の行を追加します。

case "$TERM" in
xterm*|rxvt*)
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]WSL@$WSL_DISTRO_NAME\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    ;;
screen*)
    PS1="${debian_chroot:+($debian_chroot)}\[\e[38;5;202m\]\$(byobu_prompt_status)\[\e[38;5;245m\]WSL\[\e[00m\]@\[\e[38;5;172m\]$WSL_DISTRO_NAME\[\e[00m\]:\[\e[38;5;5m\]\w\[\e[00m\]\$(byobu_prompt_symbol) "
    ;;
*)
    ;;
esac

これによりプロンプトが,WSL起動直後はWSL@Ubuntu:~$となります。

環境変数PS1がプロンプトを司る部分です。これに適切な値を代入すれば,それに応じたプロンプトが表示されます。最初のPS1.bashrcに書いてあったものをベースに作っています。環境変数TERMscreen*のほうは,/usr/share/byobu/profiles/bashrcからByobuのPS1を持ってきています。

オリジナルからの変更点は次の2箇所です。

  • ユーザー名を表示する\uWSLに固定化
  • マシン名を表示する\h$WSL_DISTRO_NAMEに変更

ユーザー名の固定化はどうせWSLにおいてマルチユーザー的な使い方はしないだろうという措置です。ただしsudo -iなどを多用するならユーザー名を表示していてもいいかもしれません。

ホスト名はWindowsのマシン名の代わりにWSLのディストリビューション名を表示するようにしてみました。

プロンプトのカスタマイズは,上級のエンジニアも嗜む高尚な趣味の世界です。興味がでてきたらぜひ「自分にとって一番良いプロンプト」を探してみてください。簡単に時間が溶けます。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。