WSL打造Linux开发环境教程

  • Post author:
  • Post category: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

关于win10

开启WSL

功能和

如何升级WSL

本教程使用到的资源文件为:

资源 版本

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:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。

出现问题:

  1. 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

出现问题:

  1. 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真是开发者的利器,再也不用各种套娃装虚拟机加系统,各种卡了。



版权声明:本文为sinat_28723265原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。