使用QEMU搭建u-boot+Linux+NFS嵌入式开发环境
1、搭建嵌入式基本开发环境
- 虚拟机:VMware 15
- VMware Tools安装:
sudo apt-get autoremove open-vm-tools
sudo apt-get install open-vm-tools-desktop
- Ubuntu:ubuntu-16.04.6-desktop-i386
- 更新软件源:
sudo apt-get update
- 安装uboot-tools:
sudo apt-get install u-boot-tools
- 代码编辑管理工具:
sudo apt-get install git vim
- 交叉编译器:
sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
- 其它依赖包:
sudo apt-get install libncurses5-dev lzop
- 交叉编译工具下载:交叉工具链
- Buildroot下载:Buildroot
- Buildroot用户手册下载:用户手册
- QEMU下载:QEMU
2、QEMU安装
- 安装QEMU编译依赖的包:
sudo apt-get install zlib1g-dev libglib2.0-0 libglib2.0-dev libsdl1.2-dev libpixman-1-dev libfdt-dev
- 下载QEMU源码
git clone git://git.qemu-project.org/qemu.git
- 切换到一个稳定版本
git checkout v2.7.0
- 编译配置
./configure --target-list=arm-softmmu --audio-drv-list=
- 编译安装
make
make install
3、编译Linux内核和dtb文件
- 下载Linux内核:linux-4.4.76
- 修改Makefile
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
- 编译内核、模块、dtb文件
make vexpress_defconfig
make zImage -j4
make modules -j4
make dtbs
4、使用busybox制作根文件系统
4.1、编译安装
- 下载源代码:busybox-1.27.0
- 修改Makefile
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
- 配置
make defconfig
make menuconfig
- 编译安装
make
make install
4.2、制作根文件系统
mkdir rootfs
mkdir -p rootfs/lib
cp -r busybox-1.27.0/_install/* rootfs
cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib
mkdir -p rootfs/etc/init.d/
touch rcS
mkdir -p rootfs/dev/
mknod –m 666 tty1 c 4 1
mknod –m 666 tty2 c 4 2
mknod –m 666 tty3 c 4 3
mknod –m 666 tty4 c 4 4
mknod –m 666 console c 5 1
mknod –m 666 null c 1 3
4.3、制作SD卡文件系统镜像
- 生成镜像:
dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
- 格式化为exts文件系统:
mkfs.ext3 rootfs.ext3
- 将各种文件拷贝到文件系统镜像中
mount -t ext3 rootfs.ext3 /mnt/ -o loop
cp -r rootfs/* /mnt
umount /mnt
4.4、启动内核、挂载rootfs
qemu-system-arm -M vexpress-a9 -m 512M -dtb linux-4.4.76/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel linux-4.4.76/arch/arm/boot/zImage -nographic -append
"root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
4.5、图形化启动内核
qemu-system-arm -M vexpress-a9 -m 512M -dtb linux-4.4.76/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel linux-4.4.76/arch/arm/boot/zImage -append
"root=/dev/mmcblk0 rw console=tty0" -sd rootfs.ext3
5、使用U-boot加载Linux内核
5.1、编译u-boot
- 下载:u-boot-2017.05
- 修改Makefile:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
- 配置:
make vexpress_ca9x4_defconfig
- 编译:
make -j4
5.2、运行u-boot
qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -nographic
5.3、QEMU网络功能设置
- 主机安装工具包:
sudo apt-get install uml-utilities bridge-utils
-
创建tun设备文件:/dev/net/tun
-
修改 /etc/network/interfaces 文件,重启生效:
-
配置 /etc/qemu-ifup、/etc/qemu-ifdown 脚本
5.4、内核配置编译
- 需要将内核编译为uImage格式
- 需要指定uImage的加载地址
- 编译时指定:
make LOADADDR=0x60003000 uImage -j4
5.5、主机TFTP工具安装
- 安装tftp工具:
sudo apt-get instaall tftp-hpa tftpd-hpa xinetd
-
修改配置文件:/etc/default/tftpd-hpa
-
创建tftp目录:
mkdir /home/tftpboot
chmod 777 tftpboot
- 重启tftp服务:
/etc/init.d/tftpd-hpa restart
5.6、启动测试
qemu-system-arm \
-M vexpress-a9 \
-kernel u-boot \
-nographic \
-m 512M \
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
-sd rootfs.ext3
5.7、自动化引导
- 修改 include/configs/vexpress_common.h
#define CONFIG_BOOTCOMMAND \
"tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; \
setenv bootargs 'root=/dev/mmcblk0 console=tty0'; \
bootm 0x60003000-0x60500000;"
- 配置开发板、主机IP地址
/* Netmask */
#define CONFIG_IPADDR 192.168.244.128
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_SERVERIP 192.168.244.129
6 、挂载NFS文件系统
6.1、主机HOST开启NFS服务
- 安装:
sudo apt-get install nfs-kernel-server
- 配置NFS,在 /etc/exports 文件中添加:
/home/rootfs *(rw,sync,no_root_squash,no_subtree_check)
- 开启NFS服务:
/etc/init.d/rpcbind restart
/etc/init.d/nfs-kernel-server restart
6.2、修改bootargs启动参数
- 修改BOOTCOMMAND
6.3、内核支持挂载NFS文件系统
7、完善根文件系统
7.1、增加内核的各种用户接口、重启reboot功能
- 新建 etc 目录,添加 inittab、init.d/rcS、fstab、profile
- 新建 tmp、sys、var、proc 目录
- 启动 linux,挂载NFS文件系统