Windows Linux Subsystem - Zugriff auf Dateien außerhalb von Ubuntu

90

Warum kann ich eine Datei, die ich zum Beispiel aus Windows heraus erstelle, unter dem Linux-Subsystem in Windows 10 (bash.exe) nicht sehen?

Der Screenshot sollte erklären.

Ordner: OMG wurde im Windows Explorer erstellt. Der Ordner OMGBash wurde mit dem Linux-Subsystem bash.exe erstellt

Wenn ein Ordner ODER eine Datei außerhalb von bash.exe erstellt wird, kann ich sie ungeachtet der Berechtigungen und des Eigentums nie sehen.

Um die Informationen anzuzeigen, die ich zum Anzeigen von Dateiberechtigungen mit Cygwin verwenden musste, habe ich auch die Berechtigungen geändert, um festzustellen, ob der Ordner angezeigt wird. (Die beiden Befehlsfenster unten)

Screenshot mit Ordner-, bash.exe- und Cygwin-Berechtigungen:

Bildbeschreibung hier eingeben

Ich versuche, alle meine Cygwin-Skripte auf das Linux-Subsystem zu verschieben, aber ich möchte nicht jede Datei neu erstellen, dann mit bash kopieren und einfügen, dann mit Dos2unix neu formatieren (sehr langwierig).

Gefunden bei GitHub für das Linux-Subsystem:

Das direkte Kopieren von Windows in das Linux-Subsystem wird nach Angaben anderer Tickets nicht unterstützt. Unter AppData befindet sich irgendwo (ich vergesse wo) ein Verzeichnis, das die Dateien für das WSL-Dateisystem enthält. Wenn Sie jedoch neue Dateien dort ablegen oder vorhandene Dateien dort ändern, werden Ihre Änderungen in WSL nicht korrekt wiedergegeben.

Ich gehe davon aus, dass Linux andere Metadaten (und mehr Caching-Informationen usw., da sich auch das Modell der Festplattenpufferung unterscheidet) zu seinen Dateien speichern muss als Windows und dies derzeit durch Speichern der Masterkopie der Struktur implementiert wird des Linux-Dateisystems in einer Datenbank, und nur mit dem Windows-Dateisystem als bequemen BLOB-Speicher für diese Datenbank.

Wenn Sie dies wirklich tun müssen, besteht eine Problemumgehung darin, ein Drag'n'Drop-Skript (.bat) oder etwas Ähnliches zu schreiben, das bash.exe -c "mv% 1 / home / $ USER /" ausführt. (Sie müssen einige clevere Arbeiten mit sed und tr ausführen, um% 1 wahrscheinlich in einen gültigen WSL-Pfad zu übersetzen.)

Alternativ - könnten Sie Ihre Dateien in ein Windows-Verzeichnis stellen und in der WSL "cd ~; ln -s / mnt / c / path / to / my / files" ausführen, um sie in Ihrem WSL-Homedir erscheinen zu lassen?

Dave Hamilton
quelle
Ist es möglich, die Windows-Festplatte in der Linux-Umgebung zu mounten? Auf diese Weise sollte es alle Dateien in Echtzeit anzeigen ... (oder sogar nur das Verzeichnis des Cygwin-Heims)
Hastur
3
Tolle Idee, aber leider sind die Dateien nicht sichtbar. Der Weg dahin ist, Dateien aus dem Windows-Verzeichnis über Bash.exe in das Linux-Subsystemverzeichnis zu kopieren. Um dies zu tun, müssen cp -r --no-preserve=all die vorherigen Berechtigungen gelöscht werden . Wenn Sie jedoch umfangreiche Änderungen vornehmen möchten, können Sie die Datei im LinuxSubSystem nicht mit einer Windows-Anwendung bearbeiten. Sie müssen sie in Ihrem Windows-Verzeichnis bearbeiten und dann kopieren. Jetzt weiß ich, dass es funktioniert, ABER ich hatte den Eindruck, das Linux-Subsystem sei nativer / in Windows integriert als ein isoliertes Betriebssystem
Dave Hamilton
Sie können den Fortschritt dieses Problems (Umgang mit Dateien zwischen Windows und WLS) unter github.com/Microsoft/BashOnWindows/issues/1051
Gaia
Wenn Sie eine Distribution aus dem Windows Store installieren, befindet sich das Dateisystem auf %LocalAppData%\Packages\<some-long-name-of-distro>\LocalState\rootfs.
Ian Kemp

Antworten:

101

Ich bin nicht sicher, ob ich Ihre Frage falsch verstehe, aber Ihre Ubuntu-Bash (Fenster oben rechts) sollte Zugriff auf Ihre Windows-basierten Datenträger unter haben /mnt. Zum Beispiel befindet sich auf meinem Computer /mnt/c/Users/Scott/Desktopmein Windows-Desktop und ich kann dort Dateien von vi zum Beispiel lesen / schreiben. Ich glaube nicht, dass das Gegenteil der Fall ist. Das heißt, ich glaube nicht, dass Sie Ihre Bash-Welt vom Windows-Explorer aus erkunden können.

Als Entwickler habe ich Projekte auf meinem d: gehostet und die linuxbasierten Tools auf diesen /mnt/d/projects/someproject/Ordner gelegt.

