При установке wsl создается сеть между комньютером windows и виртуальной ubuntu wsl. Эта сеть по умолчанию не имеет связь с локальной сетью, в которой находится компьютер windows. Для решения этой проблемы нужно выбрать одини из алгоритмов
- пробросить порты через прокси
- сделать зеркальную сеть (не работает на windows 10, работает на windows 11). Hyper-V Firewall не работает на windows 10
- сделать мост между сетями (не заработало). Рабочий вариант с мостом тут (нестабильное решение)
Если нужно сбросить настройки сети в wsl, то команды вот тут
Самым простым решением является обновление windows до 11 версии, после которого нужно сделать зеркальную сеть с WSL
- Устанавливается windows 11
- В конфиге .wslconfig пишется следующее
[wsl2]
networkingMode=mirrored
После этого у машины wsl будет такой же адрес, как у хоста (компьютера windows)
- Для назначения вебсерверам, находящимся на wsl, адреса хоста нужно пропиcать в конфиге следующее
[experimental]
hostAddressLoopback=True
по итогу конфиг выглядит так
[wsl2]
networkingMode=mirrored
memory=29GB
[experimental]
hostAddressLoopback=True
autoMemoryReclaim=gradual
- В консоли powershell вводите команду из официального гайда. Важно! Без этой команды Firewall Hyper-V не разрешит внешние подключения к wsl
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
Для создания .bat скрипта для запуска jupyter server нужно
- создать .bat файл следующего содержания. Чтобы предотвратить закрытие консоли после ошибки добавим строчку отсюда
@echo off
if not defined in_subprocess (cmd /k set in_subprocess=y ^& %0 %*) & exit )
wsl -e bash -c "cd; ./jupyter_start.sh"
- в wsl нужно создать jupyter_start.sh скрипт и внутри написать
source ~/anaconda3/etc/profile.d/conda.sh
conda activate torch
jupyter lab
res=subprocess.run('wsl -e bash -c "echo $(($(getconf _PHYS_PAGES) * $(getconf PAGE_SIZE) / (1024 * 1024)))" ', capture_output=True)
res=subprocess.run(['wsl', '-e', 'bash', '-c', 'ps -eo rss | awk \'{sum+=$1} END {print sum/1024}\''], capture_output=True, text=True)
Для переноса есть хороший короткий гайд на форуме
После переноса нужно обязательно назначить пользователя wsl по умолчанию
ubuntu config --default-user YourUsername
После нужно сделать версию wsl по умолчанию в системе
wsl --set-default Ubuntu
Из файловой системы windows есть доступ к файловой системе wsl. В адресную строку проводника нужно ввести
\\wsl.localhost\Ubuntu\
Для автостарта нужно создать батник и скачать программу nircmd. Решение взято отсюда. Затем батник нужно положить в папку автостарт в windows
@start /b X:\nircmd.exe execmd wsl -d ubuntu22
@start /b X:\nircmd.exe execmd wsl -d ubuntu24
Для каждого запущенного дистрибутива создается свой виртуальный жесткий диск. Для извлечения файлов из него есть 2 способа
Конвертировать при помощи gemu-img или других программ .vhdx в .vhd и подключить полученный файл в качестве диска в виртуалке Virtualbox/VMware. Решение описано тут.
Важно!
- Конвертация может быть очень долгой, если виртуальный диск большой. Диск размером 170 гб почему-то восприинимается, как диск размером в 1 тб. По этой причине обход всех секторов при помощи r-studio/r-linux по предварительной оценке займет несколько суток
- Открыть .vhdx каким-нибудь редактором нельзя. Это полноценный виртуальный жесткий диск с своими секторами
Самый простой и эффективный способ открыть .vhdx - создать из него виртуальную машину командой
wsl --import-in-place <distro-name> <path-to-vhdx>
Удалить дистрибутив можно командой ниже. Важно! Эта команда удаляет виртуальный диск из директории системы
wsl --unregister <distro-name>
Инструмент для управления более одним wsl дистрибутивом. Для использования этого менеджера нужно скачать исходный код с страницы релиза и затем сбилдить его при помощи flutter
Ошибка ниже решается включением systemd в дистрибутиве wsl. Ошибка описана тут
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down Failed to talk to init daemon.
Для решения нужно в в файле wsl.conf
sudo -e /etc/wsl.conf
написать строки ниже
[boot]
systemd=true