@cyysu
2021-12-03T05:43:52.000000Z
字数 10835
阅读 1382
- 时间: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-devsudo apt install libglib2.0-0 libglib2.0-devsudo apt install libsdl1.2-devsudo apt install libpixman-1-dev libfdt-dev# 2. 下载源码http://ow0q6dddn.bkt.clouddn.com/qemu-2.8.0.tar.xz# 3. 编译与安装(这里采用默认配置,编译会比较长)./configuremake -j8 && sudo make install如果嫌以上太长,可以使用如下配置./configure --target-list=arm-softmmu --audio-drv-list=
# 1. 修改MakefileARCH ?= armCROSS_COMPILE ?= arm-none-linux-gnueabi-# 2. 生成.configmj@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.shsudo 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. 修改MakefileARCH ?= armCROSS_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.shsudo 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/shecho "########################################"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/bashDATE=`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/nullecho -e "\033[32m[info] Begin to create directory rootfs rootfs/lib!\033[0m"sudo mkdir rootfssudo mkdir rootfs/libecho -e "\033[32m[info] Begin to copy file from busybox to rootfs!\033[0m"sudo cp ../busybox-1.24.2/_install/* rootfs/ -rafecho -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/libecho -e "\033[32m[info] Begin to create char device !\033[0m"sudo mkdir -p rootfs/dev/sudo mknod rootfs/dev/tty1 c 4 1sudo mknod rootfs/dev/tty2 c 4 2sudo mknod rootfs/dev/tty3 c 4 3sudo mknod rootfs/dev/tty4 c 4 4sudo mknod rootfs/dev/console c 5 1sudo mknod rootfs/dev/null c 1 3echo -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=32sudo mkfs.ext3 rootfs.ext3echo -e "\033[32m[info] Begin to mount image and copy rootfs to it!\033[0m"sudo mount -t ext3 rootfs.ext3 /mnt/ -o loopsudo cp -raf rootfs/* /mntsudo 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.shsudo 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. 修改MakefileCROSS_COMPILE ?= arm-none-linux-gnueabi-#2. 修改config.mkARCH ?= arm#3. 配置环境变量mj@DZ:~$ vim ~/.bashrcexport ARCH=armexport CROSS_COMPILE=arm-none-linux-gnueabi-mj@DZ:~$ source ~/.bashrc#4. 编译make vexpress_ca9x4_defconfigmake -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' failedmake[1]: *** [lib/asm-offsets.s] Error 1make[1]: *** 正在等待未完成的任务....arch/arm/lib/asm-offsets.c:1:0: error: bad value (armv5) for -march= switch
解决方案
配置一个环境变量vim ~/.bashrc# 加入如下这两行代码export ARCH=armexport 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/tuncrw-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 loiface lo inet loopbackauto eth0auto br0iface br0 inet dhcpbridge_ports ens33#4. 这些文件默认在安装完qemu就有,不需要修改mj@DZ:~$ cat /etc/qemu-ifqemu-ifdown qemu-ifup#5. 重新编译内核,使用uboot引导mj@DZ:~/linux-4.10.2$ make LOADADDR=0x60003000 uImage -j8CHK include/config/kernel.releaseCHK include/generated/uapi/linux/version.hCHK include/generated/utsrelease.hCHK include/generated/timeconst.hCHK include/generated/bounds.hCHK include/generated/asm-offsets.hCALL scripts/checksyscalls.shCHK include/generated/compile.hCHK kernel/config_data.hKernel: arch/arm/boot/Image is readyKernel: arch/arm/boot/zImage is readyUIMAGE arch/arm/boot/uImageImage Name: Linux-4.10.2Created: Fri Sep 14 16:34:52 2018Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 3945760 Bytes = 3853.28 kB = 3.76 MBLoad Address: 60003000Entry Point: 60003000Kernel: 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-hpaTFTP_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/bashDATE=`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/tftpbootecho -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/tftpbootecho -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/bashDATE=`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/tftpbootecho -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/tftpbootecho -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 brctlPATH=$PATH:/sbin:/usr/sbinip=$(which ip)if [ -n "$ip" ]; thenip link set "$1" upelsebrctl=$(which brctl)if [ ! "$ip" -o ! "$brctl" ]; thenecho "W: $0: not doing any bridge processing: neither ip nor brctl utility not found" >&2exit 0fiifconfig "$1" 0.0.0.0 upfiswitch=$(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 toofor br in $switch; doif [ -d /sys/class/net/$br/bridge/. ]; thenif [ -n "$ip" ]; thenip link set "$1" master "$br"elsebrctl addif $br "$1"fiexit # exit with status of the previous commandfidoneecho "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.:

一个完整的启动过程动画演示

此系统还不够完善,后面后出一个详细的定制根文件系统。未完待续。。。
以上内容有笔者自己编写,也有摘自互联网。摘自互联网部分笔者都会仔细阅读,确保符合笔者当时测试情况进行编写,当然在学习的过程中不可避免的有理解不到位的地方,还请读友批评指正。
支付宝 微信