qemu安装,busybox最简根文件系统制作,ubuntu上模拟arm64运行linux

1.qemu安装
https://www.qemu.org/download/ 下载最新的稳定版本 qemu-6.2.0-rc2.tar.xz
//注:下载,用在板子上直接下载太慢了 wget https://download.qemu.org/qemu-6.2.0-rc2.tar.xz

scp qemu-6.2.0-rc2.tar.xz [email protected]:/home/yhbd/bsp
$ cd ~/bsp
$ tar -xvf qemu-6.2.0-rc2.tar.xz
$ cd qemu-6.2.0-rc2

$ ./configure /* 配置,报错解决如下
报错:ERROR: Cannot find Ninja
解决:sudo apt-get install ninja-build

重运行./configure 还是会报很多错。
ERROR: Dependency “pixman-1” not found, tried pkgconfig
都是因为缺少软件,建议安装下面的
$ sudo apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev
$ sudo apt-get install binutils-dev libboost-all-dev autoconf libtool libssl-dev
$ sudo apt-get install libpixman-1-dev libpython-dev python-pip python-capstone virtualenv

看到下面的信息表示成功了
Subprojects
libvhost-user : YES

	Found ninja-1.8.2 at /usr/bin/ninja

*/
$ make -j4 //4核并发编译,利用多核CPU并发能力
//最好用串口运行,因编译时间太长,而vscode ssh登录运行,容易超时退出。
//而且用串口运行,vscode 可以做别的事,相互不干扰
$ sudo make install

//查看版本,源码编译的,qemu它支持不同的硬件平台的虚拟,不仅是ARM
$ qemu-arm --version
qemu-arm version 6.2.92
Copyright © 2003-2021 Fabrice Bellard and the QEMU Project developers
$ qemu-riscv64 --version
qemu-riscv64 version 6.2.92
Copyright © 2003-2021 Fabrice Bellard and the QEMU Project developers

$ qemu-system-aarch64 -cpu help //查看machine支持的cpu类型,发现支持A57
cortex-a53
cortex-a57
cortex-a72

2.busybox安装编译

官网下载 https://busybox.net/
wget https://busybox.net/downloads/busybox-1.34.1.tar.bz2 //最新稳定版
tar -xvf busybox-1.34.1.tar.bz2
cd busybox-1.34.1
make make menuconfig
Setting
[*]Build static binary (no shared libs)
(aarch64-linux-gnu-) Cross compiler prefix //注意 一定要指定交叉编译工具
make
file busybox /* 确认编译生成的是 ARM 平台的 busybox: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, for GNU/Linux 3.7.0, BuildID[sha1]=76a214150af2231f6762e712edc8dead5b55a00b, stripped */
make install //安装,默认安装路径为_install
cd _install
ls
bin linuxrc sbin usr
mkdir dev etc var proc tmp home root mnt sys //创建需要的目录
cp -rf ../examples/bootfloppy/etc/* etc/ 拷贝最简示例配置,*/
cp /home/yhai/store/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib/ . -a //拷贝编译工具链里的库
du -mh lib /*查看lib库的大小45M lib/debug228M lib */
rm lib/*.a 裁剪,删除掉静态库文件*/
aarch64-linux-gnu-strip lib/* 裁剪掉库里的调试信息 */
rm -rf lib/debug/ //删掉不需要的库
du -mh lib /*查看lib库的大小 8.5M lib/ */
sudo mknod dev/null c 1 3
sudo mknod dev/console c 5 1

如果出现fatal error: curses.h: No such file or directory
sudo apt-get install libncurses5-dev libncursesw5-dev

3.制作镜像文件
制作.img文件:dd if=/dev/zero of=rootfs.img bs=1M count=100
制作文件系统:sudo mkfs.ext4 rootfs.img
挂载设备:sudo mount rootfs.img /mnt/
拷贝 sudo cp -r _install/* /mnt
同步:sync
取消挂载:umount /mnt
4.修改etc下的系统配置文件

//etc/inittab 启动配置文件
#this is run first except when booting in single-user mode.
:: sysinit:/etc/init.d/rcS      //指定系统初始化脚本是rcS 也可指定别的名字,但习惯用rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh    //需按确认键,才能进入shell    
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
//etc/init.d/rcS 启动脚本
#!/bin/sh
# This is the first script called by init process
/bin/mount  -a         //挂载 /etc/fstab文件指定的所有文件系统 
#/etc/init.d/rc.local  //扩展子脚本
echo  /sbin/mdev  >  /proc/sys/kernel/hotplug  //设置系统的有热插拔设备时,调用mdev程序
/sbin/mdev  -s  //mdev 系统启动和热插拔 或动态加载驱动程序时,自动产生驱动程序所需的节点文件
#./app.exe   //可添加自己程序,让其上电自己运行
/sbin/ifconfig eth0 192.168.9.18 //启动后自动配置ip

//$ chmod   +x  init.d/rcS	//添加可执行权限
//etc/fstab  自动挂载的文件系统列表 	                                                  
//fstab 指定启动后自动挂载的文件系统 介质,挂载点等 ,如挂载失败会报错
#device     mount-point   type     	options         dump     fsck order
proc        /proc         proc          defaults     	 0     	   0
tmpfs       /tmp          tmpfs     	defaults         0         0
sysfs       /sys          sysfs     	defaults         0         0
tmpfs  	    /dev          tmpfs     	defaults         0         0
//etc/profile 系统环境变量的设置
#!/bin/sh
export HOSTNAME=yhai
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# "   //终端前的提示符
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH  LD_LIBRARY_PATH

5.qemu仿真
参考原文链接:https://blog.csdn.net/weixin_39541632/article/details/129910433

编译内核,使用arch/arm64的defconfig(我使用的是4.0.1版本的内核),menuconfig支持ext4文件系统
运行qemu
qemu-system-aarch64 -machine virt -cpu cortex-a57 -m 4G -kernel arch/arm64/boot/Image -append “noinitrd sched_debug root=/dev/vda rootfstype=ext4 rw crashkernel=256M” -drive if=none,file=/media/ping/KINGSTON/busybox-1.34.1/rootfs.img,id=hd0 -device virtio-blk-device,drive=hd0 -nographic

qemu-system-aarch64: QEMU 指令,用于启动一个 AARCH64 虚拟机。
-m 1024 : 设置虚拟机的内存大小为 1GB。
-cpu cortex-a57 : 执行虚拟机使用的CPU型号 A57。
-M virt -nographic : 设置 QEMU硬件模型,并且不显示图形界面。
-smp 4 : 设置虚拟机支持的最大线程数目为 4。
-kernel linux-4.14.221/arch/arm64/boot/Image : 指定要加载的 Linux 内核文件。
-append “noinintrd sched_debug root=/dev/vda rootfstype=ext4 rw crashkernel=256M loglevel=7”: 添加内核参数,以启用 noinintrd sched_debug 调试选项,并将根目录设置为 VDA 中的 /dev/vda。loglevel:内核Log级别过滤,只有小于这个级别的log才会显示,设置为7显示所有
if=none,file=rootfs.img,id=hd0: 指定要使用的存储设备为 IDE 控制器上的 HD0 设备,文件名为 rootfs.img。
-device virtio-blk-device,drive=hd0 : 指定要使用的 virtio blk 设备,用于存储设备。

5.调试内核
参考原文链接:https://blog.csdn.net/weixin_39541632/article/details/129910433

你可能感兴趣的:(linux杂项,linux,ubuntu,运维)