ARM技术论坛
直播中

嵌入式小能手

2年用户 1511经验值
擅长:嵌入式技术
私信 关注
[经验]

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

一、添加目录
使用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/cortexa7\hf-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-n\eon-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/cortexa7\hf-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/bootf\loppy/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组合键时执行子进程
(四):要执行的程序,它可以是可执行程序,也可以是脚本
五、修改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

更多回帖

发帖
×
20
完善资料,
赚取积分