Подсистема Windows Linux - доступ к файлам вне Ubuntu

90

Почему, например, когда я создаю файл из Windows, я не вижу его в подсистеме Linux в Windows 10 (bash.exe)

Скриншот должен объяснить.

Папка: OMG был создан из Windows Explorer. Папка OMGBash была создана из подсистемы Linux bash.exe

Когда папка ИЛИ файл создается вне bash.exe, я никогда не вижу его, независимо от прав доступа и владельца.

Чтобы показать информацию, которую мне пришлось использовать Cygwin, чтобы показать права доступа к файлам, я также изменил разрешения, чтобы увидеть, появится ли папка. (Два командных окна внизу)

Снимок экрана, показывающий права доступа к папке, bash.exe и Cygwin:

введите описание изображения здесь

Я пытаюсь переместить все свои скрипты Cygwin в подсистему Linux, но мне не хочется пересоздавать каждый файл, затем копировать и переносить с помощью bash, а затем переформатировать, а затем с помощью Dos2unix (очень длинный).

Нашел это на GitHub для подсистемы Linux:

копирование непосредственно в подсистему Linux из Windows не поддерживается, согласно обсуждению других заявок. Где-то в AppData есть каталог (я забыл, где), который содержит файлы для файловой системы WSL. Но если вы поместите туда новые файлы или измените существующие файлы, ваши изменения не будут правильно отражены в WSL.

Мое лучшее предположение состоит в том, что Linux должен хранить различные метаданные (и больше информации о кэшировании и т. Д., Поскольку его модель буферизации диска также отличается) относительно своих файлов, чем в Windows, и что в настоящее время это реализуется путем хранения главной копии структуры файловой системы Linux в какой-то базе данных и просто используя файловую систему Windows в качестве удобного BLOB-хранилища для этой базы данных.

Если вам действительно нужно сделать это, обходной путь - написать сценарий drag'n'drop .bat или что-то такое, что делает bash.exe -c "mv% 1 / home / $ USER /". (Вам придется проделать некоторую умную работу с sed и tr, возможно, чтобы перевести% 1 в правильный путь WSL.)

В качестве альтернативы - не могли бы вы поместить ваши файлы в каталог Windows и в WSL сделать «cd ~; ln -s / mnt / c / path / to / my / files», чтобы они оказались в вашем домашнем каталоге WSL?

