WSLによる開発基本環境の構築

動作環境は Windows11 Home (22H2) です

BIOSの設定変更

Windows11に必要な設定

  1. メモリをオーバークロックで動作させる設定を行う。
    Over Clock Tunerを XMP にすると同時にメモリの動作クロック数を適切な値(ここでは2666MHz)に設定する。
  2. TPM を有効(PPT)にする。
    これはWindows11をインストールするために必要な設定となる。

WSLに必要な設定

  1. WSLを動作させるには、Intel Virtualization Technology を「有効」にしておく必要がある。

WSLによるlinux(Ubuntu-22.04 LTS)のインストール

  1. 現在導入可能なディストリビューションを表示以下のコマンドを投入する
    > wsl --list --online
    
  2. 現在導入可能なディストリビューションを導入以下のコマンドを投入する
    > wsl --install Ubuntu-22.04
    

    Ubuntuのターミナル画面が表示され、インストールが進行すると最後に規定ユーザーの username と password を求められる。ここで入力するユーザーがUbuntuを利用する上での基本アカウントとなる。

  3. 現在の導入環境を確認するコマンド以下のコマンドを投入する
    > wsl -l -v
    
  4. WSL をシャットダウンする以下のコマンドを投入する
    > wsl --shutdown
    

WSLの環境設定

環境設定用ファイルを修正する。修正した内容はWSLを再起動後に反映する。

$sudo vi /etc/wsl.conf
  1. 既定の操作ユーザーを設定する
    [user]
    default=tts;
    
    インストレーション時に選択したユーザーは自動的には設定されない。よってこれを設定しておかないと環境復元時に既定ユーザーがrootになってしまうため、この設定は必須である。
  2. WindowsとLinuxの相互運用性を設定するWindowsのコマンドはUbuntuサイドで敢えて使えないようにする。
    [interop]
    enabled = false
    appendWindowsPath = false
    

    以下のように cmd.exe を起動できなくなる

    $ cmd.exe
    cmd.exe: コマンドが見つかりません
    
  3. ホスト名を変更する
    [network]
    hostname=dev.ipadtaxi.jp
    generateResolvConf = false
    
    generateResolvConf = false は WSLが起動する際に /etc/resolv.conf を自動書換するのを禁止するための設定である。そして /etc/resolv.conf にはホスト名解決のためのネームサーバーをgoogle DNS(8.8.8.8) に固定することにより名称解決に関する諸問題を回避している。複数の開発機を使用するために dev.ipadtaxi.jp 自体のIPアドレスはDNSではなく、開発機毎に hosts により管理することにした。hostsはWSL側とWin32側の双方に登録する必要がある(2023-08-11追記)

    [/etc/resolv.conf]

    nameserver 8.8.8.8
    
  4. IPアドレスを調査する
    eth0: に割り当てられているIPアドレスを調べる。

    $ ip a
    ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:15:5d:bf:7a:de brd ff:ff:ff:ff:ff:ff
        inet 172.28.249.132/20 brd 172.28.255.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::215:5dff:febf:7ade/64 scope link
           valid_lft forever preferred_lft forever
    
    以下に示す値が割り当てられているIPアドレスである。
    inet 172.28.249.132/20 brd 172.28.255.255 scope global eth0
  5. IPアドレスを hosts に登録する
    $ sudo vi /etc/hosts
    

    [/etc/hosts]

    172.28.249.132 dev.ipadtaxi.jp
    
  6. rootユーザーのパスワードを設定するWin32側からUbuntuを起動するとUbuntuのターミナル画面が表示される
    引き続き、以下のコマンドを投入する

    $ sudo su -
    # passwd
    Enter new UNIX password: xxxxxxxx
    Retype new UNIX password: xxxxxxxx
    passwd: password updated successfully
    
    これで su コマンドを使用可能となる
  7. 日本語環境を設定する以下のコマンドを投入し、日付ロケールを「Asia/Tokyo」で設定する
    $ sudo dpkg-reconfigure tzdata
    

    引き続き以下のコマンドを投入する

    $ sudo apt install locales
    $ sudo apt install language-pack-ja
    $ sudo update-locale LANG=ja_JP.UTF-8
    
  8. 最新版へのアップデートを実行する
    以下のコマンドを投入する

    $ sudo apt update && sudo apt upgrade
    

ホストOS(Windows)の環境設定

wslconfigの変更

ユーザーディレクトリ上の設定ファイル .wslconfig を適宜変更することによりWSLの動作ポリシーの変更を行う。
これらの変更はWSLの再起動後に有効となる。

