Windows Insider PreviewのBuild 17093では、Windows Subsystem for Linux(WSL)で起動時に簡易な設定を変更できる「wsl.conf」がサポートされた。
WSLの問題点の1つは、通常のLinuxディストリビューションのようにシステム起動時のスクリプト実行(rcスクリプト)をサポートしていないことだ。一般にLinuxシステムでは、起動時にスクリプトを使い、さまざまなデーモン(Windowsでいうサービス)を起動したり、ストレージデバイスのマウントなどができる。今回搭載されたwsl.confは、wslの初期設定を指定するためのもので、スクリプトではないが、ストレージデバイスのマウントと、hosts、resolv.confの自動生成といったWSL固有の動作を制御するものだ。
wsl.confを用いて起動時にWSLの設定をする
wsl.confは、「INI」形式と呼ばれるテキストの設定ファイル。WSL側の/etcディレクトリに配置される。WSLでは、起動時にこの/etc/wsl.confファイルを読み、初期設定をする。
このファイルは設定対象を指定するセクション行と設定値を示す設定行から構成されている。レジストリが導入される以前、Windowsの設定ではこのINI形式がよく使われていた。拡張子が「.INI」であり、現在でもWindowsディレクトリ以下にまだファイルがある。
セクションは起動時のDrvfsを制御する“[automount]”と、ネットワーク関連の“[network]”の2つ。これまでのWSLでは、Windowsが管理するドライブはすべて自動的にDrvfsでマウントされてきたが、このwsl.confを使うことで、それが制御できるようになる。
Drvfsを制御する設定値は、「enabled=」「root=」「options=」の3つ。これにLinux/Unix系で使われるfstabによるマウントの制御を許可するかどうかの「mountFsTab=」がある。
設定行 | 設定可能値 | 省略値 | 意味 |
---|---|---|---|
enabled | true/false | true | trueのときにWindows管理のドライブをDrvfsでマウントする |
root | 文字列 | /mnt/ | Drvfsのマウントポイント |
options | カンマ区切りのオプション値 | なし | Drvfsのマウントオプション値 |
mountFsTab | true/false | true | trueで/etc/fstabによる自動マウントを行なう |
「enabled=」は、Windows側のドライブをDrvfsで自動マウントするかどうかの設定。Build17093以前は、Windows側で管理している固定ドライブはすべてDrvfsで自動的にマウントされていた。この設定により自動マウントの可否を制御できるようになる。
「options=」は、このときに指定するマウントオプション。前々回で解説したDrvfs固有のオプションやLinuxのmountオプションが指定できる。ただし、このオプションは、Drvfsの自動マウント時にすべてのドライブに対して適用され、ドライブ個別にオプションを指定することはできない。
「root=」は、自動Drvfsマウント時のマウントポイントを指定する。Build 17093以前は、/mnt/に固定されていて、変更するには、コマンドラインからの再マウントが必要だった。
「mountFsTab」は、/etc/fstabによる起動時の自動マウントを有効/無効にする設定。Linux/Unix系のOSでは、/etc/fstabにマウントコマンドのオプションを記述しておくと、システムの起動時に自動的にマウントされる。WSLでは、起動はマイクロソフトの用意したinitプロセスが行ない、これまでのWSLでは、fstabによる自動マウントはなされていなかった。
enable=falseにすることで、drvfsの自動マウントはオフになる。
しかし、「mountFsTab」によるfstabの自動マウントは動作しなかった。手動で“mount -a”とすると正しくマウントされたため、記述は間違っていないと思われる。プレビュー版なのでなんらかの不具合があるのかもしれない。
Linux側の慣習からみれば、Drvfsの自動マウントをやめてfstabを有効にすればいいのだが、すでにRS3で正式版としてWSLをリリースした手前、過去との互換性を取らざるをえず、結果的にRS3までの自動Drvfsマウントと/etc/fstabによる自動マウントの両方を可能にするという折衷案になったと考えられる。
ネットワークの設定
WSLでは、起動時にWin32側のhostsファイル(C:\Windows\System32\Drivers\etc)とresolv.confが自動生成されて、/etcディレクトリに書き込まれる。hostsは、IPアドレスとホスト名の対応表で、DHCP普及以前にサイト内でホスト名とIPアドレスを定義するために使われていた。
現在では、DHCPとDNSサーバーの連携により、IPアドレス割り当てと名前解決が行なわれるため、ほとんど使われることはないが、唯一「localhost」とIPアドレスである「127.0.0.1」の対応だけが定義されていることが多い。
resolv.confは、DNSによる名前解決の設定ファイルで通常は、サイト内のDNSサーバーなどのアドレスが定義されているもの。Windowsには、これに相当するファイルはなく、レジストリなどに情報が記録されるが、これもWSLの起動時に生成されて書き込まれる。
これにより、WSLではWin32側と同じDNSサーバーを使って名前解決ができる。Windowsドメイン環境では、名前解決にDNSを使うため、WSL側でも同じDNSサーバーを使えるようにすることでWin32側と同じように名前解決ができるようになる。
これらのファイルは、静的な情報ではあるが、Win32側で利用している場合にWSL側からファイルを見る以外に名前解決を同じようにはできない。このため、WSLでは起動時にWin32側の情報を元に2つのファイルを自動生成させている。
wsl.confの“[network]”セクションで指定するのは、この2つのファイルの自動生成の有無。特にhostsファイルの場合、ユーザーがWSLのセッション内で書き換えても、次回起動時には、Win32側のhostsで上書きされ、設定が無効になっていた。簡易な解決方法としてWin32側のhostsを書き換えるものがあるが、同一のホスト名をWin32側とWSL側で別のものにしておきたいような場合、問題が出る可能性があった。
設定行はどちらも“true”か“false”を指定するもので、“true”の場合に自動生成が有効になる。
fstabの書き方
fstabは、起動時にシステム(systemd)が自動マウントするためのもので、mountコマンドのオプションに準じたパラメーターを記述する。ここでは、Drvfsの設定についてのみ簡単に解説する(manコマンドでfstabについて調べることができる)。
fstabは、6つのフィールドをスペース(あるいはタブ)で区切ったもの。フィールドは順に
ファイルシステム(file system)
マウントポイント(dir)
ファイルシステムタイプ(type)
オプション(options)
ダンプ(dump)
パス(pass)
となっている。「ファイルシステム」は、マウント対象となるデバイスやパーティションを指定する。Drvfsでは、「C:」や「D:」などのドライブ文字とコロンを指定する。「マウントポイント」は、マウント先となる空のディレクトリを指定し、cドライブなら「/mnt/c」などと指定する。なお、「/mnt」部分は、空であれば、ほかのディレクトリでもかまわない。
ファイルシステムタイプには「drvfs」を指定する。オプションは前々回で解説したように、「metadata」「uid」「gid」といったオプションをカンマで区切って指定する。ここでは、一般的なマウントオプション(たとえばリードオンリーを表すroなど)を指定することも可能。詳しくはmanコマンドでmountコマンドを調べてほしい。
ダンプは、バックアップ用ツールdumpが処理のときに対象とするかどうかの指定で通常は0を指定しておく。次のパスは、fsckがファイルシステムをチェックするときの順番を指定するものだが、drvfsはfsckによるチェックは不要であるため0を指定する。以上をまとめると
c: /mnt/c drvfs metadata,noatime,uid=1000,gid=1000,defaults 0 0
のようになる。
この連載の記事
-
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 -
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る -
第448回
PC
PowerShellで面倒なオブジェクトはPSCustomObjectに変換するのが早道 - この連載の一覧へ