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 1
mknod -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-ok6419
make 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串口助手中同步显示的内容。
这里,所有的根文件系统以及挂载方式的工作都结束了。
推荐阅读最新更新时间:2024-11-08 11:29
设计资源 培训 开发板 精华推荐
- LT3091HFE 线性稳压器的典型应用,使用较低值的 RSET 以实现较高的输出电压
- 采用MasterGaN1的工业应用DC / DC谐振转换器
- LTC5593 双路 2.3GHz 至 4.5GHz 高动态范围下变频混频器的典型应用
- 使用 Microchip Technology 的 MIC2772-S2S3YML 的参考设计
- ADR361A 2.5V 输出低功耗、低噪声电压基准的典型应用,具有灌/拉能力
- 用于低待机功耗离线 SMPS 的自供电单片开关 NCP1010 的典型应用
- AD8616ARZ-REEL 二阶低通滤波器运算放大器的典型应用电路
- SY89542U EV,SY89542U 评估板,2.5V,3.2Gbps 双路差分 2:1 多路复用器,带内部终端
- LT3477IFE 10V 至 2 个白光 LED、具有 PWM 调光的降压-升压模式的典型应用电路
- 使用 ON Semiconductor 的 KA555 的参考设计