制作根文件系统之Busybox init进程的启动过程分析中我们知道了制作嵌入的根文件系统需要:

1、Busybox这个UNIX程序集合

2、/ect/inittab这个配置文件

3、/ect/inittab指定的命令或者脚本

4、/dev/console、/dev/null设备节点

5、C库

 

下面是自己移植的过程

1、编译、安装Busybox

a、将从网上下载的压缩包解压:tar xjf busybox-1.7.0.tar.bz2
b、切换到解压后文件夹路径cd busybox-1.7.0/。
c、配置busybox,执行make menuconfig,增加一些功能
  1)、设置“tab”键补全,设置路径为:
  Busybox Settings --->
  Busybox Library Tuning --->
  [*] tab completion
  2)、连接/编译选项设置,选择动态连接
  Busybox Settings --->
  Build Options --->
  [ ]Buid Busybox as a static binary (no shared libs)
  3)、支持mdev
  Linux System Utilities --->
  [*] mdev
d、编译Busybox
  1)、更改顶层Makefile ARCH ?= arm;CROSS_COMPILE ?= arm-linux
  2)、执行make编译Busybox
e、安装Busybox,注意千万不能直接make install,这样会导致当前乌班图系统崩溃,因为我们需要再开发板上运行,所有安装以下步骤进行:
  1)、在目录下新建一个/work/nfs_andy/first_fs
  2)、回到Busybox目录,执行make CONFIG_PREFIX=/work/nfs_andy/first_fs install
  3)、完成后将在/work/nfs_andy/first_fs目录下生成bin linuxrc sbin usr目录,其中linuxrc指向/bin/busybox/init_main程序,是挂接根文件系统后执行的第一个程序

 

2、使用glibc库,glibc库的位置在/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib,这个在制作交叉编译工具时就已经生成了。
a、进入刚才建立的根文件系统目录/work/nfs_andy/first_fs
b、建立一个lib文件夹:mkdir -p lib
c、切换到glibc库所在目录:cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib
d、将加载器与动态库文件复制到/work/nfs_andy/first_fs/lib:cp *.so* /work/nfs_andy/first_fs/lib -d。-d表示所有的链接还是链接,不复制成源文件。节省空间。

 

3、构建第一个根文件系统
a、构造dev/console、dev/null:
  1)、在/work/nfs_andy/first_fs/目录下创建dev文件夹:mkdir -p dev
  2)、进入dev文件夹,构造字符设备节点console、null:sudo mknod console c 5 1、sudo mknod null c 1 3
b、构造etc/inittab配置文件:
  1)、在/work/nfs_andy/first_fs/目录下创建etc文件夹:mkdir -p etc
  2)、进入etc目录,创建配置文件inittab,里面填入console::askfirst:-/bin/sh
c、制作最小根文件系统映像:
  1)、将从网上下载的压缩包解压:tar xjf yaffs_source_util_larger_small_page_nand.tar.bz2
  2)、进入解压缩后的目录Development_util_ok/yaffs2/utils目录,然后make。
  3)、将编译出的工具mkyaffs2image拷贝到系统目录:sudo cp mkyaffs2image /usr/local/bin/
  4)、加上可执行熟悉:sudo chmod +x /usr/local/bin/mkyaffs2image
  5)、切换到 /work/nfs_andy目录执行:mkyaffs2image first_fs first_fs.yaffs2,这样就制作成功了第一个最小根文件系统

 

4、将制作出来的最小根文件系统first_fs.yaffs2烧写到开发板,然后运行成功

 

