WSL Notes
文章目录
工具收集
- lxrunoffline
- wslu
OpenInWSL
- OpenInWSL | openinwsl
- 打开 windows 文件,使用 linux 软件
gwsl
- GUI server
- linux 命令开始菜单创建工具
访问 windows 网络文件
可以使用的方法
mount -t drvfs
1 2 3 4sudo mount -t drvfs '\\server\share' /mnt/share sudo mount -t drvfs '\\freenas\public' /mnt/freenas sudo mkdir -p /mnt/wsl/ubuntu && sudo mount -t drvfs '\\wsl$\Ubuntu-20.04' /mnt/wsl/ubuntu
无效方法
mklink 法
- 在 windows 中 mklink /D \\server\share d:\share
- 再在 wsl 中 访问 /mnt/d/share
原因
- 在 wsl 中,看不到 d:\share
windows 映射盘符
原因
- wsl 不能访问映射的盘符
WSL2
Host 访问 wsl
- 直接访问 wsl 被分配的 ip 即可
wsl 访问 Host
解决方法参考
满足两个条件
- 访问主机的 ip
在 wsl 中的 /etc/resolve.conf, 查看 nameserver 得到
- 主机打开防火墙
wsl2 内网 ip 端口 转发到 windows
- 注意:脚本需要管理员权限运行
https://www.freesion.com/article/5225628158/
- 更改 ports=@ 对应的端口即可
windows visit wsl2 disk
\\wsl$\distro-name\path→\folder
wsl2 and enable systemd with genie
教程
步骤
ubuntu 20.04 版本
1 2 3curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - sudo apt-add-repository https://packages.microsoft.com/ubuntu/20.04/prod sudo apt-get update
配置 apt 源
debian
wsl-transdebian repo
https://arkane-systems.github.io/wsl-transdebian/
1 2 3 4 5 6 7 8sudo apt install apt-transport-https sudo wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg sudo chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg sudo cat << EOF > /etc/apt/sources.list.d/wsl-transdebian.list deb https://arkane-systems.github.io/wsl-transdebian/apt/ bullseye main deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ bullseye main EOF sudo apt update
安装 systemd-genie
1sudo apt install systemd-genie
wsl2 daemonize solution
參考
破解方法
nsenter error:
- eg: cannot open /proc/88/ns/time: No such file or directory
- https://github.com/DamionGans/ubuntu-wsl2-systemd-script/issues/36
- 把 nsenter -a 改成 nsenter -m -p
Arch wsl2 配置 systemd
source code 在 /etc/profile 中加入如下代码
1 2 3 4 5 6 7 8 9 10 11#!/bin/bash -e SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}') if [ -z "$SYSTEMD_PID" ]; then sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}') fi if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -m -p su - $LOGNAME fi- 制作命令
enable_systemd
- 制作命令
- 运行命令
enable_systemd 不需要每次 sudo 都输入密码
systemd 破解合集
代理
和 win10 共用代理
1export http_proxy="http://$(cat /etc/resolv.conf |grep nameserver|awk '{print $2}'):7890"
wsl 管理工具 LxRunOffline
- GitHub - DDoSolitary/LxRunOffline: A full-featured utility for managing Windo…
安装
使用 Choco
1choco install lxrunoffline
wsl 移动位置
例子
1LxRunOffline.exe move -n Ubuntu -d D:\data\wsl\Ubuntu注意
- 使用管理员 powershell
wsl.exe 命令卡住
异常表现
wsl --help卡住- 任务管理器 杀掉 wsl.exe, 还是卡住
解决方法
杀进程法
找到 task_id
1tasklist | grep wsl杀掉 wsl.exe 命令
1taskkill /pid <PID> /F- 强制杀掉
禁用 hyper-v 法
- 重启计算机后,禁用 hyper-v
- 新装 wsl 子系统
ssh 连接 wsl 失败
问题描述
ssh -vvvv 输出错误
ssh_exchange_identification: read: Connection reset by peer
修复方法
- 运行
runportproxy.ps1, 做端口映射
- 运行
GUI
安装依赖
1sudo pacman -Syu xfce4 xfce4-goodies- 不需要完全的桌面环境时,不需要安装这些额外包
配置环境
1 2 3 4 5 6export winHost=$(cat /etc/resolv.conf |grep nameserver|awk '{print $2}') export DISPLAY=$winHost:0 # 跳过 gtk warning: dbind ... dbus .... export NO_AT_BRIDGE=1Windows 启动 被动式 X server
eg:
- X manager passive
vcXsrv
- 注意勾选:
Disable access control
- 注意勾选:
MobaXterm
- home edition 就可以
Linux 运行 gui 软件即可
eg:
- emacs
启动
完整桌面环境命令startxfce4
字体问题
wsl 也需要安装字体
例子,manjaro
1 2 3sudo mkdir /usr/share/fonts/win10 sudo cp /mnt/c/Windows/Fonts/* /usr/share/fonts/win10/ sudo fc-cache -fv
wslpath
Windows 和 WSL Linux 路径互转工具
linux 转 windows
两种风格:
windows 风格 "\": -w 选项
1 2~ ❱ wslpath -w ~/ \\wsl$\Manjaro\home\sawyerunix 风格 "/": -m 选项
1 2~ ❱ wslpath -m ~ //wsl$/Manjaro/home/sawyer
windows 转 linux
-u 选项(unix) 两种合法输入
| |
GPU 使用
参考
步骤
- 安装 gpu driver
linux kernel >= 4.19.121
- 查看命令:
wsl cat /proc/version
- 查看命令:
docker 中使用 GPU
debian ubuntu
arch linux
- https://github.com/yuk7/ArchWSL/discussions/254
安装依赖
1 2sudo pacman -Syu nvidia-utils cuda sudo pacman -Syu mesa-demos # 非必须依赖,测试工具,提供命令:glxinfo + glxgears- 检查命令
wsl config
位置
- windows: ~/.wslconfig
wsl 内部
- /etc/wsl.conf
systemd 新建 service
报错: transport endpoint is not connected
描述:
- 新建一个 clash.service
sudo systemctl enable clash.service- 报错:
transport endpoint is not connected
解决:
- 不需要特殊配置
重启 wsl 即可
wsl -t Manjarowsl
新建 Manjaro 配置
安装
| |
设置成默认 linux
| |
创建新用户
| |
配置 visudo
| |
设置中国源
| |
手动选择阿里源
更新:
| |
设置默认用户
| |
移动
停止 Manjaro:
| |
移动:
| |
软件安装
| |
| package | command |
|---|---|
| bind | dig |
| net-tools | ifconfig |
| mlocate | locate, updatedb |
| man-db | man |
| |
enable systemd
参见 [[#wsl2 daemonize solution][wsl2 daemonize solution]
enable sshd
dotfiles 还原
| |
git config
| |
切换 zsh
配置 zsh 使用 xdg_config
参见: zsh notes
zsh 环境初始化
| |
永久切换到 zsh
| |
conda set
| |
wsl 备份恢复
删除
| |
恢复
| |
wslu — wsl utitiliy
参考:
wslact – 快捷工具 actions
实用功能:
同步时间
1 2sudo wslact ts # wslact time-sync sudo wslact sm # wslact auto-mount- ts: 时间同步
- sm: 自动 mount windows 上给的磁盘,网络硬盘也支持,例如:freenas
wslgsu – generate schedule utility
wslusc – short creator 快捷方式创建工具
举例:
| |
- 说明:在 Windows 桌面创建一个 demo-emacs.lnk 的快捷方式,关联到 /home/sawer/bin/wclean
修复 wsl manjaro glibc 找不到问题
方法:
- 注释掉 /etc/pacman.conf 中,关于 glibc 的内容
sudo pamac upgrade
WSL 本身 bug
linux 无法感知 windows 文件发生改变
inotifywait 命令
- Qt: QFileSystemWatcher.addPath(file)
如何 auto mount /etc/fstab
使用 wsl 上的命令在 Windows 上打开本地文件
步骤:
创建 .ps1 文件, 用来支持命令行调用 wsl 命令打开 windows 本地文件
1 2 3 4# filename: wec.ps1 $file=$args[0] wslg /usr/bin/e $(wsl wslpath -u $($file -replace "\\", "\\\\"))- 接受 Windows 文件,转化成 wsl 路径格式
- 传递转换后的路径到 wsl linux 命令
绕过 wslpath 命令版本:
1 2 3 4 5# filename: wec.ps1 $file=$args[0] cd $(Split-Path $file -parent) # 切换到文件所在目录 wslg /usr/bin/e "$(Split-Path $file -leaf)" # wslg 接收的只有文件名,没有路径名通过注册表,支持文件管理器 explorer.exe 右键菜单打开
1 2 3 4 5 6Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\wsl emacs] [HKEY_CLASSES_ROOT\*\shell\wsl emacs\command] @="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -noninteractive -nologo -noprofile -windowstyle hidden D:\\soft\\bin\\wec.ps1 '%1'"命令
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noninteractive -nologo -noprofile -windowstyle hidden D:\soft\bin\wec.ps1 "%1"
- 这里的 wec.ps1 文件就是上一步创建的 ps1 文件
- 注意这里使用的是
'%1',单引号,避免空格分割的路径被分割成多个命令行参数
wsl 添加磁盘(包括 vhd)
参考:
- Automatically Starting an External Encrypted SSD in Windows Subsystem (WSL) |…
- microsoft/WSL#6073 Is it possible to automount partition/drive using wsl –mo…
- Get started mounting a Linux disk in WSL 2 | Microsoft Learn
说明:
- wsl 可以直接 mount 一整个磁盘
虽然 wsl 声称可以 mount 一个 partition, 但是实测总是报错磁盘在使用无法 mount
wsl2 安装 cuda nvidia gpu
参考:
- nvidia cuda wsl 官方教程
CUDA-ready Archlinux for WSL2 · GitHub
- arch linux + WSL + CUDA gists 例子
wslg GUI 不能弹出图形界面问题
参考:
原因:
- wslg 不能自动创建
/mnt/wslg/.X11-unix到/tmp/.X11-unix的软链接
解决办法:
手动修复:
- 删除
/tmp/.X11-unix原有路径 ln -s //mnt/wslg/.X11-unix /tmp/
- 删除
通过 systemd
创建服务
/usr/lib/systemd/system/x11-symlink.service1 2 3 4 5 6 7 8 9 10 11 12[Unit] Description=Setup X11 Symlink [Service] Type=oneshot #ExecStartPre=/bin/umount /tmp/.X11-unix #ExecStartPre=/bin/rm -rf /tmp/.X11-unix ExecStart= bash -c '/bin/umount /tmp/.X11-unix ; /bin/rm -rf /tmp/.X11-unix ; /bin/ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix' [Install] WantedBy=multi-user.target
wslview 设置成默认网页浏览器
| |
- 待验证
端口映射
映射方法
| |
修改单个端口映射
删除单个映射
1netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr- addr: 0.0.0.0
- port: 端口号
添加单个端口映射
1netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteaddr- port: 端口号
- addr, listenaddress: windows 上的地址, 0.0.0.0
- remoteaddr, connectaddress: wsl2 的 ip 地址(eth0 被分配的地址)
清理所有端口映射
显示所有端口映射
1netsh interface portproxy show all删除所有端口映射
1netsh interface portproxy reset
wsl –shutdown 卡住处理方法
关闭 wsl 服务
1sudo taskkill /F /im wslservice.exe
文章作者
上次更新 2025-06-20 (811ee6f)