搭建I.MX6U的根文件系统rootfs

搭建I.MX6U的根文件系统rootfs

一、下载BusyBox源码

我们可以在BusyBox的官网下载到源码:https://busybox.net/downloads/
例如,我们下载1.29.0版本的busybox-1.29.0.tar.bz2
在这里插入图片描述
在nfs服务器目录下创建rootfs目录,即在Ubuntu的~/imx6ull/nfs目录下创建rootfs目录
在这里插入图片描述
将下载的busybox-1.29.0.tar.bz2复制到~/imx6ull/tools目录下,并解压

tar -vxjf busybox-1.29.0.tar.bz2

然后进入busybox-1.29.0/目录下
在这里插入图片描述

二、编译BusyBox

  1. 修改顶层Makefile,将CROSS_COMPILE和ARCH修改为如下所示:
CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
ARCH ?= arm

在这里插入图片描述
在这里插入图片描述

  1. 添加busybox中文字符支持
    打开busybox-1.29.0/libbb/printable_string.c文件,找到printable_string函数,修改如下:
    在这里插入图片描述
    打开busybox-1.29.0/libbb/unicode.c文件,找到unicode_conv_to_printable2函数,修改如下:
    在这里插入图片描述
  2. 配置Busybox
    busybox-1.29.0/目录下输入 make defconfig 命令预配置busybox,然后通过make menuconfig图形化界面配置,进入Setting->Build static binary (no shared libs),不要选中改选项:
    在这里插入图片描述
    然后是Setting->vi-style line editing commands,将其选中:
    在这里插入图片描述
    然后配置Linux System Utilities->mdev (16 kb) ,确保其全部选中:
    在这里插入图片描述
    最后配置Setting->Support Unicode,确保其选中:
    在这里插入图片描述
    然后保存、退出。
  3. 编译busybox
    配置完成即可以编译,编译结果指定为之前创建的rootfs目录:
make install CONFIG_PREFIX=/home/william/imx6ull/nfs/rootfs/

在这里插入图片描述
在rootfs目录下可以看到busybox工具:
在这里插入图片描述

三、添加lib库

  1. 在rootfs目录下添加lib目录;
    进入之前安装的交叉编译工具链目录:
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/

将此目录下所有的.so和.a文件拷贝到rootfs/lib目录下:

cp *so* *.a /home/william/imx6ull/nfs/rootfs/lib/ -d

我们将复制过去的软链接ld-linux-armhf.so.3删除:rm ld-linux-armhf.so.3
在这里插入图片描述重新在/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib目录下将其重新复制过去:

cp ld-linux-armhf.so.3 /home/william/imx6ull/nfs/rootfs/lib/

然后可以看到,ld-linux-armhf.so.3不再是软连接了
在这里插入图片描述
进入/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib目录下,将此目录下所有的.so和.a文件也拷贝到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/william/imx6ull/nfs/rootfs/lib/ -d

在这里插入图片描述
完成以后,在rootfs/lib目录下
在这里插入图片描述

  1. 在rootfs的usr目录下创建lib目录
    进入/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/目录下,将此目录下所有的.so和.a文件也拷贝到rootfs/lib目录下
cp *so* *.a /home/william/imx6ull/nfs/rootfs/usr/lib/ -d

复制完后,usr/lib目录如下
在这里插入图片描述
库文件添加完成后我们可以看一下这两个目录的大小
在这里插入图片描述

四、创建其他文件夹

在rootfs目录下创建dev、proc、mnt、sys、tmp、root等文件夹:

mkdir dev proc mnt sys tmp root

创建完成后如下
在这里插入图片描述

五、初步测试

在uboot命令行下设置bootargs里的root为:
在这里插入图片描述
设置命令:

=> setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.101:/home/william/imx6ull/nfs/rootfs ip=192.168.1.104:192.168.1.101:192.168.1.1:255.255.255.0::eth0:off'
=> saveenv 

然后使用boot命令启动linux内核
在这里插入图片描述
可以看到,我们进入了根文件系统,说明我们的根文件系统工作了,使用ls命令测试可以看到:
在这里插入图片描述

