@cyysu
2021-12-03T05:43:52.000000Z
字数 10835
阅读 1213
- 时间:2018年9月14日12:58:09
- 作者:Kali
- 邮箱:cyysu.github.io@gmail.com
- 版本:6.0
- 描述:qemu模拟A9开发板,并定制自己的根文件系统以及内核等有关教程。
QEMU模拟器系列教程
sudo apt-get install gcc-arm-linux-gnueabi
安装好之后和我文件的前缀是不一样的,为arm-linux-gnueabi-
# 1. 安装依赖
sudo apt install zlib1g-dev
sudo apt install libglib2.0-0 libglib2.0-dev
sudo apt install libsdl1.2-dev
sudo apt install libpixman-1-dev libfdt-dev
# 2. 下载源码
http://ow0q6dddn.bkt.clouddn.com/qemu-2.8.0.tar.xz
# 3. 编译与安装(这里采用默认配置,编译会比较长)
./configure
make -j8 && sudo make install
如果嫌以上太长,可以使用如下配置
./configure --target-list=arm-softmmu --audio-drv-list=
# 1. 修改Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
# 2. 生成.config
mj@DZ:~/linux-4.10.2$ make vexpress_defconfig
# 3. 编译内核
mj@DZ:~/linux-4.10.2$ make -j8 zImage
# 4. 编译内核模块
mj@DZ:~/linux-4.10.2$ make modules -j8
# 5. 编译设备树文件
mj@DZ:~/linux-4.10.2$ make dtbs
mj@DZ:~$ cat start.sh
sudo qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel /home/mj/linux-4.10.2/arch/arm/boot/zImage \
-dtb /home/mj/linux-4.10.2/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append "console=ttyAMA0" \
最后的启动形式如下:(这个时候就需要我们制作自己的根文件系统了)
# 1. 修改Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
# 2. 预编译
mj@DZ:~/busybox-1.24.2$ make defconfig
# 3. 配置menuconfig
注意配置成静态库
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
# 4. 开始编译
mj@DZ:~/busybox-1.24.2$ make -j8
# 5. 安装
mj@DZ:~/busybox-1.24.2$ make install
# 6. 开始制作
使用下面的脚本进行一键制作或者下载如下文件
# 7. 继续启动我们的Linux内核
mj@DZ:~$ cat start.sh
sudo qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel /home/mj/linux-4.10.2/arch/arm/boot/zImage \
-dtb /home/mj/linux-4.10.2/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
-sd /home/mj/rootfs/rootfs.ext3
# 8. 定制一下我们自己的欢迎界面-编辑文件系统中的/etc/init.d/rcS
#!/bin/sh
echo "########################################"
echo "## welcome to MJ Qemu A9 board! ##"
echo "########################################"
# 9. 问题解决
sync.c:(.text.sync_main+0x78): undefined reference to `syncfs'
collect2: ld returned 1 exit status
去掉menuconfig中如下这个命令中[*]的*
Coreutils --->
[ ] sync
#!/bin/bash
DATE=`date +"%Y-%m-%d"`
echo -e "\033[44;37;5m #=======================================================\033[0m"
echo -e "\033[44;37;5m # Author : MJ_DZ chenyuan \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Email : cyysu.github.io@gmail.com \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Last modified : $DATE \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Filename : mk-sd.sh \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Description : Root file system script \033[0m"
echo -e "\033[44;37;5m #=======================================================\033[0m"
echo -e "\033[32m[info] Begin to delete last files on the disk!\033[0m"
sudo rm -rf rootfs* 2&> /dev/null
echo -e "\033[32m[info] Begin to create directory rootfs rootfs/lib!\033[0m"
sudo mkdir rootfs
sudo mkdir rootfs/lib
echo -e "\033[32m[info] Begin to copy file from busybox to rootfs!\033[0m"
sudo cp ../busybox-1.24.2/_install/* rootfs/ -raf
echo -e "\033[32m[info] Begin to copy file from cross tools to rootfs!\033[0m"
sudo cp -p /opt/arm-2011.03/arm-none-linux-gnueabi/libc/lib/* rootfs/lib
echo -e "\033[32m[info] Begin to create char device !\033[0m"
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
echo -e "\033[32m[info] Begin to create others directory!\033[0m"
sudo mkdir -p rootfs/proc/
sudo mkdir -p rootfs/sys/
sudo mkdir -p rootfs/tmp/
sudo mkdir -p rootfs/root/
sudo mkdir -p rootfs/var/
sudo mkdir -p rootfs/mnt/
sudo cp -arf etc/ rootfs/
echo -e "\033[32m[info] Begin to make SD image!\033[0m"
sudo dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
sudo mkfs.ext3 rootfs.ext3
echo -e "\033[32m[info] Begin to mount image and copy rootfs to it!\033[0m"
sudo mount -t ext3 rootfs.ext3 /mnt/ -o loop
sudo cp -raf rootfs/* /mnt
sudo umount /mnt/
echo -e "\033[44;37;5m[info] Congratulations on your successful installation!\033[0m"
执行效果如下,蓝色区域是带闪动的效果,使用xshell即可看出
xshell下载链接
动态效果如下
这个时候启动的Linux的效果如下
Ctrl + A,然后 按下 X,就可以退出这个模拟系统
Ctrl + A,然后 按下 X,就可以退出这个模拟系统
Ctrl + A,然后 按下 X,就可以退出这个模拟系统
如果你感觉这个不炫丽,那么装13的配置来了
mj@DZ:~$ cat start-graphic.sh
sudo qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel /home/mj/linux-4.10.2/arch/arm/boot/zImage \
-dtb /home/mj/linux-4.10.2/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-append "root=/dev/mmcblk0 rw console=tty0" \
-sd /home/mj/rootfs/rootfs.ext3
装13要完美,如果连关闭这个界面都不会还装sha!!
ctrl + alt 1和ctrl + alt 2进行界面切换,同时也可以将这个界面关闭
ctrl + alt 1和ctrl + alt 2进行界面切换,同时也可以将这个界面关闭
ctrl + alt 1和ctrl + alt 2进行界面切换,同时也可以将这个界面关闭
#1. 修改Makefile
CROSS_COMPILE ?= arm-none-linux-gnueabi-
#2. 修改config.mk
ARCH ?= arm
#3. 配置环境变量
mj@DZ:~$ vim ~/.bashrc
export ARCH=arm
export CROSS_COMPILE=arm-none-linux-gnueabi-
mj@DZ:~$ source ~/.bashrc
#4. 编译
make vexpress_ca9x4_defconfig
make -j8
#5. 引导
mj@DZ:~/u-boot-2017.05$ qemu-system-arm -M vexpress-a9 -m 512M -nographic -kernel u-boot
#6. 如果出现以下问题,解决方案看如下
lib/asm-offsets.c:1:0: error: bad value (armv5) for -march= switch
/*
^
Kbuild:43: recipe for target 'lib/asm-offsets.s' failed
make[1]: *** [lib/asm-offsets.s] Error 1
make[1]: *** 正在等待未完成的任务....
arch/arm/lib/asm-offsets.c:1:0: error: bad value (armv5) for -march= switch
解决方案
配置一个环境变量
vim ~/.bashrc
# 加入如下这两行代码
export ARCH=arm
export CROSS_COMPILE=arm-none-linux-gnueabi-
# 执行
source ~/.bashrc
启动效果
• 采用桥接(bridge)的网络连接与Host通信
• 需要主机内核tun/tap模块支持
#1. 安装依赖包
sudo apt install uml-utilities bridge-utils
#2. 查看设备
mj@DZ:~/u-boot-2017.05$ ll /dev/net/tun
crw-rw-rw- 1 root root 10, 200 9月 14 12:33 /dev/net/tun
#3. 设置网卡配置文件
mj@DZ:~$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto eth0
auto br0
iface br0 inet dhcp
bridge_ports ens33
#4. 这些文件默认在安装完qemu就有,不需要修改
mj@DZ:~$ cat /etc/qemu-if
qemu-ifdown qemu-ifup
#5. 重新编译内核,使用uboot引导
mj@DZ:~/linux-4.10.2$ make LOADADDR=0x60003000 uImage -j8
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
CHK include/generated/timeconst.h
CHK include/generated/bounds.h
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
CHK kernel/config_data.h
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-4.10.2
Created: Fri Sep 14 16:34:52 2018
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3945760 Bytes = 3853.28 kB = 3.76 MB
Load Address: 60003000
Entry Point: 60003000
Kernel: arch/arm/boot/uImage is ready
#6. 主机配置tftp服务器
mj@DZ:~/linux-4.10.2$ sudo apt-get install tftp-hpa tftpd-hpa xinetd
# 配置文件
mj@DZ:~/linux-4.10.2$ cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
# 增加权限
mj@DZ:~/linux-4.10.2$ sudo chmod 777 /var/lib/tftpboot/
# 重启
mj@DZ:~/linux-4.10.2$ /etc/init.d/tftpd-hpa restart
#7. 修改u-boot引导内核镜像地址 - 188行,添加如下内容
mj@DZ:~/u-boot-2017.05$ vim include/configs/vexpress_common.h +188
#define CONFIG_BOOTCOMMAND \
"tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; \
setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0';\
bootm 0x60003000 - 0x60500000; "
/*定义板卡IP地址*/
#define CONFIG_IPADDR 10.168.6.100
#define CONFIG_NETMASK 255.255.255.0
/*tftp服务器地址*/
#define CONFIG_SERVERIP 10.168.6.21
#8. 修改我们的启动脚本文件-无界面
#!/bin/bash
DATE=`date +"%Y-%m-%d"`
echo -e "\033[44;37;5m #=======================================================\033[0m"
echo -e "\033[44;37;5m # Author : MJ_DZ chenyuan \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Email : cyysu.github.io@gmail.com \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Last modified : $DATE \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Filename : start-nographic.sh \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Description : Boot system script \033[0m"
echo -e "\033[44;37;5m #=======================================================\033[0m"
echo -e "\033[32m[info] Begin to copy dtb files to tftp home directory!\033[0m"
sudo cp /home/mj/linux-4.10.2/arch/arm/boot/dts/vexpress-v2p-ca9.dtb /var/lib/tftpboot
echo -e "\033[32m[info] Begin to copy linux kernel to tftp home directory!\033[0m"
sudo cp /home/mj/linux-4.10.2/arch/arm/boot/uImage /var/lib/tftpboot
echo -e "\033[32m[info] Begin to run qemu vexpress-a9 board!\033[0m"
sudo qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel /home/mj/u-boot-2017.05/u-boot \
-nographic \
-sd /home/mj/rootfs/rootfs.ext3 \
-net nic,vlan=0 \
-net tap,vlan=0,ifname=tap0
#-dtb /home/mj/linux-4.10.2/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
#-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
#-kernel /home/mj/linux-4.10.2/arch/arm/boot/zImage \
#9. 如果你想启动有界面的程序,需要你如下做
#define CONFIG_BOOTCOMMAND \
"tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; \
setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0 console=tty0';\
bootm 0x60003000 - 0x60500000; "
脚本内容如下:
#!/bin/bash
DATE=`date +"%Y-%m-%d"`
echo -e "\033[44;37;5m #=======================================================\033[0m"
echo -e "\033[44;37;5m # Author : MJ_DZ chenyuan \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Email : cyysu.github.io@gmail.com \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Last modified : $DATE \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Filename : start-nographic.sh \033[0m"
echo -e "\033[44;37;5m # \033[0m"
echo -e "\033[44;37;5m # Description : Boot system script \033[0m"
echo -e "\033[44;37;5m #=======================================================\033[0m"
echo -e "\033[32m[info] Begin to copy dtb files to tftp home directory!\033[0m"
sudo cp /home/mj/linux-4.10.2/arch/arm/boot/dts/vexpress-v2p-ca9.dtb /var/lib/tftpboot
echo -e "\033[32m[info] Begin to copy linux kernel to tftp home directory!\033[0m"
sudo cp /home/mj/linux-4.10.2/arch/arm/boot/uImage /var/lib/tftpboot
echo -e "\033[32m[info] Begin to run qemu vexpress-a9 board!\033[0m"
sudo qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel /home/mj/u-boot-2017.05/u-boot \
-sd /home/mj/rootfs/rootfs.ext3 \
-net nic,vlan=0 \
-net tap,vlan=0,ifname=tap0
以上两个文件的默认配置
mj@DZ:~$ cat /etc/qemu-ifup
#! /bin/sh
# Script to bring a network (tap) device for qemu up.
# The idea is to add the tap device to the same bridge
# as we have default routing to.
# in order to be able to find brctl
PATH=$PATH:/sbin:/usr/sbin
ip=$(which ip)
if [ -n "$ip" ]; then
ip link set "$1" up
else
brctl=$(which brctl)
if [ ! "$ip" -o ! "$brctl" ]; then
echo "W: $0: not doing any bridge processing: neither ip nor brctl utility not found" >&2
exit 0
fi
ifconfig "$1" 0.0.0.0 up
fi
switch=$(ip route ls | \
awk '/^default / {
for(i=0;i<NF;i++) { if ($i == "dev") { print $(i+1); next; } }
}'
)
# only add the interface to default-route bridge if we
# have such interface (with default route) and if that
# interface is actually a bridge.
# It is possible to have several default routes too
for br in $switch; do
if [ -d /sys/class/net/$br/bridge/. ]; then
if [ -n "$ip" ]; then
ip link set "$1" master "$br"
else
brctl addif $br "$1"
fi
exit # exit with status of the previous command
fi
done
echo "W: $0: no bridge for guest interface found" >&2
mj@DZ:~$ cat /etc/qemu-ifdown
#! /bin/sh
# Script to shut down a network (tap) device for qemu.
# Initially this script is empty, but you can configure,
# for example, accounting info here.
:
一个完整的启动过程动画演示
此系统还不够完善,后面后出一个详细的定制根文件系统。未完待续。。。
以上内容有笔者自己编写,也有摘自互联网。摘自互联网部分笔者都会仔细阅读,确保符合笔者当时测试情况进行编写,当然在学习的过程中不可避免的有理解不到位的地方,还请读友批评指正。
支付宝 微信