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>
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
sudo rm etc/resolv.conf
sudo ln -rs mnt/wsl/resolv.conf etc/
[ -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
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 "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"
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