嵌入式根文件系统(基于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串口助手中同步显示的内容。
这里,所有的根文件系统以及挂载方式的工作都结束了。
- 嵌入式根文件系统(基于arm)
- 嵌入式linux根文件系统制作(基于arm)
- 基于ARM的嵌入式文件系统YAFFS的移植
- arm嵌入式根文件系统的大概
- Linux嵌入式 -- 内核 (arm) & 文件系统
- arm-linux移植手记(四)基于busybox1.16.0的根文件系统制作
- arm-linux移植手记(四)基于busybox1.16.0的根文件系统制作
- 基于busybox-1.23.2(stable)版本制作arm-linux使用根文件系统
- Arm嵌入式开发之Flash文件系统建立
- 基于嵌入式Cramfs 的根文件系统配置新方法
- 基于AT91SAM9X35EK的嵌入式Linux+UBI根文件系统移植成功
- 基于AT91SAM9261EK的嵌入式Linux+Cramfs根文件系统移植成功
- 基于AT91SAM9261EK的嵌入式Linux+UBI根文件系统移植成功
- 如何学习嵌入式系统(基于ARM平台)(转)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习嵌入式系统(基于ARM平台)
- 如何学习嵌入式系统(基于ARM平台)
- POJ
- vim的玩法
- Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0
- gcc编译器的简介与使用
- Unity学习笔记6-进程、线程和协程
- 嵌入式根文件系统(基于arm)
- 【Oracle】Oracle安装监听程序
- 海量数据处理:分治-Hash映射+Bit-map+Bloome Filter
- c/c++中使用sizeof计算union/struct/class
- Hibernate的@GeneratedValue注解
- 背包问题(01背包和完全背包)
- Android快速开发系列 10个常用工具类
- (一)操作系统概论复习要点笔记
- 论文浅海矢量声场及其信号处理的学习