Поделиться через


Работа в файловой системе Windows и Linux

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

Хранилище файлов и производительность в разных файловых системах

Мы рекомендуем не работать с файлами между операционными системами, если у вас нет конкретной причины для этого. Для максимальной скорости производительности сохраните файлы в файловой системе WSL, если вы работаете в командной строке Linux (Ubuntu, OpenSUSE и т. д.). Если вы работаете в командной строке Windows (PowerShell, командная строка), сохраните файлы в файловой системе Windows.

Например, при хранении файлов проекта WSL:

  • Используйте корневой каталог файловой системы Linux: /home/<user name>/Project
  • Не является корневым каталогом файловой системы Windows: C:\Users\<UserName>\Project или /mnt/c/Users/<UserName>/Project$.

Если вы видите /mnt/ в пути к файлу командной строки WSL, это означает, что вы работаете с подключённого диска. Поэтому файловая система Windows C:/drive (C:\Users\<user name>\Project) будет выглядеть следующим образом при подключении в командной строке WSL: /mnt/c/Users/<user name>/Project$ Файлы проекта можно хранить на подключенном диске, но скорость производительности улучшится, если вы храните их непосредственно на \\wsl$ диске.

Просмотр текущего каталога в проводнике Windows

Вы можете просмотреть каталог, в котором хранятся файлы, открыв проводник Windows из командной строки, используя следующее:

explorer.exe .

Кроме того, можно использовать команду: powershell.exe /c start . обязательно добавьте период в конце команды, чтобы открыть текущий каталог.

Чтобы просмотреть все доступные дистрибутивы Linux и их корневые файловые системы в проводнике Windows, в адресной строке введите: \\wsl$

Просмотр файлов проекта в проводнике Windows

Конфиденциальность имени файла и регистра каталога

Чувствительность к регистру определяет, обрабатываются ли буквы верхнего регистра (FOO.txt) и строчные буквы (foo.txt) как различные (с учетом регистра) или эквивалентные (без учета регистра) в имени файла или каталога. Файловые системы Windows и Linux обрабатывают чувствительность к регистру разными способами: Windows не учитывает регистр, а Linux учитывает. Узнайте больше о том, как настроить чувствительность к регистру, особенно при монтировании дисков с помощью WSL, в статье о настройке чувствительности к регистру.

Взаимодействие между командами Windows и Linux

Средства и команды Windows и Linux можно использовать взаимозаменяемо с WSL.

  • Запустите средства Windows (т. е. notepad.exe) из командной строки Linux (т. е. Ubuntu).
  • Запустите средства Linux (т. е. grep) из командной строки Windows (т. е. PowerShell).
  • Совместное использование переменных среды между Linux и Windows. (Сборка 17063+)

Запуск средств Linux из командной строки Windows

Запустите двоичные файлы Linux из командной строки Windows (CMD) или PowerShell с помощью wsl <command> (или wsl.exe <command>).

Рассмотрим пример.

C:\temp> wsl ls -la
<- contents of C:\temp ->

Двоичные файлы, вызываемые таким образом:

  • Используйте тот же рабочий каталог, что и текущий запрос CMD или PowerShell.
  • Запустите от имени пользователя WSL по умолчанию.
  • Имеют те же права администратора Windows, что и процесс вызова и терминал.

Следующая wslwsl.exeкоманда Linux обрабатывается как любая команда, выполняемая в WSL. Такие операции, как sudo, использование конвейеров и перенаправление файлов, работают.

Пример использования sudo для обновления дистрибутива Linux по умолчанию:

C:\temp> wsl sudo apt-get update

Имя пользователя дистрибутива Linux по умолчанию будет указано после выполнения этой команды, и вам будет предложено указать пароль. После правильного ввода пароля дистрибутив будет загружать обновления.

Сочетание команд Linux и Windows

Ниже приведены несколько примеров смешивания команд Linux и Windows с помощью PowerShell.

Чтобы использовать команду Linux для перечисления файлов и команды ls -lafindstr PowerShell, чтобы отфильтровать результаты для слов, содержащих "git", объедините команды:

wsl ls -la | findstr "git"

Чтобы использовать команду PowerShell для перечисления файлов и команды dirgrep Linux для фильтрации результатов для слов, содержащих git, объедините команды:

C:\temp> dir | wsl grep git

Чтобы использовать команду Linux для перечисления файлов и команды ls -la> out.txt PowerShell для печати этого списка в текстовый файл с именем "out.txt", объедините команды:

C:\temp> wsl ls -la > out.txt

Команды, передаваемые в wsl.exe, пересылаются в процесс WSL без изменений. Пути к файлам должны быть указаны в формате WSL.

Чтобы использовать команду ls -la Linux для перечисления файлов в пути файловой /proc/cpuinfo системы Linux, с помощью PowerShell:

