Хотя я (пока) не уверен, что есть способ использовать диск как сам экземпляр WSL, я думаю, что мы можем заставить метод chroot работать, по крайней мере, до некоторой степени.
Вот установка, которую я использовал:
Внезапно я не вижу причин, по которым это не будет полуточным представлением существующего SSD, который вы смогли смонтировать в каталог внутри экземпляра WSL/Ubuntu. Однако я уверен, что будут элементы, которых я не ожидал от вашей конфигурации. Дайте мне знать через комментарий здесь (плюс, возможно, через новый вопрос, если это оправдано), если у вас возникнут проблемы.
Что работает
- Сеть
- Запуск Windows
.исполняемый
s из chroot (включая приложения с графическим интерфейсом)
- Запуск приложений Linux с графическим интерфейсом из chroot (требуется, конечно, Windows 11)
Что, как известно, не работает
Не удается смонтировать диски Windows из chroot (например, монтировать -t дрвфс ...
). Вероятно, это связано с тем, что мне пока не удалось найти способ смонтировать специальный WSL водители
и библиотека
файловые системы. Все остальное здесь работает либо через устанавливать
фактической файловой системы в путь chroot или через монтировать --bind
(«bind mount») существующего пути из WSL в путь chroot.
Путь Windows не заменяется на путь chroot (что обычно делает WSL через /в этом
. Это означает, что вам придется использовать полный путь для запуска любого .исполняемый
с. Заполнить путь не так уж сложно в сценарии, но этот ответ достаточно длинный, поэтому я оставлю его читателю в качестве упражнения (или отдельного вопроса).
Не испытано
Аудио: если это не работает, то, вероятно, это просто вопрос поиска правильных переменных среды или, возможно, еще одного сокета для монтирования, если это необходимо.
VSCode: май есть проблемы из-за ожидания «пользователя по умолчанию» со стороны VSCode)
Много других вещей
Разовая подготовка
Есть несколько задач по подготовке файловой системы chroot в первый раз.
Изнутри WSL (не в chroot) создайте точки монтирования и скопируйте некоторые элементы WSL:
cd <your_chroot_mountpoint_root>
# Создаем точки монтирования
sudo mkdir mnt/c
sudo mkdir запустить/WSL
sudo mkdir mnt/wslg
sudo mkdir mnt/wsl
sudo mkdir -p usr/lib/wsl/драйверы usr/lib/wsl/lib
# Скопировать сгенерированные файлы конфигурации WSL - в настоящее время не работает, но для использования в будущем
# sudo cp /etc/ld.so.conf.d/ld.wsl.conf и т.д./ld.so.conf.d
# Удалите существующий resolv.conf и используйте сгенерированный WSL
sudo rm и т. д./resolv.conf
sudo ln -rs mnt/wsl/resolv.conf и т. д./
# Удалить существующий сокет X (если он есть) и использовать созданный WSL
[ -S tmp/.X11-unix ] && sudo rm tmp/.X11-unix
[ -f tmp/.X11-unix ] && sudo rm tmp/.X11-unix
[ -L tmp/.X11-unix ] && sudo rm tmp/.X11-unix
sudo ln -rs mnt/wslg/.X11-unix/tmp/.X11-unix
# Настройте fstab для повторяющихся точек монтирования.
# (0) Убедитесь, что вы находитесь в корне chroot
# (смонтированный диск в вашем случае) перед
# запуск каждой команды.
# (A) Я предлагаю запускать эти строки одну за другой, чтобы убедиться,
# они работают с...
# (B) Они не идемпотентны
# (C) Проверяйте /etc/fstab после каждого. Они должны быть
# указываем на соответствующий каталог в вашем chroot
# Настройте монтирование привязки для сокетов и файлов, сгенерированных WSL:
sudo sh -c 'echo "/mnt/wsl $PWD/mnt/wsl none bind 0 0" >> /etc/fstab'
sudo sh -c 'echo "/mnt/wslg $PWD/mnt/wslg none bind 0 0" >> /etc/fstab'
#sudo sh -c 'echo "/run/WSL $PWD/run/WSL none bind 0 0" >> /etc/fstab' # В настоящее время вызывает проблемы
# Создать записи fstab для необходимых файловых систем. За
# чаще всего мы делаем это, находя запись в
# /etc/mtab, сгенерированный WSL, скопировав его в
# /etc/fstab и подставив путь chroot.
sudo sh -c "grep '^drvfs[[:space:]]\+/mnt/c\W' /etc/mtab | sed \"s-\(/mnt/c\)-${PWD}\1 -\" >> /etc/fstab"
sudo sh -c "grep '^ none[[:space:]]\+/dev[[:space:]]' /etc/mtab | sed \"s-\(/dev\)-${PWD}\ 1-\" >> /etc/fstab"
sudo sh -c "grep '^proc[[:space:]]\+/proc[[:space:]]' /etc/mtab | sed \"s-\(/proc\)-${PWD}\ 1-\" >> /etc/fstab"
sudo sh -c "grep '^devpts[[:space:]]\+/dev/pts[[:space:]]' /etc/mtab | sed \"s-\(/dev/pts\)-$ {PWD}\1-\" >> /etc/fstab"
sudo sh -c "grep '^sysfs[[:space:]]\+/sys[[:space:]]' /etc/mtab | sed \"s-\(/sys\)-${PWD}\ 1-\" >> /etc/fstab"
sudo sh -c "grep '^binfmt_misc[[:space:]]\+/proc/sys/fs/binfmt_misc[[:space:]]' /etc/mtab | sed \"s-\(/proc/sys /fs/binfmt_misc\)-${PWD}\1-\" >> /etc/fstab"
# Монтируем эти вновь добавленные записи в `/etc/fstab`. Требуется только один раз — с этого момента они будут автоматически монтироваться при перезапуске экземпляра WSL:
судо монтировать -а
Есть одна вещь, которая здесь не совсем работает. Мы не можем привязать крепление /выполнить/ВСЛ
с помощью /etc/fstab
. Я считаю, что это связано с проблемой синхронизации - WSL, вероятно, еще не завершил монтирование оригинала. /выполнить/ВСЛ
, поэтому мы пока не можем его смонтировать. Попытка сделать это приведет к ошибке при запуске WSL. Эта ошибка не является фатальной.
У вас есть несколько вариантов. Вы также можете:
* Запустите закомментированную строку выше, чтобы создать запись fstab, обработайте ошибку, а затем запустите судо монтировать -а
после перезапуска WSL (или добавления его в файл запуска)
* Просто беги sudo mount --bind /run/WSL/$PWD/run/WSL/
(из корневого каталога chroot) после перезапуска WSL (или добавьте его в файл запуска).
Запуск chroot:
sudo chroot $PWD env WSL_INTEROP="$WSL_INTEROP" DISPLAY="$DISPLAY" WAYLAND_DISPLAY="$WAYLAND_DISPLAY" XDG_RUNTIME_DIR="$XDG_RUNTIME_DIR" /usr/bin/bash
Это заполняет среду необходимыми переменными среды перед запуском оболочки. Могут быть дополнительные переменные, которые вы хотите отобразить, и это достаточно просто.
Я рекомендую удачное обновление
начать. Это, по крайней мере, скажет вам, работает ли разрешение DNS. Если нет, проверьте /etc/resolv.conf
символическая ссылка.
Другие варианты запуска включают создание пользователя с тем же именем, что и в вашем экземпляре WSL, а затем:
sudo chroot $PWD env WSL_INTEROP="$WSL_INTEROP" DISPLAY="$DISPLAY" WAYLAND_DISPLAY="$WAYLAND_DISPLAY" XDG_RUNTIME_DIR="$XDG_RUNTIME_DIR" runuser -u $USER /usr/bin/bash