目录
1.1、制作64M的镜像文件,命名为rootfs01.ext3
三、使用QEMU实现vexpress-ca9板卡的linux启动
一、配置交叉编译器
1、在Windows下载压缩包
- 进入arm官网找到Support&Training
- 点击Downloads后点击Tools and Software
- 点击Open Source后打开Downloads
- 找到:gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz 并下载
这个是64bit的交叉编译,可以编译qemu虚拟环境的开发板
2、在虚拟机安装交叉编译器
2.1、解压到指定目录
- 在packages目录解压到sim(上级)目录
$ tar -Jxvf gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf.tar.xz -C ../
- 解压后可以将文件名改短
2.2、编写激活脚本并激活
- export PATH=编译器的bin目录:$PATH
$ vim env_express.sh 填入
export PATH=/home/venom/sim/gcc-arm-linux-x86_64-gnueabihf/bin:${PATH}
export CROSS_COMPILE=arm-none-linux-gnueabihf-
export ARCH=arm
$ source env_express.sh
2.3、设置软连接
- 在编译器的bin目录,为了方便使用,不设置也可以
$ ln -s arm-none-linux-gnueabihf-gcc arm-linux-gcc
- 查看版本号
$ arm-linux-gcc -v
二、制作文件系统
1、分配空间
1.1、制作64M的镜像文件,命名为rootfs01.ext3
$ sudo dd if=/dev/zero of=rootfs01.ext3 bs=1M count=64
- 注:
dd 命令用于读取、转换并输出数据
if=文件名:输入文件名,即指定源文件。
of=文件名:输出文件名,即指定目标文件
dev/zero文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
count=blocks:仅拷贝blocks个块 这里会得到一个64M的文件
1.2、 用ext3格式化上一步的镜像文件
$ sudo mkfs.ext3 rootfs01.ext3
2、填充空间
2.1、挂载镜像文件到一个目录
- 建议放在同级目录下,假设目录名为my_mnt
$ sudo mount -t ext3 -o loop myrootfs.ext3 my_mnt/
- 根据FHS标准,建立根文件系统目录
$ sudo mkdir bin dev etc home lib proc sbin sys tmp usr var root mnt
$ sudo mkdir usr/bin usr/lib usr/sbin
2.2、利用busybox制作可执行文件
- 下载busybox www.busybox.net
- 解压busybox
$ tar jxvf busybox-1.35.0.tar.bz2 -C ../
- 激活编译脚本
$ make defconfig
$ make -j4
$ make install
- 拷贝内容到根文件系统里
$ sudo cp -a _install/* ../mymnt/
2.3、拷贝动态库到根文件系统里
$ sudo cp -a * 源文件/* 目标文件
源文件: /home/venom/sim/gcc-arm-linux-x86_64-gnueabihf/arm-none-linux-gnueabihf/libc/lib
目标文件:/home/venom/sim/mymnt/lib/
2.4、配置文件
- 一定是在mymnt目录下的etc 不是/etc
- 编写inittab文件
$ sudo vim etc/inittab 填入
::sysinit:/etc/rc.d/rcS
::askfirst:-/bin/sh
- 编写etc/rc.d/rcS
$ sudo mkdir etc/rc.d
$ sudo vim etc/rc.d/rcS 填入
#!/bin/sh
/bin/mount -a
# echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /lib/modules/`uname -r`
$ sudo chmod +x etc/rc.d/rcS
- 编写etc/fstab文件,为上一步的mount -a提供脚本支持
$ sudo vim etc/fstab 填入
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
3、 卸载空间
- 在mymnt的上级目录
$ sudo umount my_mnt
三、使用QEMU实现vexpress-ca9板卡的linux启动
1、安装qemu
$ sudo apt install qemu qemu-system-arm qemu-user
- 输入qemu-system-a然后tab查看
qemu-system-aarch64 模拟ARM - 64bit的CPU
qemu-system-arm 模拟ARM - 32bit的CPU
- 查看是否激活编译器脚本(输出是 arm)
$ echo $ARCH
2、编译Linux内核
2.1、下载linux内核
- www.kernel.org 下载较慢,就用之前的
- 解压到工作目录
$ tar -Jxvf linux-5.10.tar.xz -C ../
2.2、配置内核(必须激活编译器)
$ make vexpress_defconfig
期间会报错,直接安装对应文件即可
/bin/sh: 1: flex: not found
sudo apt-get install flex/bin/sh: 1: bison: not found
sudo apt-get install bison -y
2.3、 编译内核镜像
- 此过程较长
$ make zImage -j2
2.4、生成设备树文件
$ make dtbs
2.5、拷贝生成文件
$ cp arch/arm/boot/zImage ../backups/boot/
$ cp arch/arm/boot/dts/vexpress-v2p-ca9.dtb ../backups/boot/
3、编译启动脚本
$ vim run_vexpress.sh 填入
sudo qemu-system-arm -nographic -M vexpress-a9 -m 512M -kernel backups/boot/zImage -dtb backups/boot/vexpress-v2p-ca9.dtb -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd backups/sdCard/rootfs01.ext3
- 注意对应目录是否有对应文件 (boot、 sdCard)
- 给脚本添加可执行权限
$ chomd +x run_vexpress.sh
- 运行结果
- 也可在 qemu 中 输入ctrl+a 抬起后,再输入’x’ 退出qemu
四、使用nfs实现共享
1、nfs服务安装与配置
- 安装
$ sudo apt install nfs-kernel-server
- 配置:需要共享的目录的绝对路径 *(rw,sync)
$ sudo vim /etc/exports 填入
/home/venom/work/nfs_share *(rw,sync)
- 重启服务:
$ service nfs-kernel-server restart
- 验证:
$ sudo exportfs
2、配置ip
2.1、在虚拟机里配置了一个tap0的网卡
sudo tunctl -u venom -t tap0
sudo ifconfig tap0 192.168.5.1
sudo route add -net 192.168.5.0 netmask 255.255.255.0 dev tap0
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
- 删除是
$ tunctl -d tap0
2.2、修改启动脚本
在原来的run_vexpress.sh最后面添加:
-net nic -net tap,ifname=tap0,script=no
2.3、启动qemu,配置虚拟板ip
$ ifconfig eth0 192.168.5.101
$ mkdir /mnt
$ mount -t nfs -o nolock 192.168.5.1:/home/venom/sim/nfs_share /mnt
- 效果图
来源于上课笔记,老师是:海牛rocky