• 根文件系统构建


    一、BusyBox构建根文件系统

    1、编译BusyBox根文件系统


      在Ubuntu上NFS服务器目录/home/liupf/linux/nfs/创建rootfs子目录
      mkdir rootfs
      在PC上解压busybox-1.29.0.tar.bz2。
      tar -vxjf busybox-1.29.0.tar.bz2
      1.修改Makefile,添加编译器

    164 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
    ......
    190 ARCH ?= arm


      2.busybox中文字符支持

        修改busybox-1.29.0/libbb/printable_string.c中printable_string函数。主要增加了对大于0x7F字符和UNICODE的支持。
        修改busybox-1.29.0/libbb/unicode.c中unicode_conv_to_printable2函数。修改内容与前述类似。

      3.配置busybox

      busybox三种配置选项。
        defconfig:缺省配置,即默认配置
        allyesconfig:全选配置,选中全部配置
        allnoconfig:最小配置

      开始配置busybox:

    make defconfig
    make menuconfig


      Location:#选择动态编译,取消下述选项
       -> Settings
        -> Build static binary (no shared libs)

      Location:
        -> Settings
          -> vi-style line editing commands

      Location:#取消勾选
        -> Linux Module Utilities
          -> Simplified modutils

      Location:
        -> Linux System Utilities
          -> mdev (16 kb) //确保下面的全部选中,默认都是选中的

      Location:#使能unicode编码以支持中文
        -> Settings
          -> Support Unicode //选中
            -> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中

      4、编译busybox

        使用以下指令:

    make install CONFIG_PREFIX=/home/liupf/linux/nfs/rootfs


      如果 bootargs 设置 init=/linuxrc,那么 linuxrc 就是可以作为用户空间的 init 程序,所以用户态空间的 init 程序是 busybox 来生成的。

    2、向根文件系统添加lib库

      1、向rootfs的“/lib”添加库文件
      在rootfs下创建lib文件夹
      

    mkdir rootfs


      进入目录/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linuxgnueabihf/libc/lib
      

    cp *so* *.a /home/liupf/linux/nfs/rootfs/lib/ -defconfig

      其中ld-linux-armhf.so.3是一个软连接文件。需要拷贝实际指向的文件。删除该文件。

    rm ld-linux-armhf.so.3

      重新进入库目录,执行:

    cp ld-linux-armhf.so.3 /home/liupf/linux/nfs/rootfs/lib/

      在目录/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib中同样也有需要的库文件,将其拷贝到网络文件系统的lib目录下。

      2.向rootfs的usr/lib目录添加库文件

      现在nfs/rootfs/目录下创建usr/lib目录

      将/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib目录中的库文件拷贝到rootfs/usr/lib中。

      cp *so* *.a /home/liupf/linux/nfs/rootfs/usr/lib/ -d

      拷贝完成后,使用一下命令查看两个目录的大小

    cd rootfs //进入根文件系统目录
    du ./lib ./usr/lib/ -sh //查看 lib 和 usr/lib 这两个目录的大小

      两个目录大小分别是57M和67M。

    3、创建其他文件夹

      在根文件系统中创建其他文件夹,如 dev、 proc、 mnt、 sys、 tmp 和 root 等。

    二、测试文件系统

      root变量的设置格式如下:

    root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gwip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

      

      我们使用的命令示例如下:

    setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.250:/home/liupf/linux/nfs/rootfs ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off' //设置 bootargs
    saveenv //保存环境变量

    三、完善文件系统

      1、创建/etc/init.d/rcS文件

    #!/bin/sh
    PATH
    =/sbin:/bin:/usr/sbin:/usr/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH runlevel mount -a #挂载所有的文件系统,这些文件系统由文件/etc/fstab来指定 mkdir /dev/pts mount -t devpts devpts /dev/pts #创建目录/dev/pts,然后将 devpts 挂载到/dev/pts 目录中。
    echo
    /sbin/mdev > /proc/sys/kernel/hotplug #使用mdev来管理热插拔设备,通过这两行内核可以在/dev目录下自动创建设备节点 mdev -s

    #此处可添加需要自动启动的应用程序

      创建完成后,给与/etc/init.d/rcS可执行权限。

      

      2、创建/etc/fstab文件

      在 rootfs 中创建/etc/fstab 文件,fstab Linux 开机以后自动配置哪些需要自动挂载的分区,格式如下:

    <file system> <mount point> <type> <options> <dump> <pass>

      <file system>:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
      <mount point>:挂载点。
      <type>:文件系统类型,比如 ext2ext3procromfstmpfs 等等。
      <options>:挂载选项,在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使 defaults,也就是默认选项, defaults 包含了 rwsuiddevexecautonouser async
      <dump>:为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0
      <pass>:磁盘检查设置,为 0 表示不检查。根目录‘/’设置为 1,其他的都不能设置为 1其他的分区从 开始。一般不在 fstab 中挂载根目录,因此这里一般设置为 0
     

    #<file system> <mount point> <type> <options> <dump> <pass>
    proc /proc proc defaults 0 0
    tmpfs /tmp tmpfs defaults 0 0
    sysfs /sys sysfs defaults 0 0

      

    3、创建/etc/inittab文件

      init 程序会读取/etc/inittab这个文件, inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的 个段组成,格式如下:

    <id>:<runlevels>:<action>:<process>


      <id>:每个指令的标识符,不能重复。但是对于 busybox init 来说, <id>有着特殊意义。
    对于 busybox 而言<id>用来指定启动进程的控制 tty,一般我们将串口或者 LCD 屏幕设置为控
    tty
      <runlevels>: 对 busybox 来说此项完全没用,所以空着。
      <action>:动作,用于指定<process>可能用到的动作。



     <process>: 具体的动作,比如程序、脚本或命令等。

      创建一个/etc/inittab文件,内容如下:

    #etc/inittab
    ::sysinit:/etc/init.d/rcS
    console::askfirst:-/bin/sh
    ::restart:/sbin/init
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/umount -a -r
    ::shutdown:/sbin/swapoff -a

      支持DNS服务,在 rootfs 中新建文件/etc/resolv.conf,然后在里面输入如下内容:
     

    nameserver 114.114.114.114
    nameserver 192.168.1.1



  • 相关阅读:
    php 元字符与转义
    php内置函数
    php系统常量
    WPF 批量修改控件属性
    对实体属性值赋值(DATASET转list)
    WPF 进度条实现
    WPF 异步刷新主界面
    c# 依赖注入Export ImportMany
    Oracle 正则匹配实现字符拆分
    Oracle 获取表对应列信息和索引信息
  • 原文地址:https://www.cnblogs.com/mofei004/p/12064132.html
Copyright © 2020-2023  润新知