Дэйв Гамильтон
источник
Возможно ли смонтировать винчестер Windows в среде Linux? Таким образом, он должен показывать все файлы в реальном времени ... (или даже только каталог домашней
страницы
3
Отличная идея, но, к сожалению, файлы не видны. Обходной путь - скопировать файлы из каталога Windows в каталог подсистемы Linux через Bash.exe. Для этого необходимо cp -r --no-preserve=all удалить предыдущие разрешения. Тем не менее, если вы хотите внести какие-либо серьезные изменения, вы не можете использовать приложение Windows для редактирования файла в LinuxSubSystem, вы должны отредактировать его в вашем каталоге Windows, а затем скопировать его. Теперь я знаю это, его работоспособность, НО у меня сложилось впечатление, что подсистема Linux была более встроенной / встроенной в Windows, чем изолированная ОС
Дейв Гамильтон
Вы можете следить за развитием этой проблемы (обработка файлов между Windows и WLS) по адресу github.com/Microsoft/BashOnWindows/issues/1051
Gaia
Если вы устанавливаете дистрибутив из Магазина Windows, файловая система будет на %LocalAppData%\Packages\<some-long-name-of-distro>\LocalState\rootfs.
Ян Кемп

Ответы:

101

Я не уверен, правильно ли я понял ваш вопрос, но ваш ubuntu bash (верхнее правое окно) должен иметь доступ к дискам под Windows /mnt. Например, на моей машине /mnt/c/Users/Scott/Desktopустановлен мой рабочий стол Windows, и я могу читать / записывать туда файлы из vi, например. Я не верю, что все наоборот. То есть я не думаю, что вы можете исследовать свой мир bash из проводника Windows.

Как разработчик я занимаюсь размещением проектов на моем d: и указываю инструменты на основе linux на эту /mnt/d/projects/someproject/папку.

Убедитесь, что вы периодически обновляете свои сборки Windows, так как они, похоже, решают множество проблем с каждой сборкой, особенно вокруг символических ссылок и пересечения границ FS между Linux / Windows.

scottt732
источник
1
Вы правы, я думаю, я немного подпрыгнул. Хотя Bash может обращаться к файлам Windows, Windows не может копировать файлы в каталог подсистемы Linux. (затем он может копировать, но Bash не может их видеть, поскольку сохраняет права доступа к файлам). Когда я установил bash, я подумал, что наиболее логичным было переместить мои проекты из одной среды Linux в другую (попытка удалить из Cwygin bin), и это то, что заставило меня идти по пути головных болей. Теперь я настроил мой Bashrc, чтобы он имел начальный каталог моей предыдущей среды Linux и работал оттуда. Благодарю за ваш ответ.
Дэйв Хэмилтон
Подождите, как вы получите / mnt / d, чтобы показать? например, когда я подключаю телефон через MTP, он отображается по пути, например «This PC \ PhoneName», но с ним не ассоциируется буква диска.
Майкл
Симлинки работают, если у вас нет косой черты. Кроме того, вам нужно иметь файлы на стороне Windows в файловой системе, чтобы выполнять такие вещи, как локальный запуск проектов Django и доступ к ним в браузере
Zags
но файлы linux не обновляются, когда я изменяю файлы windows?!?!
PrimitiveNom
20

@ scottt732 прекрасно ответил.

Просто совет для разработчиков, которые будут работать в Windows и хотели бы получить быстрый доступ к этим файлам в подсистеме Linux. Вы можете использовать символические ссылки .

Например, если вы работаете над проектом в d:/projects/web-project, вы можете создать символическую ссылку на месте, /var/www/web-projectи все файлы, которые вы изменяете в окнах, будут легко доступны для доступа в Linux Bash.

Для этого вы будете использовать lnкоманду, как это

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

В приведенной выше строке /mnt/dдолжен был быть ваш диск на Windows. Настройте виртуальный хост Apache по этому пути, и вы готовы к работе.

Риз
источник
это на самом деле не синхронизируется ... разве мне каждый раз нужно перезагружать сервер?
PrimitiveNom
@ Энтони его символическая ссылка, поэтому вам не нужно перезапускать сервер для этого. На самом деле это не синхронизация, это просто указание на эту папку / путь.
Риз
1
Я разобрался в проблеме. Это произошло из-за того, что в CSS-файле было написано тире в имени, например css-file.css,. Я написал об этой проблеме здесь .
PrimitiveNom
9

Мы рекомендуем вам не копировать / создавать / обновлять файлы Linux с помощью приложений Windows .

Вместо этого храните файлы в файловой системе Windows (например c:\dev\project), для которой вы хотите редактировать файлы с помощью инструментов Windows и / или собирать / тестировать / запускать с помощью инструментов Linux / среды выполнения / платформ (например, через /mnt/c/dev/project).

В вашем конкретном случае, если вы хотите скопировать файлы Cygwin в Bash, затем откройте Bash и копировать файлы из папки Cygwin на C: в ~/, как это: cp /mnt/c/Users/dave/Documents/Cygwin/* ~/)

НТН.

Ричард Тернер
источник
1

Мне нужно было работать с PyCharm / eclipse в Windows 10, а для запуска / testind мне требовалась среда Linux;

У меня были проблемы с извлечением из git в подсистему Linux, и редактирование с помощью файлов PyCharm не было обнаружено сразу, и были проблемы;

devcode=/DevCode

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

У меня было выше в моем .bashrc в области Ubuntu. Это работает без проблем. Я мог редактировать Windows и запускать / тестировать в Ubuntu без каких-либо проблем.

Narayanaa
источник
0

У меня была похожая необходимость копировать файлы между WSL и win10. Я закончил тем, что включил sshd в Ubuntu-инсталляции, чтобы я мог ssh в Linux с win10. Затем я использую winscp для копирования файлов туда и обратно. Не оптимально, но я не копирую файлы очень часто. Я попытался найти сообщение, которое использовал для включения sshd, но не могу найти его.

kometen
источник