六、完善根文件系统

在进入系统是有这样一行提示
在这里插入图片描述
说明rootfs还缺少文件

1. 创建/etc/init.d/rcS文件

rcS是个shell脚本,Linux内核启动后需要启动一些服务,而rcS就是规定启动哪些文件的脚本文件。在rootfs中创建/etc/init.d/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
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

创建好文件/etc/init.d/rcS 以后一定要给其可执行权限!
使用如下命令给予/ec/init.d/rcS 可执行权限: chmod 777 rcS

第1 行,表示这是一个 shell 脚本。
第 3 行,PATH 环境变量保存着可执行文件可能存在的目录,这样我们在执行一些命令或者可执行文件的时候就不会提示找不到文件这样的错误。
第4 行,LD_LIBRARY_PATH 环境变量保存着库文件所在的目录。
第5 行,使用export 来导出上面这些环境变量,相当于声明一些“全局变量”。
第 7 行,使用 mount 命令来挂载所有的文件系统,这些文件系统由文件/etc/fstab 来指定,所以我们一会还要创建/etc/fstab 文件。
第8 和9 行,创建目录/dev/pts,然后将devpts 挂载到/dev/pts 目录中。
第11 和12 行,使用 mdev 来管理热插拔设备,通过这两行,Linux 内核就可以在/dev 目录下自动创建设备节点。关于 mdev 的详细内容可以参考 busybox 中的docs/mdev.txt 文档。

设置好以后就重新启动Linux 内核,启动以后如图所示:
在这里插入图片描述

2. 创建/etc/fstab文件

/etc/fstab 里面定义了该挂载哪些文件。
在rootfs 中创建/etc/fstab 文件,fstab 在Linux 开机以后自动配置哪些需要自动挂载的分区,然后输入如下代码:

#<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

创建完成重新启动Linux,结果如下
在这里插入图片描述
可以看出,启动成功,没有错误提示,但是我们需要创建一个文件/etc/inittab。

3. 创建 /etc/inittab文件

inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。init 程序会读取/etc/inittab这个文件,inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的4 个段组成,格式如下:

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

id:每个指令的标识符,不能重复。但是对于 busybox 的init 来说, id 有着特殊意义。对于 busybox 而言 id 用来指定启动进程的控制 tty,一般我们将串口或者 LCD 屏幕设置为控制tty。
runlevels:对 busybox 来说此项完全没用,所以空着。
action:动作,用于指定process可能用到的动作。busybox 支持的动作如图所示:在这里插入图片描述
process:具体的动作,比如程序、脚本或命令等。

参考 busybox 的 examples/inittab 文件,我们也创建一个/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

第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,也就是关闭交换分区。

/etc/initta 文件创建好以后就可以重启开发板即可,至此!根文件系统要创建的文件就已经全部完成了。

七、启动互联网连接

测试能不能和局域网外的网络进行连接,只需要使用ping命令ping一下百度的官网,就可以找到开发板是否能接入互联网。

ping www.baidu.com

如下所示:
在这里插入图片描述
提示测试失败,www.daidu.com是个bad address,即地址不对,出现这个错误是因为地址解析失败了,并没有解析出其对应的IP地址。
我们需要配置域名解析服务器的IP地址,一般域名解析地址可以设置为所处网络处的网关地址,比如192.168.1.1;也可以设置成114.114.114.114,这个是运营商的域名解析地址。
/etc/目录下新建resolv.conf文件,然后输入如下内容:

nameserver 114.114.114.114
nameserver 192.168.1.1

内容很简单,nameserver表示这是个域名服务器,设置了两个域名服务地址。
修改好以后保存退出,重启开发板,重新ping一下百度的官网:
在这里插入图片描述
可见ping百度官网成功了,即域名解析成功了。

发布了62 篇原创文章 · 获赞 13 · 访问量 5572

猜你喜欢

转载自blog.csdn.net/qq_38113006/article/details/104326696