1、安装
打包
wsl --export Ubuntu-20.04 E:\Ubuntu\ubuntu.tar.gz
注销之前
wsl --unregister Ubuntu-20.04
导入
wsl --import Ubuntu-20.04 E:\Ubuntu\ E:\Ubuntu\ubuntu.tar.gz --version 2
设置默认登陆用户为安装时用户名
ubuntu2004.exe config --default-user dwb
更新清华镜像
ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
安装ubuntu-desktop
sudo apt install ubuntu-desktop
安装systemctl
git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
cd ubuntu-wsl2-systemd-script/
bash ubuntu-wsl2-systemd-script.sh
安装完毕后,输入sudo vi ~/.bashrc
,在文件末尾添加:
export DISPLAY=$(grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'):0.0
export XDG_SESSION_TYPE=x11
安装xfce4桌面
sudo apt-get install xfce4 xfce4-terminal #安装xfce4桌面
echo -e "\n##DISPLAY Configuration" >> ~/.bashrc #配置声明
echo "export DISPLAY=127.0.0.1:0.0" >> ~/.bashrc #添加配置
source ~/.bashrc #配置生效
/usr/bin/startxfce4: X server already running on display :0.0
xrdb: Connection refused
xrdb: Can't open display ':0.0'
Unable to init server: Could not connect: Connection refused
xfce4-session: Cannot open display: .
# 首先需要查看Windows系统和WSL2通信使用的虚拟网卡地址
$ sudo vim /etc/resolv.conf
# nameserver后面的地址就是Windows系统虚拟网卡的地址,记一下,同时需要取消下面两行内容的注释,禁用自动重新生成配置文件,否则重启后这个地址会变
[network]
generateResolvConf = false
$ vim ~/.bashrc
# 在文件最后追加下面内容,地址使用上面查看到的
export DISPLAY=`cat /etc/resolv.conf | grep nameserver | awk '{print $2}'`:0.0
export DISPLAY=192.168.112.1:0// 网址替换为Windows下wsl以太网适配器的ip
VcXsrv下载网址
VcXsrv Windows X Server download | SourceForge.nety
使用MobaX来连接WSL2
- WSL安装 openssh-server
sudo apt-get install openssh-server
-
修改WSL2的/etc/ssh/sshd_config
Port 22 ListenAddress 0.0.0.0 PasswordAuthentication yes PermitEmptyPasswords yes PermitRootLogin yes
- WSL2开启ssh服务
service ssh restart
- 检查ssh server是否启动
ps -e | grep ssh
显示有/usr/sbin/sshd才启动
如果只有ssh-agent,说明没有启动,可以通过
- 设置开机自启SSH
sudo systemctl enable ssh
- MobaX连接
2、windows远程桌面连接wsl2
- 安装远程图形界面
sudo apt install xfce4
sudo apt install xrdp
sudo echo xfce4-session >~/.xsession
sudo vim /etc/xrdp/startwm.sh添加:
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
- 重启服务
sudo service xrdp restart
- 输入账户密码进入界面
3、导入备份的WSL
方法一
导入的名称与通过商店下载的ubuntu的名称不同时
日常使用中,我们会将部署好开发环境的wsl部署到另一台电脑上来使用。
电脑上不需要从商店安装Ubuntu系统,安装了通过图标来启动的话,就不是要导入的系统了。需要通过命令行启动。
具体步骤如下:
3.1 导入已有系统
#Ubuntu为系统名称; E:\Ubuntu\为要导入的文件夹, D:\Ubuntu20.04.tar为之前打包的文件夹
wsl --import Ubuntu E:\Ubuntu\ D:\Ubuntu20.04.tar --version 2
#查看当前版本
wsl -l -v
#结果
NAME STATE VERSION
* Ubuntu Stopped 2
3.2 修改用户名
通过上面的安装,在Powershell中输入wsl,此时进入后的用户名为root
并且无法使用下面的命令来修改用户名
ubuntu2004.exe config ---default-user dwb
可以通过
# 定义函数WSL-SetDefaultUser,接收参数distro和user
Function WSL-SetDefaultUser ($distro, $user) { Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\*\ DistributionName | Where-Object -Property DistributionName -eq $distro | Set-ItemProperty -Name DefaultUid -Value ((wsl -d $distro -u $user -e id -u) | Out-String); };
# 调用函数,此处对应发行版名称Ubuntu,用户名为yz: WSL-SetDefaultUser <DistroName> <UserName>
WSL-SetDefaultUser Ubuntu yz
# 取消函数定义
Remove-Item Function:WSL-SetDefaultUser
其思路即修改注册表中相关的键值,即将注册表计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{...}
中的DefaultUid
值设置为子系统用户对应的gid值(通过id -u
来获取,或者直接查看/etc/passwd
文件)。通过定义PowerShell函数,然后调用来实现 。
3.3 结果
在PowerShell中输入code,打开vscode即可。也可通过终端工具连接WSL了
方法二
微软商店下载的Ubuntu名称与使用import时定义的名称一样时
wsl -l -v
#结果
# NAME STATE VERSION
# * Ubuntu-20.04 Running
wsl --import Ubuntu-20.04 E:\Ubuntu\ g:\Ubuntu20.04_ROS2.tar
比如安装了的是Ubuntu-20.04那么import的时候也要使用Ubuntu-20.04.否则使用图标进入WSL的时候就不是导入的系统,就是需要安装的系统。
4、问题解决
4.1 解决删除文件后 WSL2 磁盘空间不释放的问题
原因
wsl2下删除文件windows下的硬盘空间是不会变化的,WSL2
本质上是虚拟机,所以 Windows
会自动创建 vhdx
后缀的虚拟磁盘文件作为存储。这个 vhdx
后缀的虚拟磁盘文件特点是可以自动扩容,但是一般不会自动缩容。一旦有很多文件把它“撑大”,即使把这些文件删除它也不会自动“缩小”。所以删除文件后还需要我们手动进行压缩才能释放磁盘空间。
备份(可选)
在 PowerShell
中执行:
# 关闭 WSL2 中的 linux distributions
wsl --shutdown
# 备份指定的 Linux distribution 到指定的位置
wsl --export Ubuntu-20.04 D:\Ubuntu-20.04.tar
如果后续步骤出现错误,可以从备份的文件中恢复。本人后续步骤并没有出现错误,所以并没有实践恢复的操作。
有需要的读者可以参考:wsl2-backup-and-restore-images-using-import-and-export
压缩虚拟磁盘文件
在 PowerShell
中执行:
# 关闭 WSL2 中的 linux distributions
wsl --shutdown
# 运行管理计算机的驱动器的 DiskPart 命令
diskpart
在新打开的 DiskPart
命令窗口中执行:
# 选择虚拟磁盘文件(默认位置)
select vdisk file="C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx"
#如果将WSL2移动到其他盘了
select vdisk file="E:\Ubuntu\ext4.vhdx"
# 压缩文件
compact vdisk
# 压缩完毕后卸载磁盘
detach vdisk
上述操作执行完毕,WSL2
删除文件后空出来的磁盘空间就被释放了。