工具收集

访问 windows 网络文件

可以使用的方法

  • mount -t drvfs

    1
    2
    3
    4
    
    sudo 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

wsl2 内网 ip 端口 转发到 windows

代码: https://docs.microsoft.com/en-us/windows/wsl/interop

windows visit wsl2 disk

\\wsl$\distro-name\path→\folder

wsl2 and enable systemd with genie

  • 教程

  • 步骤

    1. 添加windows 源

      • ubuntu 20.04 版本

        1
        2
        3
        
        curl -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
    2. 配置 apt 源

      • debian

        • wsl-transdebian repo

          • https://arkane-systems.github.io/wsl-transdebian/

            1
            2
            3
            4
            5
            6
            7
            8
            
            sudo 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
    3. 安装 systemd-genie

      1
      
      sudo apt install systemd-genie

wsl2 daemonize solution

代理

  • 和 win10 共用代理

    1
    
    export http_proxy="http://$(cat /etc/resolv.conf |grep nameserver|awk '{print $2}'):7890"

wsl 管理工具 LxRunOffline

wsl 移动位置

  • 例子

    1
    
    LxRunOffline.exe move -n Ubuntu -d D:\data\wsl\Ubuntu
  • 注意

    • 使用管理员 powershell

wsl.exe 命令卡住

  • 异常表现

    • wsl --help 卡住
    • 任务管理器 杀掉 wsl.exe, 还是卡住
  • 解决方法

    • 杀进程法

      1. 找到 task_id

        1
        
        tasklist | grep wsl
      2. 杀掉 wsl.exe 命令

        1
        
        taskkill /pid <PID> /F
        • 强制杀掉
    • 禁用 hyper-v 法

      • 重启计算机后,禁用 hyper-v
    • 新装 wsl 子系统

ssh 连接 wsl 失败

  • 问题描述

    • ssh -vvvv 输出错误

      ssh_exchange_identification: read: Connection reset by peer
      
  • 修复方法

    • 运行 runportproxy.ps1, 做端口映射

GUI

  • 安装依赖

    1
    
    sudo pacman -Syu xfce4  xfce4-goodies
    • 不需要完全的桌面环境时,不需要安装这些额外包
  • 配置环境

    1
    2
    3
    4
    5
    6
    
    export winHost=$(cat /etc/resolv.conf |grep nameserver|awk '{print $2}')
    
    export DISPLAY=$winHost:0
    
    # 跳过 gtk warning: dbind ... dbus ....
    export NO_AT_BRIDGE=1
  • Windows 启动 被动式 X server

    • eg:

      • X manager passive
      • vcXsrv

        • 注意勾选: Disable access control
      • MobaXterm

        • home edition 就可以
  • Linux 运行 gui 软件即可

    • eg:

      • emacs
  • 启动 完整桌面环境 命令

    • startxfce4

字体问题

wsl 也需要安装字体

  • 例子,manjaro

    1
    2
    3
    
    sudo 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

两种风格:

  1. windows 风格 "\": -w 选项

    1
    2
    
    ~ ❱ wslpath -w ~/
    \\wsl$\Manjaro\home\sawyer
  2. unix 风格 "/": -m 选项

    1
    2
    
    ~ ❱ wslpath -m ~
    //wsl$/Manjaro/home/sawyer

windows 转 linux

-u 选项(unix) 两种合法输入

1
2
3
4
5
6
7
8
9
~ ❱ wslpath -u c:/home
/mnt/c/home

~ [1] wslpath -u c:\\home
/mnt/c/home

# 错误输入,必须是 "\\" 双斜线
~ ❱ wslpath -u c:\home
wslpath: c:home

GPU 使用

步骤

  1. 安装 gpu driver
  2. linux kernel >= 4.19.121

    • 查看命令: wsl cat /proc/version
  3. docker 中使用 GPU

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 Manjaro
    • wsl

新建 Manjaro 配置

安装

1
scoop install manjarowsl

设置成默认 linux

1
lxrunoffline sd -n Manjaro

创建新用户

1
useradd -m sawyer

配置 visudo

1
EDITOR=vim visudo

设置中国源

1
sudo pacman update

手动选择阿里源

更新:

1
sudo pacman -Syy

设置默认用户

1
LxRunOffline.cmd su -n Manjaro -v 1000

移动

停止 Manjaro:

1
wsl -t Manjaro

移动:

1
LxRunOffline.cmd m -n Manjaro -d D:\data\wsl\installed\Manjaro

软件安装

1
sudo pacman -S emacs bind pamac-cli mlocate zsh net-tools man-dg yay htop
packagecommand
binddig
net-toolsifconfig
mlocatelocate, updatedb
man-dbman
1
yay -Ss daemonize

