zoukankan      html  css  js  c++  java
  • 制作根文件系统之制作根文件系统步骤详解

    制作根文件系统之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.6Documentation fsroot.txt里面有说明
          nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

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

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

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



  • 相关阅读:
    [IT学习]Python pandas 学习
    [IT学习]Python 小项目 通讯录 思路
    [IT学习]学习Python过程需要记忆的一些坑
    【线性结构】A1074Reversing Linked List
    【线性结构】一元多项式的乘法与加法运算
    【线性结构】两个有序链表序列的合并
    C/C++中函数参数传递的三种情况(p *p &p)
    解决pip安装包的时候超时失败(很多红色错误)的问题
    A1012The Best Rank
    B1015/A1062德才论
  • 原文地址:https://www.cnblogs.com/andyfly/p/9419832.html
Copyright © 2011-2022 走看看