Windows上のVirtualBox共有フォルダでシンボリックリンクを有効にする

ホストOSをWindowsVirtualBox上のゲストOSをLinuxとして、VirtualBoxの共有フォルダ機能を使った場合、Linux側で共有フォルダ内にシンボリックリンクを作ろうとすると、デフォルトでは許可されず、エラーが発生します。

vagrant@ubuntu-xenial:/vagrant$ ln -s test.txt test2.txt
ln: シンボリックリンク 'test2.txt' の作成に失敗しました: プロトコルエラー

Pythonのvirtualenvや、Node.JSのnpmを使うときにシンボリックリンクが使えないと不便なので、これを解消します。試したのはWindows 10、VirtualBox 5.2.8、Vagrant 2.0.2

※2018/3/12更新: 最初はWeb検索で出てきた情報で試してて、うまくいったように見えたので、その手順を記載していましたが、不要な手順があるなどの指摘をもらったので、再調査して記事を大きく書き直しました。

VirtualBoxの共有フォルダとシンボリックリンク

そもそもVirtualBoxは、どうやってWindows側にシンボリックリンクを作るかを調べました。VirtualBoxソースコードが公開されていて、コードも整理されているので簡単に見つかりました。

というわけで、Windowskernel32.dll にある CreateSymbolicLinkW 関数を使っています。

また、setextradata VBoxInternal2/SharedFoldersEnableSymlinksCreate/%s の設定でシンボリックリンクの有効、無効が切り替わります。

Windows10でシンボリックリンクの作成を許可する

Windows 10の場合、シンボリックリンクを作成する権限はデフォルトではAdministratorグループのみになっています。

「ローカル セキュリティ ポリシー」-「ローカル ポリシー」-「ユーザー権利の割り当て」-「シンボリック リンクの作成」に一般ユーザーのグループ(Users)を追加することで、一般ユーザーでもシンボリックリンクを作成できるようになります。

f:id:nullpobug:20180312020620p:plain

http://f.hatena.ne.jp/nullpobug/20180312020620

これにより、 CreateSymbolicLinkW 関数でシンボリックリンクを作成できます。

VirtualBoxの設定

VirtualBoxで共有フォルダのシンボリックリンクを有効にするため、設定をVBoxManageコマンドで変更します。

VBoxManageコマンドはVirtualBoxディレクトリに入っています。PATHが設定されていない場合は、直接ファイルを指定して実行します。

PS C:\Users\tokibito> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' setextradata VM名 VBoxInternal2/SharedFoldersEnableSymlinksCreate/共有フォルダ名 1

Vagrantの場合

Vagrantでは共有フォルダは、デフォルトでVirtualBoxシンボリックリンク設定(VBoxInternal2/SharedFoldersEnableSymlinksCreate/%s)を有効にしてくれるので、Windowsのポリシーの変更以外は特に追加の設定は不要でした。

実行結果

vagrant@ubuntu-xenial:/vagrant$ ln -s test.txt test2.txt
vagrant@ubuntu-xenial:/vagrant$ ls -l test2.txt
lrwxrwxrwx 1 vagrant vagrant 0  2月 28 01:11 test2.txt -> test.txt