Git-BashとWSLはディレクトリ構造が異なります

Git-BashとWSLはディレクトリ構造が異なります

そこで私は現在、Windows 10ワークステーションでWSLを設定してセットアップしているところです。これにより、Windowsで非常に便利なコマンドラインツールを使用できるようになります。現在、WSLとGit-Bashの両方で、PC上のすべてのドライブとパーティション、およびすべてのファイル(ユーザーがアクセスできるもの)にアクセスできますが、パスは異なります。tempいくつかのファイルがあるディレクトリがあるとします。

tree C:\Temp
C:\TEMP
├───tempfile1.txt
├───tempfile2.txt
└───tempfile3.txt

次にGit-Bash(これSO Q&A)C:\Tempディレクトリでコマンドを実行すると、pwdパスは次のようになります

/c/Temp

しかし奇妙なことに、 Git-Bash でlsコマンドを実行すると、ディレクトリ/が表示されずcmntディレクトリも存在しません。

さて、WSLですが、Open Linux Shell hereWindowsエクスプローラーの右クリックコンテキストメニューから実行すると、pwdパスが次のように表示されます。

/mnt/c/Temp

そこで私の質問は、Windows の '/' ディレクトリとは何であり、どこにあるのかということです。また、これらはルート ディレクトリを「モックする」 2 つの異なる方法にすぎないのでしょうか。

編集:
Windows バージョン: Windows 10 Enterprise Edition バージョン 1903 (ビルド 18362.267)
WSL バージョン: 1809 (ビルド 17763) (執筆時点での最新リリース)

答え1

Git-Bash は典型的な Windows プログラムであり、そのように機能します。C:\ルート ディレクトリとして認識されます。

ただし、WSL は異なります。コンテナーなのか VM なのかはわかりませんが、いずれにし
ても典型的な Windows プログラムではないことは明らかです。Windows 上では動作しますが、WSL で実行するものはすべて、基本的に Windows ではなく Linux 上で動作しているとみなされます。これにより、Linux のディレクトリ構造などの Linux 標準に準拠することになります。

つまり、独自のルート ディレクトリがあり、 ではなく にC:\なります/。このディレクトリの場所は AppData 内のどこかにあり、WSL のバージョンや、Ubuntu、OpenSUSE、その他のどれを使用しているかによって異なります。

Linux では、ドライブに文字は割り当てられません。マウント ポイントが割り当てられます。たとえば、ルートは/ルート パーティション (WSL の場合はフォルダー) のマウント ポイントです。その下にあるものはすべて/同じドライブではありません。たとえば、私のラップトップでは、/home/別のパーティションにあります。

/mnt/Linux ファイル構造内のマウント ディレクトリです。外部のものを対象としています。

/mnt/c/はあなたの ですC:\。Linux はドライブ文字を指定しないので、このようにする必要があります。これは、WSL から Windows ファイルにアクセスする正しい、最もエレガントな方法です。WSL の bash が に別の場所を持つのは、このためですC:\

最も一般的な WSL ディストリビューション (Ubuntu) を使用している場合は、次/のようになります。

%LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs

そこにない場合、または別のディストリビューションを使用している場合は、ここを参照してください。

%LOCALAPPDATA%\Packages\

ただし、Linux はファイル権限を Windows とはまったく異なる方法で処理することに注意してください。ここでは、ファイル エクスプローラーなどの Windows ツールを使用して何もしないでください。OS 間でやり取りする必要がある場合は、WSL 内から行ってください。

答え2

このコマンドをbashで使うだけです

cd //wsl.localhost/dir

私は以下のコマンドを使用して、ランプのhtdocsにアクセスします

cd //wsl.localhost/Ubuntu/opt/lampp/htdocs/

答え3

WSL の / フォルダーは にあり 、 WSL 用にインストールした Linux ディストリビューションに応じて、 または同様の のC:\Users\<userName>\AppData\Local\Packages\some serial number for ubuntu installation ネットワーク リソースとしても見つかります 。\\wsl$\Ubuntu-18.04

git bashの場合は次の場所にありますC:\Program Files\Git

フォルダーに移動してexplorer.exe .「git bash」と入力すると、いつでも実際の場所を見つけることができます。また、wsl は.パスを変換し、実行する Windows アプリケーションに渡します。

そうは言っても、これらのエミュレートされた/フォルダーのファイルをアプリケーションのウィンドウ経由で開くべきではありません。特に WSL の場合は、適切に読み取れない可能性があります。

これらのプログラムは、分離された CPU とメモリ割り当てを持つ仮想マシンを作成せずに、Unix ファイル システムをエミュレートします。通常のアプリケーションと同様に、Windows と共有するだけです。(Windows 10 Pro Hyper-V を使用して完全な VM を実行している WSLv2 の場合を除く)

または場所は/c/mnt/cWindows でネットワーク ドライブをマッピングしてZ:、それをローカル ディスクのように扱うのと非常によく似たネットワーク マウントです。

GIT bash と WSL は、Windows ルート ドライブをネットワーク リソースであるかのようにマウントします。Linux では、/folderドライブ文字の概念がないため、ドライブをにマウントします。

必要に応じて、git bash と同じ方法でドライブをマウントするように WSL に指示できます。

wslで/etc/wsl.confファイルを編集すると

そして次の行を追加します。

[automount]
root = /

ファイルを保存し、Windows からログオフして再度ログインします。

これで、WSL を起動すると、ローカル ハード ドライブの git bash と同じパスが設定されます。

また、これらは Linux オペレーティング システムで使用されるファイル システムをエミュレートしていますが、完璧にエミュレートされているわけではなく、同じ方法でエミュレートされているわけでもないことに注意してください。

たとえば、Unix ファイル システムにはファイルに対する権限があり、git bash は自動的に「実行可能ファイルであるべき」ものを検出し、+x 属性を追加します。WSL はこれをあまりうまく行わず、通常はすべてを実行可能にするだけです。

関連情報