> notepad c:\users\[Windowsアカウント名]\.wsconfig
  1. localhostを有効にする
    通常 localhost は自分自身を指す特殊なホスト名であるが、Win32からみてこれをWSL上の仮想サーバーに割当したい場合は以下のエントリを追加する必要がある。

    [wsl2]
    localhostForwarding = true
    
    仮想ホストのIPアドレスを使うならばこの設定は不要(falseで良い)である。この設定を加えてもWin32側からはループバックアドレス 127.0.0.1 はWSL側ではなく、Win32側のリスナーを指す点に注意が必要となる。外部サービスからコールバックを受ける場合にホスト名にlocalhostを使おうとすると問題になることがありうるだろう。
  2. アイドリング対策を行う
    既定ではWSL関係のターミナルを全て閉じてから約6秒(60,000ミリ秒)で自動的にWSLがシャットダウンされてしまう。これを1時間(3600秒)に拡張するには以下のエントリを追加する必要がある。

    [wsl2]
    vmIdleTimeout = 3600000
    
    バックグラウンド処理されているサーバープロセス(例えばapacheやmysql)の起動を維持するためには最低限1つ以上のターミナルを起動しておく必要がある。これは最低1つ以上のWSLターミナルウィンドウが残されていれば(最小化されていても)良い。全てのターミナルウィンドウを閉じてしまうと、上記の秒数が経過した場合に自動的にシャットダウンされる点に注意する必要がある。

ホスト名の登録

WSL側のIPアドレスを hosts ファイルに登録する

> notepad c:\windows\system32\drivers\etc\hosts

[c:\windows\system32\drivers\etc\hosts]

172.28.249.132 dev.ipadtaxi.jp

シェルのチューニング

  1. lsコマンドで表示される日付表記を変更する~/.bashrc の該当行を修正
    [~/.bashrc]

    alias ls='ls --color=auto --time-style="+%Y-%m-%d %H:%M"'
    
  2. (その他のチューニング事項があればここに追記します)

ファイルシステムへのアクセス

Win32からWSLを参照する場合

以下の書式でパスを記載することでアクセスできる

\\wsl.localhost\[ディストリビューション名]\

(実際にWSLのルートディレクトリを参照した例)

WSLが起動していなくてもアクセスすることは可能だが、WSLを内部的に起動してからのアクセスとなる為かなりレスポンスが悪く感じる。すでに起動済の場合には特に遅いとは感じるレベルではない。

substコマンドを使って仮想ドライブとして割り当てすると使いやすくなる

> subst L: \\wsl.localhost\ubuntu-22.04\
> L:
> cd /home/tts

net useコマンドでも同様の割り当てが可能

> net use M: \\wsl.localhost\ubuntu-22.04
> M:
> cd /home/tts
https://segakuin.com/windows/powershell/subst.html
SUBSTで割り当てた仮想ドライブは、Windowsをログオフまたは再起動すると、割り当てが解除される。また、NET USEで割り当てた仮想ドライブは、Windowsをログオフまたは再起動しても、割り当てが維持される。
これらのやり方だとコマンドプロンプト経由のアクセスは可能だが、Windows Explolerからは物理ドライブとして認識されない。WSLのファイル領域はどうやらネットワークリソースとして認識されているようである。

WSLからWin32を参照する場合

以下の書式でパスを記載することでアクセスできる

/mnt/[ドライブレター]/

WSLからみたWin32のディスクは /etc/wsl.conf で登録された既定ログインユーザーの所有物として扱われる。また、ファイルのパーミッションは既定では全て777(rwxrwxrwx)になってしまう。
これらの問題を訂正するために /etc/wsl.conf に以下の設定を加え、WSLを再起動する。
Windowsファイルシステムをマウントする際のumaskを変更し、ユーザー/グループを www-data(33) に変更する例

[automount]
enabled = true
root = /mnt/
options = "uid=33,gid=33,metadata,umask=22,fmask=11"
mountFsTab = true

(実際にWindows11のCドライブを参照した例)

Windows上の隠しファイルやシステムファイルも全て表示されてしまうようである。先頭に . の付いたファイルは ls コマンドのオプション次第で表示されない事もある。

導入済環境のバックアップとリストア

  1. 現在の導入環境をバックアップする現在の導入環境を U:\backup\ubuntu_22.04_20230726.tar にアーカイブする例
    WSLをシャットダウンし、システムが稼働していないことを確認してから環境全体をアーカイブする

    > wsl --shutdown
    > wsl -l -v
      NAME            STATE           VERSION
    * Ubuntu-22.04    Stopped         2
    > wsl --export Ubuntu-22.04 U:\backup\ubuntu_22.04_20230726.tar
    
  2. アーカイブを使って導入環境をリストアする現在の導入環境を一旦削除し、アーカイブを使ってリストアする例
    WSLをシャットダウンし、システムが稼働していないことを確認してから環境全体を消去したうえで既存のアーカイブを使って環境をリストアする

    > wsl --shutdown
    > wsl --unregister Ubuntu-22.04
    > wsl --import Ubuntu-22.04 U:\wsl U:\backup\ubuntu_22.04_20230726.tar