• Windows Subsystem for Linuxガイド 第6回 ドライブファイルシステムその1

Windows Subsystem for Linux(WSL)では、WSL側からWin32側のファイルシステムを操作するための「ドライブファイルシステム」が装備されている。

ここでは、このドライブファイルシステムの設定とその挙動に関して解説を行う。なお、ドライブファイルシステムなどのWSLのファイルシステムに関しては、基本的な解説をこの連載ですでに行っているため、この記事では繰り返さない。以下の記事を参考にされたい。また、WSLの各種ファイルシステムの表記は以下の第4回のものを利用する。

・WSLガイド 第4回 ファイルシステム編
https://news.mynavi.jp/article/20220303-2284619/
・WSLガイド 第5回 wsl$ファイルシステムとWSLファイルベンチマーク編
https://news.mynavi.jp/article/20220318-2296803/

Linuxのファイルシステム

NTFSをLinux側からアクセスするためのドライブファイルシステムについて解説する前に、Linuxのファイルシステムについて簡単に確認しておく。確認なので、Linuxのファイルシステムについてよくご存じの方は読み飛ばしていただいてかまわない。

Linuxでは、すべてのファイルシステムをいったん「仮想ファイルシステム」(VFS)として扱う。これにより、さまざまなファイルシステムを使っても、アプリケーションからは、同じようにファイルの読み書きなどができるようになっている。こうしたLinuxのファイルシステムは、Windowsの標準ファイルシステムであるNTFSと比較すると、いくつかの違いがある(表01)。

  • ■表01

最大の違いは、Linuxでは、Unix以来の伝統としてファイル名やディレクトリ名では、大文字小文字を区別するという点だ(以下文字ケースの区別と表記)。だから同じディレクトリに「TEST」と「test」というファイルが共存できる。

ファイルのアクセス権をUnix/Linuxでは、「ファイルパーミッション」あるいは略して「パーミッション」と言う。パーミッションは「所有者(ユーザー)」、「グループ(の所属ユーザー)」、「その他のユーザー」の3者に対して、読み出し、書き込み、実行の許可/禁止が設定できる。このアクセス権をそれぞれ1ビット(たとえばユーザーの書き込み、読み出し、実行許可がそれぞれビットに対応)に対応させ、合計9ビットの数値でパーミッションを表現することがある。

パーミッションを設定するのは、ファイルやディレクトリを作成したユーザーであり、そのユーザーが「所有者」となる。作成後のパーミッションの変更は、chmodコマンドで、所有者の変更はchownコマンドで行う。

ファイルやディレクトリの作成時、所有者ユーザーが所属するプライマリグループ(/etc/passwdのユーザー設定に記述されているグループ)が記録される。これは、chgrpコマンドで変更できる。

ユーザーのパーミッションの初期値は、umaskと呼ばれ、同名のシェル組み込みコマンドなどで予め設定しておく。ファイルパーミッションは、ディレクトリとファイル、サブディレクトリなどの「親子」関係などによる継承は行われず、ユーザーのumask設定に従う。セキュリティ上の配慮から初期状態でファイルを実行可能にすることはできず、ユーザーが明示的にchmodコマンドで実行許可を出す必要がある。

Linuxでは、ファイルシステムはマウント処理(mount)を行うことで利用可能となる。一般にLinuxでは、起動時には、/etc/fstabに記述されているファイルシステムをマウントするようになっている。ただし、WSLでは、この動作をデフォルトでは禁止しており、後述する/etc/wsl.confで制御できる。

NTFSとLinuxファイルシステム

MS-DOSからのファイルシステムの互換性を引き継ぐNTFSでは、ファイル名やディレクトリ名は書き込み時の文字ケースの区別は残るものの、ファイルを読み書きするときのパス指定では文字ケースを区別しない。このため、通常状態では、「TEST」というファイル名があるディレクトリ(フォルダー)には、「test」というファイルを作ることができない。 NTFSは、機能として文字ケースを区別することはできたが、Windowsでは区別しない設定で使われている。Windows 10 Ver.1809(RS5)以降では、WSLに対応するため、ディレクトリごとに大文字小文字を区別する設定が可能になった(写真01)。

  • 写真01: Windows 10 Ver.1809からは、NTFSで、ディレクトリごとに文字ケースの区別を制御できるようになった。標準状態では、文字ケースが異なっても同じファイルとみなされる(写真上)が、ディレクトリごとに可能な設定で、文字ケースを区別するように変更できる(写真下)

Windowsでは、ファイルのアクセス権は、ACL(Access Control List)と呼ばれる情報で管理される。ACLは、ユーザーやプロセスなどのアクセス権が付与される対象(Windowsではプリンシパルと呼ぶ)と、アクセス許可を組み合わせたACE(Access Control Entry)を複数組み合わせて「リスト」にしたものだ。1つのACLには複数のACEを登録できるため、細かいアクセスコントロールが可能になる。また、ACLは、基本的には、親となるオブジェクトから継承が行われる。

