码迷,mamicode.com
首页 > 其他好文 > 详细

根文件的简单添加

时间:2015-04-03 09:13:33      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

文件系统:内核管理文件的一种应用 通过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 重新启动开发板,查看是否能够正常挂载,功能是否正常 *************************************************************************************************************************************************************** *************************************************************************************************************************************************************** *************************************************************************************************************************************************************** ***************************************************************************************************************************************************************

根文件的简单添加

标签:

原文地址:http://www.cnblogs.com/cnlg/p/4389083.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!