環境
- Windows 11 22H2
- WSL version 1.0.3.0
- Kernel: 5.15.79.1-microsoft-standard-WSL2
素朴にやるとうまくいかない
以下のように WSL で NTFS 上にシンボリック リンクを作成すると、Windows のシンボリック リンクではなく WSL の UNIX シンボリック リンクが作成されます。Windows から読み取ろうとしてもエラーになってしまいます。
$ mkdir /mnt/c/work
$ cd /mnt/c/work
$ echo foo > foo.txt
$ ln -s foo.txt symlink
$ ls -l
total 0
-rwxrwxrwx 1 hanohrs hanohrs 4 Jan 19 06:45 foo.txt
lrwxrwxrwx 1 hanohrs hanohrs 7 Jan 19 06:45 symlink -> foo.txt
$ cmd.exe /c dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は EE18-AEC5 です
C:\work のディレクトリ
2023/01/19 06:45 <DIR> .
2023/01/19 06:45 4 foo.txt
2023/01/19 06:45 <JUNCTION> symlink [...]
2 個のファイル 4 バイト
1 個のディレクトリ 130,285,998,080 バイトの空き領域
WSL の UNIX シンボリック リンクはジャンクションではありませんが、dir コマンドは JUNCTION と表示します。どうやら dir コマンドは未対応のリパース ポイントを見ると JUNCTION と表示するようです。
解決方法
通常、NTFS のシンボリックリンクを作成するには管理者権限で操作する必要があります。WSL を管理者として実行すると、同様のコマンドでも Windows のシンボリック リンクが作成され、dir コマンドで SYMLINK と表示されます。
$ cd /mnt/c/work
$ ln -s foo.txt elevated
$ cmd.exe /c dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は EE18-AEC5 です
C:\work のディレクトリ
2023/01/19 07:00 <DIR> .
2023/01/19 07:00 <SYMLINK> elevated [foo.txt]
2023/01/19 06:45 4 foo.txt
2023/01/19 06:45 <JUNCTION> symlink [...]
3 個のファイル 4 バイト
1 個のディレクトリ 130,268,467,200 バイトの空き領域
挙動
GitHub の WSL プロジェクトに開発者が寄せたコメントによると、以下が全て成立する場合に Windows のシンボリック リンクが作成されるそうです。
- ターゲットが Windows から到達可能 (つまりリンクが相対で、マウント ポイントを跨がない)
- ターゲットが存在する (したがってファイルなのかディレクトリーなのか判定できる)
- ユーザーに symlink を作成するのに十分な特権がある (現状、開発者モードが有効でなければ特権昇格が必要)
成立しなかった場合、WSL の UNIX シンボリック リンクが作成されます。
別の解決方法
未確認ですが、管理者として実行する以外にも、以下の方法で解決可能と思われます。
- 開発者モードを有効にする
- Polsedit でユーザーに Create symbolic links 権限を割り当てる
- editrights コマンドを導入して、ユーザーに SeCreateSymbolicLinkPrivilege を割り当てる
- Home エディション以外の場合、
gpedit.msc
やsecpol.msc
でシンボリック リンクの作成にユーザーを追加する
参考