Liux根文件系统的构建

来源:互联网 发布:乌鲁木齐网络赛 编辑:程序博客网 时间:2024/04/27 21:12

作者:李浩

 

硬件平台:OMAP-L138+DDR

软件平台:linux2.6.32

 

 

所需软件:busybox1.17.3(http://www.busybox.net/downloads/)

 

前述:

      init进程是内核启动完毕后执行的第一个进程。下面的代码是内核启动最后阶段执行的内容在init_post函数中(/kernel-2.6.32/init/main.c):

[cpp] view plaincopy
  1. if (execute_command) {  
  2.     run_init_process(execute_command);  
  3.     printk(KERN_WARNING "Failed to execute %s.  Attempting "  
  4.                 "defaults.../n", execute_command);  
  5. }  
  6. run_init_process("/sbin/init");  
  7. run_init_process("/etc/init");  
  8. run_init_process("/bin/init");  
  9. run_init_process("/bin/sh");  
  10.   
  11. panic("No init found.  Try passing init= option to kernel.");  
  

上述代码中,execute_command是bootloader引导内核时传递给内核的参数init的值。从代码中可以看出,如果没有传递init参数给内核,则内核会顺次执行/sbin/init,/etc/init等程序作为init进程,这些代码实际上是在1号进程中执行的,但在执行时它还只是一个内核进程,run_init_process函数执行成功后不会返回,它将使当前进程转变为一个用户态进程。因此,init进程可以说是从内核态到用户态的的一座桥梁。

       从用户态来看,init进程是所有进程的祖先,其PID为1。init进程执行什么内容决定了整个系统是怎么初始化的。一般来说,它会根据相关配置文件执行,决定启动哪些应用程序同时监控这些应用程序的运行。

       因此,作为一个可用的根文件系统,必须包含一个供init进程执行的可执行文件,可称为init文件。在嵌入式系统中,通常采用busybox软件包来提供这个文件。

 

操作步骤:

1、创建目录

     首先创建一个目录,作为整个文件系统的根文件目录

     mkdir rootfs

     mkdir rootfs/rootfs_1.17

     mkdir rootfs/rootfs_build

 

下面是一个根文件系统所需要的主要目录:

/bin:存放基本命令的可执行文件

/sbin:存放基本系统管理类命令的可执行文件

/lib:存放基本的共享库

/dev:存放设备文件

/etc:存放各种配置文件

/usr:包含若干子目录,存放用户程序和文档

/usr/bin:存放用户程序的可执行文件

/usr/sbin:存放用户系统管理类程序的可执行文件

/usr/lib:存放用户程序所需要的共享库

/proc:用于挂载proc文件系统

/sys:用于挂载sysfs文件系统

/tmp:存放临时文件

/var:存放系统日志及一些服务程序的临时文件等

mkdir {bin,dev,etc,usr,lib,sbin,proc,sys,tmp}

 

创建设备文件:

Linux下的设备文件按惯例都存放在/dev目录下,应用程序一般都需要通过设备文件来访问相应的设备,现在Linux系统上一般都采用udev来管理设备文件,这是一个专门用于管理设备文件的服务程序,它会根据/sys目录中的系统信息自动在/dev目录下创建或者删除设备文件。

     但是udev要产生作用,首先必须将sysfs文件系统挂载到/dev下,然后启动udev服务,这些工作一般在系统的初始化脚本中进行。然而系统初始化时要执行程序则必须有以下两个设备存在:/dev/console和/dev/null。这两个设备只能预先放在根文件系统中。

     用以下命令来创建这两个设备文件:

     sudo mknod -m 600 rootfs_1.17/dev/console c 5 1

     sudo mknod -m 666 rootfs_1.17/dev/null c 1 3

在嵌入式系统中,出于某种需要可能不希望动态创建设备文件,这时,所需设备文件就要用mknod命令预先在根文件系统中创建,或者将创建设备文件的命令写入系统的初始化脚本中。

 

安装共享库:

拷贝交叉工具链中的共享库

/opt/TOOLS/compiler/arm-none-linux-gnueabi/libc/lib

/rootfs/rootfs_1.17/lib

 

安装busybox:

参考

http://kinglaw05.blog.163.com/blog/static/596833142010450154463/

 

创建配置文件:

1、创建/etc/init.d/rcS如下:

#!/bin/sh

export PATH=/sbin:/bin:/usr/sbin:/usr/bin

mount -t proc proc /proc

mount -t sysfs sysfs /sys

mount -t tmpfs mdev /dev

mount -t tmpfs tmp /tmp

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

 

由于执行初始化脚本与最后登录的并不是同一个shell,所以在这里定义的环境变量不可能自动导入登录以后的shell

 

使用flash文件系统:

mkfs.jffs2 -n -s 2048 -e 128KiB -d rootfs_1.17 -o rootfs.jffs2

-n:表示不要再每个檫除块上都加上清除标志;

-s 2048:表示每页大小为2048个字节

-e 128KiB:表示檫除块大小为128KB

-d rootfs_1.17:表示根文件系统目录为rootfs_1.17

-o rootfs.jffs2:表示输出的映像文件为:rootfs.jffs2

 

最后烧写到flash即可!

原创粉丝点击