現在プレビューが進められている20H1(Windows 10 Ver.2003)に含まれるWSL2(Windows Subsystem for Linux 2)は、仮想マシンベースでLinuxカーネルを動かすものだ。
Windows 10に搭載されているWSL(以下WSL1と略す)は、Linuxカーネルがなく、Linuxのカーネルファンクションコールは、すべてWindowsカーネル(NTカーネル)のファンクションコールに変換されいた。このため、Windows側の機能はほとんど問題なく利用できた。
これに対して、WSL2では、仮想マシン内部でLinuxカーネルがそのまま動作している「ほぼLinux」であるため、Windowsの持つ機能にアクセスするためには、さまざまな対応が必要になる。こうした問題の1つがNTFS上のソフトリンク(シンボリックリンクやジャンクション)への対応である。Windows Insider ProgramのPreview Build 18980より前では、WSL2は、NTFSのソフトリンクを解釈することができなかった。このため、NTFS側でlsコマンドなどを実行すると、ソフトリンクの部分ではエラーが発生していた。
ハードリンクとソフトリンクの違い
多くのOSではファイルシステム上に「リンク」を作成することができる。リンクとは、他のファイルやディレクトリを1つのものとして結びつける機能である。こうした記憶装置上のリンクには、「ハードリンク」「ソフトリンク」の2種類がある。
ハードリンクとは、簡単に言えば、複数のファイル名を持つファイルだ。複数のファイル名が記憶装置上の同じ領域を指し示す。一般にファイルシステムは、人間が理解できるファイル名を管理している部分(これをディレクトリという)と、ファイルなどが保持するデータを格納する記憶装置上の一連の領域を管理する部分から構成されている。
ソフトウェアでファイルを処理するだけなら、必ずしもファイル名がついている必要はなく、単にユニークな数値などが割り振ってあればよい。しかし、これでは人間がファイルを管理できない。そのために作られたのがディレクトリやファイル名である。
ハードリンクは、データを記憶している記憶装置上の領域に対して、複数のファイル名を付ける。また、こうしたハードリンクされたファイルがいくつあるのかも管理している。このとき、何かオリジナルのファイルがあって、それ以外はリンクといった印象を持つかもしれないが、実際には、ハードリンクされたファイルの1つ1つには区別がなく、一回ハードリンクしてしまうと、ファイルとしては同一の情報や属性を持つことになるため、どちらが先にあったのかという情報はなくなって、区別ができなくなる。
これに対して、ソフトリンクは、リンク元とリンク先があり、リンク元はリンク先を示すパスなどの情報しか持っていない。しかし、OSは、ソフトリンクをリンク先のファイルとして扱うため、処理上は区別がない。ただし、ファイルの削除やバックアップなど、ソフトリンクを区別して扱うことは可能だ。また、ソフトリンクは必ずしもリンク先が存在している必要はなく、たとえば、ユーザーが削除したなどで、リンク先がなくなってしまう可能性もある。このときリンク元はそのまま放置される。
ハードリンクは、記憶装置上の領域を示す必要があるため、同一の記憶装置内しかリンクすることができない。この欠点を補うためにあとからソフトリンクが開発された。一般にソフトリンクは、リンク先が存在していなくてもよい。もちろん技術的には、リンク先を監視して存在を追ったり、リンク先が消えたらソフトリンクを消すことも可能だが、こうしたコストをかけても、その恩恵はわずかであり、現在ではリンク先がなくてもかまわない(もちろん、アクセスしようとするとエラーになるが)という実装が一般的だ。
Windowsにおけるソフトリンク
Windowsには、シンボリックリンク(区別のため以後NTFSシンボリックリンクと呼ぶ)とジャンクションの2つのソフトリンクがある。
また、ショートカットと呼ばれるソフトリンクによく似たものもある。ショートカットは、エクスプローラーの機能で、実体はリンク先などを記録した「.lnk」という拡張子を持つファイルだ。FAT系ファイルシステムが主流だったWindows 95のときにソフトリンクのように使えるものとして導入され、いまでもスタートメニューなどに利用されている。エクスプローラーの管理するオブジェクトなので、たとえば、コマンドラインからは普通のファイルに見えてしまう。
Windowsのソフトリンクは、当初ジャンクションしかなかった。しかし、リンク先がフォルダーに限られる点やネットワークパス(UNC)をリンク先にできないといった問題があった。NTFSのハードリンクが同一記憶装置内に限られる点をカバーするためのものだったが、機能が少し不足していた。このため、Windows Vistaで搭載されたのがNTFSシンボリックリンクだ。シンボリックリンクは、ファイルだけでなくディレクトリー(フォルダー)もリンク先にできるなど、ジャンクションよりも融通性が高い、反面、フォルダーのNTFSシンボリックリンクの作成には管理者権限が必要となる。
Windowsのシンボリックリンクは、いまのところファイルシステム依存である。たとえば、FAT32などのファイルシステムの上ではシンボリックリンクを作ることができない。
Linuxのソフトリンク
Linuxのソフトリンクは、シンボリックリンクしかない(以後Linuxシンボリックリンクと表記する)。ファイルでもディレクトリーでもリンクすることができる。ハードリンクもあり、こちらはやはり同一記憶装置内のリンクに限定される。
作成は、lnコマンドで行なう。シンボリックリンクを作成するには「ln -s」と-sオプションを付ける。なお、lnコマンドとWindowsのmklinkコマンドでは、リンク元とリンク先の指定が逆になっているため、両方を使う場合には注意すること。Linuxのシンボリックリンクは、仮想ファイルシステム(VFS)の上で管理され、各ファイルシステムが具体的に実装する。
古い実装では、リンク先のパスを記憶する小さなファイルが使われたこともある(Windowsのショートカットと同じ方法)。しかし、lnなどのアプリケーションのレベルでは、ファイルシステムを意識することなくシンボリックリンクが作成できる。もちろん、Linuxのシンボリックリンクをサポートしていないファイルシステムもないわけではない。しかし、少なくともLinuxやUnix用に作られたファイルシステムではシンボリックリンクがサポートされていて、すべてlnコマンドで対応が可能だ。
この連載の記事
-
第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に変換するのが早道 -
第447回
PC
この秋登場のWindows 11の新バージョン、Ver.24H2の状況を見る -
第446回
PC
Windows 11のフォトアプリがUWPからWin32アプリになったことで今更わかるUWPの問題点 - この連載の一覧へ