一、QEMU环境配置

简介: 一、QEMU环境配置

本文原文链接:https://xuesong.blog.csdn.net/article/details/80835793?spm=1001.2014.3001.5502


一、QEMU环境配置


• 1、搭建嵌入式开发基本环境

• 2、QEMU安装及A9开发板配置介绍

• 3、编译、运行Linux内核

• 4、使用BusyBox制作根文件系统

• 5、使用U-boot引导启动Linux内核

• 6、挂载NFS文件系统

• 7、在虚拟开发板上开发应用程序、驱动示例


1、搭建嵌入式开发基本环境


• 1.1、Vmware+Ubuntu16.04

• 1.2、Vmwaretools

• 1.3、更新软件源

• 1.4、安装uboot-tools

• 1.5、代码编辑管理工具:Git/vim

• 1.6、交叉编译器:gcc-arm-linux-gnueabi

• 1.7、其他


1.1、Vmware+Ubuntu16.04


虚拟机使用vmware player

1675853089655.jpg

推荐使用Ubuntu16.04

1、Ubuntu16.04是LTS(Long Term Support)长期Support版本

2、软件包丰富,可以默认安装arm-gcc编辑器

1675853106790.jpg


1.2、Vmware-tools


安装vmware-tools:跟主机之间拷贝文件


安装

1、直接把WMwareTools拷贝出来到桌面吧

2、然后打开终端解压 命令:tar -xzvf VMwareTools-10.0.6-3595377.tar.gz

3、进入解压后的目录,执行:sudo ./wmware-install.pl 然后就一直回车了。


1.3、更新软件源


1.3.1、什么是软件源?


Ubuntu采用集中式的软件仓库机制,将软件包分类存在软件仓

库中,进行管理。软件仓库放置在各种镜像服务器中,对于用

户来说,当使用apt-get install安装软件包时,会从这些服务器

下载软件包,这些镜像服务器就是 软件源(Reposity).


1.3.2、工作原理


• 执行apt update,程序分析/etc/apt/source.list

• 自动联网寻找list中对应的Packages/Sources/Release列表文件,

如果有更新则重新下载之,存入存入/var/lib/apt/lists/目录

• 然后apt install相应的包,下载到本地并进行安装

• /var/lib/dpkg/available:软件包的描述信息,软件源中所有软

件包中的信息,包括安装和未安装的软件包

• /var/cache/apt/archives:当apt install安装软件包的临时存放路

• /etc/apt/sources.list:文件里是软件源站点,apt install时,

Ubuntu会从这些站点下载软件包到本地并进行安装

• /var/lib/apt/lists:使用apt update命令会从/etc/apt/sources.list

中下载软件包列表索引,并保存到该目录


1.3.3、软件源的更换


备份系统本身源文件

cp /etc/apt/sources.list /etc/apt/sources.list.backup

修改源文件内容,将新的源地址写入该文件中

//先安装vim:apt-get insatll vim
vim  /etc/apt/sources.list

保存文件,并刷新配置

apt update


1.4、安装uboot-tools


• 工具介绍

• 用来生成适应U-boot引导的镜像文件格式

$ apt install u-boot-tools


1.5、代码编辑管理工具:Git/vim


apt install git
    apt install tree


初始化仓库: git init

git add name //上传

git status //看修改

git log

提交:先设置邮箱和名字

1675853265763.jpg


1.6、交叉编译器:gcc-arm-linux-gnueabi


什么是交叉编译?

• 在一种计算机环境中编译程序,在另外一种环境下运行。或者说在一个平台上编译生成在另一个平台上运行的可执行代码。


什么是ABI和EABI

• ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture) 在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口. 涵盖了数据类型的大小、布局和对齐,调用约定


• EABI: 嵌入式ABI

嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。

• Arm-none-gnueabi-linux比arm-linux-gcc要好,在可移植性、兼容性上面

