zoukankan      html  css  js  c++  java
  • Busybox构建根文件系统和制作Ramdisk

      

        定制根文件系统的方法很多,最常用的是使用BusyBox来构建定制根文件系统。它集成压缩了Linux的许多工具和命令,可以使用户迅速方便地建立一套相对完整、功能丰富的文件系统,其中包括大量常用的应用程序。下面详细介绍有关Busybox定制根文件系统。

     

    一、系统环境:

    1、操作系统:Ubuntu140.4

    2、交叉编译工具:gcc version 6.1.1 20160711 (Linaro GCC 6.1-2016.08)

    3busybox源码包:busybox-1.26.2

     

    二、构建rootfs

        1、建立rootfs目录

        /home/xxx/xxx目录下建立rootfs目录,

            $  mkdir rootfs

                    $  cd  rootfs

                    $  mkdir  root  bin  sbin  etc  dev  usr  lib  tmp  mnt  sys  proc  var  //建立常用目录

                    $  mkdir  usr/lib  usr/bin  usr/sbin

     

        2、解压源码包:

            $ tar -jxvf busybox-1.26.2.tar.bz2

     

        3、配置BusyBox

           $ make distclean

                  $ make defconfig

                  $ make menuconfig ARCH=arm

        3.1选择Busybox Settings --->

                  Installation Options --->

                                       BusyBox installation prefix(在里面输入BusyBox的安装目录,我是保存在/home/xxx/xxx/rootfs下)

     

       3.2选择Busybox Settings --->  

                         选中[*] Don't use /usr

     

     

        3.3 Busybox Settings---->

                 Build Options---->

                   选中 [*]Build BusyBox as a static binary(静态链接)

                   Cross Compiler prefix配置为arm-linux-gnueabi-(指定交叉编译器)

     

    配置好后,保存相关配置信息。

        4、编译安装Busybox

            $ make

                    $ make install

        5、添加/home/xxx/xxx/rootfs/dev目录下的设备文件。

        

        dev目录下必须有console和null这两个设备文件,使用mknod来创建这两个设备文件。

                $ cd dev/

                      $ sudo mknod -m 666 console c 5 1

                     $ sudo mknod -m 666 null c 1 3

       

        6、把busybox源码目录下的examples/bootfloppy/etc的内容拷贝到rootfs目录下的etc

            $ cd /home/xxx/xxx/rootfs/etc

                    $ cp  /home/ xxx/xxx/Downloads/busybox-1.26.2/examples/bootfloppy/etc/* ./ -raf

     

       7、修改配置文件

      7.1、修改fstab配置文件为:

      1 proc        /proc   proc    defaults    0   0
      2 tmpfs       /tmp    tmpfs   defaults    0   0
      3 sysfs       /sys    sysfs   defaults    0   0
      4 tmpfs       /dev    tmpfs   defaults    0   0   
      5 var         /dev    tmpfs   defaults    0   0
      6 ramfs       /dev    ramfs   defaults    0   0
      7 


          7.2修改profile文件为:

    # /etc/profile: system-wide .profile file for the Bourne shells
    
    USER="id -un"
    LOGNAME=$USER
    HOSTNAME='/bin/hostname'
    export PS1='[u@h:w]#'
    
    PATH=/bin:/sbin:/usr/bin:/usr/sbin
    LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
    export PATH LD_LIBRARY_PATH

    PS1含义

    1. d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
    2. H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
    3. h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
    4. :显示时间为24小时格式,如:HH:MM:SS
    5. T :显示时间为12小时格式
    6. A :显示时间为24小时格式:HH:MM
    7. u :当前用户的账号名称
    8. v :BASH的版本信息
    9. w :完整的工作目录名称。家目录会以 ~代替
    10. W :利用basename取得工作目录名称,所以只会列出最后一个目录
    11. # :下达的第几个命令
    12. $ :提示字符,如果是root时,提示符为:# ,普通用户则为:$

       7.3修改inittab文件为:

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

     

    在启动过程中bootloader会传递参数init=/linuxrc给内核的main( )函数,所以在文件系统被挂载后,运行的第一个程序是linuxrc,而linuxrc是一个指向/bin/busybox的链接文件,也就是说文件系统被挂在后运行的第一个程序是busybox。Busybox首先会解析文件/etc/inittab,这个文件中存放的是系统的配置信息,这些配置信息指明了接下来将要启动那些程序。

     /etc/inittab 文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下 

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

    <id>:表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省 略,则使用与init进程一样的控制台。
    <runlevels>:对于Busybox init程序,这个字段滑意义,可以省略。
    <action>:表示init程序如何控制这个子进程,
    <process>: 要执行的程序,它可以是可执行程序,也可以是脚本


      文件etc/inittab配置条目说明如下:

      ::sysinit:/etc/init.d/rcS    启动系统初始化文件/etc/init.d/rcS。字段sysinit表明文件/etc/init.d/rcS在系统启动后最先执行,并且只执行一次,init进程等待它结束才继续执行其它动作。(脚本文件名一般为rc,后缀S代表单用户运行级别脚本)

     ::askfirst:-/bin/sh   启动askfirst动作的shell。askfirst表明init进程先输出“Please press Enter to actvie this console”,等用户输入回车键之后才启动-/bin/sh。

      ::ctrlaltdel:/sbin/reboot  当按下Ctrl+Alt+Delete组合键时,init重启执行程序。字段ctrlaltdel表明当按下Ctrl+Alt+Delete组合键时,执行相应的进程。

      ::shutdown:/bin/umount -a -r   告诉init在关机时运行umount命令卸载所有的文件系统,如果卸载失败,试图以只读方式重新挂载。字段shutdown表明在重启关闭系统命令时执行相应进程。

      7.4 配置系统的hostname。在etc目录下执行如下命令:

        $ mkdir  sysconfig

            $ cd sysconfig

            $ touch  HOSTNAME

            $ echo  tiny4412 > HOSTNAME

     

         7.5 配置init.d/rcS文件为:

    #! /bin/sh
    
    PATH=/sbin:/bin:/usr/bin:/usr/sbin
    runlevel=S
    prevlevel=N
    umask 022
    export PATH runlevel prevlevel
    
    mount -a
    mkdir -p /dev/pts
    mount -t devpts devpts /dev/pts
    #mount -n -t usbfs none /proc/bus/usb
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
    mkdir -p /var/lock
    
    ifconfig lo 127.0.0.1
    /bin/hostname -F /etc/sysconfig/HOSTNAME

     修改init.d/rcS文件权限为:

        $ chmod 777 init.d/rcS

     

    详解:

    #!/bin/sh    #用busybox的shell

    PATH=/sbin:/bin:/usr/sbin:/usr/bin  #shell命令的搜索路径

    runlevel=S   #运行在单用户模式

    prevlevel=N  #前一个级别,为N则表示没有前一个级别

    umask 022   #权限位掩码

    export PATH runlevel prevlevel   #将环境的变量导出到环境中

    mount -a   #将文件 /etc/fstab 中指明的文件挂载到对应的挂载点上

    echo /sbin/mdev>/proc/sys/kernel/hotplug  #当有热插拔事件产生时, 内核就会调用位于/sbin目录的 mdev。 这时 mdev通过环境变量中的 ACTION 和 DEVPATH,(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为 这个设备在/dev 下创建设备节点文件。
    mdev -s   #建立dev目录。以‘-s’为参数调用位于/sbin 目录写的 mdev(其实是个链接,作用是传递参数给/bin目录下的busybox 程序并调用它) ,mdev扫描 /sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则 mdev 就利用这些信息为这个设备在/dev下创建设备节点文件。一般只在启动时才执行一次  “mdev -s” 。

      7.6设置ROOT用户(在etc下)

    添加passwd文件: 

    root:x:0:0:root:/root:/bin/bash

    添加group文件

    root:x:0:

    添加shadow文件

    root:$6$whiml8Gm$IuKrjGatftq.i6i3OYiu9EP3Rou.RtC2gKC0neyDgM/D5gGBzZwfCUiVoLAj.rWjEmSIwkIe2sKI0DpUusTDn1:17260:0:99999:7:::

     

     

    三、制作Ramdisk文件系统

    #!/bin/bash
    
     
    rm -rf ramdisk*
    
    sudo dd if=/dev/zero of=ramdisk bs=1k count=8192
    
    sudo mkfs.ext4 -F ramdisk
    
    sudo mkdir -p ./initrd
    
    sudo mount -t ext4 ramdisk ./initrd
    sudo cp rootfs
    /* ./initrd -raf sudo mknod initrd/dev/console c 5 1 sudo mknod initrd/dev/null c 1 3 sudo umount ./initrd sudo gzip --best -c ramdisk > ramdisk.gz sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img rm ramdisk ramdisk.gz initrd -rf

      把该脚本拷贝到rootfs同一目录下,执行该脚本制作Ramdisk文件系统。生成的ramdisk.img就是我们需要的Ramdisk文件系统。

    github:https://github.com/xiaozhao777/busybox-1.26.2

    参考:

    https://www.cnblogs.com/AP0904225/p/7020418.html

    https://blog.csdn.net/sinat_20006769/article/details/79059317

     

  • 相关阅读:
    10.汇编语言--伪指令(offset、prt、lengthof)
    9.汇编语言--算数运算,标记寄存器
    8.汇编语言--数据传输指令mov等
    7.汇编语言--定义数据类型、数组
    6.汇编语言--汇编基本元素、寄存器、内存初步调试
    5.汇编语言--输入输出
    4.汇编语言--更为简便的使用win32-api
    3.汇编语言--x86处理器架构
    微信小程序获取input输入框里面的value值
    学习微信小程序遇到的坑 ---跳转
  • 原文地址:https://www.cnblogs.com/chu-yi/p/10458375.html
Copyright © 2011-2022 走看看