嵌入式学习笔记_根文件系统

1_根文件系统

    Uboot的最终目的是启动内核; 内核的作用是启动应用程序; 而应用程序是在根文件系统上的(挂载),构造一个简单的Linux系统,根文件系统是需要了解的.

1.1_从内核源码分析

    从内核如何启动第一个应用程序可以简单了解需要构造什么.内核挂接好根文件系统后,执行应用程序是在init_post里面,在init main.c中查看这个函数:

 

1)_首先打开一个设备文件 open “/dev/console”;

下面有俩个 sys_dup(0); sys_dup(0);这三个类似与标准输入printf(),标准输出scanf(),标准错误err();所有的printf打印信息都会从dev/console打印出来,输入时也是从这里输入,这个文件对应这终端,我现在用的对应于串口0,对于其他设备, dev/console这个文件可能是键盘液晶屏.接着向下看

2)_通过run_init_process来启动我们通过命令行参数init = “xxx”(uboot传入的),execute_command 或者是”sbin/init”下的程序,接着往下,,,,

所以我们可以在uboot中擦除文件系统, nand erase root;然后启动boot,进入内核,但是输出信息中显示挂载了file system,因为对于flash来说,将其擦除就是相当于格式化,我们可以将他看作是任何一种文件系统.(默认显示yaffs filesystem),但是里面是没有内容的,无法启动应用程序,于是出现警告 unable to open initial console 以及错误 failed to execute xxx attempting console.打开 “sbin/init”以及后面的也错误,于是打印下面的错误.

2_busybox

2.1_啥是busybox

    文件系统中有许多命令,若一个一个编译会很麻烦,嵌入式中busybox是一系列命令的集合,像ls ,cp这样的命令就是指向busybox 的连接,ls 和busybox ls的结果是一样的

    内核启动的第一个用户进程Init也是到busybox的连接

    通过分析busybox源码(源码小复杂)可以得出如果要创建最小的根文件系统,所需要的项

    1)_打开终端: /dev/console, /dev/NULL

    2)_init程序本身就可以看做是busybox

    3)_配置文件: /etc/inittab

    4)_应用程序所需要的库(fopen, fwrite等函数需要,c库等)

2.2_如何用busybox来创建可执行文件

    1)配置busybox

    将busybox包放到服务器上进行解压,cd 到解压后的文件中,

通过查看 INSTALL文件可以找到如何编译busybox文件,

make menuconfig 可以生成菜单进去配置busybox

make 就是编译的意思啦

由于是交叉编译我们不希望将文件系统安装到pc上被破坏,于是可以make install 安装到指定的目录下

    输入 make menuconfig

    需要注意的是,使用韦老师的busybox会出现错误” Makefile:xxx: *** mixed implicit and normal rules: deprecated syntax”这是由于新版Makefile不支持这样的组合目标:config %config(一个有通配符,另一个没有通配符),解决方法要么把config %config拆成2个规则,要么把其中一个目标去掉。于是:

a)_修改busybox-1.7.0 顶层Makefile 405行:

config%config: scripts_basic outputmakefile FORCE

改为:

%config:scripts_basic outputmakefile FORCE

 

b)_修改busybox-1.7.0 顶层Makefile 1242行:

/%/: prepare scripts FORCE

改为:

%/:prepare scripts FORCE即可进入菜单进行配置:

1._首先我们的bosybox是给嵌入式系统编译的,所以需要有交叉编译工具,在Makefile中配置:如下只需在后面加上前缀arm-linux- (CROSS:Linux中一般交叉编译工具的指定以CROSS开头).

2._连接/编译选项

进入menuconfig

Busybox settingà build options à []build busybox as a ……

由于使用glibc时,静态编译busybox会提示警告信息,会出现莫名其妙的问题,所以使用动态编译,在构造根文件系统时需要在/lib目录下放置glibc库文件

3._tab命令补全

Busybox settingà bosybox library tuning à [*]tab completion

4._压缩命令,默认大都选上了

Archival utilities à

5._模块加载命令

Linux module utilitiesà 默认都是选上的

6._支持mdev

支持mdev,这可以方便构造/dev目录, 并且可以支持热插拔设备, 为了方便调试, 选中mount, umount命令,并让mount命令支持nfs(网络文件系统),配置中也是默认选中的.

Linux setting utilitiesà

配置完成后make 编译,可能会出现错误,毕竟这是个开源工具,把错误命令在配置去掉即可.

然后创建一个目录”mkdir -p /work/nfs_root/first_fs” (-p命令可以一次性创建多级目录)安装 “make CONFIG_PREFIX=/work/nfs_root/first_fs install”等待安装,进入安装后的目录下

3_构建最小的文件系统

    之前的分析中,现在还差终端没有创建, 于是现在来一步一步创建最小文件系统

