ディレクトリーごとにファイル名の大文字/小文字の区別の有無を設定可能に
「Build 17093」以降、ディレクトリーごとに大文字・小文字の区別の有無を設定する機能が導入されました。その機能とは「Per-directory case sensitivity」です。
DrvFSとWindowsのファイルシステム
「DrvFS」は、「WSL」上で動作する「Linux」から「Windows」のボリュームにアクセスするための仕組みです。「WSL」上で動作する「Linux」から見ると、「/mnt」以下に「Windows」のボリュームが自動的にマウントされます。
これが「DrvFS」でマウントされたボリュームです。
例えばCドライブは「/mnt/c」にマウントされ、「Linux」から「Windows」のファイルシステムにアクセスできます。
DrvFSとファイル名の大文字と小文字の区別
「Build 17093」以降、「DrvFS」でマウントされた「Windows」のボリュームで、ディレクトリーごとにファイル名の大文字・小文字を区別してファイルの操作を行えるようになりました。区別が有効ならば、同じディレクトリー内に「test.txt」と「TEST.TXT」ファイルを作成できます。
「WSL」上で動作する「Linux」からディレクトリーを作成すると、大文字・小文字を区別するフラグが設定され、そのディレクトリー内のファイル操作は大文字・小文字を区別するようになります。
そして「Build 17110」でさらにこの対応が進み、デフォルトでこのフラグによる大文字・小文字の区別を行うようになりました。
新しい仕組みの導入
「Windows」では「Per-directory case sensitivity」を活用し、大文字・小文字の区別に対し、より優れた相互運用性を提供します。一般的な「Windows」アプリでも、この機能を利用することができます。
そして「Build 17110」以降、本機能はデフォルトの機能として導入されます。
Windowsとファイル名の大文字と小文字の区別
ファイル名の大文字と小文字を区別する機能は、元々「Windows」でも実装されている機能です。Windowsアプリ
「Windows」で大文字・小文字だけが異なるファイルを扱うことは困難でした。「Windows」アプリはファイルシステムを大文字・小文字の区別なしに扱っているため、「Windows」アプリは大文字・小文字だけが異なるファイルを区別して扱うことができません。
例えば「エクスプローラー」は、ファイルシステムに大文字・小文字だけが異なるファイルが存在する場合、両方のファイルを表示しますが、ユーザーがそれらのファイルをクリックしてもいずれか一方のファイルだけを開きます。
FILE_FLAG_POSIX_SEMANTICS
「Windows 10」含む「Windows NT」系のOSは、ファイルシステムの操作に対し大文字・小文字を区別してファイルを扱う機能をすでに提供しています。「Windows」アプリは「CreateFile」APIに「FILE_FLAG_POSIX_SEMANTICS」フラグを指定することで、ファイルパスの大文字・小文字を区別することができます。
無効になっている
しかし「Windows XP」以降、互換性の理由からこの振る舞いを抑制するグローバルレジストリーキーが設定されており、アプリが「FILE_FLAG_POSIX_SEMANTICS」フラグを指定しても、すべてのファイル操作は大文字・小文字を区別せずに行われていました。レジストリーキーの設定を変更すれば「FILE_FLAG_POSIX_SEMANTICS」フラグを指定しているアプリは期待通り動作するでしょう。
しかしこの設定の変更は、すべてのドライブ上のすべてのファイル操作に影響を与えます。
これにより「Windows」アプリからアクセスできないファイルが存在することになり、アプリによっては正常に動作しなくなるでしょう。
FILE_FLAG_POSIX_SEMANTICSと異なる仕組み
さて「WSL」では「FILE_FLAG_POSIX_SEMANTICS」とは異なる仕組みを採用しています。上記のレジストリーキーに影響を受けずに、ファイルシステムの操作で大文字・小文字を区別することができます。
本機能は例え上記のレジストリーキーが設定されていたとしても、「WSL」上で動作する「Linux」アプリが本物の「Linux」環境で動作するように、大文字・小文字だけが異なるファイルを扱うことができます。
また「Windows」アプリでも、大文字・小文字だけが異なるファイルを扱うことができます。
Per-directory case sensitivity
上記で挙げた問題を解決するため、ディレクトリーに設定可能な大文字・小文字の区別の有無を示すフラグが導入されました。フラグが設定されたディレクトリーでは
このフラグが設定されたディレクトリーでは、そのディレクトリー内のすべてのファイル操作は、大文字・小文字を区別します。つまり大文字・小文字だけが異なるファイルを区別して扱うことができ、大文字・小文字だけが異なるファイルを複数作成することができます。
これは「FILE_FLAG_POSIX_SEMANTICS」とは無関係に機能します。
フラグは継承されない
このフラグはサブディレクトリーに継承されません。このフラグが設定されているディレクトリー内で、「Windows」からサブディレクトリーを作成すると、そのサブディレクトリーにフラグが継承されないため、そのサブディレクトリーは大文字・小文字の区別を行いません。
フラグの設定に書き込み権限が必要
「Windows」のツールである「fsutil.exe」を用いて、フラグのオン・オフを設定できます。ただしフラグのオン・オフを設定するには、そのディレクトリーに書き込み権限が必要です。
fsutil.exeの使い方
フラグの有効・無効を切り替える「fsutil.exe」の使い方は、以下を参照してください。Per-directory case sensitivityとWSL
「WSL」では、「DrvFs」でマウントされた「Windows」のファイルシステムとの相互運用性を改善するため、「Per-directory case sensitivity」を使用しています。3種類のマウントオプション
「DrvFs」で「Windows」のファイルシステムをマウントする際、大文字・小文字の区別に関する3種類のマウントオプションを利用できます。これらのマウントオプションにより、既存のディレクトリーの扱いと、「WSL」から作成した新規ディレクトリーの扱いを制御することができます。
case=dir | case=off | case=force | |
---|---|---|---|
フラグが有効なディレクトリー | 区別する | 区別する | 区別する |
フラグが無効なディレクトリー | 区別しない | 区別しない | 区別する |
WSLから作成したディレクトリーのフラグ | 有効 | 無効 | 有効 |
マウント オプション |
説明 |
---|---|
case=dir | フラグが設定されているディレクトリーは大文字・小文字を区別し、フラグが設定されていないディレクトリーは大文字・小文字を区別しません。 また「WSL(Linux)」からディレクトリーを作成すると、フラグを設定します。 |
case=off | フラグが設定されているディレクトリーは大文字・小文字を区別し、フラグが設定されていないディレクトリーは大文字・小文字を区別しません。 また「WSL(Linux)」からディレクトリーを作成しても、フラグを設定しません。 |
case=force | フラグの有無に関わらず、すべてのディレクトリーで大文字・小文字を区別します。 また「WSL(Linux)」からディレクトリーを作成すると、フラグを設定します。 |
デフォルトのマウントオプション
「Build 17110」以降「case」オプションが指定されなかった場合は、「case=dir」が指定されたものとして扱われます。以前の振る舞い
この仕組みが導入される以前の「WSL」と同じ振る舞いにするには、「case=force」を指定します。ただし「WSL」からディレクトリーを作成した時にフラグが設定される点のみ、以前の振る舞いと異なります。
ただし特別な理由がない限り、「case=force」の使用は推奨しません。
また「case=force」を使用するには、レジストリーの設定を変更する必要があります。
以下のコマンドを実行すれば、「case=force」を使用できるようになります。
reg add HKLM\SYSTEM\CurrentControlSet\Services\lxss /v DrvFsAllowForceCaseSensitivity /t REG_DWORD /d 1
自動マウントされるボリュームのマウントオプションを指定するには
「WSL(Linux)」起動時、「Windows」の固定ディスクが自動的に「/mnt」以下にマウントされます。自動マウントされるボリュームのマウントオプションを指定するには、「/etc/wsl.conf」もしくは「/etc/fstab」を利用してマウントオプションを指定してください。
詳細は以下を参照してください。
Per-directory case sensitivityが利用可能なボリューム
「DrvFs」でマウント可能なすべてのファイルシステムで、「Per-directory case sensitivity」が利用可能とは限りません。現時点では、ローカルのNTFSボリュームでのみ、「Per-directory case sensitivity」が利用可能です。
Per-directory case sensitivityの利用状況を調べるには
「Per-directory case sensitivity」の利用状況、すなわちどのマウントオプションが指定されているのか調べるには、「mount」コマンドを実行します。以下のようにマウントオプションが表示されます。
Windowsアプリからも大文字・小文字の区別が可能に
なにも「Per-directory case sensitivity」は「WSL」だけの機能ではありません。「Per-directory case sensitivity」により、「Windows」アプリからも、大文字・小文字だけが異なるファイルを扱えるようになります。
デフォルトでは、大文字・小文字を区別するフラグは設定されていない
デフォルトでは、すべての既存ディレクトリーに大文字・小文字を区別するフラグは設定されていません。そのため既存のディレクトリー内のファイルは、「WSL」から見ても大文字・小文字の区別は行われません。
例えば「WSL(Linux)」からメモ帳(notepad.exe)を実行する際、メモ帳は大文字・小文字が区別されないディレクトリーに配置されているため、ファイル名の大文字・小文字が一致していなくても、以下のようにメモ帳を起動することができます。
もちろん「Windows」からメモ帳を起動する時も、同様のことが言えます。