
WSL上にubuntuを動かし、sshで外部の計算用のサーバーに接続しています。
ubuntuから作ったシンボリックリンクは、Windowsのファイルエクスプローラーからアクセスできません。
(<file-name>に対するアクセス許可がありません。ネットワーク管理者にアクセス許可を要求してくださいと言われます)。アクセスレベルはchmod 777にしています。
ところが、windowsのファイルエクスプローラーからショートカットを作ると、
windowsのファイルエクスプローラー・ubuntu両方からアクセスできます。
この両者の違いは何が原因なのでしょうか?
ファイルエクスプローラーからアクセスできるショートカットを、ubuntuから作ることは不可能なのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
Windowsのリビジョンによって、WSLのCドライブマウントの動作が多少異なるため、Windows 10 1803、Ubuntu 18.04 LTSである前提で話をします。また、WindowsとUbuntu両方から共通して扱えるのはWindows上のドライブ、Cドライブであれば"/mnt/c"配下であるという前提で話をします。Ubuntu上の"/home"配下も実体のフォルダーを開くことでWindowsから直接アクセスすることが可能ですが、その動作はWSLでサポートされていませんので、対象には含めません。
次に、まず知っておいて欲しいこととして、WSLがCドライブなどのWindowsをマウントする仕組みです。以下のMicrosoftの公式なブログが参考になります。
WSL File System Support – Windows Subsystem for Linux
File System Improvements to the Windows Subsystem for Linux – Windows Subsystem for Linux
WindowsのファイルシステムはNTFSというもので、Linuxで一般的なext4等とは異なる属性や概念をもちます。そのため、そのままLinuxに見せても色々と不具合が出てしまいます。そこで、DrvFsというファイルシステムとして特殊な変換を行っています。それでも完全な一致は不可能なため、Windowsだけで有効、Linuxだけで有効、と言うことが発生します。
Linuxであるファイルやディレクトリに対して別のパスでアクセスするようにするできるのは下記の二つです。
- ハードリンク(ファイルのみ)
ln ターゲット リンク
- シンボリックリンク
ln -s ターゲット リンク
対して、WindowsのNTFSでは複数の手段が用意されています。
- ハードリンク(ファイルのみ)
mklink /h リンク ターゲット
- ショートカット(コマンド無し)
エクスプローラー上で作成
WshShellのCreateShortcut等
※ コマンドは用意されていない - シンボリックリンク(作成には管理者権限が必要)
mklink /d リンク ターゲット
(ディレクトリの場合)
mklink リンク ターゲット
(ファイルの場合)
※ ファイル用シンボリックリンクとディレクトリ用シンボリックリンクがそれぞれ存在し、エクスプローラー上での扱いなどが異なる。この動作はターゲットに依存しない。 - ジャンクション(ディレクトリのみ※)
mklink /j リンク ターゲット
※ ファイルに対しても設定できるがエクスプローラー上はディレクトリ扱いになるため、アプリなどのアクセスは正常に動作しない場合がある。
ハードリンクはWindowsでもLinuxでも扱いが同じであるため、問題になりません。
ショートカットはファイルシステム上の仕組みではなく、拡張子".lnk"のただのファイルです。ファイル内にショートカットの内容、ターゲットであるリンクやアイコンの情報が入っています。エクスプローラーではこれらを認識できますが、Linuxでは".lnk"というただのファイルにしか見えないため、ファイルやディレクトリへの別名として扱う事は出来ません。
LinuxからはWindowsのシンボリックリンクもジャンクションも同じように使用可能です(隠し属性のある特殊なジャンクションを除く)。つまり、Windowsで作成した場合は問題ありません。デフォルトではWSL上でもWindowsのコマンドが使えますので、mklink
コマンドで作れば問題ないように思えます。しかし、WSLはユーザーのアクセス権で操作されるため作成できるのはジャンクションのみです(sudo
でrootになってもそれは変わりません)。そして、Windowsでのジャンクションはディレクトリしか扱えない、絶対パスしか設定できないという欠点があります。
では、Linuxのシンボリックリンクはどうしているのかというと実はジャンクションを作成しています。しかし、このジャンクションはWindowsと互換性がないジャンクションです。なぜなら、Linuxのシンボリックリンクは、Windowsのジャンクションと違って、ディレクトリを扱う必要がありますし、相対パスも扱う必要があるからです。そのようなジャンクションをWindowsで読み取ることができず、アクセス拒否という形で現れます。パーミッションが足りないとかではなく、Windowsでサポートしていない形式のジャンクションなので、そもそも不可能であると言うことです。
ということで、もし、WindowsとLinux両方からアクセス可能なシンボリックリンクを作成したい場合は、管理者権限でコマンプロンプト等を実行し、mklink
を用いるぐらいしか、今のところありません。
上記問題は以下のIssueとしてあがっており、1803で解決されたとありますが、依然として問題は残ったままです。
Symlinks on the mounted Windows directories are not compatible with native. · Issue #353 · Microsoft/WSL · GitHub
投稿2018/09/23 11:06
総合スコア21741
0
投稿2018/09/23 01:39
総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/23 11:02

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。