超详细WSL搭建教程,包含图形化界面安装、解决内存占用大的问题
最近决定尝试一下wsl,发现确实挺好用,比虚拟机香多了。把我的全部搭建过程记录下来。
我这里使用wsl2,安装ubuntu,安装xfce4桌面环境
安装wsl
官方教程https://docs.microsoft.com/zh-cn/windows/wsl/install-win10
我这里采用手动安装的方式。
需要先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
或者在这里勾选
先不着急重启,继续后面的操作。
启用虚拟机功能
关于wsl2和wsl的区别看官方介绍,我这里使用wsl2
安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能才能使用此功能。
以管理员身份打开 PowerShell 并运行:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
或者在这里勾选
先不着急重启,继续后面操作。
wsl2貌似不启用这个选项也能使用,启用的好像效果会更好,反正启用了不会有问题。
先不着急重启,继续后面操作。
下载 WSL2更新包
下载适用于 x64 计算机的 WSL2 Linux 内核更新包
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
现在重启。
开启BIOS虚拟化功能
如果之前没开启过,在这次重启的时候趁机进入bios开启。
如果不开启,后续过程会安装失败。
安装所选的 Linux 分发
现在重启完成,先安装WSL2更新包,也就是上面下载下来的wsl_update_x64.msi,双击运行。
之后打开 Microsoft Store,并选择你偏好的 Linux 分发版。
我这里安装的是ubuntu,其他的发行版一样的操作。
安装完成点击启动
之后就会出现小黑框,提示你正在安装,等几分钟,正常情况等两分钟就安装成功了,如下图
输入用户名,输入两次密码,安装就完成了,就可以愉快的玩耍了。
然而,这里却很容易出问题,比较容易出现错误 0x80070003 或错误 0x80370102。请确保启用了虚拟机平台,bios里开启了虚拟化功能。
然而我这里全都开启了,依然报错。后来发现是虚拟机的问题,vmware和virtualbox我全都装了。直接卸载,然后重启,再次启动ubuntu,就能安装成功了。之前在Microsoft Store里面下载成功之后,开始里面就已经出现了ubuntu的图标了,直接从开始里面点击图标就可以启动了。在安装成功之后直接在命令行里面输入ubuntu也能启动。
后来我又遇到了问题,因为我反复安装删除了几次,后来就死活装不上了,就一直报错WSL2 请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用虚拟化,后来找到这样一条命令解决,在命令行里面输入这条命令:
bcdedit /set hypervisorlaunchtype auto
然后再重启电脑,重新安装,安装成功。
将分发版版本设置为 WSL 1 或 WSL 2
在命令行或powershell中输入
wsl --list --verbose
简写
wsl -l -v
可以查看ubuntu现在的状态以及使用的wsl的版本,正常情况刚安装的都是版本1,我这里是设置为2了。
下面就是设置为wsl2
在cmd或powershell中输入命令
wsl --set-version <distribution name> <versionNumber>
请确保将 替换为你的分发版的实际名称,并将 替换为数字“1”或“2”。 可以随时更改回 WSL 1,方法是运行与上面相同的命令,但将“2”替换为“1”。
所以我这里实际的命令就是
wsl --set-version Ubuntu 2
稍等片刻即可完成。
注意,把所有的终端都关闭,并不能关闭ubuntu,依旧会在后台运行,而且在ubuntu中命令shutdown、init 0、poweroff都不能用。
想要关闭ubuntu,需要在cmd或powershell中输入命令
wsl --shutdown
设置WSL默认以root用户登录
首先设置root用户密码
在ubuntu中输入
sudo passwd root
输入当前用户密码,再输入两次root用户密码。
然后再cmd或powershell中输入
ubuntu config --default-user root
再次登录ubuntu,就会发现是以root用户登录的。
此时你会发现,之前的用户是有颜色的,现在root没有颜色,直接用之前用户家目录下的.bashrc替换掉root目录下的.bashrc文件即可解决。
修改国内源
这里就没什么好讲的了,/etc/apt/sources.list文件,添加阿里或清华或中科大或网易的源,下面提供一个阿里的源
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
然后执行
apt update
按理来说这时就可以愉快的apt install各种软件了,但是此时会发现apt update是有问题的,安装软件也失败。ping一下百度,网是通的,但是延时很高。后来发现是dns的问题,修改/etc/resolv.conf文件,把地址改为223.5.5.5(阿里的DNS,也可以改成其他的,比如8.8.8.8,好使就行),这时候ping一下百度延时也很低了,再次apt update就没错了,然后安装各种软件也是很快的。
在修改/etc/resolv.conf文件的时候会发现前面有这样一段内容
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
就是说这个文件是wsl自动生成的,如果要停止自动生成,在etc目录下创建一个wsl.conf文件,然后文件里面输入下面内容
[network]
generateResolvConf = false
此时注意了,一定要重启wsl服务才能生效,不是关闭ubuntu,首先关闭所有的终端,然后以管理员身份运行CMD或powershell输入命令
net stop LxssManager
net start LxssManager
其实这个地址就是WSL2 架构会为 Linux 系统分配一个虚拟网卡,在cmd中用ipconfig查看会发现wsl网卡的地址就是/etc/resolv.conf中nameserver的地址。
这里我不去停止自动生成,因为后面在安装图形化界面的时候,还会涉及到这个文件,我会用其他方法修改这个地址。
远程登录
安装并启动ssh服务器,在windows上通过ssh客户端,比如putty,即可远程登录。个人感觉使用wsl再去远程登录意义不大,因为在windows上可以直接点击ubuntu的图标来登录,也可以在cmd或者powershell中直接输入ubuntu来登录。所以远程登录这里就不详细讲了。
windows与ubuntu之间文件互访
云端服务器,访问linux中的文件可以通过samba来实现,在虚拟机中还可以创建共享文件夹。现在使用wsl,十分简单。
首先ubuntu访问windows的文件,在/mnt目录下,你会发现你的c盘、d盘等等都被自动挂载上了,可以随意访问。
在windows中访问ubuntu的文件,首先在ubuntu中运行下面这条命令:
explorer.exe .
注意,那个点,或者写其他任意目录都行,但是一定要有一个目录。
这时候windows就会打开这个文件夹。
然后点地址栏里的wsl$
这时候会看到下面的样子
然后在ubuntu上右击,点映射网络驱动器
直接点完成
这时候你就会发现和使用samba是一样的,并且少了samba那些繁杂的配置。
到这里大家有没有发现,刚才执行的explorer.exe是windows的资源管理器程序,当然这并不是说linux里面可以执行windows的程序,这里ubuntu只是把命令交给了windows,还是windows来执行的。继续尝试你还会发现,其他的windows程序都可以在ubuntu里面启动,当然了,都是交给windows运行的,而且还能发现,ubuntu的PATH环境变量的值包含了windowsPATH的全部内容。
安装图形化界面
虽然真正用linux的人基本都是使用命令行,但是对于这个wsl安装图形化界面还是很好奇的。
在网上找了一下,一种是安装ubuntu-desktop桌面,另一种是安装xfce4桌面。第一种安装失败,所以我采用的是xfce4桌面
首先在windows上安装ximg,下载地址https://sourceforge.net/projects/xming/ 或 https://xming.en.softonic.com/
然后运行XLaunch
四种风格,推荐最后一个,Dispaly number填0
点下一步,不用改,继续点下一步
这里一定要勾选
然后点下一步,完成。
接下来就是在ubuntu中安装xfce4
apt install xfce4-terminal
apt install xfce4
等安装完成,配置DISPLAY环境变量。大家注意了,这里有个大坑,对与这个DISPLAY的设置的命令,网上有export DISPLAY=:0 有export DISPLAY=127.0.0.1:0 有export DISPLAY=localhost:0
然后运行startxfce4或者xfce4-session命令,各种方式我都尝试了,全部都报错。其实这几种设置的DISPLAY的值是一样的,但这是针对WSL的,我这里使用的是WSL2,这个地址是不对的。对于WSL2,正确的地址是/etc/resolv.conf里面的那个nameserver的地址,所以这里应该执行的命令是
export DISPLAY=IP:0
startxfce4
这里的IP要换成你的/etc/resolv.conf里面的那个地址,注意,是没被你自己改之前的那个地址。把startxfce4改成xfce4-session也可以,不知道两者的区别与联系,但是效果一样。这时候你的XLaunch就能显示出桌面了。
这里还可以使用xrdp配合windows自带的远程桌面或者vnc软件来实现。
安装xrdp
apt install xorg
apt install xrdp
修改默认的通信端口
vim /etc/xrdp/xrdp.ini
port=3390 # 修改默认的通信端口`3389`,防止和Windows系统的远程桌面冲突
/etc/init.d/xrdp start
然后在ubuntu中用ifconfig查看ip,然后打开远程桌面连接,输入ip:3390,然后输入WSL2的账户和密码进行登录,结果会发现闪退,这是由于xrdp远程连接创建后对登录使用的账户不知道该启动哪个桌面Session会话导致,需要手动创建一下,在ubuntu中执行
cd ~
vim .xsession
# 文件内容就下面一行,保存退出
xfce4-session
再使用远程桌面连接,成功。不过感觉好像很卡。不知道使用vnc软件会不会好一些,没尝试。继续研究上面的XLaunch。
XLaunch方式的ip就很头疼,因为/etc/resolv.conf里面的内容不是固定的,是会变的。
所以我这里自己写了个脚本,来自动设置DISPLAY环境变量。
在用户目录下创建.set_display.sh文件,输入下面内容
#!/bin/bash
net_ip=$(cat /etc/resolv.conf | grep "#nameserver" | cut -f 2 -d ' ');
if [ ! -n "$net_ip" ]; then
net_ip=$(cat /etc/resolv.conf | grep "nameserver" | cut -f 2 -d ' ');
echo "#nameserver $net_ip" > /etc/resolv.conf
echo "nameserver 223.5.5.5" >> /etc/resolv.conf
fi
export DISPLAY=$net_ip:0
然后添加可执行权限
chmod +x .set_display.sh
然后在.bashrc中添加下面内容,实现在登录时自动执行脚本
source /root/.set_display.sh
现在每次登录都可以自动设置正确的DISPLAY环境变量的值了。
创建启动图形界面的快捷方式
每次启动图形界面,都要先打开XLaunch,然后在ubuntu里执行startxfce4,比较繁琐,下面介绍如何在windows桌面上创建快捷方式,直接双击ok。
首先打开XLaunch按之前的那样配置,最后将配置保存下来,记住自己保存的位置,我这里保存在C:\mysoft\start_x_ubuntu\config.xlaunch
然后在windows某个目录,创建bat批处理文件,我这里文件名是startXubuntu.bat,文件内容
start "" "C:\Program Files (x86)\Xming\XLaunch.exe" -run "C:\mysoft\start_x_ubuntu\config.xlaunch"
bash -c "cd /root && source /root/.set_display.sh && startxfce4"
注意,C:\Program Files (x86)\Xming\XLaunch.exe要根据你的安装路径做修改。
然后再创建一个vbs文件,文件内容
set ws=WScript.CreateObject("WScript.Shell")
ws.Run "C:\mysoft\start_x_ubuntu\startXubuntu.bat",0
最后把xUbuntu.vbs发送到桌面快捷方式,再找个图标,换个好看的图标,直接双击,就能自动运行图像界面
内存占用过大的解决办法
使用一段时间就会发现,电脑变卡了,打开windows的任务管理器,会发现有个Vmmem,占用了大量的内存,使用图像界面,这个进程使用的内存会更大,很明显这就是wsl的虚拟机。
而且你会发现,即使你把图形界面关了,这里的内存占用也不会变小。下面介绍解决方法。
首先限制wsl最大使用内存
在C:\Users\username目录下创建文件.wslconfig,输入内容
[wsl2]
memory=4GB
swap=4GB
localhostForwarding=true
username是指你在windows下的用户名,内容中的具体大小根据你实际物理内存做适当修改。重启wsl服务。
在ubuntu中手动释放cache内存
echo 3 > /proc/sys/vm/drop_caches
为了方便,可以做成定时任务
crontab -e -u root
选择编辑器
输入内容
*/10 * * * * sync; echo 3 > /proc/sys/vm/drop_caches; touch /root/drop_caches_last_run
10代表每十分钟执行一次
在.bashrc中添加下面内容,允许启动cron服务而无需输入root密码,
[ -z "$(ps -ef | grep cron | grep -v grep)" ] && sudo /etc/init.d/cron start &> /dev/null
然后执行并添加下面内容
visudo
%sudo ALL=NOPASSWD: /etc/init.d/cron start
保存退出。
可以通过查看/root/drop_caches_last_run上次修改日期来检查cron作业是否正在相应地运行:
stat -c '%y' /root/drop_caches_last_run
整个WSL的搭建过程也就结束了。