C:\temp> wsl ls -la /proc/cpuinfo

Чтобы использовать команду Linux ls -la для перечисления файлов в пути файловой системы Windows C:\Program Files, используя PowerShell:

C:\temp> wsl ls -la "/mnt/c/Program Files"

Запуск средств Windows из Linux

WSL может запускать средства Windows непосредственно из командной строки WSL с помощью [tool-name].exe. Например: notepad.exe.

Приложения выполняются таким образом, имеют следующие свойства:

  • Сохраните рабочий каталог в командной строке WSL (для большей части — исключения описаны ниже).
  • Имеют те же права доступа, как и процесс WSL.
  • Запустите от имени активного пользователя Windows.
  • Отображается в диспетчере задач Windows, как если бы он выполнялся непосредственно из запроса CMD.

Исполняемые файлы Windows, выполняемые в WSL, обрабатываются аналогично собственным исполняемым файлам Linux — конвейеризация, перенаправления и даже запуск в фоновом режиме работают так, как и ожидалось.

Чтобы запустить средство ipconfig.exe Windows, используйте средство grep Linux, чтобы отфильтровать результаты "IPv4", и используйте средство cut Linux, чтобы удалить поля столбцов; в дистрибутиве Linux (например, Ubuntu), введите:

ipconfig.exe | grep IPv4 | cut -d: -f2

Давайте рассмотрим пример сочетания команд Windows и Linux. Откройте дистрибутив Linux (т. е. Ubuntu) и создайте текстовый файл: touch foo.txt Теперь используйте команду ls -la Linux для перечисления прямых файлов и сведений о создании, а также средства findstr.exe Windows PowerShell для фильтрации результатов, чтобы отобразить только файл foo.txt в результатах:

ls -la | findstr.exe foo.txt

Средства Windows должны включать расширение файла, соответствовать регистру файла и быть исполняемым. Не исполняемые файлы, включая пакетные скрипты. Собственные команды CMD, например dir , могут выполняться с помощью cmd.exe /C команды.

Например, укажите содержимое каталога файловой системы Windows C:\, введя следующее:

cmd.exe /C dir

Или используйте ping команду для отправки эхо-запроса на веб-сайт microsoft.com:

ping.exe www.microsoft.com

Параметры передаются в двоичный файл Windows, не измененный. Например, следующая команда откроет C:\temp\foo.txt в notepad.exe:

notepad.exe "C:\temp\foo.txt"

Это также будет работать:

notepad.exe C:\\temp\\foo.txt

Совместное использование переменных среды между Windows и WSL с помощью WSLENV

WSL и Windows совместно используют специальную переменную среды, WSLENV, созданную для объединения дистрибутивов Windows и Linux, работающих в WSL.

Свойства переменной WSLENV :

  • Он общий; он существует как в среде Windows, так и в среде WSL.
  • Это список переменных среды для совместного использования между Windows и WSL.
  • Он может форматировать переменные среды для работы в Windows и WSL.
  • Он может помочь во взаимодействии между WSL и Win32.

Замечание

До сборки 17063 единственной переменной среды Windows, к которой WSL мог получить доступ, была PATH (поэтому можно было запускать исполняемые файлы Win32 из WSL). Начиная с 17063 года, WSLENV начинает поддерживаться. WSLENV является чувствительным к регистру.

Флаги WSLENV

Доступны четыре флага в WSLENV, которые могут повлиять на преобразование переменной среды.

WSLENV Флаги:

  • /p — преобразует путь между путями в формате WSL/Linux и путями Win32.
  • /l — указывает, что переменная среды — это список путей.
  • /u — указывает, что эта переменная среды должна быть включена только при запуске WSL из Win32.
  • /w — указывает, что эта переменная среды должна быть включена только при запуске Win32 из WSL.

Флаги можно объединить по мере необходимости.

Читать подробнее о WSLENV, включая часто задаваемые вопросы и примеры установки значения WSLENV как конкатенации с другими предварительно определёнными переменными среды, каждая из которых имеет суффикс с косой чертой и флагами, указывающими, как должно быть преобразовано значение и передачи переменных с помощью скрипта. В этой статье также приведен пример настройки среды разработки с помощью языка программирования Go, настроенного для совместного использования GOPATH между WSL и Win32.

Отключение взаимодействия

Пользователи могут отключить возможность запуска инструментов Windows для единого сеанса WSL, выполнив следующую команду с правами суперпользователя:

echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop

Чтобы повторно включить двоичные файлы Windows, закройте все сеансы WSL и снова запустите bash.exe или выполните следующую команду от имени root:

echo 1 > /proc/sys/fs/binfmt_misc/WSLInterop

Отключение взаимодействия не будет сохраняться между сеансами WSL. Взаимодействие будет включено снова при запуске нового сеанса.