admin 管理员组

文章数量: 1184232


2024年12月25日发(作者:html和javascript)

第36卷 第4期 湖南理工学院学报(自然科学版

)

Vol. 36 No. 4

2023年12月 Journal of Hunan Institute of Science and Technology (Natural Sciences) Dec. 2023

基于WSL 2子系统的嵌入式

Linux操作系统移植方法

王明菱, 刘测产, 张小春, 徐绯然

(西昌卫星发射中心, 四川 西昌 615000)

摘 要: 提出一种基于WSL 2子系统的嵌入式Linux操作系统移植方法. 该方法在Windows操作系统下搭建WSL 2

子系统, 并安装Ubuntu 22.04操作系统, 用于嵌入式软件开发和交叉编译, 能极大提高计算机资源的利用效率. 同时, 采

用QEMU开源虚拟化软件模拟各类硬件平台, 对裁剪后的操作系统、板级驱动和应用程序进行跨平台移植和快速验证,

有利于缩短产品开发周期, 提高研发效率.

关键词: WSL; Ubuntu; QEMU; Linux; 系统移植

中图分类号: TP316.8 文献标识码: A 文章编号: 1672-5298(2023)04-0024-06

Transplantation Method of Embedded Linux Operating

System Based on WSL 2 Subsystem

WANG Mingling, LIU Cechan, ZHANG Xiaochun, XU Feiran

(Xichang Satellite Launch Center, Xichang 615000, China)

Abstract: This paper puts forward a transplantation method of embedded Linux operating system based on WSL 2 subsystem.

In this method, WSL2 subsystem is built under Windows operating system and Ubuntu 22.04 operating system is installed for

embedded software development and cross-compilation, which can greatly improve the utilization efficiency of computer resources.

At the same time, QEMU open source virtualization software is used to simulate various hardware platforms, cross-platform

transplantation and rapid verification of the tailored operating system, board drivers and applications, which is conducive to

shortening product development cycle and improving research and development efficiency.

Key words: WSL; Ubuntu; QEMU; Linux; system transplantation

0 引言

现代嵌入式软硬件开发通常需要在特定的硬件平台上进行. 不同厂商和品牌的硬件板卡之间往往不

兼容, 导致操作系统和软件移植困难, 硬件适配性差. 此外, 为了方便编写和修改开发过程中产生的大量

软件工程化文档, 许多嵌入式软件开发者选择使用Windows操作系统. 因此他们通常需要在虚拟机平台

(如VMware或VirtualBox)下进行交叉编译, 不仅工作效率低下, 而且难以维护. 为了解决上述问题, 本文

提出了一种新的开发调试方法. 该方法在Windows操作系统下搭建WSL 2子系统, 并安装Ubuntu 22.04

操作系统用于嵌入式软件开发和交叉编译, 同时采用QEMU开源虚拟化软件模拟各类硬件平台, 对裁剪

后的操作系统、板级驱动和应用程序进行跨平台移植和快速验证, 有利于提高研发效率.

1 仿真环境搭建

QEMU是一款被广泛使用的开源仿真软件, 支持仿真嵌入式系统中的CPU、I/O、内存及其他硬件设

备源, 被测软件可以完全摆脱对硬件资源的依赖, 为软件的调试运行、故障定位提供便利条件

[1]

. 与

VMware Station相比, QEMU能够模拟一系列嵌入式开发板, 包括ARM、MIPS、RISC-V等不同架构. 模

拟的开发板支持各种外设, 如串口、LCD、网卡、USB、SD卡等, 能够在模拟开发板上运行U-boot、Linux

收稿日期: 2022-08-17

作者简介: 王明菱, 男, 本科, 工程师. 主要研究方向: 嵌入式系统设计

第4期 王明菱, 等: 基于WSL 2子系统的嵌入式Linux操作系统移植方法 25

和Rootfs. 对于没有实物开发板的使用者来说, 通过QEMU搭建虚拟开发板不仅方便快捷, 而且经济实

用, 是学习嵌入式系统和研究U-boot、Linux内核的理想选择. 操作系统环境为Windows 11、WSL 2、

Ubuntu 22.04子系统; QEMU版本为6.2.0; 交叉编译工具链版本为11.4.0; Linux内核版本为5.10.186;

BusyBox版本为1.36.1.

1.1 WSL子系统迁移

在应用商城安装好Ubuntu 22.04子系统后, 该系统默认安装在C盘, 可能造成C盘空间紧张, 于是将

其迁移至其他空闲分区.

使用管理员身份打开powershell, 输入命令“wsl -l -v”查看WSL 2发行版本. 命令显示结果如图1所

示, 不同环境下NAME可能会有所不同.

图1 WSL子系统状态显示

输入命令“wsl --shutdown”, 关闭WSL的Linux发行版.

输入命令“wsl --export Ubuntu D:”, 将操作系统导出到D盘.

输入命令“wsl --unregister Ubuntu”, 注销原Linux发行版.

在D盘的根目录下新建“D:wsl”文件夹, 用于存放新的Ubuntu发行版, 然后使用命令“wsl --import

