【嵌入式Linux之QEMU模拟器】4、使用busybox制作根文件系统
文件系统:对存储设备上的数据进行组织的机制。
根文件系统【root_fs】
- Linux内核启动后第一个挂载的文件系统
- 主要由基本的shell命令、各种库、字符设备、配置脚本组成
- 提供了根目录/
- 根文件系统【简称RFS】可以放在:nor/nand flash、SD卡、磁盘、网络空间上
busybox
- 一个集成100多个Linux常用命令和工具的软件
- 一个适合制作嵌入式文件系统的软件工具
- 下载<链接>
一、创建shell命令
1、下载busybox
2、修改Makefile
①、下载完毕后将其拖曳到ubuntu中,进行解压tar xvf busybox-1.27.0.tar.bz2
②、解压完毕后,进入该文件夹后,输入vi Makefile
进行修改Makefile。在vi的一般模式下输入/ARCH
,进行搜索。
下面所说多少行是以我的上述版本为例
164行 CROSS_COMPILE ?=arm-linux-gnueabi-
190行 ARCH ?= arm
3、配置
①、输入make defconfig
,进行配置
②、图形化配置
-
输入
apt install libncurses5-dev
安装必须的库 -
输入
make menuconfig
-
选中“Busybox Settings”,然后回车。
-
找到下图所示选项,然后按空格,让其前面出现
*
-
退出
4、编译
输入make -j4
(漫长等待…)【貌似有好多警告???】
5、安装
输入make install
编译后会在 ./_install
的目录下生成各种命令。分别放到了4个文件bin linuxrc sbin usr
里。
bin
目录下,主要是一些常用的命令
sbin
目录下,也是一些命令
linuxrc
目录下,是linuxrc
usr
目录下,也是一些命令
前面说过,
根文件系统主要由基本的shell命令、各种库、字符设备、配置脚本组成
几个部分组成,现在已经具备了shell命令了,接着制作!
二、创建各种库
1、创建根文件系统总文件夹,这里我把/home/clay/QEMU
目录下的rootfs
文件夹作为总文件夹!
2、拷贝刚刚_install
文件中的全部命令到该文件中!
进入rootfs
文件后,输入cp -r ../busybox/busybox-1.27.0/_install/* .
将刚刚生成的所有命令拷贝到要制作的根文件系统总文件夹中!【-r
参数表示连带子目录也一同拷贝】
3、在rootfs
文件夹中,新建lib
文件夹。
①、进入rootfs
文件目录后,输入mkdir lib
创建文件夹!
②、将交叉编译器的库,拷到/rootfs/lib
文件夹中
进入lib文件夹,输入cp -p /usr/arm-linux-gnueabi/lib/* .
【-p参数表示保留源文件或目录的属性】
三、创建字符设备
设备文件,跟用户、底层进行交互的接口,这些接口以文件节点的形式存在!读写文件,直接读写对应的结点即可!
1、在rootfs
目录下,创建./dev
文件夹,用以存放各种目录结点!
进入rootfs
目录,输入mkdir dev
新建文件夹
2、依次输入下面命令,创建4个串口结点
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
- 1
- 2
- 3
- 4
mknod -m 666 tty1 c 4 1
命令中
mknod表示创建结点
-m设置权限为666
tty表示串口
c表示字符设备
4表示主设备号,1表示次设备号
3、创建工作台结点,mknod -m 666 console c 5 1
4、创建null
结点,mknod -m 666 null c 1 3
四、制作SD卡文件系统镜像
根文件系统放到SD卡里,内核启动后,从SD卡挂载根文件系统
1、退回./QEMU
目录,输入dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
,生成根文件系统镜像rootfs.ext3
。
命令中的bs表示缓冲区大小,count表示块大小
直接把rootfs.ext3
看成一个SD卡即可
2、格式化rootfs.ext3
,输入mkfs.ext3 rootfs.ext3
3、将各种文件拷贝到文件系统镜像中
需要注意的是,块设备不能直接读写,需要挂载到目录,然后对目录进行一些相应的操作!
①、输入mount -t ext3 rootfs.ext3 /mnt/ -o loop
mount [-fnrsvw] [-t vfstype] [-o options] device dir
-t ext3,表示文件系统是ext3格式
其中-o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。
②、挂载完毕,然后输入ls /mnt
查看SD卡内容,里面自然是空的!
③、拷贝文件到SD卡中
输入cp -r rootfs/* /mnt/
④、卸载SD卡
输入umount /mnt
五、启动内核,挂载rootfs
输入qemu-system-arm -M vexpress-a9 -m 512M -dtb ./test/vexpress-v2p-ca9.dtb -kernel ./test/zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
上述命令过长,也可采用上节最后介绍的技巧2,修改
./QEMU
目录下的boot.sh
文件为:
qemu-system-arm\
-M vexpress-a9\
-m 512M\
-dtb ./test/vexpress-v2p-ca9.dtb\
-kernel ./test/zImage\
-nographic\
-append "root=/dev/mmcblk0 rw console=ttyAMA0"\
-sd rootfs.ext3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
然后再控制台输入
./boot.sh
即可运行!
注意:
启动后,也许会发现有一个错误。
这个是因为,目前做的文件系统是最简陋的文件系统,还缺少很多东西。所以暂时忽略,关键是当输入ls
时,是否会出现相应内容呢?如下图所示。
若可以,则没有问题!
如何消除这个警报呢?下面提供两种方法,一种在简陋的根文件系统内部修改,一种从简陋的根文件系统外部修改!
方法一:在简陋的根文件系统内部修改
①、mkdir
创建etc
文件夹
②、进入etc
,mkdir
创建init.d
文件夹
③、进入init.d
,touch
创建rcS
文件
④、输入chmod a+x rcS
,添加可运行权限
⑤、输入vi rcS
,编辑脚本文件
echo "-----------------------------------------"I
echo "Welcome to A9 vexpress board"
echo "------------------------------------------"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
⑥、从/etc/init.d
目录,退回到根目录。
输入两次cd ..
⑦、开启另一个终端,输入ps -a
,查看qemu-system-arm
对应的进程PID号,然后输入kill ×××
⑧、回到原终端,输入启动命令qemu-system-arm -M vexpress-a9 -m 512M -dtb ./test/vexpress-v2p-ca9.dtb -kernel ./test/zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
或者输入
./boot.sh
重新启动查看rcS
显示效果
方法二:从简陋的根文件系统外部修改
①、进入rootfs,在rootfs下创建etc文件夹,mkdir etc
②、进入etc,在etc下创建init.d文件夹,mkdir init.d
③、进入init.d,在init.d下创建rcS文件,touch rcS
。同时加上可运行权限,chmod a+x rcS
④、编辑rcS如下内容,vi rcS
echo "-----------------------------------------"I
echo " Hello world! "
echo "-----------------------------------------"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
⑤、重新将内容拷贝到SD卡!
- 挂载SD卡
- 退回
QEMU
所在目录,输入mount -t ext3 rootfs.ext3 /mnt/ -o loop
- 退回
- 拷贝所有文件到挂载目录
- 输入
cp -r rootfs/* /mnt
- 输入
- 卸载SD卡
- 输入
umount /mnt
- 输入
⑥、重新启动,输入qemu-system-arm -M vexpress-a9 -m 512M -dtb ./test/vexpress-v2p-ca9.dtb -kernel ./test/zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
或者输入
./boot.sh
可以看到内容已经变更!
目前的情况来看,完善我们的文件系统还是蛮不方便的,后期当我们挂载到NFS上,可直接在主机进行修改,到那时便会方便许多,继续往下看咯!
注:上面都是命令行启动内核,若想图形化启动【LCD】可执行下面代码进行启动!
qemu-system-arm -M vexpress-a9 -m 512M -dtb ./test/vexpress-v2p-ca9.dtb -kernel ./test/zImage -append "root=/dev/mmcblk0 rw console=tty0" -sd rootfs.ext3
- 1
【上述代码是一行完成!】
或者再新建脚本
boot_with_lcd.sh
为以下内容【制作方法可参考上节最后的技巧2】
qemu-system-arm \
-M vexpress-a9 \
-m 512M\
-dtb ./test/vexpress-v2p-ca9.dtb\
-kernel ./test/zImage\
-append "root=/dev/mmcblk0 rw console=tty0"\
-sd rootfs.ext3\
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
LCD启动后,关闭LCD可直接关闭对应进程!
文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。
原文链接:recclay.blog.csdn.net/article/details/102319392
- 点赞
- 收藏
- 关注作者
评论(0)