0001 制作busybox

busybox 版本 :busybox-1.29
操作系统版本 :ubuntu 16.0.4.7
arm_gcc版本 :gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gcc

制作busybox 文件系统

  1. 解压busybox

     tar -xvf busybox-1.29.tar.gz
    
  2. 创建busybox 编译脚本

     cd busybox-1.29
     vim build_busybox.sh
    

    build_busybox.sh

     #!/bin/sh
     export ARCH=arm
     export CROSS_COMPILE=arm-linux-gnueabihf-
     export PATH=$PATH:/home/li/linux/gcc-v/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
     
     
     #make clean
     make defconfig
     make menuconfig
     make -j6
     make install CONFIG_PREFIX=/home/li/linux/nfs/rootfs
    
  3. 创建 文件系统安装路径

     mkdir /home/li/linux/nfs/rootfs
    
  4. 修改 busybox源码 支持中文

    //修改printable_string.c
    修改const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)

     vim  libbb/printable_string.c
     //注释掉 31行
     /*if (c >= 0x7f)
     	break;*/
     //注释45行修改为	
     /*if (c < ' ' || c >= 0x7f)*/
     if (c < ' ' )
    

    //修改unicode.c
    修改static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t *stats, const char *src, unsigned width, int flags)

     vim  libbb/unicode.c
     //注释掉 1022行
     //*d++ = (c >= ' ' && c < 0x7f) ? c : '?';
     *d++ = (c >= ' ') ? c : '?';
     //注释掉 1031行
     //if (c < ' ' || c >= 0x7f)
     if (c < ' ')
    
  5. 编译busybox
    ./build_busybox.sh

    busybox menuconfig 设置

     Location:
     	-> Settings
     		-> Build static binary (no shared libs)  // 使用共享库   		不选
     		-> vi-style line editing commands	//vi风格的行编辑命令 		可选
     		-> Support Unicode //选中
     			-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables 选中
     -> Linux Module Utilities
     		-> Simplified modutils			//简化模块						不选
     -> Linux System Utilities
     		-> mdev (16 kb)			 										全部选中,默认都是选中的
    
  6. 完善根文件系统

     //创建库文件夹
     mkdir /home/li/linux/nfs/rootfs/lib
     mkdir /home/li/linux/nfs/rootfs/usr/lib
    

    //拷贝 arm_linux_gcc libc/lib/*----->/rootfs/lib/

     cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linuxgnueabihf/libc/lib/		
     cp  *so* *.a  /home/li/linux/nfs/rootfs/lib/ -d
     rm ld-linux-armhf.so.3
     cp  ld-linux-armhf.so.3  /home/li/linux/nfs/rootfs/lib
    

    //拷贝 arm_linux_gcc lib/*----->/rootfs/lib/

     cd  /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib/
     cp  *so* *.a   /home/li/linux/nfs/rootfs/lib/ -d
    

    //拷贝 arm_linux_gcc /usr/lib/*----->/rootfs//usr/lib

     cd  /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/
     cp *so* *.a   /home/li/linux/nfs/rootfs/usr/lib/ -d
    
  7. 创建文件夹

     cd  /home/li/linux/nfs/rootfs/
     mkdir dev  proc  mnt  sys  tmp  root
    
  8. 设置uboot参数

     ///nfs  加载  启动参数
     //设置网络信息
     setenv serverip 192.168.1.102
     setenv ipaddr 192.168.1.29
     setenv ethaddr 00:04:9f:04:d2:35
     setenv gatewayip 192.168.1.1
     setenv netmask 255.255.255.0
     
     //设置nfs目录
     setenv nfsroots /home/li/linux/nfs/
     
     //nfs加载内核 加载所设备树
     setenv  bootcmd 'nfs ${loadaddr} ${serverip}:${nfsroot}${image};nfs ${fdt_addr} ${serverip}:${nfsroot}${fdt_file};bootz ${loadaddr} - ${fdt_addr};'
     //nfs启动  不能存在变量否则无法正常启动
     setenv  bootargs 'console=tty1 video=mxcfb0:dev=hdmi,1920x1080@60,bpp=32 console=ttymxc3,115200 root=/dev/nfs rw  nfsroot=192.168.1.101:/home/li/linux/nfs/rootfs ip=192.168.1.102:192.168.1.101:192.168.1.1:255.255.255.0::eth0:off'
     saveenv
    

