> 文档中心 > [linux学习记录]wsl2踩坑指北

[linux学习记录]wsl2踩坑指北

请添加图片描述

前言

因为最近选了Linux内核编程的课程,需要linux环境,刚好之前利用wsl2装了ubuntu,就直接使用了,但是发现这个操作系统和正常的系统有很多差距,导致各种wrong,所以就开了这篇文章来记录一下自己遇到的坑和解决方案。

🧑🏻作者简介:一个从学嵌入式的年轻人
✨联系方式:2201891280(QQ)
全文大约阅读时间: 20min


文章目录

  • 前言
  • 零、wsl转wsl2
    • 前置条件
    • 设置版本
    • wsl无缝切换wsl2
  • 一、无外网IP的ssh连接
      • ssh的反向代理
      • ssh的持续性连接
      • sshd: no hostkeys available -- exiting
  • 二、wsl的内核模块
  • 三、wsl的clone
  • 四、wsl的空间释放
  • 五、crontab无法开启的问题
  • 六、内存占用问题
  • 写在最后

零、wsl转wsl2

因为我整篇文章都是写的wsl2的方式,wsl1我确实不知道怎么操作,所以给一种切换版本的方式。以下只是提供一种官方的方法,我没有wsl1,如果有任何问题欢迎联系我进行更正。


前置条件

查看关于本机,系统版本必须>=windows10 2004以上 (可以使用winver查看)

设置版本

wsl --set-default-version 2

可以直接设置版本为wsl2,注意的是wsl2中win也是运行在虚拟平台的,导致xtu无法使用,暂未发现其他bug。


wsl无缝切换wsl2

如果你本身是wsl1的系统(查看方式:wsl -l -v如果VERSION为1就是1),想无缝切换到wsl2,可以运行以下命令:

wsl --set-version <分发版本> 2

分发版本是上面wsl -l -v查看到的版本号
例如我的就是 wsl --set-version Ubuntu-20.04 2就OK了。

一、无外网IP的ssh连接

因为我是在台式机上安装的wsl,上课总不可能抱着电脑去上课把?所以就希望使用ssh,最直接的方式就是端口映射直接映射到公网ip就行了,但是。。。
[linux学习记录]wsl2踩坑指北
宿舍办的宽带没有公网ip,是个内网ip。。。我真的就惊喜,意外啊-。-那就琢磨琢磨骚操作。


ssh的反向代理

反向代理是用过ssh进行数据的传输.反向代理的作用可以认为是把内网中的主机(A)暴露出来,以便于所有的主机都可以访问到主机A的服务。假定我们使用一台公网可以访问的主机(B)来给主机A做反向代理。
看完我的感受这是啥意思。。完全没看懂。。。。哈哈哈哈哈
[linux学习记录]wsl2踩坑指北
针对我的场景需求,就是上面的图,其实就是需要我们宿舍的电脑将反向代理注册到服务器的一个端口,当我使用ssh客户端连接服务器的端口的时候就会把对应端口需求转发给我宿舍电脑的端口。
所以需要在我电脑上运行如下命令:

ssh -CNfR server_port:127.0.0.1:port server_name@server_ip

比如我输入下面的命令:

ssh -CNfR 2223:127.0.0.1:2222 root@xxxx.top

就是将本地的2222端口映射到xxxx.top2223
别忘了在对应的远程服务器开放2223端口呀!
然后我在juice连接xxxx.top的2223端口就能使用啦,看看效果:[linux学习记录]wsl2踩坑指北
就可以开心的远程控制啦0.0而且可以映射到网络服务之类的,改相应的端口就好了。
注意:我把我wsl的端口改成2222了,如果你的是22请自行修改,修改方式:sudo vim /etc/ssh/sshd_configPort修改之后重启服务 sudo service ssh restart就好了


ssh的持续性连接

默认ssh有超时时间,在听课的时候没敲就直接输入不了了。。咋办呢?
修改wsl的/etc/ssh/sshd_config