Stellen Sie sicher, dass Sie Ihre Windows-Builds regelmäßig aktualisieren, da sie bei jedem Build viele Probleme zu beheben scheinen, insbesondere im Zusammenhang mit Sym-Links und dem Überschreiten von FS-Grenzen zwischen Linux / Windows.

scottt732
quelle
1
Sie haben recht, ich glaube, ich bin ein wenig mit der Waffe gesprungen. Während Bash auf Windows-Dateien zugreifen kann, kann Windows keine Dateien in das Linux-Subsystemverzeichnis kopieren. (Es kann dann kopieren, aber Bash kann sie nicht sehen, da es die Dateiberechtigungen beibehält.) Als ich Bash installiert bekam, war es am logischsten, meine Projekte von einer Linux-Umgebung in eine andere zu verschieben (Versuch, Cwygin zu entfernen) Es ist das, was mich auf den Weg der Kopfschmerzen gebracht hat. Ich habe meinen Bashrc jetzt so konfiguriert, dass er ein Startverzeichnis meiner vorherigen Linux-Umgebung hat und von dort aus funktioniert. Danke für Ihre Antwort.
Dave Hamilton
Warten Sie, wie kommt es, dass / mnt / d angezeigt wird? Wenn ich zum Beispiel ein Telefon über MTP verbinde, wird es unter einem Pfad wie "Dieser PC \ Telefonname" angezeigt, aber es ist kein Laufwerksbuchstabe zugeordnet.
Michael
Symlinks funktionieren, wenn Sie keinen abschließenden Schrägstrich haben. Außerdem benötigen Sie Dateien auf der Windows-Seite des Dateisystems, um beispielsweise Django-Projekte lokal ausführen und im Browser darauf zugreifen zu können
Zags
Aber die Linux-Dateien werden nicht aktualisiert, wenn ich die Windows-Dateien ändere?!?!
PrimitiveNom
20

@ scottt732 hat wunderbar geantwortet.

Nur ein Tipp für Entwickler, die unter Windows arbeiten und schnell auf diese Dateien im Linux-Subsystem zugreifen möchten. Sie können symbolische Links verwenden .

Wenn Sie beispielsweise an einem Projekt in arbeiten d:/projects/web-project, können Sie vor Ort einen Symlink erstellen, /var/www/web-projectund alle Dateien, die Sie in Windows ändern, stehen in Linux Bash zur Verfügung.

Dazu verwenden Sie den folgenden lnBefehl

ln -s  /mnt/d/projects/web-project  /var/www/web-project

In der obigen Zeile /mnt/dsollte Ihr Laufwerk auf Windows sein. Richten Sie Ihren virtuellen Apache-Host auf diesen Pfad ein und Sie können loslegen.

Riz
quelle
Es wird nicht synchronisiert ... es sei denn, ich muss den Server jedes Mal neu starten?
PrimitiveNom
@Anthony ist ein symbolischer Link, sodass Sie den Server hierfür nicht neu starten müssen. Eigentlich ist dies keine Synchronisation, sondern zeigt nur auf diesen Ordner / Pfad.
Riz
1
Ich habe das Problem herausgefunden. Das lag daran, dass die CSS-Datei einen Bindestrich im Namen hatte, wie zum Beispiel css-file.css. Ich habe zu diesem Thema hier gepostet .
PrimitiveNom
9

Es wird empfohlen, Linux-Dateien nicht mit Windows-Apps zu kopieren, zu erstellen oder zu aktualisieren .

Speichern Sie stattdessen Dateien im Windows-Dateisystem (z. B. über c:\dev\project), die Sie mit Windows-Tools bearbeiten und / oder mit Linux-Tools / Runtimes / Platforms (z /mnt/c/dev/project. B. über ) erstellen / testen / ausführen möchten .

In Ihrem speziellen Szenario, wenn Sie Ihre Cygwin - Dateien in Bash kopieren, dann öffnen Bash und kopieren Sie die Dateien von Ihrem Cygwin Ordner auf C: in ~/, wie folgt aus : cp /mnt/c/Users/dave/Documents/Cygwin/* ~/)

HTH.

Richard Turner
quelle
1

Ich musste unter Windows 10 mit PyCharm / eclipse arbeiten, während ich zum Ausführen / Testen eine Linux-Umgebung benötigte.

Ich hatte Probleme beim Auschecken aus dem Git in das Linux-Subsystem und beim Bearbeiten mit PyCharm-Dateien.

devcode=/DevCode

if [ ! -L $devcode ]; then
     ln -s /mnt/c/DevCode /DevCode 
fi

Ich hatte das oben in meinem .bashrc im Ubuntu-Bereich. Es funktioniert nahtlos. Ich konnte Windows bearbeiten und in Ubuntu ohne Probleme ausführen / testen.

Narayanaa
quelle
0

Ich hatte ein ähnliches Bedürfnis, Dateien zwischen WSL und win10 zu kopieren. Am Ende habe ich sshd auf der Ubuntu-Installation aktiviert, damit ich von win10 in Linux sshen konnte. Dann benutze ich Winscp, um Dateien hin und her zu kopieren. Nicht optimal, aber ich kopiere keine Dateien sehr häufig. Ich habe versucht, den Beitrag zu finden, mit dem ich sshd aktiviert habe, kann ihn aber nicht finden.

kometen
quelle