ホストOSをWindows、VirtualBox上のゲスト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はソースコードが公開されていて、コードも整理されているので簡単に見つかりました。
vbsfSymlink()
https://www.virtualbox.org/browser/vbox/trunk/src/VBox/HostServices/SharedFolders/service.cpp#L1245RTSymlinkCreate()
vbsf.cpp in vbox/trunk/src/VBox/HostServices/SharedFolders – Oracle VM VirtualBoxs_pfnCreateSymbolicLinkW()
symlink-win.cpp in vbox/trunk/src/VBox/Runtime/r3/win – Oracle VM VirtualBoxCreateSymbolicLinkW
symlink-win.cpp in vbox/trunk/src/VBox/Runtime/r3/win – Oracle VM VirtualBox
というわけで、Windowsの kernel32.dll
にある CreateSymbolicLinkW
関数を使っています。
また、setextradata VBoxInternal2/SharedFoldersEnableSymlinksCreate/%s
の設定でシンボリックリンクの有効、無効が切り替わります。
Windows10でシンボリックリンクの作成を許可する
Windows 10の場合、シンボリックリンクを作成する権限はデフォルトではAdministratorグループのみになっています。
「ローカル セキュリティ ポリシー」-「ローカル ポリシー」-「ユーザー権利の割り当て」-「シンボリック リンクの作成」に一般ユーザーのグループ(Users)を追加することで、一般ユーザーでもシンボリックリンクを作成できるようになります。
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