[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就行了,但是。。。

宿舍办的宽带没有公网ip,是个内网ip。。。我真的就惊喜,意外啊-。-那就琢磨琢磨骚操作。


ssh的反向代理

反向代理是用过ssh进行数据的传输.反向代理的作用可以认为是把内网中的主机(A)暴露出来,以便于所有的主机都可以访问到主机A的服务。假定我们使用一台公网可以访问的主机(B)来给主机A做反向代理。

看完我的感受这是啥意思。。完全没看懂。。。。哈哈哈哈哈

针对我的场景需求,就是上面的图,其实就是需要我们宿舍的电脑将反向代理注册到服务器的一个端口,当我使用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.top的2223

别忘了在对应的远程服务器开放2223端口呀!

然后我在juice连接xxxx.top的2223端口就能使用啦,看看效果:

就可以开心的远程控制啦0.0而且可以映射到网络服务之类的,改相应的端口就好了。

注意:我把我wsl的端口改成2222了,如果你的是22请自行修改,修改方式:sudo vim /etc/ssh/sshd_config将Port修改之后重启服务 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.gz

cd WSL2-Linux-Kernel-4.19.84-microsoft-standard
zcat /proc/config.gz > .config
make             //Compile the kernel and modules
sudo 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之后的名称>

注意:


如果提示文件权限问题 我的解决方法是重启

如果提示已经存在,请使用删除命令删掉系统(千万别删错)

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

将 cron 前面的注释符去掉

重启相关服务

sudo service rsyslog restart

sudo service cron restart


六、内存占用问题

默认的wsl的内存量为主机的80%,这就导致主机很卡,而且没有必要

.打开Windows资源管理器,地址栏输入 %UserProfile% 回车,在该目录下创建一个文件, 名字为 .wslconfig ,写入内容示例如下 (我电脑8GB内存,分给WSL内存2GB,另外设置交换分区4GB)


[wsl2]
memory=2GB
swap=4GB
localhostForwarding=true


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


写在最后

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


相关文章
|
4月前
|
NoSQL 关系型数据库 MySQL
Linux学习记录---(1、基本命令)
该博客文章提供了Linux系统中基本命令的使用记录,包括文件和目录操作、Redis服务管理、MySQL数据库操作以及Tomcat服务器的启动和检查。
Linux学习记录---(1、基本命令)
|
1月前
|
Linux 编译器 开发工具
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
|
1月前
|
存储 安全 Linux
|
1月前
|
Linux Shell 数据安全/隐私保护
|
5月前
|
Ubuntu Linux vr&ar
IM跨平台技术学习(十二):万字长文详解QQ Linux端实时音视频背后的跨平台实践
本文详细记录了新版QQ音视频通话在 Linux 平台适配开发过程中的技术方案与实现细节,希望能帮助大家理解在 Linux 平台从 0 到 1 实现音视频通话能力的过程。
201 2
|
2月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
2月前
|
网络协议 Linux
linux学习之套接字通信
Linux中的套接字通信是网络编程的核心,允许多个进程通过网络交换数据。套接字提供跨网络通信能力,涵盖本地进程间通信及远程通信。主要基于TCP和UDP两种模型:TCP面向连接且可靠,适用于文件传输等高可靠性需求;UDP无连接且速度快,适合实时音视频通信等低延迟场景。通过创建、绑定、监听及读写操作,可以在Linux环境下轻松实现这两种通信模型。
48 1
|
2月前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
107 0
|
4月前
|
NoSQL Ubuntu Linux
Linux内核学习
Linux内核学习
103 3
|
3月前
|
Linux
使用qemu来学习Linux的休眠和唤醒
使用qemu来学习Linux的休眠和唤醒