系统移植-(四)根文件系统的制作、编译和移植:busybox

根文件系统 简介

根文件系统:系统运行所必须依赖的一些文件,eg:脚本、库、配置文件等;
本质就是目录和文件。

根文件系统镜像:将根文件系统按照某种格式进行打包压缩后,生成文件ramdisk.img
文件系统:一种管理和访问磁盘的软件机制,不同文件系统管理和访问磁盘的机制不同。

根文件系统 -制作工具:busybox

(1)busybox 特点
短小精悍,版本更新较快,但是版本之间差异不大。

(2)如何获取busybox
https://busybox.net/downloads/

根文件系统 -各目录介绍

各文件的功能解析:

	bin:    命令文件(通过busybox工具制作)
	dev:    设备文件(被操作系统识别的设备才有对应的文件,即设备运行时)
	etc:    配置文件(配置内核相关的一些信息)
	lib:    库文件、比如C的标准库(从交叉编译工具链中复制的)
	linuxrc:根文件系统被挂载后运行的第一个程序(通过busybox工具制作)
	mnt:    共享目录(非必要)比如挂载SD卡等时将SD卡挂载在该目录
	proc:   与进程相关的文件(当有进程运行时才会有文件)
	root:   用户权限(板子本身就是以root用户运行)
	sbin:   超级用户命令、一般用户不可用(板子本身是超级用户  通过busybox工具制作)
	sys:    系统文件(系统运行时,系统加载后才会有文件)
	tmp:    临时文件(比如插入新的设备时会产生临时文件)
	usr:    用户文件(通过busybox工具制作)
	var:    存放下载的文件和软件 (可有可无)

常用的目录文件:
mkdir lib mnt proc root sys tmp var 

rootfs制作流程

(一)配置交叉编译工具链

使用busyBox工具制作根文件系统,需要重新配置交叉编译工具链。
步骤:

  1. 在ubuntu的家目录(~)下,创建toolchain
    mkdir toolchain
  2. 拷贝gcc-4.6.4.tar.xz到toolchain目录下
    cp 共享目录/gcc-4.6.4.tar.xz ~/toolchain
  3. 解压缩交叉编译工具链
    tar -vxf gcc-4.6.4.tar.xz
  4. 配置环境变量
    打开 sudo vi /etc/bash.bashrc
    在最后一行添加以下内容: 修改为自己的路径
    export PATH=$PATH:/homelinux/toolchain/gcc-4.6.4/bin/
  5. 使环境变量立即生效
    source /etc/bash.bashrc
  6. 测试交叉编译工具链是否安装成功
    切换完交叉编译工具链,ubuntu的终端需要重新开
    arm-none-linux-gnueabi-gcc -v
    打印以下内容,表示成功:
    gcc version 4.6.4 (Sourcery G++ Lite 2010.09-50)

(二)使用busybox工具制作rootfs根文件系统

  1. 拷贝busybox-1.31.1.tar.bz2到ubuntu的家目录下
    cp /mnt/hgfs/share/busybox-1.31.1.tar.bz2 ~/

  2. 对根文件系统进行解压缩,并切换到busybox-1.31.1目录下
    tar -vxf busybox-1.31.1.tar.bz2
    cd busybox-1.31.1

  3. 分析README(基本无用,百度了解的多)

  4. 通过make help 获取编译的帮助信息
    1)清除中间文件
    make clean - delete temporary files created by build
    make distclean - delete all non-source files (including .config)
    2)编译
    make all - Executable and documentation
    3)通过图形化界面的配置
    make menuconfig - interactive curses-based configurator
    4)安装和卸载
    make install - install busybox into CONFIG_PREFIX
    make uninstall

  5. 修改Makefile,配置为交叉编译工具链
    打开Makefile内容:

 164 CROSS_COMPILE ?=  
 190 ARCH ?= $(SUBARCH)  
修改为
 164 CROSS_COMPILE ?=  arm-none-linux-gnueabi-
 190 ARCH ?= arm 
  1. 执行make menuconfig 命令,对busybox进行配置

1)使用静态库,不使用共享库,因为系统没有启动

Settings  --->
	 [*] Build static binary (no shared libs) (NEW) 

2)配置为vi风格的行编辑命令

Settings  --->
	[*]   vi-style line editing commands (NEW)

3) 配置根文件系统的安装路径

Settings  --->
    (./_install) Destination path for 'make install'
修改./_install 为 /home/linux/rootfs

4)配置支持驱动模块化的命令

