ホスト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.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