Puncte:1

Migrați un desktop fizic Ubuntu 20.04 la WSLg în Windows 11 prin montarea SSD-ului de sistem

drapel rs

Am un sistem desktop Ubuntu 20.04 fizic existent care rulează pe un SSD cu ext4 ca sistem de fișiere.

Am montat SSD-ul în WSLg Ubuntu în Windows 11.

Pentru a păstra aceeași experiență cât mai mult posibil, vreau să folosesc SSD-ul montat ca disc principal de sistem pentru a înlocui instalarea implicită a Ubuntu în WSLg.

Este posibil?

Am încercat să fac un chroot în SSD în WSLg și am rulat cu succes un software CLI. Dar nu a reușit să lanseze toate acele aplicații GUI precum Jetbrains IDE.

În plus, după migrare, mi-aș dori să mai pot porni în același sistem Ubuntu fizic folosind același SSD atunci când este necesar.

ChanganAuto avatar
drapel us
Răspuns scurt: Nu, nu este posibil sau chiar de dorit.
NotTheDr01ds avatar
drapel vn
@ChanganAuto Sunt doar curios, ce te face atât de sigur? S-ar putea să ai dreptate, dar la naiba, sunt pesimist/realist din fire și pot vedea *oarece* speranțe că acest lucru va funcționa. Pot vedea cel puțin *posibilitatea* de a rezolva problema `chroot` prin maparea soclului Interop.
drapel rs
@NotTheDr01ds Mulțumesc! Ați putea, vă rog, să oferiți mai multe informații despre maparea soclului Interop?
Puncte:1
drapel vn

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:

  • Imaginea rootfs Ubuntu Base 21.10 extras (ca sudo) to $HOME/chroot/Ubuntu21.10.
  • Pentru testare, după ce configurația de mai jos a fost finalizată, apt install xterm
  • Pentru oricine încearcă acest lucru cu un rootfs real, rețineți că ar trebui să dezinstalați tar cu xattrs opțiune, de exemplu:
    # Descărcați rootf-urile de bază Ubuntu în directorul curent, apoi:
    mkdir Ubuntu21.10
    cd !$
    sudo tar -xvz --xattrs -f ../ubuntu-base-21.10-base-amd64.tar.gz
    

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 .executabile 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 .executabils. 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

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.