• IMX6Q的SD卡启动使用教程【超完整】(2):busybox交叉编译根文件系统


    在上一篇文章【(1)uboot与kernel编译移植】中需要将自己的根文件系统通过NFS挂载或SD加载的形式来启动linux系统,本文将介绍如何制作是属于自己的根文件系统。

    下载busybox资源

    busybox下载地址为busybox资源,本教程下载版本为busybox-1.29.1.tar.bz2

    设置编译器

    在交叉编译前,需要在虚拟机上准备好自己的交叉编译工具链,本文如下

    export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin
    
    • 1
    解压压缩包

    解压压缩包:tar -xvf busybox-1.29.1.tar.bz2

    在这里插入图片描述

    修改顶层Makefile

    修改顶层Makefile,添加编译器与芯片架构信息:

    #164行
    CROSS_COMPILE ?= arm-linux-gnueabi- 
    #190行
    ARCH ?= arm
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    配置menuconfig
    • 根我们编译 Uboot、 Linux kernel 一样,我们要先对 busybox 进行默认的配置 。

      make defconfig
      
      • 1
    • 配置menuconfig 执行make menuconfig

      Location:
      	-> Settings
      		-> Build static binary (no shared libs)
      
      • 1
      • 2
      • 3

    在这里插入图片描述

    Location:
    	-> Settings
    		-> vi-style line editing commands
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    Location:
    	-> Linux Module Utilities
    		-> Simplified modutils
    
    • 1
    • 2
    • 3

    在这里插入图片描述

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

    在这里插入图片描述

    Location:
    	-> Settings
    		-> Support Unicode //选中
    			-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    Location:
    	->Coreutils
    		->sync
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    Location:
    	->Linux System Utilities
    		->nsenter
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    编译与安装

    执行编译命令:

    make -j4
    
    • 1

    安装命令:

    # CONFIG_PREFIX安装目录需要自己创建
    make install CONFIG_PREFIX=/home/wcs/4412/rootfs/rootfs   
    
    • 1
    • 2

    安装结果为:

    在这里插入图片描述

    添加库文件
    • 向rootfs下/lib添加库

      将编译器路径下的库,添加到向rootfs下/lib添加库。

      先在rootfs下创建lib文件

      mkdir lib
      
      • 1

      后拷贝库文件

      # 1.进入编译器库目录
      cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/lib
      
      #2.拷贝库
      cp *.so* *.a /home/wcs/4412/rootfs/rootfs/lib -d
      
      # 3.进入编译器库目录
      cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/lib
      
      #4.拷贝库
      cp *.so* *.a /home/wcs/4412/rootfs/rootfs/lib -d
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 向rootfs下/usr/lib添加库

      先在rootfs的use下创建lib文件

      mkdir lib
      
      • 1

      拷贝库

      # 1.进入编译器库目录
      cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/usr/lib
      
      #2.拷贝库
       cp *.so* *.a /home/wcs/4412/rootfs/rootfs/usr/lib/ -d
      
      • 1
      • 2
      • 3
      • 4
      • 5

    至此文件系统已经移植完成,通过NFS挂载来验证,其结果为:

    在这里插入图片描述

    完善文件系统
    • 在系统起来时,报can't run '/etc/init.d/rcS': No such file or directory,需创建文件/etc/init.d/rcS

      rcS 是个 shell 脚本, Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件的脚本文件。

      # 1.创建etc目录
      mkdir etc
      
      # 2.创建init.d目录
      mkdir init.d
      
      # 3.创建rcS文件
      vim rcS
      
      # 4.rcS文件添加内容
      #!/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 #命令来挂载所有的文件系统,这些文件系统由文件/etc/fstab 来指定
      mkdir /dev/pts #创建目录/dev/pts,然后将 devpts 挂载到/dev/pts 目录中。
      mount -t devpts devpts /dev/pts 
      mdev -s
      
      # 5.修改权限
      chmod 777 rcS
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
    • 创建/etc/fstab文件

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

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

      # 1.创建fstab文件
      mkdir fdtab
      
      # 2.添加内容
      #     
      proc /proc proc defaults 0 0
      tmpfs /tmp tmpfs defaults 0 0
      sysfs /sys sysfs defaults 0 0
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 创建/etc/inittab文件

      inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。 init 程序会读取/etc/inittab这个文件, inittab 由若干条指令组成。

      # 1.创建inittab文件 
       vim inittab
       
      # 2.添加内容
      #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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      第 2 行,系统启动以后自动运行/etc/init.d/rcS 这个脚本文件。(可设置启动测试脚本)
      第 3 行,将 console 作为控制台终端,也就是 ttymxc0。
      第 4 行,重启的话运行/sbin/init。
      第 5 行,按下 ctrl+alt+del 组合键的话就运行/sbin/reboot,看来 ctrl+alt+del 组合键用于重启系统。
      第 6 行,关机的时候执行/bin/umount,也就是卸载各个文件系统。
      第 7 行,关机的时候执行/sbin/swapoff,也就是关闭交换分区。

    NFS挂载busybox

    使用IMX6Q开发板,通过NFS挂载根文件系统。

    1. 设置虚拟机为NFS服务器。

    2. 修改uboot中的bootargs参数。

      setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=169.254.17.100:/home/wcs/nfs,proto=tcp rw ip=169.254.17.229:169.254.17.100:169.254.17.1:255.255.255.0::eth0:off'
      
      • 1

      169.254.17.229为开发板ip,169.254.17.100虚拟机ip

      setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=169.254.17.100:/home/wcs/nfs,proto=tcp rw ip=169.254.17.229:169.254.17.100:169.254.17.1:255.255.255.0::eth0:off'
      
      • 1

      169.254.17.229为开发板ip,169.254.17.100虚拟机ip

    注:
    本文参考正点原子以及网络教程

  • 相关阅读:
    【C++】【STL】【list类的使用】【list类的模拟实现】
    python 创建虚拟环境
    如何减少const的传染性?
    [NOIP2016 提高组] 蚯蚓
    上线部署流程
    五一“捡钱”,就在这几天!国债逆回购最佳时点来了,如何躺赚6天利息?来看操作攻略
    【docker桌面版】windows使用docker搭建nginx
    QGIS 超级课程:从初学者到专家
    win10删除的文件怎么恢复?恢复靠它
    ASP.NET Core中的缓存
  • 原文地址:https://blog.csdn.net/weixin_43952192/article/details/127622358