Podsystem Windows Linux - uzyskiwanie dostępu do plików poza Ubuntu

85

Dlaczego, na przykład, gdy tworzę plik z poziomu systemu Windows, nie mogę go zobaczyć pod systemem Linux w systemie Windows 10 (bash.exe)

Zrzut ekranu powinien wyjaśnić.

Folder: OMG został utworzony w Eksploratorze Windows. Folder OMGBash został stworzony z systemu Linux bash.exe

Kiedy folder LUB plik jest tworzony poza bash.exe, nigdy go nie widzę, bez względu na uprawnienia i własność.

Aby pokazać informacje, których musiałem użyć Cygwin do wyświetlenia uprawnień do plików, zmieniłem również uprawnienia, aby zobaczyć, czy folder się pojawi. (Dwa okna poleceń u dołu)

Zrzut ekranu przedstawiający uprawnienia do folderu, bash.exe i Cygwin:

wprowadź opis zdjęcia tutaj

Próbuję przenieść wszystkie moje skrypty Cygwin do podsystemu Linux, ale nie mam ochoty odtwarzać każdego pliku, potem muszę kopiować i wklejać za pomocą bash, a następnie formatować, a następnie używać Dos2unix (bardzo długi).

Znaleziono to w GitHub dla podsystemu Linux:

kopiowanie bezpośrednio do podsystemu Linux z systemu Windows nie jest obsługiwane, zgodnie z dyskusją na temat innych zgłoszeń. W AppData jest gdzieś katalog (nie pamiętam gdzie), który wydaje się zawierać pliki dla systemu plików WSL. Ale jeśli umieścisz tam nowe pliki lub zmodyfikujesz istniejące pliki, zmiany nie zostaną poprawnie odzwierciedlone w WSL.

Domyślam się, że Linux musi przechowywać różne metadane (i więcej informacji o buforowaniu itp., Ponieważ jego model buforowania dysku również jest inny) na temat swoich plików niż Windows, i że jest to obecnie realizowane przez przechowywanie głównej kopii struktury systemu plików Linux w jakiejś bazie danych i po prostu używając systemu plików Windows jako wygodnego magazynu BLOB dla tej bazy danych.

Jeśli naprawdę musisz to zrobić, obejściem może być napisanie skryptu przeciągnij i upuść .bat lub coś takiego, co powoduje, że bash.exe -c "mv% 1 / home / $ USER /". (Będziesz musiał wykonać sprytną pracę z sed i tr, prawdopodobnie, aby przetłumaczyć% 1 na prawidłową ścieżkę WSL.)

Alternatywnie - czy możesz umieścić swoje pliki w katalogu Windows i, w ramach WSL, wykonać polecenie „cd ~; ln -s / mnt / c / path / to / my / files”, aby wyglądały, jakby były w katalogu głównym WSL?

Dave Hamilton
źródło
Czy można zamontować dysk twardy systemu Windows w środowisku Linux? W ten sposób powinien wyświetlać wszystkie pliki w czasie rzeczywistym ... (a nawet tylko katalog domu Cygwin)
Hastur
3
Świetny pomysł, ale niestety pliki nie są widoczne. Obejściem tego problemu jest skopiowanie plików z katalogu systemu Windows do podkatalogu systemu Linux za pośrednictwem Bash.exe. W ten sposób trzeba cp -r --no-preserve=all usunąć poprzednie uprawnienia. Jeśli jednak chcesz dokonać ciężkich zmian, nie możesz użyć aplikacji systemu Windows do edycji pliku w systemie LinuxSubSystem, musisz go edytować w katalogu systemu Windows, a następnie skopiować. Teraz wiem, że jest to wykonalne, ALE miałem wrażenie, że Linux Sub System był bardziej natywny / zintegrowany z Windows niż izolowany system operacyjny
Dave Hamilton
Możesz śledzić postępy tego problemu (obsługa plików między Windows a WLS) na github.com/Microsoft/BashOnWindows/issues/1051
Gaia
Jeśli zainstalujesz dystrybucję ze Sklepu Windows, system plików będzie na %LocalAppData%\Packages\<some-long-name-of-distro>\LocalState\rootfs.
Ian Kemp,

Odpowiedzi:

95

Nie jestem pewien, czy nie rozumiem twojego pytania, ale twoja Ubuntu Bash (prawe górne okno) powinna mieć dostęp do twoich dysków opartych na Windowsie /mnt. Na przykład na moim komputerze /mnt/c/Users/Scott/Desktopjest mój pulpit systemu Windows i mogę na nim odczytywać / zapisywać pliki z vi. Nie wierzę jeszcze, że jest odwrotnie. Oznacza to, że nie sądzę, że możesz eksplorować swój świat bashów za pomocą Eksploratora Windows.

