安装并启用WSL

使用GUI管理WSL

强烈推荐使用软件 WSL Dashboard,可以可视化配置WSL

官方安装教程参考WSL安装教程

以管理员身份运行PowerShell,执行命令安装WSL,建议添加--no-distribution不自动下载linux发行版,分开下载

1
wsl --install --no-distribution

等待WSL安装完成后,可以使用命令wsl --list --online查看当前有哪些发行版可用:

1
2
3
4
5
6
7
8
&: wsl --list --online
NAME FRIENDLY NAME
Ubuntu Ubuntu
Ubuntu-26.04 Ubuntu 26.04 LTS
Ubuntu-24.04 Ubuntu 24.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
openSUSE-Tumbleweed openSUSE Tumbleweed
openSUSE-Leap-16.0 openSUSE Leap 16.0

Ubuntu一般是24.04,做嵌入式开发最好不要选择太高的版本,建议用22.04或20.0420.04最好,
虽然wsl --list --online没显示,但是是可以安装的:

1
wsl --install Ubuntu-20.04

安装依赖和环境

APT包

安装依赖的APT包

1
2
sudo apt update
sudo apt install build-essential libncurses5-dev lzop

交叉编译器

使用正点原子官方提供的交叉编译器,位置在百度网盘A盘->5、开发工具->1、交叉编译器-> gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
下载链接:百度网盘提取码:m65i

解压到任意目录:

1
tar -xzvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

将解压出来的/absolute/path/to/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin路径添加到zshrc:

1
echo "export PATH=\"/absolute/path/to/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin:\${PATH}\"" >> ~/.zshrc

使用source ~/.zshrc刷新终端环境,然后执行命令测试交叉编译器是否配置好

1
2
3
4
5
6
7
8
❯ arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/absolute/path/to/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/4.9.4/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/snapshots/gcc-linaro-4.9-2017.01/configure SHELL=/bin/bash ............省略
Thread model: posix
gcc version 4.9.4 (Linaro GCC 4.9-2017.01)

NFS

使用NFS和TFTP时一定要确保WSL和板卡处于同一个局域网

NFS是网络文件系统(Network FileSystem),NFS主要用来把 Ubuntu 主机上的目录挂载到开发板,让板子直接运行主机上交叉编译好的程序、甚至用 NFS 根文件系统启动,省掉反复烧写 eMMC/NAND 的麻烦。

安装软件:

1
sudo apt-get install nfs-kernel-server rpcbind

创建目录:

1
mkdir -p ${HOME}/linux/nfs

编辑文件/etc/exports,在最后一行添加(将zuozhongkai改为自己的用户名):

1
/home/zuozhongkai/linux/nfs *(rw,sync,no_root_squash)

重启nfs服务:

1
sudo systemctl restart nfs-kerner-server
如果使用的是Ubuntu-22.04及更高版本系统

正点原子提供的uboot2016.03使用的是nfsv2,但是Ubuntu22.04的Linux内核已移除对NFSv2的支持,因此无法正常使用。

如果非要在Ubuntu22.04及以上的WSL系统开发,需要重新编译Linux内核启动NFSv2的支持

参考教程:自行编译内核

在编译内核前修改配置文件Microsoft/config-wsl,在7772行,将

1
2
CONFIG_NFSD=m
# CONFIG_NFSD_V2 is not set

改为:

1
2
CONFIG_NFSD=y
CONFIG_NFSD_V2=y

保存后再编译内核即可启用NFSv2
编译安装后启动系统,修改配置文件/etc/nfs.conf,
[nfsd]下面添加

1
2
udp=y
vers2=y

保存后重启nfs:sudo systemctl restart nfs-kernel-server.service

TFTP

tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,
只是 tftp 命令使用的 TFTP 协议,Ubuntu 主机作为 TFTP 服务器。

安装依赖:

1
2
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd

创建目录:

1
2
3
mkdir -p ${HOME}/linux/tftpboot
chmod 777 ${HOME}/linux/tftpboot
sudo mkdir -p /etc/xinetd.d

修改配置文件/etc/xinetd.d/tftp(将zuozhongkai改为自己的用户名):

1
2
3
4
5
6
7
8
9
10
11
12
13
server tftp
{
socket_type= dgram
protocol= udp
wait= yes
user= root
server= /usr/sbin/in.tftpd
server_args= -s /home/zuozhongkai/linux/tftpboot/
disable= no
per_source= 11
cps= 100 2
flags= IPv4
}

修改配置文件/etc/default/tftpd-hpa(将zuozhongkai改为自己的用户名):

1
2
3
4
5
6
# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/zuozhongkai/linux/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"

重启服务:

1
sudo systemctl restart tftpd-hpa

USB设备共享

类似于vmware中将设备连接到虚拟机,WSL也可以将usb设备连接到WSL,
参考指南:连接 USB 设备

usbipd-win Releases下载最新的.msi安装包并安装

建议使用WSL Dashboard来管理usb设备

CLI使用步骤:

  1. 查看有哪些usb设备:usbipd list
  2. 启动指定设备的共享:usbipd bind --busid 4-4
  3. 附加到WSL:usbipd attach --wsl --busid <busid>,此时可在wsl使用lsusb查看到新附加的设备
  4. wsl中使用完成后,可以直接断开设备,或在windows中使用usbipd detach --busid <busid>重新连接到windows

网络配置

建议使用Windows11

如果使用的是Windows11,将WSL网络模式设置为mirrored,WSL即可和板卡处于同一个网络,
使用的是Windows10的话需要做额外的配置。

编辑文件/etc/wsl.conf,在[boot]下添加command:

1
2
3
[boot]
systemd=true
+ command=sudo ip addr add 192.168.137.3/24 broadcast 192.168.137.255 dev eth0 label eth0:staticip

192.168.137.3/24192.168.137.255改成对应的你要设置的ip和广播地址

在windows网络适配器中选择vEthernet和以太网(与板卡链接的网口对应的适配器),右键选择桥接

然后配置网桥的ip和linux在同一个网段,板卡也要在同一个网段

Warning

若WSL丢失172网段的默认路由,则usbipd会失效,请手动添加一个默认路由到windows

桥接后WSL无法联网

由于WSL中设置的网关地址为vEthernet适配器的ip地址,桥接后vEthernet失去ip,因此需要手动将原本vEthernet的IP地址赋予给网桥。

在WSL中使用ip r查看一下当前的默认路由地址,输出有default via 172.19.48.1 dev eth0 proto kernel
则表示172.19.48.1为原本vEthernet的ip,在网桥的ipv4设置右下角有个高级设置,在里面添加上这个额外的ip

这个ip会在每次启动时动态改变,因此当WSL再次没网时要按上面的步骤重新设置ip