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)--->
(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
(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).
#
# <file system> <mount point> <type> <options> <dump> <pass>
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、设置主机名
(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
添加上面的profile文件后,可以在终端的命令行看到设置的主机名和登录的账户名;
5.6、增加用户登录
参考博客:《嵌入式设备文件系统构建——增加用户登录功能》;
5.7、动态链接库的拷贝
(1)将程序运行需要依赖的动态库拷贝到/lib或者/usr/lib目录下;
(2)最少是需要将交叉编译工具链的动态库拷贝到/lib目录下,不然编译的程序都没法在板子上运行;
6、用NFS挂载构建的根文件系统
参考博客:《用NFS挂载根文件系统详解(带nfs版本不兼容问题的解决方法)》;
推荐
再难的项目都是基础知识的复杂运用,基础是最重要的。给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转