Deși nu sunt sigur (încă) că există o modalitate de a folosi unitatea ca instanță WSL în sine, cred că putem face ca metoda chroot să funcționeze, cel puțin într-o oarecare măsură.
Iată configurația pe care am folosit-o:
Din capul meu, nu văd un motiv pentru care aceasta nu ar fi o reprezentare semi-preciză a unui SSD existent pe care l-ați putut monta într-un director din interiorul unei instanțe WSL/Ubuntu. Cu toate acestea, sunt sigur că vor exista elemente pe care nu le-am anticipat din configurația dvs. Anunțați-mă prin comentariu aici (plus, eventual, printr-o nouă întrebare dacă este justificat) dacă întâmpinați probleme.
Ce merge
- Rețele
- Rulează Windows
.executabil
e din interiorul chroot (inclusiv aplicațiile GUI)
- Rularea aplicațiilor GUI Linux din interiorul chroot (necesită, desigur, Windows 11)
Ce se știe că nu funcționează
Nu se pot monta unități Windows din interiorul chroot (de ex. mount -t drvfs...
). Acest lucru se datorează probabil faptului că încă nu am reușit să găsesc o modalitate de a monta WSL-ul special. şoferii
și lib
sisteme de fișiere. Orice altceva funcționează aici fie prin a montură
a sistemului de fișiere real în calea chroot sau prin a monte --lega
("bind mount") a unei căi existente de la WSL în calea chroot.
Calea Windows nu este populată în cea a chroot-ului (ceea ce WSL o face în mod normal prin /init
. Aceasta înseamnă că va trebui să utilizați calea complet calificată pentru a rula oricare .executabil
s. Popularea căii nu este chiar atât de dificil de scriptat, dar acest răspuns este suficient de lung așa cum este, așa că voi lăsa ca exercițiu cititorului (sau o întrebare separată).
Netestat
Audio: Dacă nu funcționează, atunci este probabil doar o chestiune de a găsi variabilele de mediu potrivite, sau poate încă un soclu de montat dacă este necesar.
VSCode: Mai au probleme din cauza așteptărilor „utilizatorului implicit” din partea lui VSCode)
O mulțime de alte lucruri
Pregătire o singură dată
Există câteva sarcini pentru a pregăti sistemul de fișiere chroot pentru prima dată.
Din interiorul WSL (nu în chroot), creați puncte de montare și copiați unele elemente WSL:
cd <rădăcină_punct de montare_chroot_dvs>
# Creați puncte de montare
sudo mkdir mnt/c
sudo mkdir run/WSL
sudo mkdir mnt/wslg
sudo mkdir mnt/wsl
sudo mkdir -p usr/lib/wsl/drivers usr/lib/wsl/lib
# Copiați fișierele de configurare generate de WSL - În prezent nu funcționează, dar există pentru referință/utilizare viitoare
# sudo cp /etc/ld.so.conf.d/ld.wsl.conf etc/ld.so.conf.d
# Ștergeți rezolv.conf existent și utilizați-l pe cel generat de WSL
sudo rm etc/resolv.conf
sudo ln -rs mnt/wsl/resolv.conf etc/
# Ștergeți socket-ul X existent (dacă există) și utilizați-l pe cel generat de 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
# Configurați fstab pentru punctele de montare recurente.
# (0) Asigurați-vă că vă aflați în rădăcina chroot-ului
# (unitatea montată, în cazul dvs.) înainte
# rulează fiecare comandă.
# (A) Vă sugerez să rulați aceste linii una câte una pentru a fi sigur
# lucrează de când...
# (B) Nu sunt idempotenți
# (C) Verificați /etc/fstab după fiecare. Ar trebui să fie
# indicând directorul corespunzător din chroot-ul tău
# Configurați suporturi de legătură pentru socket-urile și fișierele generate 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' # Cauzează probleme în prezent
# Creați intrări fstab pentru sistemele de fișiere necesare. Pentru
# în cea mai mare parte, facem acest lucru găsind intrarea în
# /etc/mtab pe care l-a generat WSL, copiendu-l pe acesta
# /etc/fstab și înlocuind calea 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"
# Montați aceste intrări nou adăugate în `/etc/fstab`. Este necesar o singură dată -- De aici încolo, se vor monta automat când reporniți instanța WSL:
sudo mount -a
Există un lucru care nu prea funcționează aici. Se pare că nu putem lega montura /run/WSL
prin intermediul /etc/fstab
. Cred că acest lucru se datorează unei probleme de sincronizare -- WSL probabil nu a finalizat montarea originalului /run/WSL
, așa că nu putem încă lega montarea-l. Încercarea de a face acest lucru va duce la o eroare la pornirea WSL. Această eroare nu este fatală.
Aveți mai multe opțiuni. Puteți fie:
* Rulați linia comentată de mai sus pentru a genera intrarea fstab, rezolvați eroarea și apoi rulați sudo mount -a
după ce reporniți WSL (sau îl adăugați la un fișier de pornire)
* Doar fugi sudo mount --bind /run/WSL/ $PWD/run/WSL/
(din interiorul directorului rădăcină chroot) după o repornire WSL (Sau adăugați-l la un fișier de pornire).
Pornirea chroot-ului:
sudo chroot $PWD env WSL_INTEROP="$WSL_INTEROP" DISPLAY="$DISPLAY" WAYLAND_DISPLAY="$WAYLAND_DISPLAY" XDG_RUNTIME_DIR="$XDG_RUNTIME_DIR" /usr/bin/bash
Acest lucru populează mediul cu variabilele de mediu necesare înainte de a porni shell-ul. Pot exista variabile suplimentare pe care doriți să le mapați și este destul de ușor.
recomand un actualizare apt
a începe. Acest lucru vă va spune cel puțin dacă rezoluția DNS funcționează. Dacă nu, verificați /etc/resolv.conf
link simbolic.
Alte alternative de pornire includ crearea unui utilizator cu același nume ca în instanța dvs. WSL și apoi:
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