ในขณะที่ฉันยังไม่แน่ใจ (ยัง) ว่ามีวิธีใช้ไดรฟ์เป็นอินสแตนซ์ WSL เอง ฉันคิดว่าเราสามารถทำให้เมธอด chroot ทำงานได้ อย่างน้อยก็ในระดับหนึ่ง
นี่คือการตั้งค่าที่ฉันใช้:
จากด้านบนสุดของหัวของฉัน ฉันไม่เห็นเหตุผลที่ว่านี่จะไม่เป็นตัวแทนกึ่งแม่นยำของ SSD ที่มีอยู่ซึ่งคุณสามารถเมานต์ในไดเร็กทอรีภายในอินสแตนซ์ WSL/Ubuntu อย่างไรก็ตาม ฉันแน่ใจว่าจะมีรายการที่ฉันคาดไม่ถึงจากการกำหนดค่าของคุณ แจ้งให้เราทราบผ่านความคิดเห็นที่นี่ (รวมถึงคำถามใหม่หากรับประกัน) หากคุณพบปัญหา
มีอะไรทำงาน
- ระบบเครือข่าย
- เรียกใช้ Windows
.exe
s จากภายใน chroot (รวมถึงแอพ GUI)
- เรียกใช้แอพ Linux GUI จากภายใน chroot (แน่นอนว่าต้องใช้ Windows 11)
สิ่งที่รู้ว่าไม่ทำงาน
ไม่สามารถเมานต์ไดรฟ์ Windows จากภายใน chroot (เช่น เมานต์ -t drvfs ...
). อาจเป็นเพราะฉันยังไม่สามารถหาวิธีติดตั้ง WSL พิเศษได้ ไดรเวอร์
และ lib
ระบบไฟล์ ทุกอย่างทำงานที่นี่ผ่านทั้ง ภูเขา
ของระบบไฟล์จริงลงในพาธ chroot หรือผ่าน a เมานต์-ผูก
("ผูกมัด") ของเส้นทางที่มีอยู่จาก WSL ไปยังเส้นทาง chroot
เส้นทางของ Windows ไม่ได้บรรจุอยู่ในเส้นทางของ chroot (ซึ่งโดยปกติแล้ว WSL จะทำผ่าน /ในนั้น
. ซึ่งหมายความว่าคุณจะต้องใช้เส้นทางที่มีคุณสมบัติครบถ้วนเพื่อเรียกใช้ .exe
ส. การเติมเส้นทางไม่ใช่เรื่องยากที่จะเขียนสคริปต์ แต่คำตอบนี้ยาวพอดังนั้นฉันจะปล่อยให้ผู้อ่านเป็นแบบฝึกหัด (หรือคำถามแยกต่างหาก)
ไม่ได้ทดสอบ
เตรียมครั้งเดียว
มีงานสองสามอย่างในการเตรียมระบบไฟล์ chroot เป็นครั้งแรก
จากภายใน WSL (ไม่ใช่ใน chroot) ให้สร้างจุดเชื่อมต่อและคัดลอกรายการ WSL บางรายการ:
ซีดี <your_chroot_mountpoint_root>
# สร้างจุดเชื่อมต่อ
sudo mkdir mnt/ค
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 etc/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 ไม่มีการผูก 0 0" >> /etc/fstab'
sudo sh -c 'echo "/mnt/wslg $PWD/mnt/wslg ไม่มีการผูก 0 0" >> /etc/fstab'
#sudo sh -c 'echo "/run/WSL $PWD/run/WSL ไม่มีการผูก 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:
sudo เมานต์ -a
มีสิ่งหนึ่งที่ใช้ไม่ได้ผลที่นี่ ดูเหมือนเราจะผูกเมานท์ไม่ได้ /รัน/WSL
ทาง /etc/fstab
. ฉันเชื่อว่านี่เป็นเพราะปัญหาเรื่องเวลา -- WSL อาจยังติดตั้งต้นฉบับไม่เสร็จ /รัน/WSL
เราจึงยังไม่สามารถผูกมัดมันได้ การพยายามทำเช่นนั้นจะส่งผลให้เกิดข้อผิดพลาดเมื่อเริ่มต้น WSL ข้อผิดพลาดนี้ไม่ร้ายแรง
คุณมีหลายตัวเลือก คุณสามารถ:
* เรียกใช้บรรทัดความคิดเห็นด้านบนเพื่อสร้างรายการ fstab จัดการกับข้อผิดพลาด แล้วเรียกใช้ sudo เมานต์ -a
หลังจากที่คุณรีสตาร์ท 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