最近使用wsl的qemu总是遇到奇奇怪怪的问题,以前使用VMware环境下使用qemu用得没那么多问题,所以现在换回使用VMware,顺便记录过程。
下载VMware安装
下载完成傻瓜式安装即可。
下载ubuntu安装
下图是桌面版,我是下载的是桌面版。
下在完成后得到一个.ios文件。
打开安装好的VMware,创建新虚拟机
选择下载的.iso文件
关闭Ubuntu,设置文件夹共享,设置网络模式为桥接模式
设置好后,点击确定,打开ubuntu终端
进到/mnt目录,创建hgfs目录,然后挂载共享文件夹到该目录,挂载之后在ubuntu里即可看到共享文件夹的文件。
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
取消挂载可以用:
sudo fusermount -u /mnt/hgfs
不过如果代码放在共享目录总是遇到一些奇怪的问题,我搞不明白,所以我都是在/home/eon目录下重新下一份代码。
ubuntu添加国内镜像源
为了提升速度,ubuntu添加国内镜像源,先备份原来的软件源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
然后输入 sudo vim /etc/apt/sources.list 编辑软件源。在最前面添加即可。
######## Ubuntu22.04 中科大镜像源 ###############
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
######## Ubuntu22.04 阿里云镜像源 ###############
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
######## Ubuntu22.04LTS 清华镜像源 ###############
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
####################################################################################################
更新镜像源
sudo apt-get update #更新软件列表 sudo apt-get upgrade # 更新本地软件
安装工具
安装arm交叉编译工具:
sudo apt-get update #更新软件列表
sudo apt-get upgrade # 更新本地软件
sudo apt install gcc
sudo apt install gcc-arm-linux-gnueabi
sudo apt install g++-arm-linux-gnueabi
安装u-boot工具,编译uImage会用到。
sudo apt-get install u-boot-tools
安装arm版QEMU:
sudo apt install qemu-system-arm
qemu-system-arm -version 确认安装成功
安装其他东西:
sudo apt install bzip2
sudo apt install build-essential libssl-dev libncurses5-dev libncursesw5-dev
sudo apt install bison
sudo apt install flex
下载代码
git clone git@gitee.com:mirrors/Linux.git
git clone git@gitee.com:mirrors/u-boot.git
git clone git@gitee.com:mirrors/busyboxsource.git
编译
简单记下分步编译,文末提供整理好的编译脚本,可以一条命令编完。
这里选择编译vexpress-v2p-ca9这款芯片的代码。
编译busybox
配置:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig;
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
可以使用默认配置
编译:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
安装:make install,成功后_install目录如下图
_install目录下有编好的busybox工具。
编译linux
make ARCH=arm CROOSS_COMPILE=arm-linux-gnueabi- vexpress_defconfig
make ARCH=arm CROOSS_COMPILE=arm-linux-gnueabi- zImage
make ARCH=arm CROOSS_COMPILE=arm-linux-gnueabi- uImage
make ARCH=arm CROOSS_COMPILE=arm-linux-gnueabi- modules
make ARCH=arm CROOSS_COMPILE=arm-linux-gnueabi- dtbs
可使用下面的命令单独启动linux,但是会卡在挂载文件系统那里。
qemu-system-arm -M vexpress-a9 -m 512M -kernel Linux/arch/arm/boot/zImage -dtb Linux/arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb -nographic
单独启动linux,没有文件系统的实验:
编译u-boot
可使用qemu单独启动u-boot: qemu-system-arm -M vexpress-a9 -m 512M -nographic -kernel u-boot/u-boot
单独启动uboot的实验:
制作文件系统
新建目录用于存放文件系统
mkdir rootfs/lib
mkdir rootfs/dev
复制_install/目录下所有文件和连接库到rootfs
cp -r busyboxsource/_install/* rootfs
cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib
创建文件节点
cd rootfs/dev
mknod -m 666 tty1 c 4 1
mknod -m 666 tty2 c 4 2
mknod -m 666 tty3 c 4 3
mknod -m 666 tty4 c 4 4
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
制作扩展文件系统格式.ext4文件
dd if=/dev/zero of=rootfs.ext4 bs=1M count=32
mkfs.ext4 rootfs.ext4
因为.ext4格式的文件无法直接读写,所以建立用于挂载的目录/mnt/rootfs_tmp,并rootfs.ext4挂载到/mnt/rootfs_tmp,并将文件系统复制到rootfs_tmp
sudo mkdir /mnt/rootfs_tmp
sudo mount -t ext4 rootfs.ext4 /mnt/rootfs_tmp -o loop
sudo cp -r rootfs /* /mnt/rootfs_tmp
umount /mnt/rootfs_tmp
制作SD卡镜像
我要在QEMU中使用u-boot启动linux,所以想到的是将kernel、dtb、rootfs放到SD卡中,而u-boot由qemu的 -kernel参数指定,在uboot中将kernel和dtb从SD卡中加载到内存,并设置bootargs参数,然后引导kernel启动。
实验记录:
实验步骤:
dd if=/dev/zero of=sd.img bs=1M count=1024名创建一个1GB的文件 sd.img。
fdisk sd.img工具将 sd.img 格式化为多个分区。
sudo losetup -f --show sd.img 创建一个循环设备映射到整个镜像文件,这将输出一个循环设备名,比如 /dev/loop18。
sudo kpartx -a /dev/loop18 创建分区映射,这条命令会为 flash.img 文件中的每个分区创建一个新的循环设备映射。
ls /dev/mapper/loop18p命令查看新创建的分区设备 。
lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINT /dev/loop18会列出更详细的信息。
使用 mkfs命令格式化分区 。
挂载分区并复制文件。
卸载并删除循环设备和分区映射。
运行QEMU通过uboot启动kernel
执行env.sh里的qemu_run_boot函数,并在uboot中停下来,然后手动将zImage和dtb从SD卡加载到内存中,并设置bootargs参数,然后使用bootz {}kernel addr} - {dtb addr}命令即可进到linux控制台。
实验记录:
实验步骤:
运行qemu启动u-boot。
u-boot启动过程中按回车在uboot中停下来。
可通过mmc名查看sd卡的情况,通过fatload加载文件到内存。
手动将zImage和dtb从SD卡加载到内存中,并设置bootargs参数。
使用bootz {}kernel addr} - {dtb addr}命令即可进到linux控制台。
kernel启动后会根据bootargs中的root参数挂载文件系统。
环境整理
build_env.sh文件:
此处的格式贴源码不好看,只上一个图,需要的可以到我的博客去免费参考。
为方便编译而整理的脚本《build_env.sh》,使用时先对其source,即可执行里面的函数,如:
source build_env.sh
build_all
qemu_run_kernel
制作SD卡镜像的没有在脚本里,主要是因为使用fdisk命令那段不好写到脚本里。
欢迎评论,喜欢的可以点赞+关注