当前位置: 首页 > news >正文

搭建qemu环境

1.安装qemu

apt install qemu-system

2.编译内核

	设置gcc软链接
	sudo ln -s arm-linux-gnueabihf-gcc  arm-linux-gcc
	sudo ln -s arm-linux-gnueabihf-ld  arm-linux-ld
	sudo ln -s arm-linux-gnueabihf-nm  arm-linux-nm
	sudo ln -s arm-linux-gnueabihf-objcopy  arm-linux-objcopy
	sudo ln -s arm-linux-gnueabihf-ar  arm-linux-ar
	sudo ln -s arm-linux-gnueabihf-strip  arm-linux-strip
	下载内核linux-5.6.14.tar.xz
	// 解压
	tar xvf linux-5.6.14.tar.xz
	// 编译默认配置
	make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
	// 编译安装,-j参数后面可以跟一个数字,表示并行任务的数量
	// make -j4表示同时运行四个编译任务。
	make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm -j8

3.编译文件系统

	下载文件系统busybox-1.37.0.tar.bz2 
	// 解压
	tar xvf busybox-1.37.0.tar.bz2 
	// 编译默认配置
	make defconfig
	// 编译
	make CROSS_COMPILE=arm-linux-gnueabi- -j8
			错误:1. ‘sha1_process_block64_shaNI’ undeclared 
						解决1. nano .config注释下面配置
						#define ENABLE_SHA1_HWACCEL
						解决2. nano libbb/hash_md5_sha.c添加条件判断
						修改前:
						/* Used also for sha256 */
						unsigned FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf)
						{
						        unsigned hash_size;
						
						        /* SHA stores total in BE, need to swap on LE arches: */
						        common64_end(ctx, /*swap_needed:*/ BB_LITTLE_ENDIAN);
						
						        hash_size = 8;
						        if (ctx->process_block == sha1_process_block64
						#if ENABLE_SHA1_HWACCEL
						         || ctx->process_block == sha1_process_block64_shaNI
						#endif
						        ) {
						                hash_size = 5;
						        }
						        /* This way we do not impose alignment constraints on resbuf: */
						        if (BB_LITTLE_ENDIAN) {
						                unsigned i;
						                for (i = 0; i < hash_size; ++i)
						                        ctx->hash[i] = SWAP_BE32(ctx->hash[i]);
						        }
						        hash_size *= sizeof(ctx->hash[0]);
						        memcpy(resbuf, ctx->hash, hash_size);
						        return hash_size;
						}
						修改后:
						/* Used also for sha256 */
						unsigned FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf)
						{
						        unsigned hash_size;
						
						        /* SHA stores total in BE, need to swap on LE arches: */
						        common64_end(ctx, /*swap_needed:*/ BB_LITTLE_ENDIAN);
						
						        hash_size = 8;
						        if (ctx->process_block == sha1_process_block64
						#if ENABLE_SHA1_HWACCEL
							/* 添加条件判断 */
							#if defined(__GNUC__) && (defined(__i386__) || defined(__x86__64__))
						         || ctx->process_block == sha1_process_block64_shaNI
						    #endif
						#endif
						        ) {
						                hash_size = 5;
						        }
						        /* This way we do not impose alignment constraints on resbuf: */
						        if (BB_LITTLE_ENDIAN) {
						                unsigned i;
						                for (i = 0; i < hash_size; ++i)
						                        ctx->hash[i] = SWAP_BE32(ctx->hash[i]);
						        }
						        hash_size *= sizeof(ctx->hash[0]);
						        memcpy(resbuf, ctx->hash, hash_size);
						        return hash_size;
						}


						2. ‘IFLA_CAN_TERMINATION’ undeclared
						修改networking/libiproute/iplink.c添加条件判断
						修改前:
							 case ARG_termination: {
			                        uint16_t val;
			                        NEXT_ARG();
			                        val = get_u16(*argv, keyword);
			                        addattr_l(&req.n, sizeof(req), IFLA_CAN_TERMINATION, &val, sizeof(val));
			                        break;
			                }
			             修改后:
			             case ARG_termination: {
		                        uint16_t val;
		                        NEXT_ARG();
		                        val = get_u16(*argv, keyword);
		                    /* 添加条件判断 */
		               		#ifdef IFLA_CAN_TERMINATION
		                        addattr_l(&req.n, sizeof(req), IFLA_CAN_TERMINATION, &val, sizeof(val));
		                	#else
		                        fprintf(stderr, "IFLA_CAN_TERMINATION is not supported on this system.\n");
		               	    #endif
		                        break;
		                }

	// 编译安装
	make install CROSS_COMPILE=arm-linux-gnueabi- -j8
	编译生成的bin文件在busybox-1.37.0/_install/目录下

4.制作根文件系统镜像
切换到busybox的上级目录,并使用如下脚本制作镜像

#!/bin/bash