Jako programista zajmuję się hostowaniem projektów na moim d: i kierowaniem narzędzi opartych na systemie Linux na ten /mnt/d/projects/someproject/folder.

Pamiętaj, aby okresowo aktualizować kompilacje systemu Windows, ponieważ wydają się one naprawiać wiele problemów z każdą kompilacją, szczególnie wokół sym-linków i przekraczania granic FS między Linux / Windows.

scottt732
źródło
1
Masz rację, myślę, że trochę podskoczyłem z pistoletu. Podczas gdy Bash może uzyskiwać dostęp do plików Windows, Windows nie może kopiować plików do katalogu Linux Sub System. (może wtedy skopiować, ale Bash ich nie widzi, ponieważ zachowuje uprawnienia do plików) Kiedy zainstalowałem bash, pomyślałem, że najbardziej logiczną rzeczą było przeniesienie moich projektów z jednego środowiska Linux do drugiego (próba wyrzucenia Cwygin), i to właśnie zaczęło mnie bóle głowy. Skonfigurowałem teraz mój Bashrc, aby miał teraz katalog startowy mojego poprzedniego środowiska Linux i działał stamtąd. Dziękuję za odpowiedź.
Dave Hamilton,
Czekaj, jak się wyświetla / mnt / d? na przykład, kiedy podłączam telefon przez MTP, pojawia się on pod ścieżką „This PC \ PhoneName”, ale nie jest z nim związana żadna litera dysku.
Michael
Dowiązania symboliczne działają, jeśli nie masz końcowego ukośnika. Ponadto musisz mieć pliki po stronie systemu plików Windows, aby np. Uruchamiać projekty Django lokalnie i uzyskiwać do nich dostęp w przeglądarce
Zags
ale pliki linux nie aktualizują się, gdy modyfikuję pliki systemu Windows?!?!
BugWhisperer
20

@ scottt732 pięknie odpowiedział.

Tylko wskazówka dla programistów, którzy chcieliby pracować w systemie Windows i chcieliby naprawdę szybko uzyskać dostęp do tych plików w podsystemie Linux. Możesz użyć dowiązań symbolicznych .

Na przykład, jeśli pracujesz nad projektem d:/projects/web-project, możesz utworzyć dowiązanie symboliczne w miejscu, /var/www/web-projecta wszystkie pliki, które zmienisz w systemie Windows, będą łatwo dostępne w Linux Bash.

W tym celu użyjesz lntakiego polecenia

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

W powyższej linii /mnt/dmiał być twój dysk na Windows. Ustaw wirtualny host Apache na tę ścieżkę i jesteś gotowy.

Riz
źródło
tak naprawdę nie synchronizuje ... chyba że muszę za każdym razem restartować serwer?
BugWhisperer
@Anthony jest jego dowiązaniem symbolicznym, więc nie trzeba zrestartować serwera w tym celu. W rzeczywistości nie jest to synchronizacja, tylko wskazuje ten folder / ścieżkę.
Riz
1
Zrozumiałem problem. Było tak, ponieważ plik CSS miał myślnik w nazwie, na przykład css-file.css. O tym problemie pisałem tutaj .
BugWhisperer
9

Zalecamy, aby nie kopiować / tworzyć / aktualizować plików Linux za pomocą aplikacji Windows .

Zamiast tego przechowuj pliki w systemie plików Windows (np. c:\dev\project), Które chcesz edytować za pomocą narzędzi Windows i / lub buduj / testuj / uruchamiaj za pomocą narzędzi / środowisk uruchomieniowych / platform Linux (np. Via /mnt/c/dev/project).

W konkretnym scenariuszu, jeśli chcesz skopiować pliki Cygwin do Bash, a następnie otwórz Bash i skopiuj pliki z folderu Cygwin na C: do ~/, w ten sposób cp /mnt/c/Users/dave/Documents/Cygwin/* ~/:)

HTH.

Richard Turner
źródło
1

Miałem potrzebę pracy z PyCharm / eclipse na Windows 10, podczas gdy do uruchamiania / testind potrzebowałem środowiska Linux;

Miałem problemy z wyewidencjonowaniem z gita do systemu Linux i edytowanie plików PyCharm nie było od razu widoczne i miałem problemy;

devcode=/DevCode

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

Miałem powyższe w moim .bashrc w obszarze Ubuntu. Działa płynnie. Mogę edytować system Windows i uruchamiać / testować w Ubuntu bez żadnych problemów.

Narayanaa
źródło
0

Miałem podobną potrzebę kopiowania plików między WSL a win10. Skończyłem włączanie sshd w instalacji Ubuntu, aby móc ssh w Linuksie z win10. Następnie używam winscp do kopiowania plików tam iz powrotem. Nie optymalne, ale nie kopiuję plików zbyt często. Próbowałem znaleźć post, którego użyłem do włączenia sshd, ale nie mogę go znaleźć.

kometen
źródło