根文件系统构建

一、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



原文地址:https://www.cnblogs.com/mofei004/p/12064132.html