博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【嵌入式Linux之QEMU模拟器】4、使用busybox制作根文件系统
阅读量:2028 次
发布时间:2019-04-28

本文共 4502 字,大约阅读时间需要 15 分钟。

文件系统:对存储设备上的数据进行组织的机制。

根文件系统【root_fs】

  • Linux内核启动后第一个挂载的文件系统
  • 主要由基本的shell命令、各种库、字符设备、配置脚本组成
  • 提供了根目录/
  • 根文件系统【简称RFS】可以放在:nor/nand flash、SD卡、磁盘、网络空间上

busybox

  • 一个集成100多个Linux常用命令和工具的软件
  • 一个适合制作嵌入式文件系统的软件工具
  • 下载<>

一、创建shell命令

1、下载busybox

可以到上面的<>进行下载,当然也可以到<>提取码:7j6b

在这里插入图片描述

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 1mknod -m 666 tty2 c 4 2mknod -m 666 tty3 c 4 3mknod -m 666 tty4 c 4 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

然后再控制台输入./boot.sh即可运行!

在这里插入图片描述

注意:

启动后,也许会发现有一个错误。

在这里插入图片描述
这个是因为,目前做的文件系统是最简陋的文件系统,还缺少很多东西。所以暂时忽略,关键是当输入ls时,是否会出现相应内容呢?如下图所示。
在这里插入图片描述
若可以,则没有问题!

如何消除这个警报呢?下面提供两种方法,一种在简陋的根文件系统内部修改,一种从简陋的根文件系统外部修改!

方法一:在简陋的根文件系统内部修改

①、mkdir创建etc文件夹

在这里插入图片描述

②、进入etcmkdir创建init.d文件夹

在这里插入图片描述

③、进入init.dtouch创建rcS文件

在这里插入图片描述

④、输入chmod a+x rcS,添加可运行权限

在这里插入图片描述

⑤、输入vi rcS,编辑脚本文件

echo "-----------------------------------------"Iecho "Welcome to A9 vexpress board"echo "------------------------------------------"

⑥、从/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 "-----------------------------------------"Iecho "        Hello world!       "echo "-----------------------------------------"

⑤、重新将内容拷贝到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

【上述代码是一行完成!】

或者再新建脚本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\

在这里插入图片描述

LCD启动后,关闭LCD可直接关闭对应进程!

转载地址:http://dknaf.baihongyu.com/

你可能感兴趣的文章
openssl CRL证书
查看>>
openssl rand
查看>>
00.代码阅读内功心法篇
查看>>
02.规划过程组表格-项目管理计划
查看>>
02.规划过程组表格-WBS词典
查看>>
03.失败与成功哲学
查看>>
04.向太平意思宣战
查看>>
03.简化领导力摘录——卓越领导者
查看>>
02.HTML中使用JavaScript
查看>>
04.变量、作用域和内存问题--JavaScript高级程序设计(笔记)
查看>>
08.用户故事与敏捷方法——估算用户故事笔记
查看>>
12.敏捷估计与规划——Splitting User Stories笔记
查看>>
13.敏捷估计与规划——Release Planning Essentials笔记
查看>>
05精益敏捷项目管理——超越Scrum
查看>>
11.看板方法——建立服务水平协议笔记
查看>>
14.精益敏捷项目管理——认识精益笔记
查看>>
12.敏捷项目管理——治理敏捷项目笔记
查看>>
05.软件项目管理与敏捷方法——范围管理笔记
查看>>
09.软件项目管理与敏捷方法——人力资源管理笔记
查看>>
17.软件项目管理与加敏捷方法——常见错误笔记
查看>>