文件系统:内核管理文件的一种应用
通过bootargs或者nfs将文件系统映射到本地
内核挂载文件系统的时候,首先需要找到挂载的地方,用bootargs可以设置通过nfs挂载到某个文件,
当找到挂载文件后需要执行init进程,Busybox里面就有init进程,编译和配置后就可运行,在配置
好后的_install文件下面的子文件基本都是链接指向-->/bin/busybox,在busybox-1.17.3/coreutils/
中有各种命令的实现程序,例如:ls,cat等等等,这些程序可以拿来学习,提高自己的编程技巧,训练
编程方法和编程风格,在init/中的init.c就是实现init进程的程序。在运行init.c程序后最终会运行
parse_inittab()函数解析命令,这个时候需要打开etc/inittab文件,因此,我们需要在etc下面需要
创建一个inittab文件,那么这个inittab里面有些什么内容呢,在busybox/examples/inittab下面有
些解释的文件可供查看,他是init初始化时的一个脚本,格式:format for etch entry:
:::
id:那个终端运行,不写就是默认终端,基本省略
runlevels:基本省略
action:表示以什么样的方式运行,是指运行一次还是像打不死的小强一样
process:表示脚本里面运行的什么
例如: ;;askfirst;/bin/sh 表示运行/bin/sh并且运行之前先询问一下。
如果没有inittab,init.c会去默认的执行一些东西,如果打开了,就去默认的解析你面的东西,解析里
面对象的时候,程序将上面四个域保存在一个结构体中,然后做相关操作解析操作,当这个文件运行起来
的时候,此时假如我们想运行ps,ls dev等命令时的会提示需要/proc文件系统,这个文件是描述内核起来
的时候里面进程运行的相关状态,当内核起来的时候这个文件已经生成了,只是我们没有挂载,我们可以在
开发板终端挂载一下看效果:mount -t proc proc ./proc/;但是我们总不能每次都手动挂载吧,我们需要
系统去自动挂载,因此我们可以把它写到一个文件里面,我们一般在etc下面创建init.d/rcS,将命令放到
rcS脚本里面,在里面写上mount -a就行了,但是写过后内核怎么知道到这里去执行呢?我们是不是还需要
指示一下,因为内核刚开始运行的时候,运行的是inittab文件,所以我么可以把路径放到inittab里面,
在里面添加::respawn:/etc/init.d/rcS,表示如果没找到或没运行起来则一直运行,
或者::sysinit:/etc/init.d/rcS,这个写法需要手动修改一下rcS权限,表示只运行一次,
这个时候再次运行就能挂载成功了,但是文件系统有太多了,我们总不能每次一个个挂载写上去,所以我们
在etc下面创建一个fstab表,在表里面事先写上需要挂载的文件。这样终端输入mount -a就可以了。在前面的rcS
里面我们已经写好了,会自动挂载完成,我们直接查看挂载的文件就能看到挂载后效果;在内核启动后会有许多
文件状态节点,运行命令mdev -s然后ls /dev/就可以查看设备节点了,但是我们也总不能每次输入这个命令吧,
我们可以把mdev -s命令写到前面的etc/init.c/rcS里面,这样系统起来的时该挂载的挂载,该
运行的运行。还有一点,在这个时候,开发板终端命令提示符是光秃秃的,还有一些环境变量需要设置,
另外在执行/bin/sh脚本的时候有个默认文件会被执行,这个脚本就是etc/profile,在这个脚本里面有哪些内容呢?
下面内容可供参考:
在etc下添加profile文件,文件内容为:
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME W]# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
到这个时候,环境差不多就搭建完成了,这个时候我们要是在上面跑自己的应用你会发现跑不起来,这是为什么呢?
因为应用运行的时候需要依赖一些动态库,这个时候我们需要去准备动态库lib,最后,文件系统中有一个设备节点是
必须的,在dev下创建console节点,mknod dev/console c 5 1
在上面一切都完成后可以做最后测试了。
下面是创建上面所以文件的一个例子,可参考:
一、根文件系统制作
1、 源码下载
我们选择的版本是busybox-1.17.3.tar.bz2下载路径为:
http://busybox.net/downloads/
2、 解压源码
$ tar xvf busybox-1.17.3.tar.bz2
3、 进入源码目录
$ cd busybox-1.17.3
4、 配置源码
$ make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
[ ] Force NOMMU build
[ ] Build with Large File Support (for accessing files > 2 GB)
(arm-none-linux-gnueabi-) Cross Compiler prefix 括号里面的内容是新添加的
() Additional CFLAGS
5、编译
$ make
6、安装
busybox默认安装路径为源码目录下的_install
$ make install
7、进入安装目录下
$ cd _install
$ ls
bin linuxrc sbin usr
8、创建其他需要的目录
$ mkdir dev etc mnt proc var tmp sys root
9、添加库,将工具链中的库拷贝到_install目录下
$ cp /home/linux/toolchain/arm-none-linux-gnueabi/libc/lib ./ -a
或者是:cp ~/arm-cortex_a8/arm-cortex_a8-linux-gnueabi/sysroot/lib$ ./ -a 这个是我自己电脑上面的库
删除_install/lib下的所有目录、.o文件和.a文件
对库进行瘦身以减小文件系统的大小
$ arm-none-linux-gnueabi-strip lib/*
10、添加系统启动文件
在etc下添加文件inittab,文件内容如下:
#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
在etc下添加文件fstab,文件内容如下:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
这里我们挂载的文件系统有三个proc、sysfs和tmpfs。在内核中proc和sysfs默认都支持,而tmpfs是没有支持的,我们需要添加tmpfs的支持
修改内核配置:
File systems --->
Pseudo filesystems --->
[*] Virtual memory file system support (former shm fs)
[*] Tmpfs POSIX Access Control Lists
重新编译内核
在etc下创建init.d目录,并在init.d下创建rcS文件,rcS文件内容为:
#!/bin/sh
# This is the first script called by init process
/bin/mount -a
为rcS添加可执行权限:
$ chmod +x init.d/rcS
在etc下添加profile文件,文件内容为:
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME W]# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
11、设备文件创建
根文件系统中有一个设备节点是必须的,在dev下创建console节点
$ mknod dev/console c 5 1
重要:新制作的文件系统尺寸若超出8M,删除不需要的库文件
二、NFS测试
1、备份/source/rootfs
$ sudo mv /source/rootfs /source/rootfs_bak
2、将我们新建的根文件系统拷贝到/source目录下
$ sudo cp _install /source/rootfs -a
3、设置uboot环境变量
# setenv bootcmd tftp 20008000 zImage; go 20008000
# setenv bootargs root=nfs nfsroot=192.168.1.100:/source/rootfs init=/linuxrc console=ttySAC0,115200 ip=192.168.1.200
# saveenv
重新启动开发板,查看是否能够正常挂载,功能是否正常
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************