[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.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之后的名称>
注意:
- 如果提示文件权限问题 我的解决方法是重启
- 如果提示已经存在,请使用删除命令删掉系统(千万别删错)
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=2GBswap=4GBlocalhostForwarding=true
输入
wsl --shutdown
重启ubuntu就好了
写在最后
这段时间都会使用wsl来写很多代码,所以如果遇到新的问题我都会更新在这个文章里,以防重装的时候不知道怎么办,节约时间嘛。。。