• 早期u-boot和Linux编译可能使用的都不是一个arm-linux-gcc版本


安装

• $ apt install gcc-arm-linux-gnueabi
• $ apt install g++-arm-linux-gnueabi


1.7、其他


1、curses库–libncurses5-dev–游标移动及屏幕的显示


2、我们在ubuntu上编译程序,不是说有了gcc就行了,需要先apt-get install build-essential,

这个包提供了很多编译相关的软件包,里面有:

dpkg-dev fakeroot g++ g++-4.6 libalgorithm-diff-perl
  libalgorithm-diff-xs-perl libalgorithm-merge-perl
  libdpkg-perl libstdc++6-4.6-dev libtimedate-perl


3、(工具链:一般由编译器、连接器、解释器和调试器组成)

gcc-arm-none-eabi是GNU项目下的软件,是一个面向裸机arm的编译器


2、QEMU安装及A9开发板配置介绍


• 自动安装

$ apt install qemu


• 手动编译安装

• 首先安装QEMU编译依赖的包

– apt install zlib1g-dev
– apt install libglib2.0-0 libglib2.0-dev
– apt install libsdl1.2-dev
– apt install libpixman-1-dev libfdt-dev


• 下载QEMU源码:

git clone git://git.qemu-project.org/qemu.git
git branch -a


分支 git checkout remotes/origin/stable-2.8 -b stable-2.8


标签 git tag


• 切换到一个稳定版本:git checkout v2.7.0


• 编译配置:./configure –target-list=arm-softmmu –audio-drv-list=


• 编译安装:make ; make install


使用

查看qemu 支持的开发板子

qemu-system-arm -M  help


3、编译、运行Linux内核


• 下载Linux内核

– www.kernel.org
– git clone
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/


• 修改Makefile

• ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

• 编译内核、模块、dtb文件

• makevexpressdefconfig;makezImage∙makevexpressdefconfig;makezImage•make modules; make dtbs

• 运行内核

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”
qemu-system-arm -nographic -M vexpress-a9 -m 1024M -kernel arch/arm/boot/zImage -append “rdinit=/linuxrc console=ttyAMA0 loglevel=8” -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb


4、使用busybox制作根文件系统


什么是根文件系统?

• 文件系统

• 对存储设备上的数据进行组织的机制


为什么要使用文件系统

• Linux的哲学:一切皆文件

• 用户与操作系统进行交互的主要工具:文件系统调用

• 用户和底层存储的接口


根文件系统

• Linux内核启动后第一个挂载的文件系统

• 主要由基本的shell命令、各种库、字符设备、配置脚本组成

• 提供了根目录/

• RFS可以放在:nor/nand flash、SD卡、磁盘、网络空间上


编译安装

• 下载源代码:http://www.busybox.net/downloads/

• 修改Makefile:ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

• 配置:make defconfig ; make menuconfig

• 编译:make

• 安装:make install


制作根文件系统

• mkdirrootfs∙mkdirrootfs• mkdir rootfs/lib
• cp–rinstall/∗rootfs∙cp–rinstall/∗rootfs• cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib
• mkdir−prootfs/dev/∙mkdir−prootfs/dev/• mknod –m 666 tty1 c 4 1
• mknod–m666tty2c42∙mknod–m666tty2c42• mknod –m 666 tty3 c 4 3
• mknod–m666tty4c44∙mknod–m666tty4c44• mknod –m 666 console c 5 1
• $ mknod –m 666 null c 1 3


制作SD卡文件系统镜像

• 生成镜像:dd if=/dev/zero of=rootfs.ext3 bs=1M count=32

• 格式化为exts文件系统:mkfs.ext3 rootfs.ext3

• 将各种文件拷贝到文件系统镜像中:

mount−text3rootfs.ext3/mnt/−oloop∙mount−text3rootfs.ext3/mnt/−oloop• cp -r rootfs/* /mnt

• $ umount /mnt


• 启动内核,挂载rootfs

• $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpress-
v2p-ca9.dtb -kernel ./zImage -nographic -append
“root=/dev/mmcblk0 rw console=ttyAMA0” -sd rootfs.ext3

• 图形化启动内核

• $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpress-
v2p-ca9.dtb -kernel ./zImage -append “root=/dev/mmcblk0 rw
console=tty0” -sd rootfs.ext3
mkdir etc/init.d
touch etc/init.d/rcS
chmod a+x rcS
vi rcS

5、使用u-boot加载Linux内核


• 5.1、嵌入式启动概述

• 5.2、U-boot编译

• 5.3、QEMU网络功能设置

• 5.4、内核配置编译

• 5.5、主机TFTP工具安装

• 5.6、启动测试

• 5.7、自动化引导


5.1、嵌入式启动概述


嵌入式bootloader

• 功能类似于PC的BIOS、硬件检测是否正常

• 加载操作系统镜像到RAM

• 设置不同的启动方式


常见的启动方式

• NOR/NAND flash启动

• 从SD卡启动

• Bootloader从网络加载Linux内核启动


5.2、U-boot编译


• 功能类似于Windows的BIOS

• 编译u-boot

• 下载: http://ftp.denx.de/pub/u-boot/

• 修改Makefile:ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

• 配置:makevexpressca9x4defconfig∙编译:makevexpressca9x4defconfig•编译: make –j4


• 运行u-boot

qemu-system-arm -M vexpress-a9 \
-kernel u-boot \
-nographic \
-m 512M


QEMU网络功能设置

• 配置QEMU与主机的网络连接

• 采用桥接(bridge)的网络连接与Host通信

• 需要主机内核tun/tap模块支持

• 配置

• 主机安装工具包: apt install uml-utilities bridge-utils

• 创建tun设备文件:/dev/net/tun

• 修改/etc/network/interfaces文件,重启生效:

• # interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto ens33
auto br0
iface br0 inet dhcp
bridge_ports ens33

• 配置/etc/qemu-ifup、/etc/qemu-ifdown脚本


/etc/qemu-ifup与/etc/qemu-ifdown,是kvm启动后将网卡在宿主主机上配置的脚本文件,我的archlinux没有这个脚本自己写了一个,直接上代码

/etc/qemu-ifup:
#! /bin/sh
switch=br0
ifconfig $1 up 
 #ip link set $1 up
brctl addif ${switch} $1
/etc/qemu-ifdown:
#! /bin/sh
switch=br0
brctl delif ${switch} $1
ifconfig $1 down 
#ip link set $1 down
#tunctl -d $1
其中$1是虚拟机传入的参数


内核配置编译

• 使用U-boot引导内核镜像

• 需要将内核编译为uImage格式

• 需要指定uImage的加载地址

• 编译时指定:$ make LOADADDR=0x60003000 uImage -j4


主机TFTP工具安装

• 安装主机Host的TFTP

• 1)安装tftp工具:$ apt-get install tftp-hpa tftpd-hpa xinetd


• 2)修改配置文件: /etc/default/tftpd-hpa

TFTP_USERNAME=”tftp”
TFTP_DIRECTORY=”/home/tftpboot”
TFTP_ADDRESS=”0.0.0.0:69”
TFTP_OPTIONS=”-l -c -s”

• 3)创建tftp目录:mkdir/home/tftpboot;chmod777tftpboot∙4)重启tftp服务:mkdir/home/tftpboot;chmod777tftpboot•4)重启tftp服务: /etc/init.d/tftpd-hpa restart


自动化引导

• 修改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/
196 #define CONFIG_IPADDR 192.168.244.128
197 #define CONFIG_NETMASK 255.255.255.0
198 #define CONFIG_SERVERIP 192.168.244.129


6、挂载NFS文件系统


• 主机HOST支持NFS服务

• 修改bootargs启动参数

• • • 设置NFS为根文件系统

• • • 设置主机NFS文件系统的地址

• 内核支持挂载NFS文件系统


安装

$ apt install nfs-kernel-server


配置NFS

• 在/etc/exports文件中添加:

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


开启NFS服务

• /etc/init.d/rpcbindrestart∙/etc/init.d/rpcbindrestart•/etc/init.d/nfs-kernel-server restart

安装FTP:

sudo apt-get install vsftpd openssh-server nfs-kernel-server portmap

配置 FTP 服务

修改 vsftpd 的配置文件/etc/vsftpd.conf,将下面两行前面的“#”号去掉。

#local_enable=YES
#write_enable=YES


上面第一行表示是否允许本地用户登录,第二行表示是否允许上传文件。

修改完华之后,执行以下命令重启 ftp 服务:

sudo /etc/init.d/vsftpd restart


修改bootargs启动参数:

修改BOOTCOMMAND(hhbf.h中)

#define CONFIG_BOOTCOND \
        "tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb;\
                setenv bootargs
                'root=/dev/nfs rw\
                nfsroot=192.168.244.129:/homg/rootfs init=/linuxrc \
                ip=192.168.244.128 console=ttyAMA0';\
                bootm 0x60003000 - 0x60500000
        "


内核make menuconfig

配置内核支持挂载NFS文件系统


File systems –>


完善根文件系统:

• 增加内核的各种用户接口

• 重启reboot功能


步骤:

• 新建etc目录

• • • 添加inittab、 init.d/rcS、 fstab、 profile

• 新建tmp、 sys、 var、 proc目录

• 启动Linux,挂载NFS文件系统


四个文件的启动流程

• Linux内核启动之后,挂载NFS根文件系统

• 开启Linux的第一个用户进程: init

• init进程bootargsinit=…执行inittab脚

• inittab脚本首先会执行init.d/rcS脚本

• rcS脚本:执行mount –a 读取fstab挂载各种

文件系统

• inittab:接着会启动console

• • • 启动shell: /bin/sh

• • • 在启动/bin/sh之前先执行profile文件


7、在虚拟开发板上开发应用程序、驱动示例

相关文章
|
8月前
|
存储 XML Ubuntu
如何在 Ubuntu 22.04 服务器上安装和配置 KVM?
如何在 Ubuntu 22.04 服务器上安装和配置 KVM?
242 0
如何在 Ubuntu 22.04 服务器上安装和配置 KVM?
|
4月前
|
机器学习/深度学习 Ubuntu Linux
如何在Ubuntu 23.10部署KVM并创建虚拟机?
如何在Ubuntu 23.10部署KVM并创建虚拟机?
|
11月前
|
存储 Linux KVM
2021最新版KVM虚拟机安装详解
2021最新版KVM虚拟机安装详解
530 0
|
机器学习/深度学习 Linux KVM
cento7安装kvm并通过qemu命令行安装其他虚拟机(红帽)
cento7安装kvm并通过qemu命令行安装其他虚拟机(红帽)
cento7安装kvm并通过qemu命令行安装其他虚拟机(红帽)
|
Linux
win10 centos虚拟机搭建->vagrant+virtualbox
win10 centos虚拟机搭建->vagrant+virtualbox
169 0
|
自然语言处理 Linux 编译器
如何基于Buildroot和Qemu搭建嵌入式Linux系统环境
为了能够更好的学习嵌入式Linux内核,本文基于qemu-system-arm工具模拟ARM公司的VersatileExpress硬件环境,基于buildroot工具制作rootfs,并且扩展了buildroot,增加内核配置管理,定制rootfs等功能。
755 0
|
存储 Linux KVM
2020最新版KVM虚拟机安装详解
本篇内容记录了2020最新版KVM虚拟机安装详解。
884 0
2020最新版KVM虚拟机安装详解
|
KVM 虚拟化 机器学习/深度学习
|
机器学习/深度学习 KVM 虚拟化