/etc/wsl.confとドライブファイルシステム

/etc/wsl.conf(以下wsl.confと略記する)は、WSLディストリビューションごとのWSL固有の挙動を設定するためのファイルだ。このファイルは、俗にini形式と呼ばれるWindowsで使われているテキストファイル形式でこれを記述する。これについては、本連載の過去記事を参照されたい。

・WSLガイド 第3回 WSL2動作設定編
https://news.mynavi.jp/article/20220207-2266984/

ただし、wsl.confの文字コードはUTF-8で行末コードはLFのみのLinuxのテキスト形式を利用する。また、WSLは、wsl.confのエラーを表示しない。

また、wsl.confを書き換えたあと、ディストリビューションを再起動させる必要がある。そのためにはすべてのセッションを終了し、Win32側のコマンドラインから以下のコマンドを使ってディストリビューションを終了させる。


wsl.exe --terminate  〈ディストリビューション名〉

上記コマンド実行後、ディストリビューションが停止していることを確認する。


wsl.exe -l -v

これで該当ディストリビューションが“Stopped”になっていることを確認する。その後、ディストリビューションを起動することて、wsl.confの設定が有効になる。

ドライブファイルシステムの設定は“[automount]”セクションで行う。ここには、(表02)のような設定キーがある。これらの設定キーのうち“enabled”で自動マウントの有効(true)、禁止(false)を行い、“root”と“options”は有効の場合の振る舞いを設定するものだ。

  • ■表02

これに対して“mountFsTab”は、WSLディストリビューション起動時のfstabによるマウント処理の有効、無効を切り替えるものだ。ただし、fstabでマウントする場合、wsl.confのrootやoptionsの指定は無視され、fstab内での指定のみが有効になる。

設定キーが別なので、enabledとmountFsTabの指定は独立して行える。このため、自動マウントもmountFsTabのマウントもともに有効という指定も可能だ。ただし、Linuxでは同一のファイルシステムを同時に2つマウントすることはしないため、fstabで指定したファイルシステムは自動マウントが行われない。

このとき、fstabで指定されないが自動マウント可能なドライブがあれば、自動マウントが行われる。ドライブC、Dがあったとき、fstabでCだけをマウントしたとき、Dは自動マウントされる。

複数のドライブが自動マウントされるとき、すべてのドライブをマウントしたくない場合には、enabled=false、mountFsTab=trueとしてfstabで必要なマウント処理を行う。

root設定キーは、ドライブファイルシステムのマウント先となるディレクトリを指定する。デフォルトは、“/mnt”で、その下にドライブ文字と同じc、d、と1文字のディレクトリが続く。root設定キーでディレクトリを指定すると、自動的にディレクトリが作られ、その下に同じやり方でマウントが行われる。

mountFsTab

wsl.confのautomountセクションでmountFsTab=trueとすると、WSLの起動時にfstabによるマウント処理が有効になる。fstabの形式や基本的な動作に関しては、fstabのmanページに記述がある。

マウントは、fstab形式でマウントコマンドを記述する。具体的には、以下のようなマウントコマンド行をfstab内に記述する。fstabの各行はスペースで6つの部分にわけられている。逆にいうとオプションなどにスペースを入れることはできない。


C:\134␣/mnt/c␣drvfs␣〈オプション〉␣0␣0

␣:ASCIIスペース文字を表す

最初の「C:\134」は、マウントデバイスの指定で“\134”はエスケープ表記による逆スラッシュである。2つめはマウント先の指定、3つめはファイルシステムタイプの指定でここでは“drvfs”を指定すると、WSL2では自動的に9pファイルシステムになる。4つめは、オプションの指定である(オプションについての解説は次回に行う)。5番目、6番目は、ゼロを指定する。

自動マウントしたときのコマンドラインは、起動後に/etc/mtabで見ることができる(写真02)。ここにあるコマンドで3つめのマウントタイプのみを書き換えて利用することで、fstab内でもドライブファイルシステムのマウント用コマンドを正しく記述できる。ドライブファイルシステムに限らず、マウントタイプは/sbinにあるマウントドライバーの「mount.~」というファイル名のピリオドから後ろの部分のみを指定する。ドライブファイルシステムには、WSL1で使われるdrvfsとWSL2で使われる9pの2つのファイルシステムタイプがあるが、どちらもマウントタイプとしてはdrvfs(/sbin/mount.drvfs)を使う。

  • 写真02: Linuxでは、マウント状態はmountコマンドで表示でき、マウント時に実行されたコマンドは、fstab形式で/etc/mtabファイルに記録されている

なお、fstabでドライブファイルシステム用に指定するオプションの一部は、wsl.confのautomountセクションのoptionキーの指定に使うものと同一である。

次回は、ドライブファイルシステムのオプション設定やwsl.confのoptionキーとその挙動について解説する。