WSL打造Linux开发环境教程
开发环境
win10 64位
WSL Ubuntu 1804.2020824.0
MobaXterm 工具
注意:这里需要使用WSL 2,因为WSL 1 不支持挂载sd卡镜像驱动,会一直报挂载失败故障。
查看 当前WSL版本,win+r cmd后输入:
wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Running 1
如果这里VERSION 为1 需要将WSL 升级到VERSION 2
本教程使用到的资源文件为:
资源 | 版本 |
---|---|
qemu | qemu-6.0.0.tar.xz |
uboot | u-boot-2017.01.tar.bz2 |
kernel | linux-5.9.2.tar.gz |
busybox | busybox-1.28.1.tar.bz2 |
将上述文件拷贝到
\\wsl$\Ubuntu-18.04\home\用户
路径下
首先安装可能需要安装的库,如果后续有提示缺少库可根据需要安装:
需要安装的库:
sudo apt-get install build-essential pkg-config zlib1g-dev libglib2.0-0 libglib2.0-dev libsdl1.2-dev libpixman-1-dev libfdt-dev autoconf automake libtool librbd-dev libaio-dev flex bison -y
交叉编译链安装:
sudo apt install gcc-arm-linux-gnueabihf
输入
arm-linux-gnueabihf-gcc -v
查看是否安装成功
安装QEMU
解压并编译安装
tar xvf qemu-6.0.0.tar.xz
cd qemu-6.0.0
./configure --prefix=/usr/local/qemu --target-list=arm-softmmu --audio-drv-list=
make -j8 && sudo make install
sudo ln -s /usr/local/qemu/bin/* /usr/local/bin/
其中 --target-list:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。
出现问题:
- ERROR: Cannot find Ninja
解决方法:
sudo apt-get install ninja-build
执行完毕测试:
qemu-img -V
查看 QEMU 支持的板子
qemu-system-arm -M help
其中
vexpress-a9 ARM Versatile Express for Cortex-A9
为本教程选择的虚拟开发板
编译uboot源码并仿真
解压源码
tar xvf u-boot-2017.01.tar.bz2
cd u-boot-2017.01/
指定编译环境
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
查看uboot支持的板级配置
ls configs/vexpress_*
这里选择vexpress_ca9x4_defconfig
make vexpress_ca9x4_defconfig
此时会在源码目录下生成配置.config文件
uboot编译源码
make -j16
编译完成后在源码目录生成uboot镜像文件
uboot仿真
qemu-system-arm -M vexpress-a9 -m 256 -kernel ./u-boot -nographic
其中-nographic 不使用图形化界面
退出qemu
网上很多教程都说是输入ctrl + A 后按 X退出 QEMU,在wsl上实测不能退出,wsl上退出方法为:重新打开一个wsl窗口输入
sudo killall qemu-system-arm
编译Linux内核并仿真
编译Linux内核
解压Linux源码
tar xvf linux-5.9.2.tar.gz
cd linux-5.9.2
指定编译环境
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
查看内核配置文件
ls arch/arm/configs/
这里我们选择vexpress_defconfig配置文件
make vexpress_defconfig
查看配置中的控制台设备号
cat arch/arm/configs/vexpress_defconfig |grep -n "CONFIG_CMDLINE"
vexpress_defconfig 中设置了 CONFIG_CMDLINE=“console=ttyAMA0”
配置内核
make menuconfig
出现问题:
- Unable to find the ncurses package.
解决问题:
sudo apt-get install ncurses-dev
选择内核支持nfs功能:
File systems – > Network File systems
编译内核源码
make -j8
内核仿真
sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"
其中 -dtb 指定设备树,否则会失败
-append “console=ttyAMA0” 内核启动參数。这里告诉内核vexpress串口设备是哪一个。
编译busybox源码制作根文件系统及仿真
编译busybox源码
解压busybox源码
tar xvf busybox-1.28.1.tar.bz2
cd busybox-1.28.1/
指定编译环境
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
配置busybox
make menuconfig
选中 Settings-> [*] Build static binary (no shared libs)
编译busybox源码
make -j16
安装busybox
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- install
通过 make install 命令把生成的根文件创建在顶层目录(busybox-1.28.1根目录) _install 下
注意这里一定要加上 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 否则安装为x86架构的镜像无法进入控制行操作。
编写制作rootfs和sd卡镜像文件
在busybox-1.28.1根目录下,新建make_rootfs.sh文件
vim make_rootfs.sh
加入一下内容
# File Name: make_rootfs.sh
##
#!/bin/sh
base=`pwd`
tmpfs=/_tmpfs
# 如果存在删除
sudo rm -rf rootfs
sudo rm -rf ${tmpfs}
sudo rm -f a9rootfs.ext4
sudo mkdir rootfs
# 拷贝 _install 中文件 到 rootfs
sudo cp _install/* rootfs/ -raf
#sudo mkdir -p rootfs/{lib,proc,sys,tmp,root,var,mnt}
cd rootfs && sudo mkdir -p lib proc sys tmp root var mnt && cd ${base}
# 根据自己的实际情况, 找到并 拷贝 arm-gcc 中的 libc中的所有.so 库
sudo cp -arf /usr/arm-linux-gnueabihf/lib/* rootfs/lib
sudo cp examples/bootfloppy/etc rootfs/ -arf
sudo sed -r "/askfirst/ s/.*/::respawn:-\/bin\/sh/" rootfs/etc/inittab -i
sudo mkdir -p rootfs/dev/
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
sudo dd if=/dev/zero of=a9rootfs.ext4 bs=1M count=32
# 如果提示 "No space left on device" 证明 dd 命令中 count 的大小不够,可以先进行瘦身
sudo mkfs.ext4 a9rootfs.ext4
sudo mkdir -p ${tmpfs}
sudo chmod 777 ${tmpfs}
sudo mount -t ext4 a9rootfs.ext4 ${tmpfs}/ -o loop
sudo cp -r rootfs/* ${tmpfs}/
sudo umount ${tmpfs}
然后给文件执行权限,然后执行脚本
sudo chmod a+x make_rootfs.sh
./make_rootfs.sh
接着进入rootfs/lib 中,为交叉编译工具链瘦身
cd rootfs/lib/
sudo arm-linux-gnueabihf-strip ./*
du -h ./
仿真rootfs
拷贝 a9rootfs.ext4 文件 到 之前 内核 linux-5.9.2 根目录中 ,并在 其中打开终端输入下面命令进行仿真
cp a9rootfs.ext4 ../linux-5.9.2
在linux-5.9.2主目录执行
qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd ./a9rootfs.ext4
根文件系统仿真完毕
问题总结
终于填坑完毕,踩坑过程中出现了很多问题,一度怀疑WSL不能搭建开发环境,后期仿真根文件系统的时候,总是挂载ext4文件失败,是因为WSL版本1不支持挂载ext4格式的磁盘,升级到WSL版本2测试通过了,在编译过程中出现各种报错问题,一般都是没有相应的库,按照报错内容下载对应库就好了,WSL真是开发者的利器,再也不用各种套娃装虚拟机加系统,各种卡了。