mkdir -p rootfs/{dev,etc/init.d,lib}
touch rootfs/etc/init.d/rcS
#这里用双引号可能会报错
echo -e '#!/bin/sh\n' > rootfs/etc/init.d/rcS
cp busybox-1.37.0/_install/* -r rootfs/
sudo cp -P /usr/arm-linux-gnueabihf/libc/lib/* rootfs/lib/

ln -s bin/busybox rootfs/init 

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 chown root:root -R rootfs/*
sudo  chmod  777 rootfs/etc/init.d/rcS

qemu-img create -f raw disk.img 512M
mkfs -t ext4 ./disk.img
mkdir  -p   tmpfs
sudo mount -o loop ./disk.img tmpfs/
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs
file disk.img

5.启动虚拟机开发板

sudo qemu-system-arm \
    -M vexpress-a9 \
    -m 512M \
    -kernel linux-5.6.14/arch/arm/boot/zImage \
    -dtb linux-5.6.14/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
    -nographic \
    -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
    -sd disk.img

运行成功,如下图
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a11090ba506b47e78e1e2db350c3dcdf.png#pic_center)


	错误:EXT4-fs (mmcblk0): recovery complete
EXT4-fs (mmcblk0): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) on device 179:0.
Freeing unused kernel memory: 1024K
Run /sbin/init as init process
Run /etc/init as init process
Run /bin/init as init process
Run /bin/sh as init process
Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.6.14 #2
Hardware name: ARM-Versatile Express
[<80110804>] (unwind_backtrace) from [<8010c6a8>] (show_stack+0x10/0x14)
[<8010c6a8>] (show_stack) from [<807867b0>] (dump_stack+0xa0/0xb4)
[<807867b0>] (dump_stack) from [<80120f90>] (panic+0x118/0x320)
[<80120f90>] (panic) from [<807a0374>] (kernel_init+0x104/0x114)
[<807a0374>] (kernel_init) from [<801010e8>] (ret_from_fork+0x14/0x2c)
Exception stack(0x9e493fb0 to 0x9e493ff8)
3fa0:                                     00000000 00000000 00000000 00000000
3fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3fe0: 00000000 00000000 00000000 00000000 00000013 00000000
---[ end Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.


 1. <span style="color: red;">文件系统重init文件缺失</span>,检查我的文件系统中init文件正常。故排除



2.busybox编译时未进行交叉编译导致文件为不是arm架构文件,file rootfs/bin/busybox命令查看并无问题。故排除

参考博客:CentOS 7 利用qemu模拟ARM vexpress A9开发板

3.交叉编译库未正常拷贝。检查rootfs/lib文件发现其下面没有交叉编译库的内容,而是一个软链接,指向一个不存在的路径。问题定位到了,修复如下:

修改制作根文件系统镜像中sudo cp -P /usr/arm-linux-gnueabihf/lib/* rootfs/lib/为sudo cp /usr/arm-linux-gnueabihf/lib/sf/* rootfs/lib/,重新制作根文件系统镜像后正常了。

可能不同版本ubuntu安装的 gcc-arm-linux-gnueabi 库路径不同,需要自己检查一下。

Kernel panic No working init found 可能原因:
1.文件系统重init文件缺失,检查我的文件系统中init文件正常。故排除

参考博客:buildroot编译内核启动报错:Kernel panic - not syncing: No working init found问题解决

2.busybox编译时未进行交叉编译导致文件为不是arm架构文件,file rootfs/bin/busybox命令查看并无问题,故排除

参考博客:CentOS 7 利用qemu模拟ARM vexpress A9开发板

3.交叉编译库未正常拷贝。,检查rootfs/lib文件发现其下面没有交叉编译库的内容,而是一个软链接,指向一个不存在的路径。问题定位到了,修复如下:

修改制作根文件系统镜像中sudo cp -P /usr/arm-linux-gnueabihf/lib/* rootfs/lib/为sudo cp /usr/arm-linux-gnueabihf/libc/lib/* rootfs/lib/,重新制作根文件系统镜像后正常了。

可能不同版本ubuntu安装的 gcc-arm-linux-gnueabi 库路径不同,需要自己检查一下。

参考博客:启动报错:Kernel panic - not syncing: No working init found. Try passing init= option to kernel.

http://www.dtcms.com/a/107828.html

相关文章:

  • 【pcdet3D检测】——OPenpcdet如何进行测试文件配置?能否自定义测试数据?一文看懂pointpillar(pcdet)中的test.py
  • redis7.0搭建redis-cluster集群部署实战
  • AquaMoon and Chess_CodeForces - 1545B
  • AI前沿:资本狂潮下的技术暗战:巨头博弈、开源革命与生态重构
  • Java项目之基于ssm的简易版营业厅宽带系统(源码+文档)
  • Ubuntu 使用apt安装MySQL后的升级方法
  • Share02-小小脚本大大能量
  • 【面试篇】多线程
  • RTX5080 安装torch,torchvision ,torchaudio 指南
  • 全功能在线WEB工具箱PHP源码
  • 3. 线程间共享数据
  • 跨网文件安全交换系统|国产信创认证+安全高效传输
  • 2025-4-2 蓝桥杯刷题情况(分布式队列)
  • 智能觉醒:四大AI Agent框架重构未来生产力
  • 简单描述一下Unity物理系统的主要性能消耗点
  • 【高项】信息系统项目管理师(十五)高级项目管理【4分】
  • RocketMq 5.0之后延时消息底层是怎么实现的?
  • C++(匿名函数+继承+多态)
  • MySQL GROUP BY 和 HAVING 子句中 ‘Unknown column‘ 错误的深入解析
  • 详细介绍一下C++的按位运算
  • Tinder上线《The Game Game》
  • mapreduce工作原理
  • 论文阅读10——解开碳排放与碳足迹之间的关系:文献回顾和可持续交通框架
  • TCP四次挥手
  • 《K230 从熟悉到...》颜色识别
  • 归并排序延伸-非递归版本
  • 基于yolo11的BGA图像目标检测
  • Ubuntu18.04 编译 Android7.1代码报错
  • 使用numpy读取数据集
  • Ubuntu Wayland启动腾讯会议并实现原生屏幕共享