# Windows Subsystem for Linux

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

Существует две реализации WSL:
- WSL1 - транслятор API Linux <-> Windows
- WSL2 - виртуальная машина с полноценным ядром Linux.

Мы будем пользоваться WSL2. По скорости работы WSL2 почти не уступает нативной OS Linux. Более подробные отличия можно посмотреть в интеренете.

Находим в поиске: Включение или отключение компонентов Windows

Включаем галочки:
- Подсистема Windows для Linux
- Платформа виртуальной машины
<p align="center"> <img src="images/WSL1.png"></p>

Перезагружаем.

В терминале включаем WSL2 по умолчанию для всех дистрибутивов.
```
wsl --set-default-version 2
```

Далее из Microsoft Store можно устанавливать дистрибутивы Ubuntu, Debian, и др.

## Конфигурация WSL

Установленные дистрибутивы можно запускать из профиля [Windows Terminal](Windows-Terminal) так:
```
wsl.exe -d <distroname>
```
Например:
```
wsl.exe -d Ubuntu-20.04
```

Если после настройки .bashrc будет ругаться на переменные locale
то надо сгенерировать локаль ru_RU.UTF-8:
```
sudo dpkg-reconfigure locales
```

## Настройка DNS (для работы с VPN)

При включении VPN наблюдается проблема с переключением на новый DNS. Для ее решения необходимо чтобы WSL использовала DNS независимо от хостовой системы.

В файл /etc/wsl.conf добавляем:
```
[network]
generateResolvConf = false
```

Пишем свои DNS сервера в /etc/resolv.conf
```
sudo rm -rf /etc/resolv.conf
sudo nano /etc/resolv.conf
```
```
nameserver 8.8.8.8
nameserver 8.8.4.4
```
Перезапускаем WSL:
```
wsl --shutdown
```

## Проброс USB устройств в WSL

Устанавливаем `usbipd`
```
winget install usbipd
```

Вводим для получения листа ```usbipd list``` и получаем что то вроде такого:
```
Connected:
BUSID  VID:PID    DEVICE                    STATE
1-1    1a86:7523  USB-SERIAL CH340 (COM5)   Not shared
```

Биндим нужное устройство:
```
usbipd bind --busid 1-1
```

Лист станет таким:
```
Connected:
BUSID  VID:PID    DEVICE                    STATE
1-1    1a86:7523  USB-SERIAL CH340 (COM5)   Shared
```

Пробрасываем нужное нам устройство:
```
usbipd attach --wsl --busid 1-1
```

Всё, после этого отваливется COM от винды и он теперь доступен в WSL.

## Работа

Чтобы получить доступ к файловой системе виртуальной машины
надо при запущенной машине зайти в сетевую папку:
```
\\wsl$
```
Либо запустить внутри виртуальной машины:
```
explorer.exe .
```
Если используете VS Code то его можно открыть в нужной папке виртуальной машины:
```
code .
```