Ubuntu D:wslUbuntu D: --version 2”, 将“D:ubuntu. tar”导入到“D:wsl”文件夹下.

导入成功后, 输入指令“Ubuntu config --default-user ubuntu”, 修复默认登陆用户, 其中最后的“ubuntu”

可改为自己的用户名.

1.2 配置安装交叉编译环境

安装x86-arm交叉编译器gcc和g++以及其他配套支持软件,并检验交叉编译器安装是否成功, 可输

入指令“arm-linux-gnueabi-gcc-v”. 若出现如图2所示的提示, 则说明交叉编译器安装成功.

图2 交叉编译环境搭建成功提示

安装QEMU开源仿真软件及其配套依赖并检验QEMU是否安装成功, 可输入指令“qemu-system-arm

--version”. 若出现如图3所示的提示, 则说明QEMU安装成功.

图3 QEMU安装成功提示

2 Linux内核编译

Linux 是全面的多任务操作系统, 能支持X86、ARM、MIPS、ALPHA、SPARC等多种不同的体系结

构, 其高效性和稳定性已经在各个领域尤其是在网络服务器领域得到了验证, 而且Linux 内核小巧灵活,

易于裁剪

[2]

.

26 湖南理工学院学报(自然科学版) 第36卷

Linux内核是Linux操作系统的核心代码, 负责与硬件进行交互, 并实现资源调度、内存管理、存储

管理、进程管理、文件系统、设备驱动、网络通信和系统调用等功能.

接下来介绍如何下载、编译Linux内核源码, 并将其移植到QEMU虚拟开发板上, 以实现运行.

在官方网站“”上获取Linux内核源码, 解压并编译.

wget /pub/linux/kernel/v5.x/

tar -xvf

cd linux-5.10.191

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_defconfi

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j12

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- LOADADDR=0x60003000 uImage -j12

输入以下指令, 尝试运行QEMU加载Linux内核.

qemu-system-arm -M vexpress-a9

-m 512M

-kernel arch/arm/boot/zImage

-dtb arch/arm/boot/dts/

-nographi

若出现如图4所示的提示界面, 则说明内核已经成功运行, 但文件系统尚未挂载.

图4 内核运行提示界面

3 建立根文件系统并挂载

根文件系统是内核启动时挂载的第一个文件系统, 内核代码映像文件就保存在根文件系统中. 系统

引导启动程序会在挂载根文件系统后, 从中加载一些基本的初始化脚本和服务到内存中运行

[3]

.

3.1 建立根文件系统

根文件系统的制作方法有很多, 如Buildroot、BusyBox等, 本文采用安装过程最为简单的轻量级根文

件系统制作工具BusyBox.

从官方网站“”下载、解压并编译BusyBox源码.

wget /downloads/2

tar -xvf 2

cd busybox-1.36.1

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j12

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

编译过程中会出现Configuration界面, 需要将“Settings->Build Options->Build static binary”选上, 如图

5所示.

BusyBox默认将根文件系统放在_install文件夹下, 此时构建的根文件系统仅仅是一系列支撑Linux

操作系统基本运行的可执行文件, 若想将根文件系统挂载起来, 还需要手动生成脚本文件、配置文件、设

备节点和动态链接库.

第4期 王明菱, 等: 基于WSL 2子系统的嵌入式Linux操作系统移植方法 27

在“_install”文件夹下创建“dev/tty1” “dev/tty2” “dev/tty3” “dev/tty4” “dev/console” “dev/null”等设备节点,

建立动态链接库, 同时创建初始化脚本“etc/init.d/rcS”, 并在rcS中填入环境变量导出、初始节点挂载、临

时路径创建等初始化相关内容.

图5 界面选项

创建自动挂载配置文件“etc/fstab”, 并在fstab中填入自动挂载节点的相关内容.

创建初始化脚本映射文件“etc/inittab”, 并在inittab中填入初始化脚本的相关内容.

配置初始化环境变量“etc/profile”, 并在profile内填入以下内容

[4]

.

#!/bin/sh

USER="root"

LOGNAME=$USER

# export HOSTNAME=vexpress-a9

export HOSTNAME=`cat /etc/sysconfig/HOSTNAME`

export USER=root

export HOME=root

export PS1="[$USER@$HOSTNAME:w]#"

PATH=/bin:/sbin:/usr/bin:/usr/sbin

LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH

export PATH LD_LIBRARY_PATH

输入以下指令, 创建其他文件夹.

mkdir mnt proc root sys tmp var

至此, 根文件系统的内容已经补充完毕. 接下来将介绍两种挂载根文件系统的方法: 一种是通过在

QEMU上添加外设SD卡来挂载根文件系统, 另一种是通过NFS共享文件夹来挂载根文件系统.

3.2 使用SD卡挂载根文件系统

进入busybox-1.36.1文件夹的根目录, 输入指令创建ext3格式的文件系统模拟SD卡:

sudo mkdir /mnt/rootfs

sudo chmod 777 /mnt/rootfs

dd if=/dev/zero of=3 bs=1M count=64

3 3

sudo mount -t ext3 3 /mnt/rootfs -o loop

