こんにちは
ALJの江口と申します。
シンボリックリンクはご存じでしょうか。シンボリックリンク(symlink)は、ファイルやディレクトリへの参照を別の場所に作る仕組みです。
Windowsには、ショートカットという似た機能がありますが、ショートカットはエクスプローラが解釈して利用するGUI専用のようなイメージで、プログラムから利用できないなど、Linuxのシンボリックリンクとはだいぶ異なっています。
一方、mklinkコマンドは、NTFSの「再解析ポイント(reparse point)」を使用しており、Linuxのシンボリックリンクとかなり近い使い方ができます。Windows Vistaで機能が追加されました。
Linuxではよく利用すると思いますが、Windowsでもmklinkがあるということがまだ一般的ではないと思いますので、Linuxのシンボリックリンクと比較し、mklinkについてどういうものか、理解してみたいと思います。
簡単な比較
| 項目 | Linux | Windows |
|---|---|---|
| 作成コマンド | ln -s | mklink |
| 権限 | 一般ユーザでも可 | 管理者権限 or 開発者モード |
| 種類 | 複数あり(シンボリックリンク / ハードリンク) | 複数あり(シンボリックリンク / ハードリンク / ジャンクション) |
| パス解決 | 柔軟(相対パス推奨) | やや制約あり |
| 互換性 | 高い | ツールによって扱いが不安定 |
シンボリックリンク / ハードリンク / ジャンクション について
シンボリックリンク / ハードリンク / ジャンクション についてそれぞれ、どんなものか簡単に表にしてみました。
| 種類 | Linux | Windows |
|---|---|---|
| シンボリックリンク | ln -s 一般的に利用される。 ユーザー作成可(ファイルシステムの権限による)。 |
mklink / mklink /D 管理者 or 開発者モード |
| ハードリンク | ln 同一ディスク、同一inode 実態そのもの |
mklink /H ディレクトリ不可 同一ボリューム内のみ 実態そのもの |
| ジャンクション | なし | mklink /J ディレクトリのみ 同一ボリューム内のみ 管理者不要(多くの場合) Vista以前からの互換性のため? |
ジャンクションが紛らわしいですが、歴史的経緯があります。
・ジャンクション(Directory Junction)
⇒ Windows 2000 から存在(NTFS 3.0)
・シンボリックリンク(Symbolic Link)
⇒ Windows Vista / Windows Server 2008 で追加された新機能
使い心地はどうか
ハードリンク
まず、ハードリンクについては、Linuxでもあまり利用されてないのではないかと思います。自分も、使うのは、/etc/init.d で慣習的に利用する場合とか、systemctlまわりだったりなど以外では、シンボリックリンクの方をよく利用します。
Windowsも同一ボリューム(C:\とかD:\)に限定されるので、シンボリックリンクで済むならそちらの方が便利そうです。
さらに、Windowsではハードリンクについて調査するコマンドが、dirではなく別のコマンドになります。
# ハードリンクかどうかの確認(同一実体のリンク一覧が出る)
fsutil hardlink list ファイル名
Linuxであれば、lsコマンドでなんとなく雰囲気がわかりますが、Windowsではdirコマンドで見分けがつかず、上記のような別コマンドで確認する必要があります。
シンボリックリンク
Windowsのシンボリックリンクは、管理者権限か、開発者モード(あまりなじみがないですが)が必要になります。
管理者権限が必要なところは少々不便ですが、それまでのWindowsXPなどでセキュリティ問題が多発し、セキュリティ問題を強化したのがVistaというような背景があると思います。
Windows10になり、開発者モードで限定的にOKにした、というような流れのようです。
Windowsのシンボリックリンクは、ACLだけではく、OSレベルで機能を制限しているため、これをユーザーに許可するには、ローカルポリシー で ユーザー権利の割り当てで シンボリックリンクの作成 を許可する、という流れが必要になります。
ジャンクション
ジャンクションは過去の互換性のために残されている機能と考えられ、これから使うならシンボリックリンクで作成することになると思います。
ジャンクションはユーザー権限でも作成できるので、管理者権限が得られない場合、ディレクトリ作成ではジャンクションも検討できると思いますが、同一ボリュームの制約があることは認識しておく必要があります。
最後に
Windowsでもシンボリックリンクが使えるということが理解できたと思いますが、管理者権限が必要など、若干使い勝手はLinuxに比べると劣る側面はあります。
Linuxに比べ、コマンドラインでの作業は多くないので、必要性が感じにくいと思いますが、それなりに便利な機能なので、興味がある方は調べてみてはいかがでしょうか。
以上です。