Build 14361の変更点
2016/6/8にリリースされたBuild 14361の「WSL」に関する変更点です。リリースノート
変更点の詳細は、リリースノートを参照してください。動作の改善
Build 14361で行われた動作の改善です。リリースノートに記述されていない動作の改善も行われています。
1.Windowsのボリューム内のファイルのファイル名の大文字・小文字が区別されるようになった
「Bash」からWindowsのボリューム(DriveFs)内のファイルにアクセスした場合、ファイル名の大文字・小文字が区別されるようになりました。これにより相互運用性が向上しました。
「/mnt/c」以下のあるフォルダー内に「CASE.TXT」ファイルと「case.txt」ファイルが作成できます。
異なるファイルとして認識されるため、もちろんファイルの中身も異なる内容を保存できます。
注意事項
このファイル名の大文字・小文字の区別が行われるのは、あくまで「Ubuntu on Windows」の「Bash」からファイルにアクセスした時のみです。そのためファイル名の大文字・小文字を区別しないWindowsのアプリからそれらのファイルにアクセスした場合、意図しない動作を行う可能性があります。
上記の例で紹介した「case.txt」ファイルと「CASE.TXT」ファイルをWindowsのアプリからアクセスした場合、どちらのファイルが操作対象になるのかをユーザーが常に把握する必要があります。
中には正常に動作しないWindowsのアプリがあるかも知れません。(アプリ次第)
2.ptyとttyのサポート
pty(pseudo terminal)とtty(TeleTYpewriter)がサポートされ、tmux(terminal multiplexer)が動作するようになりました。簡潔に言えば、高度な操作が可能な「端末」が動くようになったと思えばよいです。
「Ubuntu on Windows」の直接的なUIは「Bash」ですから、「tmux」で複数の端末を使い分けるなど便利な機能が利用できます。
3.コマンド引数の動作改善
非常に長いコマンド引数を指定できるようになりました。4.DriveFsの読み込み専用ファイルの操作が可能に
DriveFsの読み込み専用ファイルの権限の変更やファイルの削除が可能になりました。5.ttyデバイスにパーミッションを指定可能に
ttyデバイスに、chmodやchownでパーミッションを指定できるようになりました。6.localhostの指定方法の改善
「0.0.0.0」や「::」でlocalhostを指定できるようになりました。7.DBusの部分的なサポート改善
Sendmsgとrecvmsgの扱いが改善されました。8./etc/hostsファイル自動作成の抑制
ユーザーが「/etc/hosts」ファイルの自動作成を抑制し、「/etc/hosts」ファイルを編集できるようになりました。9.ロケールの自動設定
「Ubuntu on Windows」のインストール時に、LinuxのロケールをWindowsのロケールに合わせるようにしました。10./proc/sys/vm/swappinessのサポート
スワップに関する設定を行う「/proc/sys/vm/swappiness」ファイルが追加されました。11.パイプの動作改善
「/proc/self/fd」を通じてパイプを再オープンできるようになりました。12.%LOCALAPPDATA%\lxssにアクセスできないようになった
「VolFs」内の「/root」と「DriveFs」内の「/mnt/c/Users/ユーザー名/AppData/Local/lxss/root」は同じディレクトリーなのですが、「/root」は一般ユーザーにアクセス権がなくアクセスできません。「/root」は「root」ユーザーのみアクセスできるディレクトリーです。
一方「/mnt/c/Users/ユーザー名/AppData/Local/lxss/root」には、「root」ユーザーでなくてもアクセスできてしまいます。
この脆弱性に対応するため、「%LOCALAPPDATA%\lxss」を「Ubuntu on Windows」から隠蔽し、アクセスできないようにしました。
13.bash.exeのコマンドオプションの動作改善
「bash.exe」(Ubuntu on WindowsのBashを起動するWindowsのアプリ)に指定するbashで実行するコマンドの指定方法が改善されました。「bash ~ -c ls」のような記述が可能です。
14.ソケットのepollの動作改善
シャットダウン時のソケットのepoll(read)通知がサポートされました。15.アンインストール動作の改善
「lxrun /uninstall」を実行して「Ubuntu on Windows」をアンインストールする際、ファイルやフォルダーの削除処理の改善が行われ、より安定動作するようになりました。16.X11アプリのサポート改善
「xEmacs」のようなX11アプリのサポートが改善されました。今後Xウィンドウシステムと組み合わせてGUIアプリが安定動作するようになっていくのかも知れません。
楽しみですね。
17.スタックサイズの調整
スタックサイズの初期値を、本物のUbuntuと同じ初期値にしました。また「get_rlimit」システムコールで正しいスタックサイズを返すようになりました。
- High recursive C++ program compiled with G++ 4.8.4 gives Segmentation Fault (due to stack size)
- rustc (segmentation fault)
18./proc/mountinfoの実装
dfコマンドのために「/proc/mountinfo」を実装しました。不具合の修正
Build 14361で行われた不具合の修正です。リリースノートに記述されていない不具合の修正も行われています。
1.ユーザーアカウントが作成されない問題の修正
「Ubuntu on Windows」インストール時に、ユーザーアカウントが作成されないケースがある問題が修正されました。2.ネットワーク切断時にターミナルがフリーズする問題の修正
ネットワーク切断時にターミナルがフリーズする問題が修正されました。3.straceが正常に終了するようになった
システムコールやシグナルをトレースする「strace」が正常に終了するようになりました。4.ps -fが動作しない問題の修正
「ps」コマンドの「-f」オプションが正常に動作しない問題が修正されました。5.symlinkエラーの修正
「.」や「..」を含むsymlinkの操作時に発生していたエラーを修正しました。Syscallの動作改善と不具合の修正
以下のSyscallの動作改善と不具合の修正が行われました。- GETTIMER
- MKNODAT
- RENAMEAT
- SENDFILE
- SENDFILE64
- SYNC_FILE_RANGE
すべてのパラメーターとの組み合わせは、現時点でサポートされていない可能性があります。
「WSL」がサポートしているSyscallの一覧は、以下を参考にしてください。
NTFSと大文字・小文字の区別
そもそもNTFSでは、ファイルシステムレベルでファイル名の大文字・小文字を区別してファイルを配置・保存することができます。つまり「case.txt」ファイルと「CASE.TXT」ファイルを同じフォルダーに配置することができます。
これはNTFSの仕様として認められている動作です。
補足
ここではファイル名と記述していますが、ディレクトリー名(フォルダー名)も対象です。それらをまとめてファイル名と記述します。アプリからどのように見えるのか
しかしメモ帳などWindowsのアプリからそれらのファイルにアクセスしようとした場合、どちらかのファイルのみを操作対象にすることができます。Windowsのアプリには、大文字・小文字を区別させない見せ方をしているためです。
例えばメモ帳では、常に「CASE.TXT」ファイルを操作対象にします。
そのため「case.txt」ファイルを操作対象にできません。
コマンドプロンプトやファイルマネージャー
コマンドプロンプトやファイルマネージャーからは、それらのファイルを異なるファイルとして認識できます。以下はエクスプローラーです。
以下はメモ帳のファイル選択画面です。
以下はコマンドプロンプトです。
しかしCOPYコマンドなどそれらのファイルに対して何か操作をしようとした場合、エラーになるなど意図しない結果になるでしょう。
例えばtypeコマンドを実行すると、「CASE.TXT」ファイルの中身が二重に表示されました。
NTFSの2つの動作モード
NTFSには、動作が少し異なる2つのモードがあります。このモードはサブシステムによって選択され、そのサブシステム上で動作するアプリが選択されているモードでNTFSにアクセスます。
1.大文字・小文字を区別するモード
NTFSの2つのモードのうちの1つは、ファイル名の大文字・小文字を完全に区別するモードです。アプリがこのモードでNTFSへアクセスすると、ファイル名の大文字・小文字が区別されるため「case.txt」ファイルと「CASE.TXT」ファイルは異なるファイルとして認識されます。
従ってアプリは、正確に大文字・小文字を区別して操作対象にするファイルを指定する必要があります。
つまり「Case.txt」でファイルにアクセスしようとしても、「case.txt」ファイルにも「CASE.TXT」ファイルにもアクセスできないということになります。
今回「Build 14361」で行われた変更では、Windowsのボリューム(DriveFs)内のファイルを大文字・小文字を区別してファイルへアクセスするようになったため、「Ubuntu on Windows」の「Bash」はこちらのモードでNTFSへアクセスするということになります。
「Build 14361」の「WSL」はこちらのモードで動作するようになりました。
2.大文字・小文字を区別しないモード
もう1つのモードは、ファイル名の大文字・小文字を区別しないモードです。こちらのモードは一般的なWindowsアプリがNTFSへアクセスするモードです。
MS-DOSやWOW(Windows on Windows)、Win32サブシステムはこちらのモードで動作します。
このモードではファイル名の大文字・小文字を区別しませんが、ファイル名の大文字・小文字を維持したままNTFSへファイルを配置します。
従ってWindowsのアプリから「CASE.TXT」ファイルを作成した場合、NTFSには「CASE.TXT」という名称のままファイルが保存されます。
ファイル名の大文字・小文字の情報が破棄されないということです。
しかしアプリから見た場合、ファイル名の大文字・小文字を区別しないため、「CASE.TXT」ファイルに「cASe.TxT」でも「cASE.TXT」でもアクセスできます。
どちらのモードでもNTFSに大文字・小文字を区別したままファイルが配置される
結局どちらのモードでも、ファイル作成時にNTFSにファイルを配置する際、ファイルの大文字・小文字を区別したままファイルが配置されます。2つのモードの違いは、アプリがすでにNTFS上に存在するファイルにアクセスする際、アプリに大文字・小文字の違いを見せるかどうかです。