3.1_创建 /dev/console ; /dev/NULL

    “mkdir dev”进入dev目录下,创建俩个文件设备:

    “mknod console c 5 1”

    “mknod null c 1 3”

    c-字符型设备(猜测可能是由于使用串口设备为终端,所以是字符型设备), 第一个是主设备号, 第二个是次设备号

3.2_init程序本身就是busybox,所以这一步之前完成了

   

3.3_创建/etc/inittab配置文件

   

    表示只执行askfirst中的一个/bin/sh程序,这个程序的标准输入,输出,错误都定位到/dev/console里面去

3.4_安装glibc库

    “mkdir lib”目录

    进入gcc里的库

    直接复制,.so表示动态库, 是链接文件, 所以在后面需要加上 –d选项,否则库就会显得很大,

    以上就是我们最小的根文件系统所需要的东西了

3.5_烧写到FLASH上

  需要制作yaffs文件系统映像,yaffs1 是给小页的nand flash用的,每页512字节, 我使用的板子的大页的,2048字节,于是用yaffs2.将

“yaffs_source_util_larger_small_page_nand.tar.bz2”解压缩,然后进入” Development_util_okàyaffs2àutils目录下,make生成mkyaffs2image应用程序,将这个程序拷贝到pc机的 /usr/local/bin目录下,加上可执行属性,

” sudo chmod +x /usr/local/bin/mkyaffs2image”

就可以直接用了.

    可以看出用法是后面接创建的文件系统即可.

“mkyaffs2image second_fs second_fs.yaffs2”用uboot烧写到单板上,进入内核,是askfirst然后启动/bin/sh

    这就是最小的根文件系统

3.6_完善根文件系统

3.6.1_挂载虚拟根文件系统

    在内核中,当前有哪些应用程序在跑,这些信息如何去收集,在内核提供的一个虚拟文件系统中,叫proc文件系统,创建一个proc目录,然后将proc文件系统挂接到这里即可.ps命令就是去proc目录下看有啥东西可以在单板上创建,也可以在inittab中使用脚本挂载

    在pc上,进入etc/inittab 加入以下命令,表示开始会执行这个rcS 脚本

    然后创建 /etc/init.d/rcS,在里面输入挂接proc的命令

    加上可执行属性” chmod +x etc/init.d/rcS”,重新烧写到开发板上,这样一启动就会直接执行 上面挂接的命令,如果在启动时还想执行其他命令,加入到rcS 脚本即可

    这是挂载proc的方法,还有一种是 mount –a 它会去读 /etc/fstab里的内容, 根据里面的内容来挂载,修改rcS 文件,注释掉前面的,在后面加入mount –a

    然后在etc/fstab中,device—挂接的设备; mount-point—挂接点; type—文件类型; option—挂接参数,以逗号隔开

    在单板上执行 cat /proc/mounts 即可输出当前挂载的文件系统

   

 

3.6.2_完善dev目录

    dev目录下对应着那些设备和驱动,驱动有成百上千,一个个创建会很麻烦,用udev机制自动创建 dev目录下的设备节点,busybox下是mdev是udev的简化版本.

    先创建sys/目录

    修改/etc/fstab和etc/init.d/rcS

 

  Mdev –s 是指一开始就先将原先内核现有的那些驱动设备节点创建出来,创建映像文件烧写到开发板之上.下面这些就是mdev自动创建的.

3.7_挂接NFS

    每次都去烧写根文件系统十分麻烦,可以将文件系统放在服务器上,内核启动的时候,识别服务器的这个目录,将这个目录系统当成根文件系统,这样就不必每次都去烧写.

3.7.1_PC 开启nfs 服务

    插上网线,配置好ip,首先得让服务器允许挂接目录被挂接,(/etc/exports 这个配置文件中定义这个目录).如图配置,最好按着图中设置,我按着之前的目录设置出现启动不了nfs服务,提示语法错误.

    然后在pc上开启这个服务, 输入命令”/etc/init.d/nfs-kernel-server restart”

    这样的话基本上就是开启成功了,但是可以实验一下,在pc上挂接这个目录,看是否可以访问这个目录,输入命令”mount –t nfs 本机ip :需要被挂接的目录 /mnt”最后去这个目录下查看是否可以访问:

3.7.2_单板挂接

    先开启网卡”ifconfig eth0 up”再设置板子ip需要设置在同一网段,.” ifconfig eth0 192.168.10.3”,再检验是否可以ping通:

    再创建一个mnt目录,尝试挂接服务器上的这个目录文件

    这样手动设置十分麻烦,当然也可以自动手动挂载,直接让开发板从nfs启动,需要在uboot下修改命令行参数:

“set bootargs noinitrd root=/dev/nfs nfsroot=192.168.10.2:/work/nfs_root/second_fs ip=192.168.10.3:192.168.10.2:192.168.10.4:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0”

Save 重启即可

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值