• 正文
  • 相关推荐
申请入驻 产业图谱

飞凌嵌入式ElfBoard ELF 1板卡-busybox构建根文件系统之添加必要目录和库

06/23 17:47
595
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、添加目录

使用mkdir分别建立lib、dev、proc、mnt、sys、tmp、root、usr/lib文件夹:

elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir lib

elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir dev

elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir proc

elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir mnt

elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir sys

elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir tmp

elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir root

elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir usr/lib

elf@ubuntu:~/nfs_rootfs/rootfs$ ls

bin  dev  lib  linuxrc  mnt  proc  root  sbin  sys  tmp  usr

二、添加lib库内容

在rootfs目录中,使用如下命令,将交叉编译工具中的lib库复制到lib下:

elf@ubuntu:~/nfs_rootfs/rootfs$ cp -d /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/lib/*so* ./lib

然后继续以下操作,将lib中的ld-linux-armhf.so.3软连接,更改为实体。

删除软连接:

elf@ubuntu:~/nfs_rootfs/rootfs$ rm lib/ld-linux-armhf.so.3

复制实体:

elf@ubuntu:~/nfs_rootfs/rootfs$ cp /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/lib/ld-linux-armhf.so.3 ./lib

三、添加usr/lib库内容

在rootfs目录中,使用如下命令,将交叉编译工具中的/usr/lib库复制到/usr/lib下:

elf@ubuntu:~/nfs_rootfs/rootfs$ cp -rd /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/*so* ./usr/lib

四、添加启动文件

在/busybox/examples/etc文件夹中存在有启动相关的文件,我们将该etc文件夹复制到我们创建的文件系统中:

elf@ubuntu:~/nfs_rootfs/rootfs$ cp -rf /home/elf/work/busybox-1.32.1/examples/bootfloppy/etc/ .

复制完成之后,我们打开etc目录:

elf@ubuntu:~/nfs_rootfs/rootfs$ ls etc/

fstab  init.d  inittab  profile

其中:

inittab是一个存储有初始化配置的文本文件,它有若干行指令所组成,这些指令都按照一定的格式进行书写。内核在经过一系列初始化工作之后,执行的第一个用户进程是init进程,该进程执行程序是sbin/目录下的init程序。init程序会解析inittab文件,获取其中的配置信息,并按照其中配置创建各种子进程。

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

Identifier:run_level:action:process

(一)Identifier:对于busybox来说,表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如省略,则使用与init进程一样的控制台。

(二)run_level:系统运行级别,对于Busybox init程序,这个字段无意义,可以省略。

(三)action:表示init程序如何控制这个子进程。

action字段一般有如下定义:

action定义 执行说明
sysinit 系统启动后最先执行的进程,init程序会等待它执行完成之后,才能执行下一进程
wait Sysinit进程执行结束后执行的第二个进程,init程序会等待它执行完成之后,才能执行下一进程
once Wait进程执行结束后,执行的进程,init程序会等待它执行完成之后,才能执行下一进程
respawn Once进程结束之后,init进程监测发现子进程退出时,重新启动子程序
askfirst 与respawn类似,也是在Once进程结束之后,init进程监测发现子进程退出时,重新启动子程序,不过init进程先输出“Please press Enter to actvie this console”,等用户输入回车键之后才启动子进程
shutdown 重启关闭系统命令时halt/reboot/poweroff/SIGQUIT启动子进程
restart 重启时执行子进程
ctrlatldel 按下Ctr+Alt+del组合键时执行子进程

(四)<process>:要执行的程序,它可以是可执行程序,也可以是脚本

五、修改inittab文件

我们可以打开etc/inittab文件,详细看一下:

::sysinit:/etc/init.d/rcs

::respawn:-/bin/sh

tty2::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount -a -r

::sysinit:/etc/init.d/rcS表示系统启动后会首先运行etc/init.d/rcS文件,该文件是一个脚本文件,在此脚本文件中,我们可以执行一系列初始化操作,比如设置环境变量路径,开启程序,挂载文件系统、配置网络等等。

::respawn:-/bin/sh表示当子进程-/bin/sh退出之后,重新开启。

tty2::askfirst:-/bin/sh表示-/bin/sh交互使用的控制台是tty2,子进程有"-"字符,表示这个程序是可交互的。

::ctrlaltdel:/sbin/unmount -a –r按下组合键后卸载文件系统。

我们将inittab文件进行按照我们想要的功能进行简单修改:

ttymxc0::sysinit:/etc/init.d/rcS

ttymxc0::askfirst:-/bin/sh

::restart:/sbin/init

::crtlaltdel:/sbin/reboot

::shutdown:/sbin/unmount -a -r

::shutdown:/sbin/swaoff -a

然后我们打开init.d/rcS文件:

#! /bin/sh

/bin/mount -a

该脚本文件只有一行命令,我们进行简单修改,增加mdev系统功能,mdev系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件:

#! /bin/sh

mount -a

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

mdev -s

#./usr/my_app

mount –a命令用于挂载文件系统,挂载所有的应该被挂载的文件系统,在busybox中mount -a时busybox会去查找etc/fstab文件系统列表文件,这个文件按照一定的格式列出来所有应该被挂载的文件系统。

接下来的两行命令,是mdev系统功能,mdev系统启动和热插拔 或动态加载驱动程序时,自动创建设备节点。

最后的./usr/my_app是我添加的一个测试程序,系统启动之后,会自动执行该程序,这里先注释掉。

刚才说执行mount –a命令时,busybox会去查找etc/fstab文件系统列表文件,我们打开etc/fstab文件:

proc   /proc    proc    defaults    0    0

可以看到这里只列出一个proc文件系统,我们继续在此文件中添加:

proc   /proc    proc    defaults    0    0

sysfs           /sys    sysfs   defaults    0   0

tmpfs           /tmp    tmpfs   defaults    0   0

tmpfs           /dev    tmpfs   defaults    0   0

最后,在etc目录下还有一个profile文件,增加关于应用程序、库文件的路径环境变量配置:

PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib

export PATH LD_LIBRARY_PATH

相关推荐