6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WSL で Windows のシンボリック リンクを作る

Last updated at Posted at 2023-01-19

環境

  • 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.mscsecpol.msc でシンボリック リンクの作成にユーザーを追加する

参考

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?