sudo cp -rf ./_install/* /mnt/rootfs/

sudo umount /mnt/rootfs

此时根文件系统已被装进模拟SD卡内.

将busybox-1.36.1、linux-5.10.186两个文件夹放在同一个目录下, 暂称为WorkSpace目录. 进入该目

录并执行如下指令, 尝试引导Linux内核并挂载根文件系统:

28 湖南理工学院学报(自然科学版) 第36卷

qemu-system-arm -M vexpress-a9

-m 512M

-kernel ./linux-5.10.186/arch/arm/boot/zImage

-dtb ./linux-5.10.186/arch/arm/boot/dts/

-nographic

-append "root=/dev/mmcblk0 rw console=ttyAMA0"

-sd ./busybox-1.36.1/3

若出现如图6所示的界面, 则说明根文件系统挂载成功.

图6 模拟SD卡挂载根文件系统成功界面

3.3 使用NFS挂载根文件系统

在嵌入式软件调试过程中, 开发人员经常需要与开发板交换文件或修改配置文件. 如果使用SD卡挂

载根文件系统, 那么每次文件交换都需要重新启动操作系统.

为了提高开发效率, 开发人员可以添加NFS(Network File System)网络服务支持. 目前, NFS有诸多应

用, 其中最主要的是通过配置完成网络文件的挂载, 即用它实现网络文件共享

[5]

.

给开发板使用NFS共享主机上的根文件系统, 可以将主机上修改完善并交叉编译后的可执行文件直

接在开发板上运行, 实现无缝对接.

安装和配置NFS网络文件系统, 输入指令:

sudo apt install nfs-kernel-server

sudo mkdir -p /sync/rootfs

sudo vim /etc/exports

在exports文件中添加内容, 输入指令:

/sync/rootfs *(rw,sync,no_root_squash,no_subtree_check)

配置文件“/etc/default/nfs-kernel-server” , 输入指令:

sudo vim /etc/default/nfs-kernel-server

在nfs-kernel-server文件中修改RPCSVCGSSDOPTS的属性, 输入指令:

RPCSVCGSSDOPTS="--nfs-version 2,3,4 --debug --syslog"

重启NFS服务器, 输入指令:

sudo /etc/init.d/rpcbind restart

sudo /etc/init.d/nfs-kernel-server restart

进入busybox-1.36.1根目录, 输入以下指令, 将创建好的根文件系统拷贝到“/sync/rootfs”文件夹下:

sudo cp -rf * /sync/rootfs/

sudo chmod 777 -R /sync/rootfs

创建tap0网卡, 用于连接QEMU虚拟开发板, 输入指令:

sudo tunctl -u root -t tap0

sudo ifconfig tap0 192.168.1.1 promisc up

进入WorkSpace目录, 输入以下指令, 运行QEMU并通过NFS挂载根文件系统:

sudo qemu-system-arm

第4期 王明菱, 等: 基于WSL 2子系统的嵌入式Linux操作系统移植方法 29

-M vexpress-a9

-m 512M

-kernel ./linux-5.10.186/arch/arm/boot/zImage

-dtb ./linux-5.10.186/arch/arm/boot/dts/

-net tap,ifname=tap0,script=no,downscript=no

-net nic,macaddr=00:16:3e:00:00:01

-nographic

-append "root=/dev/nfs rw nfsroot=1192.168.1.1:/sync/rootfs,proto=tcp,nfsvers=3,nolock

init=/linuxrc console=ttyAMA0 ip=192.168.1.100"

若出现如图7所示的界面, 说明NFS挂载根文件系统成功.

图7 NFS挂载根文件系统成功界面

根文件系统挂载成功后, 即可对开发板进行进一步调试, 例如加载内核驱动模块、运行应用程序等.

4 结束语

本文介绍QEMU仿真环境和开发环境, 以Vexpress-A9开发板为例, 逐步深入描述了Linux内核源码

编译、建立文件系统的详细步骤, 并采用两种不同的方式挂载根文件系统, 为嵌入式系统开发者进行跨平

台操作系统裁剪移植、驱动调试、应用软件快速验证等工作提供了一种新的手段和思路, 使得嵌入式软件

学习、开发和验证不再拘泥于实物开发板, 有利于提高嵌入式软件开发效率.

参考文献:

[1] 张 磊, 陈 程, 林 卓, 等. 基于QEMU的AARCH64平台仿真技术的研究[J]. 电脑编程技巧与维护, 2023(4): 120−122.

[2] 田 磊. 基于ARM的嵌入式Linux操作系统的移植[D]. 西安: 西安电子科技大学, 2009.

[3] 程 琼, 孙 敏. 基于3G和嵌入式技术的数据传输系统设计[J]. 工业控制计算机, 2012, 25 (12): 93−94+96.

[4] 史巧硕, 范东月, 柴 欣, 等. 嵌入式Linux根文件系统的构建与分析[J]. 计算机测量与控制, 2015, 23(2): 656−659+663.

[5] 赵娜靖, 佟志勇, 李超然, 等. 基于设备树平台下Exynos4412嵌入式Linux系统移植[J]. 2020, 11(4): 75−80.


本文标签: 挂载 编译 开发板 内核 交叉