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
解压压缩包

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

在这里插入图片描述

修改顶层Makefile

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

#164行
CROSS_COMPILE ?= arm-linux-gnueabi- 
#190行
ARCH ?= arm

在这里插入图片描述

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

    make defconfig
    
  • 配置menuconfig 执行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:
	-> Settings
		-> Support Unicode //选中
			-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中

在这里插入图片描述

Location:
	->Coreutils
		->sync

在这里插入图片描述

Location:
	->Linux System Utilities
		->nsenter

在这里插入图片描述

编译与安装

执行编译命令:

make -j4

安装命令:

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

安装结果为:

在这里插入图片描述

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

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

    先在rootfs下创建lib文件

    mkdir lib
    

    后拷贝库文件

    # 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
    
  • 向rootfs下/usr/lib添加库

    先在rootfs的use下创建lib文件

    mkdir lib
    

    拷贝库

    # 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
    

至此文件系统已经移植完成,通过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
    
  • 创建/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.添加内容
    #<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
    
  • 创建/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
    

    第 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'
    

    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'
    

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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
armgcc交叉编译的文件无法运行可能有多种原因,以下是一些常见的解决方法: 1. 确认交叉编译器是否正确安装:在命令行中输入arm-none-linux-gnueabi-gcc -v,确认是否能够正确输出版本信息。如果不能输出,则需要重新安装交叉编译器。 2. 确认编译选项是否正确:在编译时需要指定正确的交叉编译器和选项,例如:arm-none-linux-gnueabi-gcc -o output_file input_file.c -static。如果编译选项不正确,可能会导致生成的文件无法运行。 3. 确认目标平台是否正确:在交叉编译时需要指定目标平台的架构和操作系统,例如:arm-none-linux-gnueabi-gcc -march=armv7-a -mtune=cortex-a9 -mfloat-abi=softfp -mfpu=neon -o output_file input_file.c。如果目标平台不正确,可能会导致生成的文件无法运行。 4. 确认库文件是否正确链接:在交叉编译时需要指定正确的库文件路径和链接选项,例如:arm-none-linux-gnueabi-gcc -o output_file input_file.c -L/path/to/lib -lmylib。如果库文件链接不正确,可能会导致生成的文件无法运行。 5. 确认文件权限是否正确:在生成可执行文件后,需要使用chmod命令修改文件权限,例如:chmod +x output_file。如果文件权限不正确,可能会导致无法运行。 针对iMX287A交叉编译环境搭建,需要据具体的操作系统和开发环境来选择交叉编译器和库文件等。一般的步骤如下: 1. 下载安装交叉编译器:可以从官方网站下载适用于iMX287A的交叉编译器,例如imx28-gcc-4.6.2.tar.bz2。 2. 配置环境变量:将交叉编译器的路径添加到PATH环境变量中,例如:export PATH=/path/to/cross-compiler/bin:$PATH。 3. 下载安装库文件:需要据具体的需求下载并安装iMX287A所需要的库文件,例如libxml2、zlib、openssl等。 4. 配置编译选项:在编译时需要指定正确的交叉编译器和选项,例如:arm-none-linux-gnueabi-gcc -o output_file input_file.c -I/path/to/include -L/path/to/lib -lmylib。 5. 生成可执行文件:使用交叉编译器生成可执行文件,例如:arm-none-linux-gnueabi-gcc -o output_file input_file.c。 6. 调试和测试:将生成的可执行文件烧录到iMX287A开发板上,并进行调试和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值