このページの本文へ

前へ 1 2 次へ

Windows Info 第193回

Windows Subsystem for Linux 2のNTFSソフトリンク対応

2019年10月06日 10時00分更新

文● 塩田紳二 編集● ASCII編集部

  • この記事をはてなブックマークに追加
  • 本文印刷

 現在プレビューが進められている20H1(Windows 10 Ver.2003)に含まれるWSL2(Windows Subsystem for Linux 2)は、仮想マシンベースでLinuxカーネルを動かすものだ。

Windows 10 20H1プレビューに含まれるWSL2。今回はNTFSのソフトリンクに対応した

 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コマンドで対応が可能だ。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

最新記事

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン