ディレクトリーごとに大文字・小文字を区別する機能の改善
「Build 17692」では、ディレクトリーごとにファイル名の大文字・小文字を区別する機能が改善されました。ファイル名と大文字・小文字の区別
「WSL」では、「Linux」のようにファイル名(ディレクトリー名含む)の大文字・小文字を区別してファイルを扱うことができます。一方以前の「Windows」では、「Windowsアプリ」はファイルシステムを大文字・小文字の区別なしに扱うため、大文字・小文字のみが異なるファイルに「Windows」からアクセスすることができませんでした。
ディレクトリーごとの大文字・小文字の区別
この状況を改善するため、ディレクトリーごとに大文字・小文字を区別する機能が導入されました。これにより「WSL」及び「Windowsアプリ」から大文字・小文字のみが異なるファイルにアクセスできるようになりました。
通常「Linux」の開発者は、ファイルシステムが大文字・小文字を区別することを期待しているため、「WSL」から「Windowsのボリューム(DrvFs)」上にディレクトリーを作成すると、デフォルトで大文字・小文字を区別するディレクトリーを作成します。
Windowsアプリに対する副作用
ディレクトリーごとに大文字・小文字を区別する機能が一部の「Windowsアプリ」に意図しない影響を与えました。一部の「Windowsアプリ」では、ファイルシステムが大文字・小文字を区別しないことを前提にファイルを参照します。
例えばファイル名をすべて大文字もしくは小文字に変換してファイルを参照するアプリがこれに該当します。
このようなアプリは、大文字・小文字を区別するディレクトリー内のファイルにアクセスすることができません。
長期的な観点では、この問題に対する好ましい解決策は、アプリ側で大文字・小文字の区別を意識した実装に修正することです。
しかし必ずしもアプリが修正されるとは限りませんし、ユーザーによっては、普段利用するアプリがこの問題に該当しており、アプリが修正されるまで待ち続けるというのも現実的な選択肢ではないでしょう。
加えて「Windowsアプリ」が大文字・小文字を区別するディレクトリー内にサブディレクトリーを作成すると、そのサブディレクトリー内のファイルは大文字・小文字の区別が無効になります。
この振る舞いにより、大文字・小文字を区別するディレクトリー内でWindowsのソフトウェアと連携した作業が困難になります。
大文字・小文字を区別する機能の改善
上記を踏まえ、大文字・小文字を区別する機能に2つの改良が行われました。一つは「WSL」内で大文字・小文字の区別の有無を制御するLinux拡張属性の導入です。
もう一つは、新規に作成されたディレクトリーに大文字・小文字の区別の有無を示すフラグの継承です。
1.Linux拡張属性を利用して大文字・小文字を区別する機能を制御する
「Build 17692」では、Linux拡張属性を利用して大文字・小文字を区別する機能の調査や制御が可能になりました。拡張属性
大文字・小文字の区別を制御する拡張属性名は「system.wsl_case_sensitive」です。この拡張属性の値が「0」ならば、そのディレクトリーは大文字・小文字を区別しません。
この拡張属性の値が「1」ならば、そのディレクトリーは大文字・小文字を区別します。
attrのインストールを
拡張属性にアクセスするには、事前に「attr」パッケージをインストールしておきます。以下のコマンドを実行すれば、「attr」パッケージをインストールできます。
sudo apt install attr
大文字・小文字の区別の有無を調べるには
「WSL」から大文字・小文字の区別が有効になっているかどうか調べるには、以下のコマンドを実行します。
getfattr -n system.wsl_case_sensitive <ディレクトリーのパス>
大文字・小文字の区別が有効なディレクトリーならば、以下のように出力されます。
大文字・小文字の区別が無効なディレクトリーならば、以下のように出力されます。
大文字・小文字の区別の有無を指定するには
既存のディレクトリーに対し、大文字・小文字の区別の有効・無効を切り替える方法です。大文字・小文字の区別を有効にするには、以下のコマンドを実行します。
setfattr -n system.wsl_case_sensitive -v 1 <ディレクトリーのパス>
大文字・小文字の区別を無効にするには、以下のコマンドを実行します。
setfattr -n system.wsl_case_sensitive -v 0 <ディレクトリーのパス>
注意事項
大文字・小文字区別の設定の変更に関し、いくつか注意事項があります。アクセス権に注意
大文字・小文字の区別の設定を変更するには、ディレクトリーに対し以下のアクセス権が必要になります。- 属性の書き込み
- ファイルの作成
- フォルダーの作成
- サブフォルダーとファイルの削除
これらのアクセス権は「Windows」のアクセス権です。
またユーザープロファイルの外側のフォルダーでは、たとえ自分が所有者のディレクトリーであっても、上記のすべてのアクセス権が付与されているとは限りません。
もし設定変更時にパーミッションエラーが発生した場合は、上記のアクセス権が設定されているか確認してください。
サブフォルダー以下にアクセスしていないこと
大文字・小文字の区別の設定を変更する前に、そのディレクトリー以下のディレクトリーを「WSL」から開いていないか(アクセスしていないか)確認してください。さもないと設定に失敗します。
すでに大文字・小文字のみ異なるファイルが存在している場合
すでにディレクトリー内に大文字・小文字のみ異なるファイルが存在している場合、大文字・小文字の区別を無効することはできません。ディレクトリーごとに大文字・小文字を区別する機能をサポートしていないファイルシステム
現在ディレクトリーごとに大文字・小文字を区別する機能は、ローカルの「NTFS」ボリュームでのみ利用可能です。「FAT」や「SMB」といったファイルシステムでは、ディレクトリーごとに大文字・小文字を区別する機能をサポートしていないため、この拡張属性を利用できません。
2.大文字・小文字の区別の継承
以前の「Build」では、新規に作成するディレクトリー毎に、大文字・小文字を区別するフラグを明示する必要がありました。この振る舞いが変更され、ディレクトリーを新規に作成する時、大文字・小文字を区別するフラグを親ディレクトリーから継承するようになりました。
つまり大文字・小文字を区別するフラグが設定されているディレクトリー内でサブディレクトリーを作成すると、そのサブディレクトリーも大文字・小文字を区別するようになります。
これにより大文字・小文字を区別するディレクトリー内で、もっと簡単にWindowsのツールを活用できるようになりました。
例えば大文字・小文字を区別するディレクトリー内に「tar.exe」でアーカイブを展開すると、アーカイブから展開されたすべてのディレクトリーも大文字・小文字を区別するディレクトリーになります。
DrvFsと大文字・小文字区別のマウントオプション
以前紹介したように、「DrvFs(Windowsボリューム)」をマウントする際、マウントオプションを指定し、大文字・小文字区別のデフォルトの振る舞いを設定することができます。- case=off
- case=dir
「case=off」では、デフォルトで大文字・小文字の区別を行いません。
「case=dir」では、デフォルトで大文字・小文字の区別を行います。
どちらのオプションでも大文字・小文字区別のフラグが設定されている既存のディレクトリーでは、大文字・小文字を区別してファイルを扱います。
この点は従来から変わりませんが、今回の改良により、より柔軟な大文字・小文字区別の運用及び活用が可能になります。
例えば「case=off」を指定すれば、ユーザーは大文字・小文字を区別したいディレクトリーに対してのみ、大文字・小文字の区別を明示的に指定することができます。
case=offを推奨
これからは「case=off」が推奨になり、大文字・小文字の区別が必要なディレクトリーは、ユーザーが明示的にその指定を行うことになります。こうすることで影響を受けている「Windowsアプリ」との互換性を最大限維持しつつ、大文字・小文字の区別に影響を受けない「Windowsアプリ」との柔軟な連携も可能になります。
将来の「Build」では、何もマウントオプションが指定されなかった時は「case=off」が指定されたものとして扱うように変更されます。
現在の「Build」で自動マウントされるWindowsボリュームのマウントオプションを変更するには、「wsl.conf」にマウントオプションを記述します。
[automount]
options = case=off
options = case=off
「wsl.conf」に関しては、以下を参照してください。