嵌入式根文件系统(基于arm)

来源:互联网 发布:张译 知乎回答的问题 编辑:程序博客网 时间:2024/06/02 04:02

1 根文件系统

嵌入式可以包含多个文件系统,根文件系统是第一个,当linux启动的时候,第一个必须挂载的是根文件系统,若系统不能从指定设备上挂载根文件系统,则系统出错就退出。本文主要分以下两个部分说明根文件系统,第一个是如何制作根文件系统,第二个则是挂载根文件系统到内核。


2 如何建立根文件系统

根文件系统的制作是学习驱动的重要一步,这里我直接把制作根文件系统的框架思维导图贴出来了。我们制作的根文件系统就是按照这个框架来设计。
这里写图片描述

2.1 创建目录

本文所创建的根文件名称是rootfs,路径是/home/S5-driver/lesson8/rootfs,这个路径在随后的内核配置中用到多次。接下来在rootfs中创建一系列目录,mkdir bin etc lib proc sbin sys usr mnt tmp var,这些目录都是根文件基本上所必须具有的目录。以及创建子目录:mkdir usr/bin usr/lib usr/sbin lib/modules

2.2 创建设备文件

linux启动的时候,有两个设备是必须要的,在rootfs/dev目录下操作:

mknod -m 666 console c 5 1mknod -m 666 null c 1 3

第一个指令console表示是串口控制台设备 c表示是字符设备 5表示主设备号,1表示次设备号。第二个指令暂且先这样设置。这样就创建了两个设备文件console 和 null。

2.3 加入配置文件

把etc.tar.gz放到/home/S5-driver/lesson7/linux-ok6410(这个路径是存放内核的路径)中解压后得到etc文件,将这个文件里所有的东西复制到rootfs/etc/中去。(etc.tar.gz压缩包是需要自己找一下)

cp etc/* rootfs/etc/ -rf

2.4 添加内核模块(这步是在内核顶层目录下进行的)

分别执行以下三条指令,第一条是表示进入内核目录中,第二条是指编译内核模块,第三天指的是将模块部分都复制到rootfs目录下去。

cd /home/S5-driver/lesson7/linux-ok6419make modules ARCH=arm CROSS_COMPILE=arm-linux-make modules install ARCH=arm INSTALL_MOD_PATH=/home/S5-driver/lesson8/rootfs

执行完后进入/lesson8/rootfs/lib/modules中,发现产生了3.0.1的目录,这样内核模块就已经添加到相应的路径中了。

2.5 编译/安装busybox

首先简单的介绍一下busybox,busybox是一个功能很强大的工具包,里面有各种小功能,我们最熟悉的ls查看文件夹里的文件就是busybox所提供的,所以安装busybox也是我们使用各种小命令的前提。
(1)将busybox-1.13.3.tar.gz文件放到linux-ok6410中去解压
(2)配置busybox,make menuconfig启动图形化菜单,主要的配置项在busybox setting中有个build options,选择build busybox as a static binary(静态链接),空格选中,再选择在最下面的交叉工具链,进入后填入arm-linux-即可,如下图。
这里写图片描述
(3)安装busybox中,进入installation options中,选中“Don‘t use /usr”, 选中该项可以避免busybox 被安装到宿主系统的/usr目录下,破坏宿主系统。配置如下图。
这里写图片描述
(4)编译安装:这里的编译时在busybox的顶层目录中进行的,直接输入make进行编译,编译完之后输入make install进行安装。
至此,根文件系统的制作就已经完成了。


3挂载根文件系统

这里写图片描述
根据上图,挂载根文件系统可以分为以下三个部分。

3.1 挂载方式简介

基于nandflash的文件系统:Yaffs2 UbiFS(可写可读)
基于norflash的文件系统:Jffs2(可写可读)
基于内存的文件系统Ramdisk Initramfs(启动速度快,不能保存,用的较多)
基于网络的文件系统 NFS(开发阶段使用)
根文件系统是第一个文件系统,通常采用Initramfs

3.2 使用initramfs

3.2.1

#cd /home/S5-driver/lesson8/rootfs/ #ln -s ./bin/busybox init //进行软连接,将init加载到当前目录中来

当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
3.2.2
配置内核,支持initramfs
进入lesson7下linux-ok6410内核目录,配制内核make menuconfig ARCH=arm
进入到general setup中,找到下图中选项
这里写图片描述
添加路径名后如下
这里写图片描述
保存退出后,重新编译内核

make uImage ARCH=arm CROSS_COMPILE=arm-linux-

将/arch/arm/boot/uImage 拷贝到根目录tftpboot中。然后tftp uImage c0008000下载内核,
bootm c0008000启动内核可以看到内核启动成功。
这里写图片描述

3.3使用NFS

如果采用initramfs的方式挂载根文件到内核中,每次在rootfs中加了一个新的文件后,还要到linux内核中重新编译,再复制到tftpboot中,下载到开发板上,这样会非常繁琐,工作量会大大加重。这就体现使用NFS的好处了,采用NFS的话,如果在rootfs根文件中修改文件或者说增删文件,开发板上会相应的同步修改增删。所以说NFS的方式对于开发者来说用的是最多的,其他的方式都是在产品成品中使用。接下来配置NFS。

3.3.1 在内核顶层目录下运行,也就是我的/lesson7/linux-ok6410 中执行
make menuconfig ARCH=arm
首先进入general setup中,取消initial RAM filesystem and RAM disk,如下图。
这里写图片描述

3.3.2 保存退出后,进入到file systems中,再进入到network file system中,选中root file system on NFS,如下图。
这里写图片描述

3.3.3 保存退出,再次编译内核。
make uImage ARCH=arm CROSS_COMPILE=arm-linux-

我们除了在开发板上设置ipaddr和serverip的地址,(ipaddr就是自己设置开发板的地址,serverip就是linux中的地址,两个ip段需在同一个段中)还要设置bootargs。
在串口助手上输入以下内容

setenv bootargs noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=192.168.1.104:/home/S5-driver/lesson8/rootfs ip=192.168.1.105:192.168.1.104:192.168.1.1:255.255.255.0::eth0:off    

这里写图片描述
除了上图红色框框里的东西要改,其他的都可以复制粘贴。

开启NFS

输入vi /etc/exports 确保nfs在linux已经配置,如下图。
这里写图片描述
开启linux中nfs服务器:/etc/init.d/nfs restart
然后下载内核 tftp c0008000 uImage
启动内核 :bootm c0008000
开发板上启动内核后,在pc上修改rootfs文件下的文件,这里增加了一个test1文件,随后在开发板的串口助手上ls查看发现也多了一个test1。这样就可以看出来使用NFS进行开发是多么的方便了,同步高效。下图是在linux中增加test1文件。
这里写图片描述

下图是在securCRT串口助手中同步显示的内容。

这里写图片描述

这里,所有的根文件系统以及挂载方式的工作都结束了。

阅读全文
1 0
原创粉丝点击