Linux Module Utilities  ---> 
	 [ ] Simplified modutils  

此前前边默认是*,将*修改为空

 [*] depmod (27 kb) (NEW)          
 [*] insmod (22 kb) (NEW)          
 [*] lsmod (1.9 kb) (NEW)          
 [*] Pretty output (NEW)         
 [*] modinfo (24 kb) (NEW)         
 [*] modprobe (28 kb) (NEW)        
 [*] Blacklist support (NEW)     
 [*] rmmod (3.3 kb) (NEW)  
  1. 对源码进行编译
    make / make all

  2. 安装根文件系统到/home/linux/rootfs
    make install

  3. 测试根文件系统,对根文件系统进行部署
    1)首先将nfs目录的的rootfs跟换一个其他的名字
    cd ~/nfs
    mv rootfs rootfs-ok
    2)将自己制作的rootfs文件拷贝到~/nfs
    cp ~/rootfs ~/nfs -raf

  4. 重启开发板,测试rootfs是否可以正常使用
    前提,使用tftp下载uImage
    使用nfs挂载根文件系统

1)挂载成功,但是打印一下错误信息:

can't run '/etc/init.d/rcS': No such file or directory
	can't open /dev/tty2: No such file or directory
	can't open /dev/tty3: No such file or directory
	can't open /dev/tty4: No such file or directory

解决办法:

cd ~/nfs/rootfs 
创建dev文件夹,创建etc/init.d文件夹,
在etc/init.d目录下创建rcS文件
mkdir -p  etc/init.d 
mkdir dev 
cd etc/init.d 
touch rcS

2)继续重启开发板,进行测试出现以下问题:
can’t run ‘/etc/init.d/rcS’: Permission denied

此问题解决办法:修改rcS的权限最大
chmod 777 rcs
在rcS文件中必须添加以下内容:

#!/bin/sh 
/bin/mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug 
/sbin/mdev -s  

解释:
mount -a:系统会自动解析fstab配置文件,系统根据此配置文件进行一系列的挂接动作
echo /sbin/mdev > /proc/sys/kernel/hotplug:向文件/proc/sys/kernel/hotplug写入字符串"/sbin/mdev"
其实就是告诉内核驱动将来创建设备文件的程序是/sbin/mdev
mdev -s:系统启动,将内核驱动对应的设备文件进行自动创建 。

	can't open /dev/tty2: No such file or directory
	can't open /dev/tty3: No such file or directory
	can't open /dev/tty4: No such file or directory
	此问题,后边会解决
	
	再次重启开发板:

3)在根文件系统的etc目录下创建文件fstab inittab

cd etc 
touch fstab 
touch inittab 

打开inittab文件添加以下内容:

::sysinit:/etc/init.d/rcS 
::askfirst:-/bin/sh
::restart:/sbin/init 
::ctrlaltdel:/sbin/reboot 

解释:系统启动的流程

打开fstab文件添加以下内容

#device mount-point type options dump fsck orde
proc   /proc  proc  defaults  0  0
tpfs  /tmp   tmpfs defaults  0  0
sysfs  /sys   sysfs defaults  0  0
tmpfs  /dev   tmpfs defaults  0  0 

解析:
第一列:设备类型
第二列:挂载点
第三列:类型
第4,5,6列:访问权限

再次重启开发板,基本上成功,

4)创建其他文件:
mkdir lib mnt proc root sys tmp var
再次重启开发板,根文件系统制作成功。

5)添加用户名
在根文件系统的etc目录下创建profile文件,
打开profile文件,添加以下内容:

export HOSTNAME=HQYJ
export USER=root
export HOME=ot
#export PS1="\[\u@\h \W\ ]\$ "
#cd root
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

重启开发板

6)移植共享库到根文件系统中,

在ubuntu中创建test.c 编写以下代码

#include <stdio.h>
int main(int argc, char *argv[])
{
	
	printf("hello world!\n");
	return 0;
}
  • 使用交叉编译工具链编译test.c生成test可执行程序:
    arm-none-linux-gnueabi-gcc test.c -o test

  • 拷贝test可执行程序到新制作的文件系统中
    cp test ~/nfs/rootfs

重启开发板,在超级终端终端上,运行应用程序test
./test出现以下错误提示:
-/bin/sh: ./test: not found

问题原因:缺少应用程序运行必要的动态库。
解决办法:
将交叉编译工具链中的库,拷贝到根文件系统的lib目录

cp /home/linux/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot/lib/*  
~/nfs/rootfs/lib
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值