VirtualBox + vagrant での開発環境構築は、バージョンや構成の柔軟性が高く、重宝します。また、ホストOSへの共有フォルダを利用することにより、開発自体は、ホストOSであるWindows上で行って、実行は仮想マシン側で行うこともできます。
しかし、仮想マシン側でシンボリックリンクを作成する処理は、失敗してしまいます。そんな時、Windows側でシンボリックリンクを作ることで、対応可能な場合があります。この記事では、仮想マシン側で、共有フォルダへのシンボリックリンク作成に失敗したとき、windows側でシンボリックリンクを作成して対応する方法を説明します。
vagrantでwindows側との共有フォルダへのシンボリックリンク作成に失敗するときの対応
ホストOSがWindows、ゲストOSがLinuxの時にこういうシンボリックリンク作成の問題が発生することがあります。
そんな時、Windowsのコマンドプロンプト内蔵コマンドであるmklinkを使って、windows側からシンボリックリンクを作りましょう。下に手順を説明します。
手順1. コマンドプロンプトを管理者権限で起動する
リンクを作成するツールは、mklinkと言います。コマンドプロンプトの内蔵コマンドであるため、PowerShell や Git Bash などからは実行することができません。
また、mklink は管理者権限で実行する必要があるため、起動時に気を付けましょう。たとえ普段、PowerShell や Git Bashなど使っていたとしても、mklinkを実行するときだけは、コマンドプロンプトを起動しましょう。
スタートメニュー から、「Windowsシステムツール→コマンドプロンプト」を右クリックし、「その他→管理者として実行」をクリックします。
手順2. mklinkコマンドでリンクを作成する
mklinkコマンドの使い方
mklinkコマンドを引数なしで実行すると、ヘルプが表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Microsoft Windows [Version 10.0.17763.437] (c) 2018 Microsoft Corporation. All rights reserved. C:\Windows\system32>mklink シンボリック リンクを作成します。 MKLINK [[/D] | [/H] | [/J]] リンク ターゲット /D ディレクトリのシンボリック リンクを作成します。既定では、 ファイルのシンボリック リンクが作成されます。 /H シンボリック リンクではなく、ハード リンクを作成します。 /J ディレクトリ ジャンクションを作成します。 リンク 新しいシンボリック リンク名を指定します。 ターゲット 新しいリンクが参照するパス (相対または絶対) を指定します。 |
フォルダのシンボリックリンクを作成するには、/D オプションを指定します。また、引数の順番は、「作成するリンクの名称」、「ターゲットとなる元フォルダ名」の順になります。
リンクの作成
下リストでは、フォルダ「test_org」へのシンボリックリンク「test_link1」を作成しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
c:\data\tk\vagrant\centos7\test\link のディレクトリ [.] [..] [test_org] 0 個のファイル 0 バイト 3 個のディレクトリ 357,835,149,312 バイトの空き領域 c:\data\tk\vagrant\centos7\test\link>mklink /d test_link1 test_org test_link1 <<===>> test_org のシンボリック リンクが作成されました c:\data\tk\vagrant\centos7\test\link>dir /w ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は 6B1B-CC45 です c:\data\tk\vagrant\centos7\test\link のディレクトリ [.] [..] [test_link1] [test_org] 0 個のファイル 0 バイト 4 個のディレクトリ 357,835,276,288 バイトの空き領域 |
注意事項
絶対パスで指定するとvagrantからシンボリックリンクとみなされない
フルパスで指定すると、リンクの文字列が、「c:/パス」 というようになります。おそらくvagrantの中のlinuxでは、「/c/パス」でcドライブを指定しないとディレクトリ(=フォルダ)として認識できないからか、
シンボリックリンクがあるフォルダから見た相対パスで指定しましょう。
コマンドプロンプトでフルパス指定のシンボリックリンクを作成したときのふるまいを下に示します。下リストがコマンドプロンプトでリンク作成したところです。
1 2 |
c:\data\tk\vagrant\centos7\test\link>mklink /d test_fullpath c:\data\tk\vagrant\centos7\test\link\test_org test_fullpath <<===>> c:\data\tk\vagrant\centos7\test\link\test_org のシンボリック リンクが作成されました |
コマンドプロンプトでは、フルパス指定したリンクが普通に使えます。
1 2 3 4 5 6 7 8 9 10 11 12 |
c:\data\tk\vagrant\centos7\test\link>dir test_fullpath ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は 6B1B-CC45 です c:\data\tk\vagrant\centos7\test\link\test_fullpath のディレクトリ 2019/04/23 08:58 <DIR> . 2019/04/23 08:58 <DIR> .. 2019/04/23 08:58 <DIR> sub_dir 2019/04/22 03:29 63 test.txt 1 個のファイル 63 バイト 3 個のディレクトリ 357,693,341,696 バイトの空き領域 |
vagrant側でアクセスしてみると、フォルダへのリンクが、機能していません。
1 2 3 4 5 6 7 8 9 10 11 |
[taka@localhost link]$ l 合計 4 drwxrwxrwx. 1 vagrant vagrant 0 4月 23 09:00 ./ drwxrwxrwx. 1 vagrant vagrant 4096 4月 22 01:53 ../ lrwxrwxrwx. 1 vagrant vagrant 0 4月 23 09:00 test_fullpath -> c:/data/tk/vagrant/centos7/test/link/test_org lrwxrwxrwx. 1 vagrant vagrant 0 4月 22 03:27 test_link1 -> test_org/ drwxrwxrwx. 1 vagrant vagrant 0 4月 23 08:58 test_org/ [taka@localhost link]$ ls test_fullpath test_fullpath [taka@localhost link]$ ls test_fullpath/ ls: test_fullpath/ にアクセスできません: そのようなファイルやディレクトリはありません |
mklinkは元フォルダの指定が間違っていてもエラーにならない
mklinkの元フォルダの名前が間違っていても、エラーにならず、存在しないフォルダへのリンクを作ることができるので注意してください。
下リストは、存在しないtest_org2 という名前へのフォルダリンクを作成したときの作業ログです。エラー発生なく正常終了しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
c:\data\tk\vagrant\centos7\test\link>dir ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は 6B1B-CC45 です c:\data\tk\vagrant\centos7\test\link のディレクトリ 2019/04/23 09:00 <DIR> . 2019/04/23 09:00 <DIR> .. 2019/04/23 09:00 <SYMLINKD> test_fullpath [c:\data\tk\vagrant\centos7\test\link\test_org] 2019/04/22 03:27 <SYMLINKD> test_link1 [test_org] 2019/04/23 08:58 <DIR> test_org 0 個のファイル 0 バイト 5 個のディレクトリ 357,691,392,000 バイトの空き領域 c:\data\tk\vagrant\centos7\test\link>mklink /d test_wrong test_org2 test_wrong <<===>> test_org2 のシンボリック リンクが作成されました c:\data\tk\vagrant\centos7\test\link>dir ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は 6B1B-CC45 です c:\data\tk\vagrant\centos7\test\link のディレクトリ 2019/04/23 09:03 <DIR> . 2019/04/23 09:03 <DIR> .. 2019/04/23 09:00 <SYMLINKD> test_fullpath [c:\data\tk\vagrant\centos7\test\link\test_org] 2019/04/22 03:27 <SYMLINKD> test_link1 [test_org] 2019/04/23 08:58 <DIR> test_org 2019/04/23 09:03 <SYMLINKD> test_wrong [test_org2] 0 個のファイル 0 バイト 6 個のディレクトリ 357,691,387,904 バイトの空き領域 |
当然、存在しないフォルダへのリンクにはアクセスできません。
1 2 3 4 5 6 7 |
c:\data\tk\vagrant\centos7\test\link>dir test_wrong ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は 6B1B-CC45 です c:\data\tk\vagrant\centos7\test\link\test_wrong のディレクトリ ファイルが見つかりません |
相対パスはシンボリックリンクから見たパスで指定
シンボリックリンクから見た相対パスで設定するように注意してください。コマンドを実行したフォルダから見たパスではありません。間違えていてもエラーにはなりませんので、間違えてても気づきにくいです。
下ログは、相対パスでサブディレクトリへのシンボリックリンクを作る例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
c:\data\tk\vagrant\centos7\test\link>mklink /d test_subdir test_org\sub_dir test_subdir <<===>> test_org\sub_dir のシンボリック リンクが作成されました c:\data\tk\vagrant\centos7\test\link>dir test_subdir ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は 6B1B-CC45 です c:\data\tk\vagrant\centos7\test\link\test_subdir のディレクトリ 2019/04/23 09:06 <DIR> . 2019/04/23 09:06 <DIR> .. 2019/04/23 09:06 12 test.txt 1 個のファイル 12 バイト 2 個のディレクトリ 357,694,595,072 バイトの空き領域 c:\data\tk\vagrant\centos7\test\link>more test_subdir\test.txt Test file. c:\data\tk\vagrant\centos7\test\link>d |
仮想マシンのゲストOSからのアクセスチェック
vagrantのゲストOSから、 ls -lF コマンド で確認すると、見た目で有効なシンボリックリンクになっているかチェックできます。
下図のように、青色で表示されているのが、有効なシンボリックリンクです。フルパス指定したリンクや、存在しないフォルダへのリンクは、赤文字で表示されてます。
また、test_link1 の中にあるファイルの中身の表示もできてます。
1 2 3 4 5 6 7 8 9 10 |
[taka@localhost link]$ pwd /vagrant/test/link [taka@localhost link]$ ls -l 合計 0 lrwxrwxrwx. 1 vagrant vagrant 0 4月 22 03:27 test_link1 -> test_org drwxrwxrwx. 1 vagrant vagrant 0 4月 22 03:29 test_org [taka@localhost link]$ cat test_link1/test.txt テストファイル シンボリックリンクのテスト |
まとめ
vagrant の仮想マシンが Linux 、ホストOSがWindowsのとき、Windowsの共有フォルダ内に、仮想マシンからシンボリックリンクを張ることができません。
そんな時、Windows側のmklink というコマンドでシンボリックリンクを作ることができます。また、仮想マシンからもそのリンクへアクセスすることが可能です。
mklink は、コマンドプロンプトの内蔵コマンド、また、管理者権限が必要なので、mklinkを使うときは、コマンドプロンプトを管理者権限で起動するようにしましょう。また、相対パスで指定するように注意してください。
コメント