Mặc dù tôi không chắc chắn (chưa) rằng có một cách để sử dụng ổ đĩa như một phiên bản WSL, nhưng tôi nghĩ rằng chúng ta có thể làm cho phương thức chroot hoạt động, ít nhất là ở một mức độ nào đó.
Đây là thiết lập mà tôi đã sử dụng:
Ngoài suy nghĩ của tôi, tôi không hiểu lý do gì khiến đây không phải là biểu diễn bán chính xác của ổ SSD hiện có mà bạn có thể gắn vào thư mục bên trong phiên bản WSL/Ubuntu. Tuy nhiên, tôi chắc chắn rằng sẽ có những mục mà tôi không lường trước được từ cấu hình của bạn. Hãy cho tôi biết qua nhận xét tại đây (cộng với có thể qua câu hỏi mới nếu được bảo hành) nếu bạn gặp sự cố.
Cái gì đang hoạt động
- mạng
- Chạy Windows
.exe
s từ bên trong chroot (bao gồm cả ứng dụng GUI)
- Chạy các ứng dụng GUI của Linux từ bên trong chroot (tất nhiên, yêu cầu Windows 11)
Những gì được biết là không hoạt động
Không thể gắn ổ đĩa Windows từ bên trong chroot (ví dụ: gắn kết -t drvfs ...
). Điều này có thể là do tôi chưa tìm được cách gắn WSL đặc biệt trình điều khiển
và lib
hệ thống tập tin. Mọi thứ khác hoạt động ở đây thông qua một trong hai gắn kết
của hệ thống tập tin thực tế vào đường dẫn chroot hoặc thông qua một gắn kết --bind
("bind mount") của đường dẫn hiện có từ WSL vào đường dẫn chroot.
Đường dẫn Windows không được đưa vào đường dẫn của chroot (WSL thường thực hiện thông qua /trong đó
. Điều này có nghĩa là bạn sẽ phải sử dụng đường dẫn đủ điều kiện để chạy bất kỳ .exe
S. Điền vào đường dẫn không quá khó để viết kịch bản, nhưng câu trả lời này đủ dài, vì vậy tôi sẽ để lại dưới dạng bài tập cho người đọc (hoặc một câu hỏi riêng).
không được kiểm tra
Âm thanh: Nếu nó không hoạt động, thì có lẽ vấn đề chỉ là tìm các biến môi trường phù hợp hoặc có thể thêm một ổ cắm để gắn kết nếu cần.
VSCode: Có thể có vấn đề do kỳ vọng của "người dùng mặc định" trên phần của VSCode)
Rất nhiều thứ khác
Chuẩn bị một lần
Có một vài nhiệm vụ để chuẩn bị cho hệ thống tập tin chroot lần đầu tiên.
Từ bên trong WSL (không phải trong chroot), tạo các điểm gắn kết và sao chép qua một số mục WSL:
cd <your_chroot_mountpoint_root>
# Tạo điểm gắn kết
sudo mkdir mnt/c
sudo mkdir chạy/WSL
sudo mkdir mnt/wslg
sudo mkdir mnt/wsl
sudo mkdir -p usr/lib/wsl/drivers usr/lib/wsl/lib
# Sao chép các tệp cấu hình do WSL tạo - Hiện tại không hoạt động, nhưng có để tham khảo/sử dụng trong tương lai
# sudo cp /etc/ld.so.conf.d/ld.wsl.conf etc/ld.so.conf.d
# Xóa độ phân giải hiện có và sử dụng độ phân giải được tạo bởi WSL
sudo rm vv/resolv.conf
sudo ln -rs mnt/wsl/resolv.conf, v.v./
# Xóa ổ cắm X hiện có (nếu tồn tại) và sử dụng ổ cắm do WSL tạo
[ -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
# Thiết lập fstab cho các điểm gắn định kỳ.
# (0) Đảm bảo rằng bạn đang ở thư mục gốc của chroot
# (ổ đĩa được gắn, trong trường hợp của bạn) trước
# chạy từng lệnh.
# (A) Tôi khuyên bạn nên chạy từng dòng một để đảm bảo
# họ làm việc từ ...
# (B) Chúng không bình thường
# (C) Kiểm tra /etc/fstab sau mỗi cái. Họ nên
# trỏ đến thư mục thích hợp trong chroot của bạn
# Thiết lập gắn kết liên kết cho ổ cắm và tệp được tạo bởi 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 không ràng buộc 0 0" >> /etc/fstab'
#sudo sh -c 'echo "/run/WSL $PWD/run/WSL none bind 0 0" >> /etc/fstab' # Hiện đang gây ra sự cố
# Tạo các mục nhập fstab cho các hệ thống tệp cần thiết. Vì
# phần lớn, chúng tôi làm điều này bằng cách tìm mục nhập trong
# /etc/mtab mà WSL đã tạo, sao chép nó sang
# /etc/fstab và thay thế đường dẫn 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"
# Gắn các mục mới được thêm này vào `/etc/fstab`. Chỉ cần một lần -- Từ đây trở đi, chúng sẽ tự động đếm khi bạn khởi động lại phiên bản WSL:
gắn sudo -a
Có một điều không hoàn toàn hiệu quả ở đây. Chúng tôi dường như không thể liên kết gắn kết /chạy/WSL
qua /etc/fstab
. Tôi tin rằng điều này là do vấn đề về thời gian -- WSL có thể chưa hoàn thành việc cài đặt bản gốc /chạy/WSL
, vì vậy chúng tôi chưa thể liên kết gắn kết nó. Cố gắng làm như vậy sẽ dẫn đến lỗi khi khởi động WSL. Lỗi này không gây tử vong.
Bạn có một số tùy chọn. Bạn có thể:
* Chạy dòng nhận xét ở trên để tạo mục nhập fstab, xử lý lỗi rồi chạy gắn sudo -a
sau khi bạn khởi động lại WSL (hoặc thêm nó vào tệp khởi động)
* Chỉ cần chạy Sudo mount --bind /run/WSL/ $PWD/run/WSL/
(từ bên trong thư mục gốc chroot) sau khi khởi động lại WSL (Hoặc thêm nó vào tệp khởi động).
Bắt đầu chroot:
sudo chroot $PWD env WSL_INTEROP="$WSL_INTEROP" DISPLAY="$DISPLAY" WAYLAND_DISPLAY="$WAYLAND_DISPLAY" XDG_RUNTIME_DIR="$XDG_RUNTIME_DIR" /usr/bin/bash
Thao tác này sẽ điền vào môi trường các biến môi trường cần thiết trước khi khởi động trình bao. Có thể có các biến bổ sung mà bạn muốn ánh xạ và điều đó đủ dễ dàng.
tôi đề nghị một cập nhật apt
để bắt đầu. Điều này ít nhất sẽ cho bạn biết nếu độ phân giải DNS đang hoạt động. Nếu không, hãy kiểm tra /etc/resolv.conf
liên kết tượng trưng.
Các lựa chọn thay thế khởi động khác bao gồm tạo người dùng có cùng tên như trong phiên bản WSL của bạn và sau đó:
sudo chroot $PWD env WSL_INTEROP="$WSL_INTEROP" DISPLAY="$DISPLAY" WAYLAND_DISPLAY="$WAYLAND_DISPLAY" XDG_RUNTIME_DIR="$XDG_RUNTIME_DIR" người chạy -u $USER /usr/bin/bash