vagrantでwindowsのホストOSの共有フォルダにシンボリックリンクを張ることができません。そんなとき、windows側でリンクを張ることで対応可能です。
windows側でシンボリックリンクを作成するコマンドは、mklinkです。
windows10でmklinkが見つからないのは、コマンドプロンプト内蔵コマンドだからです
ところが、Git bashでmklinkと実行しても見つかりませんし、Windows PowerShell で実行してもコマンドが見つかりません。
1 2 3 4 5 6 7 8 9 10 11 |
PS C:\data\tk\vagrant\centos7\html\test> mklink mklink : 用語 'mklink' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されま せん。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してく ださい。 発生場所 行:1 文字:1 + mklink + ~~~~~~ + CategoryInfo : ObjectNotFound: (mklink:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException PS C:\data\tk\vagrant\centos7\html\test> |
1 2 3 |
user@cf-nx2 MINGW64 /c/data/tk/vagrant/centos7/html/test (master) $ mklink bash: mklink: command not found |
どちらも、ファイルとして独立しているコマンドを探しているからです。mklinkはコマンドプロンプトの内蔵コマンドのため、コマンドプロンプトからしか実行できません。
PowerShell、Git Bashからcmdを実行すれば、mklinkも実行できます
コマンドプロンプトは、cmd.exe というファイルになってるので、PowerShellやGit Bash からもcmd と打ち込めば、コマンドプロンプトが起動します。
起動したコマンドプロンプトからは、mklinkを実行することはできます。
ただし、管理者権限が必要
ただし、一つ注意点は、mklinkでシンボリックリンクを作るのには管理者権限が必要なことです。よって、PowerShellやGit Bashを起動するとき、管理者権限で実行してない場合、cmd コマンドでコマンドプロンプトを実行しても、権限がないとエラー発生してしまいます。
管理者権限がないときはエラー発生
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
PS C:\data\tk\vagrant\centos7\html\test> cmd Microsoft Windows [Version 10.0.17763.437] (c) 2018 Microsoft Corporation. All rights reserved. C:\data\tk\vagrant\centos7\test\link>dir /w ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は 6B1B-CC45 です C:\data\tk\vagrant\centos7\test\link のディレクトリ [.] [..] [test_org] 0 個のファイル 0 バイト 3 個のディレクトリ 357,833,256,960 バイトの空き領域 C:\data\tk\vagrant\centos7\test\link>mklink /d test_lnk_ps test_org この操作を実行するための十分な特権がありません。 |
mklink コマンドの /d はフォルダの意味、リンク名 元フォルダ の順に指定します。せっかくcmdを実行してmklinkが見つかっても、権限がないため、エラー終了しています。
管理者権限ありのコマンドプロンプトを起動する3つの方法
mklinkでシンボリックリンクを作成するためには、
- コマンドプロンプトを管理者権限で起動する
- PowerShell、Git Bash を管理者権限で起動しておいて、cmdコマンドを使ってコマンドプロンプトを起動する
- ユーザ権限で起動しているPowerShell やGit Bashから、別ウィンドウで管理者権限でコマンドプロンプトを起動する
の3つの方法で、コマンドプロンプトを管理者権限で起動する必要があります。それぞれの例を紹介します。
コマンドプロンプトを管理者権限で起動する
何のひねりもないですね。スタートメニューの「Windowsシステムツール → コマンドプロンプト」を右クリックして、「その他 → 管理者として実行」をクリックして、起動するだけです。
PowerShell、Git Bash を管理者権限で起動しておいて、cmdコマンドを使ってコマンドプロンプトを起動する
PowerShell、Git Bash を管理者権限で起動しておけば、cmd を入力してコマンドプロンプトを起動しても管理者権限が維持されるので、mklink コマンドを実行できます。
Git Bashの例を挙げます。コマンドプロンプトと同様に、Git Bashをスタートメニューから、「Git → Git Bash」を右クリックして、「その他→管理者として実行」をクリックして起動します。
test_org というフォルダへのシンポリックリンクを作ってみます。
1 2 3 |
user@cf-nx2 MINGW64 /c/data/tk/vagrant/centos7/test/link (master) $ la ./ ../ test_org/ |
まず、cmd でコマンドプロンプトを起動します。
1 2 3 4 |
user@cf-nx2 MINGW64 /c/data/tk/vagrant/centos7/test/link (master) $ cmd Microsoft Windows [Version 10.0.17763.437] (c) 2018 Microsoft Corporation. All rights reserved. |
そのまま、 mklink /d リンク名 元フォルダ と入力して、フォルダへのシンボリックリンクを作成します。下リストでは、test_org フォルダへのシンボリックリンクを、test_link1 という名前で作成しています。
1 2 3 4 5 6 |
C:\data\tk\vagrant\centos7\test\link>mklink /d test_link1 test_org mklink /d test_link1 test_org test_link1 <<===>> test_org ▒̃V▒▒▒{▒▒▒b▒N ▒▒▒▒▒N▒▒▒쐬▒▒▒▒܂▒▒▒ C:\data\tk\vagrant\centos7\test\link>exit exit |
表示が文字化けしていますね。これはGit Bashでウィンドウズコマンドを実行すると文字化けするという問題で、記事「Git Bashでコマンドプロンプトのコマンド実行すると文字化けするのを解消する方法」で紹介した方法で解消できます。
解消した後、もう一回、実行してみると、下リストのようにエラーなく作成できています。
1 2 3 4 5 6 7 8 9 10 11 |
user@cf-nx2 MINGW64 /c/data/tk/vagrant/centos7/test/link (master) $ cmdwin cmd Microsoft Windows [Version 10.0.17763.437] (c) 2018 Microsoft Corporation. All rights reserved. C:\data\tk\vagrant\centos7\test\link>mklink /d test_link2 test_org mklink /d test_link2 test_org test_link2 <<===>> test_org のシンボリック リンクが作成されました C:\data\tk\vagrant\centos7\test\link>exit exit |
下リストのように、ちゃんとシンボリックリンクが作成されています。
1 2 3 |
user@cf-nx2 MINGW64 /c/data/tk/vagrant/centos7/test/link (master) $ la ./ ../ test_link1@ test_link2@ test_org/ |
ユーザ権限で起動しているPowerShell やGit Bashから、別ウィンドウで管理者権限でコマンドプロンプトを起動する
powershell のstart-process コマンドで、別ウィンドウでコマンドを実行することができます。
また、 -verb runasを付けることにより、管理者権限で実行することができます。下リストでは、cmd コマンドを管理者権限で起動してます。
1 2 |
user@cf-nx2 MINGW64 /c/data/tk/vagrant/centos7/html/test (master) $ powershell start-process cmd -verb runas |
でも、これで起動してもカレントフォルダが引き継がれるわけでもないので、方法1のスタートメニューからコマンドプロンプトを起動するのとあまり変わらないです。
まとめ
PowerShellやGit Bash からは、コマンドプロンプトの内蔵コマンドである mklink を実行することはできません。
また、mklinkコマンドでのシンボリックリンク作成には、管理者権限が必要です。
一番楽なmklinkの実行方法は、mklinkコマンドが必要になったら、スタートメニューからコマンドプロンプトを右クリックして、管理者権限で起動することです。
コメント
[…] windows 10 で mklink が見つからないのは、コマンドプロンプト内蔵コマンドだからです | IT 業務で使えるプログラミングテクニック […]