用busybox构建最小根文件系统详解

1、busybox源码获取

(1)busybox官网下载地址:https://busybox.net/;
(2)建议下载busybox的版本:尽量和你使用的编译环境(比如:Ubuntu)的版本相近,版本差太多可能需要解决一些编译时候的兼容问题;

2、busybox原理分析

参考博客:《busybox的实现原理分析(C语言实现简易版的busybox)》;

3、busybox编译

3.1、配置busybox

Busybox Settings--->
	Build Options--->
		[*]Build BusyBox as a static binary(no shared libs)

		
Busybox Library Tuning--->
	[*]vi-style line editing commands
	[*]Fancy shell prompts
	
	
Linux Module Utilities--->
	[ ]Simplified modutils
	[*]insmod
	[*]rmmod
	[*]lsmod
	[*]modprobe
	[*]depmod

	
Linux System Utilities--->[*]mdev
	[*]Support /etc/mdev.conf
	[*]Support subdirs/symlinks
	[*]Support regular expressions substitutions when renaming dev
	[*]Support command execution at device addition/removal
	[*]Support loading of firmwares

3.2、编译

root@Ubuntu:~$ ls
busybox-1.24.1  busybox-1.24.1.tar.bz2
root@Ubuntu:~$
root@Ubuntu:~$ cd busybox-1.24.1/
root@Ubuntu:~$ make ARCH=arm CROSS_COMPILE=arm-linux-

解压开busybox源码后,在编译时指定CPU架构和交叉编译工具链

4、busybox构建根文件系统

Busybox Settings--->
	Installation Options ("make install" behavior)--->

用busybox构建最小根文件系统详解_第1张图片

(1)配置安装目录:"make menuconfig"里可以按照上面的选项去选择busybox安装目录;
(2)配置好安装目录,执行"make install"就会将busybox、链接文件、linuxrc等拷贝到指定目录,构成文件夹形式的最小文件系统;

5、完善根文件系统

5.1、添加inittab文件

#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init

用busybox构建最小根文件系统详解_第2张图片
用busybox构建最小根文件系统详解_第3张图片

(1)在未添加inittab文件前,系统可以起来,可以进入命令行,但是系统起来后会不停的刷报错的打印;
(2)在添加上面的inittab文件后,系统不会再刷"can’t open /dev/tty3: No such file or directory";
(3)inittab文件的内容解读可以参考博客:《嵌入式系统开发——文件系统中inittab文件、rcS文件、fstab文件、profile文件详解》;

5.2、添加fstab文件

# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# 	 	 	 	 	 	
	proc 			/proc 			proc 	defaults 	0 		0
	sysfs 			/sys 			sysfs 	defaults 	0 		0
	tmpfs 			/var 			tmpfs 	defaults 	0 		0
	tmpfs 			/tmp 			tmpfs 	defaults 	0 		0
	tmpfs 			/dev 			tmpfs 	defaults 	0 		0

fstab是开启自动挂载文件系统的,需要在文件系统中手动创建好根目录下的"sys、proc、dev等"挂载点;

5.3、添加rcS文件

#!/bin/sh
# 设置PATH变量
PATH=/sbin:/bin:/usr/sbin:/usr/bin

# 将系统设置为单用户模式
runlevel=S
prevlevel=N

# 设置umask的值,和创建文件的默认权限相关
umask 022

# 到处为环境变量
export PATH runlevel prevlevel

#解析/etc/fstab文件并挂载分区;
mount -a

# 开启mdev,和驱动在/dev目录下生成设备节点有关
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

#指定主机名保存在/etc/sysconfig/HOSTNAME文件中
/bin/hostname -F /etc/sysconfig/HOSTNAME

#设置eth0的ip为192.168.1.10
ifconfig eth0 192.168.1.10

5.4、设置主机名

用busybox构建最小根文件系统详解_第4张图片

(1)创建/etc/sysconfig/HOSTNAME 文件,里面保存主机名,可以用hostname命令查看;
(2)这个文件名和路径是与rcS文件中的设置相对应的;

5.5、添加profile文件

# Ash profile
# vim: syntax=sh

# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\# '
PATH=$PATH

HOSTNAME=`/bin/hostname`

export USER LOGNAME PS1 PATH

用busybox构建最小根文件系统详解_第5张图片

添加上面的profile文件后,可以在终端的命令行看到设置的主机名和登录的账户名;

5.6、增加用户登录

参考博客:《嵌入式设备文件系统构建——增加用户登录功能》;

5.7、动态链接库的拷贝

(1)将程序运行需要依赖的动态库拷贝到/lib或者/usr/lib目录下;
(2)最少是需要将交叉编译工具链的动态库拷贝到/lib目录下,不然编译的程序都没法在板子上运行;

6、用NFS挂载构建的根文件系统

参考博客:《用NFS挂载根文件系统详解(带nfs版本不兼容问题的解决方法)》;

推荐

再难的项目都是基础知识的复杂运用,基础是最重要的。给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转
在这里插入图片描述
在这里插入图片描述

你可能感兴趣的:(嵌入式文件系统,linux,busybox,文件系统)