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.6

ファイルシステムの設定変更

管理者権限でPowerShellを起動し、fsutil behaviorの状態を確認

PS C:\Users\tokibito> fsutil behavior query SymlinkEvaluation
ローカルからローカルへのシンボリック リンクは有効です。
ローカルからリモートへのシンボリック リンクは有効です。
リモートからローカルへのシンボリック リンクは無効です。
リモートからリモートへのシンボリック リンクは無効です。

シンボリックリンクの作成をすべて有効にする。 (R2L = Remote to Local, R2R = Remote to Remote, L2R: Local to Remote, L2L: Local to Local)

PS C:\Users\tokibito> fsutil behavior set SymlinkEvaluation R2L:1 R2R:1
PS C:\Users\tokibito> fsutil behavior query SymlinkEvaluation
ローカルからローカルへのシンボリック リンクは有効です。
ローカルからリモートへのシンボリック リンクは有効です。
リモートからローカルへのシンボリック リンクは有効です。
リモートからリモートへのシンボリック リンクは有効です。

VirtualBoxのオプション変更

VirtualBoxのオプションをVBoxManageコマンドで変更する。管理者権限が必要。

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

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

Vagrantの場合

Vagrantの場合は、Vagrantfileに上記のVBoxManageコマンドを実行するように記述しておく。

config.vm.provider :virtualbox do |vb|
  vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/vagrant","1"]
end

この設定で、 vagrantコマンドを管理者権限で実行する 必要がある。 upまたはprovisionを実行すればよいようだ。

実行結果

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

参考