5、继续完善根文件系统,使其支持虚拟文件系统。如果在移植好根文件系统的开发板上ps命令,内核不能执行,因为缺少虚拟文件系统。所以 执行mount -t proc none /proc挂接虚拟文件系统
a、在/work/nfs_andy/first_fs/目录下创建proc文件夹:mkdir -p proc
b、在ect/inittab文件中再添加一行::sysinit:/etc/init.d/rcS。表示调用rcS这个脚本文件
c、在/etc/init.d/rcS这个脚本文件里添加mount -a这个命令,mount -a这个命令会去读取etc/fstab文件的内容
d、增加etc/fstab文件,里面填入
  #device mount-point type options dump fsck order
  proc /proc proc defaults 0 0
f、执行mkyaffs2image first_fs first_fs.yaffs2,将生成的文件印象烧入开发板运行成功。再执行ps命令可以看到

  PID  Uid        VSZ Stat Command
    1 0          3092 S   init       
    2 0               SW< [kthreadd]
    3 0               SWN [ksoftirqd/0]
    4 0               SW< [watchdog/0]
    5 0               SW< [events/0]
    6 0               SW< [khelper]
   55 0               SW< [kblockd/0]
   56 0               SW< [ksuspend_usbd]
   59 0               SW< [khubd]
   61 0               SW< [kseriod]
   73 0               SW  [pdflush]
   74 0               SW  [pdflush]
   75 0               SW< [kswapd0]
   76 0               SW< [aio/0]
  710 0               SW< [mtdblockd]
  745 0               SW< [kmmcd]
  769 0          3096 S   -sh 
  771 0          3096 R   ps

 

6、继续完善使其自动构建dev/设备节点。使用udev机制,在busybox里面是mdev机制,需要增加sys文件系统、tmpfs文件系统
a、建立sys文件夹:mkdir sys
b、修改/etc/init.d/rcS这个脚本文件。加入下面几行

     mount -a             //读取etc/fstab文件,挂接文件系统
        mkdir /dev/pts    //
        mount -t devpts devpts /dev/pts // /dev/pts用来支撑外部网络连接的虚拟终端
        echo /sbin/mdev > /proc/sys/kernel/hotplug //设置内核当有热插拔设备时调用/sbin/mdev 程序
        mdev -s //在dev目录下生成内核所有的支持的设备节点

c、修改etc/fstab文件,它用来控制mount -a的行为,挂接以下所有的文件系统

   #device      mount-point      type     options   dump     fsck order
    proc           /proc         proc      defaults  0          0
    sysfs          /sys          sysfs     defaults  0          0
    tmpfs          /dev          tmpfs     defaults  0          0

d、制作成文件系统映像后运行成功,可以看到在dev目录下新建了很多设备节点

 

7、移植nfs文件系统。
a、从flash上启动根文件系统,再用命令挂接NFS
  1)、在服务器上配置支持被挂接的目录,配置文件为etc/exports,增加想要挂接的目录:/work/nfs_andy/first_fs *(rw,sync,no_root_squash)
  2)、重启nfs服务:sudo /etc/init.d/nfs-kernel-server restart
  3)、试着在服务器上将mmt目录挂接到/work/nfs_andy/first_fs:sudo mount -t nfs 192.168.1.108:/work/nfs_andy/first_fs /mnt
  4)、第三步成功后再利用开发板挂接到/work/nfs_andy/first_fs,首先在开发板上创建一个mnt目录:mkdir mnt
  5)、在开发板上输入 mount -t nfs -o nolock 192.168.1.108:/work/nfs_andy/first_fs /mnt。挂接成功
b、直接从nfs启动,修改命令行参数
  1)、原先的参数为:bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
  2)、现在改为:set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.108:/work/nfs_andy/first_fs                               ip=192.168.1.111:192.168.1.105:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
  3)、nfs参数在linux-2.6.22.6\Documentation\nfsroot.txt里面有说明
      nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

          服务器ip        被挂接目录       配置参数省略
      ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>

        客户端ip    服务器ip     网关      子网掩码       主机名省略  设备eth0   自动配置关闭

  4)、启动内核挂接成功。



 

posted on 2018-08-04 20:36  andy_fly  阅读(1146)  评论(0编辑  收藏  举报