enable systemd

参见 [[#wsl2 daemonize solution][wsl2 daemonize solution]

enable sshd

dotfiles 还原

1
https_proxy=http://192.168.1.129:7890 http_proxy=http://192.168.1.129:7890 git clone --recurse-submodules https://gitee.com/kongmingxuan/dotfiles ~/.config

git config

1
2
git config --global user.name "Sawyer Zheng"
git config --global user.email "kmxsz@qq.com"

切换 zsh

配置 zsh 使用 xdg_config

参见: zsh notes

zsh 环境初始化

1
2
3
4
5
# zsh 配置
https_proxy=http://192.168.1.129:7890 http_proxy=http://192.168.1.129:7890 zsh

# 可以删除 ~/.antigen 如果安装不成功,再次安装
antigen update

永久切换到 zsh

1
chsh -s /bin/zsh

conda set

1
2
conda config --set show_channel_urls
conda config --add channels conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

wsl 备份恢复

删除

1
2
wsl --shutdown
lxrunoffline ui -n manjaro      # 删除

恢复

1
2
3
4
cp -r E:\data\wsl\manjaro-2022-03-21 D:\data\wsl\manjaro       # 恢复
LxRunOffline.cmd rg -n manjaro -d D:\data\wsl\manjaro\ # 注册,register
LxRunOffline.cmd su -n manjaro -v 1000                 # user
LxRunOffline.cmd sd -n manjaro                         # 默认

wslu — wsl utitiliy

参考:

wslact – 快捷工具 actions

实用功能:

  1. 同步时间

    1
    2
    
    sudo wslact ts                       # wslact time-sync
    sudo wslact sm                       # wslact auto-mount
    • ts: 时间同步
    • sm: 自动 mount windows 上给的磁盘,网络硬盘也支持,例如:freenas

wslgsu – generate schedule utility

wslusc – short creator 快捷方式创建工具

举例:

1
wslusc -g   -n demo-emacs /home/sawyer/bin/wclean
  • 说明:在 Windows 桌面创建一个 demo-emacs.lnk 的快捷方式,关联到 /home/sawer/bin/wclean

修复 wsl manjaro glibc 找不到问题

方法:

  1. 注释掉 /etc/pacman.conf 中,关于 glibc 的内容
  2. sudo pamac upgrade

WSL 本身 bug

linux 无法感知 windows 文件发生改变

使用 wsl 上的命令在 Windows 上打开本地文件

步骤:

  1. 创建 .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 接收的只有文件名,没有路径名
  2. 通过注册表,支持文件管理器 explorer.exe 右键菜单打开

    1
    2
    3
    4
    5
    6
    
    Windows 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)

参考:

说明:

  1. wsl 可以直接 mount 一整个磁盘
  2. 虽然 wsl 声称可以 mount 一个 partition, 但是实测总是报错磁盘在使用无法 mount

    
    

wsl2 安装 cuda nvidia gpu

参考:

wslg GUI 不能弹出图形界面问题

参考:

原因:

  • wslg 不能自动创建 /mnt/wslg/.X11-unix/tmp/.X11-unix 的软链接

解决办法:

  1. 手动修复:

    1. 删除 /tmp/.X11-unix 原有路径
    2. ln -s //mnt/wslg/.X11-unix /tmp/
  2. 通过 systemd

    1. 创建服务 /usr/lib/systemd/system/x11-symlink.service

       1
       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 设置成默认网页浏览器

1
xdg-settings set default-web-browser wslview.desktop
  • 待验证

端口映射

映射方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$remoteport = wsl bash -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if( $found ){
  $remoteport = $matches[0];
} else{
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

#[Ports]

#All the ports you want to forward separated by coma
# $ports=@(22,10086,9000,5000,8080,8081,8082,8083,8084,8085,9090,9091,9092,9093,9094, 8000,8007, 8888,8889,9000,9001,9002,9999,3333,10001,10002,10003,10004,61212,61313,17012,12087);
$ports=@(80,22,8000,15432,9033,8399,8089, 18080,17089);


#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";


#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";

#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}

修改单个端口映射

  1. 删除单个映射

    1
    
    netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr
    • addr: 0.0.0.0
    • port: 端口号
  2. 添加单个端口映射

    1
    
    netsh 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 被分配的地址)

清理所有端口映射

  1. 显示所有端口映射

    1
    
    netsh interface portproxy show all
  2. 删除所有端口映射

    1
    
    netsh interface portproxy reset

wsl –shutdown 卡住处理方法

  1. 关闭 wsl 服务

    1
    
    sudo taskkill /F /im wslservice.exe