wsl2的使用

Microsoft文档

wsl1和2的区别

因为只是轻度使用,目前已知的区别如下:

  1. WSL2 基于Hyper-V功能的子集提供了真实的linux内核,而WSL1是一个用于访问 Linux 环境的兼容层,没有linux内核的完整功能
  2. WSL2 通过虚拟网卡与win10组成了局域网进行交互

另外WSL安装的linux是极简版的,很多程序都需要自己手动安装

安装wsl2

  1. 如果之前没有用过 WSL,那么首先需要安装 Windows 10 的 WSL 功能:
    script
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  2. 安装 WSL2 功能模块
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  3. 重启电脑
  4. 将 WSL 2 设置为默认版本
    script
    wsl --set-default-version 2
  5. 在Microsoft Store中获取linux发行版
    直接搜索linux即可
  6. powershell使用wsl --list --verbose查看是否安装成功
    script
      NAME            STATE           VERSION
    * Ubuntu-18.04 Running 2
  7. 如果运行失败可能是未安装 Linux 内核更新程序包,下载安装后重新运行即可.
    https://docs.microsoft.com/en-us/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

wsl2和windows互相访问

wsl2访问windows: 在/mnt/下存在所有的windows磁盘
windows访问wsl2: 文件浏览器输入 \\wls$ ,注意有时候会卡住

迁移wsl2的vhdx文件到其他位置

  1. 查看已安装的linux发行版本 wsl -l --all -v
  2. 导出分发版为tar文件到其他盘 wsl --export Ubuntu-18.04 E:\wsl\wsl-ubuntu18.04.tar
  3. 注销当前分发版 wsl --unregister Ubuntu-18.04
  4. 重新导入并安装WSL
    wsl --import Ubuntu-18.04 E:\wsl\wsl-ubuntu18.04 E:\wsl\wsl-ubuntu18.04.tar --version 2
  5. 设置默认登陆用户为安装时用户名
    ubuntu1804 config --default-user USERNAME
  6. 删除tar

限制内存的使用

创建一个%UserProfile%.wslconfig文件来限制wsl使用的内存总量
若不限制,在拷贝进大文件时内存会一直增长直至内存占满系统蓝屏.

[wsl2]
processors=8
memory=13GB
swap=12GB

processors是核心数,不限制去除即可.
swap是交换分区大小

手动释放cache缓存
script
echo 3 > /proc/sys/vm/drop_caches

扩展虚拟磁盘

WSL2 VHD使用ext4文件系统,此VHD会自动调整大小以满足存储需求,其最大大小默认为256GB

  1. 关闭wsl
    script
    wsl --shutdown
  2. 找到自己的vhdx文件的路径,例如我的是:E:\wsl\wsl-Ubuntu-18.04\ext4.vhdx
  3. 管理员权限打开cmd或powershell进入diskpart
    script
    diskpart
    Select vdisk file="E:\wsl\wsl-Ubuntu-18.04\ext4.vhdx"
    expand vdisk maximum="512000" # 后面的数字是最大大小,单位MB
  4. 在wsl中运行命令,让 WSL 知道它可以扩展其文件系统的大小
    script
    sudo mount -t devtmpfs none /dev
    mount | grep ext4 $ 记录输出的结果,例如 /dev/sdb
    sudo resize2fs /dev/sdX # X为上一条输出的结果,如果resize2fs没有 apt install resize2fs

释放未占用的空间

虽然vhd在需要时会自动增大,但文件删除后不会自动减小占用

script
wsl --shutdown
optimize-vhd -Path .\ext4.vhdx -Mode full

配置能够让局域网其他电脑ssh连接

  1. 重装ssh

    script
    sudo apt-get remove openssh-server
    sudo apt-get install openssh-server
  2. 编辑sshd_config文件 sudo vim /etc/ssh/sshd_config

    Port 22
    PermitRootLogin yes
    PasswordAuthentication yes
  3. 编辑hosts.allow sudo vim /etc/hosts.allow
    添加一行 sshd: ALL

  4. 重启ssh服务 sudo service ssh --full-restart
    (每次重新运行后不知道为何ssh的开发会失效,重启ssh服务即重新运行sudo service ssh --full-restart后又有效)

  5. 配置端口转发

    1. 查看wsl的IP地址ifconfigip addr show eth0
      注意: 每次重启WSL2时ip地址都会改变
    2. windows下管理员权限打开cmd或powershell,添加端口转发
      netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=22 connectaddress=xxx.xxx.xxx.xxx protocol=tcp
      删除端口转发:
      netsh interface portproxy delete v4tov4 listenport=22 listenaddress=0.0.0.0
      注意: 0.0.0.0可以换成* ,但是添加和删除的时候要对应.
    3. 查看端口转发状态 netsh interface portproxy show all
  6. 若对方还是无法连接成功,防火墙添加端口的入站规则
    打开防火墙规则: 运行输入 wf.msc设置–>更新和安全–>Windows安全中心–>防火墙和网络保护–>高级设置
    入站规则–>新建规则–>端口–>TCP,特定本地端口 输入22–>允许连接 最后输入名称,例如我的是 wsl2ssh

通过命令行开启和关闭此规则:

script
# 开启
netsh advfirewall firewall set rule name="wsl2ssh" new enable=yes
# 关闭
netsh advfirewall firewall set rule name="wsl2ssh" new enable=no

访问固定的wsl2的ip

  1. 在wsl2的虚拟网卡上添加一个windows的ip
    netsh interface ip add address "vEthernet (WSL)" 192.168.99.1 255.255.255.0
  2. 在wsl2中为wsl添加一个ip
    sudo ip addr add 192.168.99.2/24 broadcast 192.168.99.255 dev eth0 label eth0:1;

即通过分别为2个系统在虚拟网卡中添加固定的ip得到了2个固定的ip.
之后即可在windows上针对wsl2的固定ip指定端口转发:
netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectport=22 connectaddress=192.168.99.2 protocol=tcp

不过每次重启WSL后添加的ip会失效,需要再次运行,可以考虑添加到.bashrc

Windows 10升级1809版本后,发现Hyper-V不能用了,管理器里是一片空白,看服务Hyper-V 主机计算服务没有启动,手动启动的话失败,报错,代码1053.

自己尝试修复,也百度了很久,没弄好,后来终于在微软的英文网站上找到了答案,分享如下。
1, Open “Window Security”
打开“WIndows安全中心 ”
2, Open “App & Browser control”
打开“应用和浏览器控制”

3, Click “Exploit protection settings” at the bottom
点击”Exploit protection settings” (在最下面)

4, Switch to “Program settings” tab
切换到“程序设置”

5, Locate “C:\WINDOWS\System32\vmcompute.exe” in the list and expand it
找到 “C:\WINDOWS\System32\vmcompute.exe”并展开