ClientAliveInterval 60   #server每隔60秒发送一次请求给client,然后client响应,从而保持连接ClientAliveCountMax 3  #server发出请求后,客户端没有响应得次数达到3,就自动断开连接,正常情况下,client不会不响应

就好了


sshd: no hostkeys available – exiting

sudo ssh-keygen -A

二、wsl的内核模块

因为linux内核编程嘛,肯定是要编译内核的,结果我用示例代码编译,报错没有内核。。。。微软真行,行的很,,,
直接cd /lib/modules发现真啥也没有。但其实微软提供了源码我们需要自己编译wsl2内核
先使用uname -r查看我们的版本,然后下载对应的版本就行。
直接复制对应的连接wget就行了。
然后安装依赖:

sudo apt-get install libelf-dev build-essential pkg-config bison build-essential flex libssl-dev libelf-dev bc

然后正式编译安装:

sudo tar xvzf 4.19.84-microsoft-standard.tar.gzcd WSL2-Linux-Kernel-4.19.84-microsoft-standardzcat /proc/config.gz > .configmake      //Compile the kernel and modulessudo make modules_install

然后我们就拥有了内核模块。。。离谱!!!!

三、wsl的clone

虚拟机一般都提供了工具进行clone,就能生成一个副本镜像,然后就能运行kgdb双机联调了,wsl默认一个版本只能安装一个wsl,这就非常不方便,况且不能进行复制重新配置环境岂不是累死个人?有没有什么方法呢?


万能的全球最大的同性交友网站GitHub有一款工具LxRunOffline
下载最新的发行版之后就能进行clone了
介绍三个我常用的命令
查看当前所有的wsl版本

.\LxRunOffline.exe l

删除某个版本的wsl系统(不删除文件,文件自己删)

.\LxRunOffline.exe ur -n <版本名称>

clone子系统

.\LxRunOffline.exe d -n <版本名称> -d <存放目录> -N <clone之后的名称>

注意:

  1. 如果提示文件权限问题 我的解决方法是重启
  2. 如果提示已经存在,请使用删除命令删掉系统(千万别删错)

clone之后的系统启动方式
默认的wsl命令启动是之前的系统 新系统的启动方式是

wsl -d <clone之后的名称>

四、wsl的空间释放

由于wsl使用的是虚拟磁盘,这东西有个特色就是按需分配,但是很蠢的是 需要空间的时候进行申请,不需要的时候不会自动释放
所以就会越用越大,即时删除了内容也不会变回去。所以需要进行空间回收。
执行下面的操作进行关机

wsl --shutdown

然后输入

DISKPART

打开win自带的分区工具

select vdisk file="{vhdx路径完整版}"

然后

compact vdisk

就ok了
注:
{vhdx路径完整版}一般在C:\Users\{user}\AppData\Local\Packages\下 Pengwin 是WhitewaterFoundryLtd.Co,Ubuntu 是 CanonicalGroupLimited,Debian 是TheDebianProject
找到对应LocalState.vhdx就行了

五、crontab无法开启的问题

开启 cron.log
sudo vim /etc/rsyslog.d/50-default.conf
[linux学习记录]wsl2踩坑指北
将 cron 前面的注释符去掉
重启相关服务
sudo service rsyslog restart
sudo service cron restart

六、内存占用问题

默认的wsl的内存量为主机的80%,这就导致主机很卡,而且没有必要
.打开Windows资源管理器,地址栏输入 %UserProfile% 回车,在该目录下创建一个文件, 名字为 .wslconfig ,写入内容示例如下 (我电脑8GB内存,分给WSL内存2GB,另外设置交换分区4GB)

[wsl2]memory=2GBswap=4GBlocalhostForwarding=true

输入wsl --shutdown重启ubuntu就好了

写在最后

这段时间都会使用wsl来写很多代码,所以如果遇到新的问题我都会更新在这个文章里,以防重装的时候不知道怎么办,节约时间嘛。。。