Windows 10 Ver.1803(April 2018 Update、RS4)で、DrvFs(WSLからWindows側ファイルシステムへのアクセス)が改良され、Windows Subsystem for Linux(WSL)から作成したディレクトリ(フォルダ)に関しては、ファイル名の大文字小文字の区別をするようになった。このような大文字小文字の区別を「ケースセンシティビティ」(Case Sensitivity)という。
POSIX互換のためにNTFSでは
ファイル名の大文字小文字を区別できるようになっている
そもそもNTFSはファイル名の大文字小文字を区別しており、大文字小文字の状態は保存されている。しかし、WindowsのAPIでは、ファイルの大文字と小文字を区別しないようにしてNTFSを利用する。
Windowsでファイル名の大文字小文字を区別させたい場合には、「FILE_FLAG_POSIX_SEMANTICS」という属性を付けてファイルを作成する必要があった。これは、Windows NTがPOSIXと互換性を持っていたときに用意された機能だ。
かつては、米政府に納入するコンピューターはPOSIXと互換性が持つ必要(Federal Information Processing Standards:FIPS、FIPS 151-1/151-2がPOSIXとの互換性を要求していた)があり、昔のWindowsはPOSIXサブシステムを内蔵していた。このFIPS 151-1/151-2は2000年に廃止されたため、現行のWindowsはPOSIXとの互換性は持っていない。ちなみにWSLはPOSIXサブシステムをベースにして作られている。
前述のようにNTFS上ではファイル名の大文字小文字を区別しているため、表示としては区別された状態だが、ファイルとして扱うときには、WindowsのAPIが大文字小文字を区別せずに処理する。これに対して、LinuxなどUnix系のOSでは区別するのが標準。これはWSL内においても同様だ。
RS4では、このケースセンシティビティのためにディレクトリ(フォルダ)に対して、新しい属性が用意された。WSLからDrvFs上に作成したディレクトリにはこの属性が設定され、その中ではファイル名の大文字小文字が区別されるようになった。
RS5ではWindowsアプリケーションが扱うことを考えた設定に
しかし、Windowsとの共存を考えると、RS4における実装にはいつかの問題があった。Windows側のアプリケーションは、そもそも大文字小文字を区別しないという前提で作られていて、ファイル名などを内部的に大文字のみ、小文字のみ、に変換して利用することがある。
それによりパスの比較処理などが簡単にできるからだ。しかし、こうした前提で作られたアプリケーションは、ファイルのアクセスの仕方によっては大文字小文字を区別するディレクトリでファイルを見つけられなくなってしまう可能性がある。
そこで、RS5のWSLでは動作を変更し、WSL側で作成したディレクトリも大文字小文字を区別しないようにした。その代わりに、WSL側からディレクトリのケースセンシティビティを制御できるようにした。
またRS4では、DrvFsのmountコマンドのオプション(マウントオプション)に、ケースセンシティビティ動作を指定できるようになった。マウントオプションは、
・case=dir:新規作成したディレクトリをケースセンシティビティにする
・case=off:ケースセンシティビティは設定しない
・case=force:ディレクトリのケースセンシティビティフラグに関係なく常にケースセンシティビティが有効
の3つで、RS4においては「case=dir」がデフォルト値だった。しかし、RS5では標準設定のマウントオプションをcase=offとして、ケースセンシティビティを有効にすることをやめた。
また、NTFSの既定の動作として、ディレクトリのケースセンシティビティ属性をサブディレクトリに継承するようになった。これは、ケースセンシティビティが設定されたディレクトリ以下にWindows側でサブディレクトリを作っても、そのサブディレクトリにケースセンシティビティが設定されることを意味する。
さらにRS5では、WSL側からディレクトリのケースセンシティビティを設定することを可能にした。具体的には「getfattr」「setfattr」というコマンドを使う。
ただし、標準ではインストールされていないため、aptコマンドを使い手動でインストールする必要がある。
sudo apt install attr
このコマンドを使うとき、ケースセンシティビティは、「system.wsl_case_sensitive」という属性値で扱われる。ケースセンシティビティを設定する場合には、
setfattr -n system.wsl_case_sensitive -v 1 対象ディレクトリへのパス
とする。
この連載の記事
-
第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に変換するのが早道 - この連載の一覧へ