Linux用Windowsサブシステム(WSL)の登場とPOSIXサポートの変化をおさらいその知識、ホントに正しい? Windowsにまつわる都市伝説(220)

Windowsはかつて「POSIXサブシステム」を備え、UNIX互換のファイルシステムと実行環境を提供していました。POSIXサブシステムは現在のWindowsにはもうありませんが、「Linux用Windowsサブシステム(WSL)」の登場で、POSIXサポートが復活というか、さらに強化されています。その1つが、「POSIX方式(スタイル)の削除」のサポートです。

» 2022年10月05日 05時00分 公開
[山市良テクニカルライター]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Windowsにまつわる都市伝説」のインデックス

Windowsにまつわる都市伝説

WindowsとPOSIXの関係

 「POSIX(Portable Operating System Interface)」は、オペレーティングシステム(OS)の標準的なインタフェースと環境を定義するIEEE規格です。ソースコードレベルで移植性の高いアプリケーション開発を可能にするため、主にUNIX系OSに採用されました。

 現在のWindowsの源流である「Windows NT」は、POSIX(IEEE 1003.1)準拠のOSとして開発され、当初は「POSIXサブシステム」というサブシステムと「Services for UNIX(SFU)」というUNIXとの互換性機能を備えていました。また、「NTFS」ファイルシステムには、POSIXサポートのために、大文字と小文字を区別するファイル名とディレクトリ名、ファイルやディレクトリのパーミッション、ハードリンクなどの機能が実装されました。

 その後、POSIXサブシステムは廃止され、「UNIXベースアプリケーション用サブシステム(Subsystem for UNIX-Based Application、SUA)」に置き換わりましたが、「Windows 8.1」と「Windows Server 2012 R2」からは削除されました。WindowsにおけるPOSIXサポートはここでひとまず中断しましたが、その成果は「Windows 10」に導入された「Linux用Windowsサブシステム(Windows Subsystem for Linux、WSL)」(バージョン1709から一般提供開始、WSL2はバージョン1903以降)に引き継がれています。

 WindowsとPOSIXの関係について、いろいろはしょって説明しましたが、要はWindowsにおけるPOSIXサポートは続いており、WindowsとWSL/WSL2のLinuxシェルのファイルシステム間で相互にファイルをやりとりできるようになったいま、POSIXサポートはさらに強化されているということです。

「POSIX方式(スタイル)の削除」のサポートとは?

 Windows 10 Fall Creators Update(バージョン1709、RS3)では、NTFSボリュームの新機能として「POSIXスタイル(POSIXセマンティクス)の削除」がサポートされました。「FSUTIL」コマンドの日本語版における出力結果には「POSIXスタイルのリンク解除と名前変更をサポート」と表示されますが、「POSIXスタイルのunlinkとrenameのサポート」です(画面1)。

画面1 画面1 Windows 10以降のNTFSボリュームでは、「POSIXスタイルの削除」がサポートされている(「fsutil fsinfo volumeinfo <ドライブ文字:>」コマンドで確認可能)

 Windowsでは、あるアプリケーションは別のアプリケーションによって排他的に(ファイルハンドルが)開かれているファイルを、たとえ共有モードで削除が許可されている場合でも、それを即座に削除することができません。

 一方、ファイルやディレクトリを削除するLinuxの「unlink(またはrm)」コマンドは、それが可能です。WindowsとWSL/WSL2のLinuxは、ファイルシステム間で相互にやりとりできますが、WSLをサポートするためには、この「POSIXスタイルの削除」をサポートする必要がありました。Windows 10 バージョン1703ではWSLはβ版として利用できましたが、FSUTILの「POSIXスタイルのリンク解除と名前変更をサポート」の行は空白でした(行がないのではなく、空白行であることが、非公式で既に実装されていたことを暗示しています)。

 以下の画面2は、「Windows Server 2019」(Windows 10 バージョン1709〜1809でも同様)のPowerShellでファイル「demo.txt」に新規作成し(筆者の都合の良い結果を得るために、共有モードで後続アクセスによる削除を許可)、ファイルハンドルを保持した状態で、コマンドプロンプトから同じファイルを参照しようとしたり、削除しようとしたりしたところです。

画面2 画面2 排他的に開かれているファイルの削除操作は、受け付けるが即時に実行されることはない

 ファイルの削除操作は実施されたように見えますが、実行後もファイルは存在し続けています。ファイルの削除操作は、ファイルを排他的に開いているアプリケーションを終了してファイルハンドルが失われた時点で実施されます(画面3)。これが通常のWindowsにおけるファイル削除の挙動になります。

画面3 画面3 ファイルを開いていたアプリケーション(画面2の例の場合はPowershell.exe)を閉じると、保留されていたファイル削除操作が実施される

 同様の操作を、コマンドプロンプトをWSLのLinuxシェルに置き換えて実施してみます。Windowsの方(Powershell.exe)でファイルが排他的に開かれている状態で、Linuxのunlink(またはrm)コマンドでそのファイルを削除すると、今度はファイルが即座に削除されます。しかも、ファイルを開いているWindows側でエラーは発生しません(ファイルはアプリケーションを閉じるまで引き続きアクセス可能です)。これが「POSIXスタイルの削除」の挙動です。

画面4 画面4 WSLのLinuxからunlink(またはrm)コマンドでファイルを削除すると、即座にファイルが削除される。この挙動を実現するために、Windowsで「POSIXスタイルの削除」がサポートされた

 Windowsのネイティブなアプリケーションの場合でも、ファイル削除のAPIを利用すれば、「POSIXスタイルの削除」を実行できます。

Windows 10 バージョン1903以降でファイル削除の挙動に変化あり

 以下の画面5は、前出の画面2と同じことを、Windows Server 2022で実施したものです。Windowsの「Del」コマンドは、別のアプリケーションで排他的に開かれているファイルであっても、即座に削除しました。

画面5 画面5 Windows 10バージョン1903以降、Windowsのファイル削除の挙動はPOSIXスタイルの削除に変更された。画面2とは異なり、画面4と同じ挙動

 実は、Windows 10 May 2019 Update(バージョン1903、19H1)において、「POSIXスタイルの削除」がWindowsの既定に採用されたようなのです。このWindowsの既定の動作変更、つまり仕様変更について、詳しく説明した公式なドキュメントは見当たりません。

 最近のWindowsは、このような仕様変更がひっそりと行われ、後になって明らかになることがあるので注意が必要です。この仕様変更は、従来のWindowsにおけるファイル削除の挙動を期待して開発されたアプリケーションに影響する可能性があります。

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP 2008 to 2023(Cloud and Datacenter Management)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。