完善文件系统

  1. 创建启动脚本 rcS

    cd /home/li/linux/nfs/rootfs
    sudo mkdir ./etc ./etc/init.d
    sudo  touch ./etc/init.d/rcS
    sudo vim ./etc/init.d/rcS
    

    rcS
    a. PATH 环境变量保存着可执行文件可能存在的目录
    b. LD_LIBRARY_PATH 环境变量保存着库文件所在的目录
    c. export 来导出上面这些环境变量

    mount -a 挂载所有文件系统

    #!/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH			
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib		
    export PATH LD_LIBRARY_PATH							
    mount -a											
    mkdir /dev/pts										
    mount -t devpts devpts /dev/pts						
    echo /sbin/mdev > /proc/sys/kernel/hotplug			
    mdev -s
    ///
    PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH			//PATH 环境变量保存着可执行文件可能存在的目录
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib		//LD_LIBRARY_PATH 环境变量保存着库文件所在的目录
    export PATH LD_LIBRARY_PATH							//导入环境变量
    mount -a											//挂载所有文件系统								
    mkdir /dev/pts										//创建挂载点
    mount -t devpts devpts /dev/pts						//挂载devpts    挂载到/dev/pts 目录		----->文件系统由文件/etc/fstab 来指定		
    //mdev 来管理热插拔设备  下面两句使能linux内核再/dev目录中自动创建节点  
    //即是把/sbin/mdev写到/proc/sys/kernel/hotplug文件里
    echo /sbin/mdev > /proc/sys/kernel/hotplug			
    mdev -s
    
  2. rcS添加权限

     chmod 777 rcS
    
  3. 创建 文件系统信息/etc/inittab文件(初始化文件系统)

    idrunlevelstypeactionprocess
    令的标识符保留动作具体的动作

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

    动作描述
    sysinit在系统初始化的时候 process 才会执行一次。
    respawn当 process 终止以后马上启动一个新的。
    askfirst和 respawn 类似,在运行 process 之前在控制台上显示“Please press Enter to activate this console.”。只要用户按下“Enter”键以后才会执行 process。
    wait告诉 init,要等待相应的进程执行完以后才能继续执行。
    once仅执行一次,而且不会等待 process 执行完成
    restart当 init 重启的时候才会执行 procee。
    ctrlaltdel当按下 ctrl+alt+del 组合键才会执行 process。
    shutdown关机的时候执行 process。
    sysinit
    sysinit
     sudo touch ./etc/inittab
     sudo vim ./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
    
     ///
     ::sysinit:/etc/init.d/rcS			//在系统初始化的时候  执行/etc/init.d/rcS。
     console::askfirst:-/bin/sh			//console 作为控制台终端,也就是 ttymxc0
     ::restart:/sbin/init				//重启运行运行/sbin/init
     ::ctrlaltdel:/sbin/reboot			//  ctrl+alt+del 组合键的话就运行/sbin/reboot
     ::shutdown:/bin/umount -a -r		//关机卸载 各个文件系统
     ::shutdown:/sbin/swapoff -a			// 关机执行/sbin/swapoff
    
    1. 创建 文件系统信息/etc/fstab 文件
    file systemmount pointtypeoptionsdumppass
    备名称挂载点文件系统类型挂载选项备份设置磁盘检测设置

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

     sudo touch ./etc/fstab
     sudo vim ./etc/fstab
     #<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
    

脚本启动流程

在busybox中 init作为其他进程的控制这和发起者,当init进程开始创建子进程时,会解析 /etc/inittab 文件,创建进程,执行开机启动脚本 /etc/init.d/rcS,在rcS中会导入环境变量,指定控制台(如果没有指定控制台,则使用制定的否则使用默认的/dev/console),挂载文件系统,会调用/etc/fstab获取的文件系统加载信息,最后加载文件系统。

	init
		-->./etc/inittab
			-->/etc/fstab
		-->/etc/reS
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值