Linux根文件系统:搭建简易的嵌入式Linux根文件系统

(注:本文参考资料:朱有鹏嵌入式课程。本文为个人学习记录,如有错误,欢迎指正。)

1. busybox简介

Busybox是一个开源项目,它将众多的UNIX命令集合进一个很小的可执行程序中。Busybox中各种命令与相应的GNU工具相比,所能提供的选项比较少,但是也足够一般的应用了。Busybox按模块设计,可以很容易地加入、去除某些命令,或增减命令的某些选项。Busybox主要用于嵌入式系统。

本文应用busybox来构建一个简易的嵌入式Linux根文件系统。目的在于通过搭建过程,了解根文件系统的工作原理。

2. 搭建步骤

Step1:获取busybox源码

从busybox官网下载busybox的源码文件,本文选取的busybox版本号为:busybox-1.24.0。

Step2:配置、编译、安装busybox

1)修改busybox根目录下的Makefile文件,重新定义CPU架构、交叉编译工具链的前缀。

ARCH = arm
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

2)在Ubuntu终端运行“make  menuconfig”命令,进入busybox配置图形界面配置busybox。具体进行如下配置:

Busybox Settings --->
//配置busybox的编译过程为静态编译
Build Options --->
[*]Build BusyBox as a static binary(no shared libs)


//优化busybox的shell界面
Busybox  Library Tuning --->
[*]vi-style line editing commands
[*]Fancy shell prompts

//配置busybox的安装路径
Installation Options ("make install" behavior)  --->
 (/home/sai/rootfs-test/rootfs/myrootfs) BusyBox installation prefix

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)编译busybox,在Ubuntu终端执行“make”命令。

4)在Ubuntu执行“make  install”命令,busybox将被安装至指定目录。安装完成后,进入安装目录,其中新增了一些子目录,/bin、/linuxrc、/sbin、/usr。

Step3:添加inittab文件

手工创建/etc目录,并在/etc目录下添加inittab文件。

内核成功挂载根文件系统之后,运行根目录下的第一个用户进程linuxrc。linuxrc将解析inittab文件,运行操作系统的配置脚本,对Linux系统进行初始化。inittab文件的具体介绍详见。

本文的inittab文件具体内容如下:

#first:run the system script file
::sysinit:/etc/init.d/rcS                #系统开机或重新启动,执行rcS文件
::askfirst:-/bin/login                   #系统启动后,运行登录程序
::ctrlaltdel:-/sbin/reboot             #按下组合键“ctrl+alt+del”,重启Linux系统

#umount all filesystem
::shutdown:/bin/umount -a -r     #系统关机时,卸载所有文件系统

#restart init process
::restart:/sbin/init                      #重启init进程

Step4:添加rcS脚本文件

手工创建/etc/init.d目录,并在/etc/init.d目录下添加rcS脚本文件,该文件是系统的初始化文件。本文的rcS脚本文件具体内容如下:

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin     #初始化环境变量PATH,操作系统执行程序默认到PATH指定的目录下寻找该程序

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

umask 022#指定当前用户在创建文件时的默认权限 

export PATH runlevel prevlevel  #导出环境变量

mount -a                 #挂载/etc/fstab文件中指定的文件系统

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s       #生成相应的/dev目录下的设备文件

#从/etc/sysconfig/HOSTNAME文件中读取主机名,命令行下运行hostname即可显示当前系统的主机名
/bin/hostname -F /etc/sysconfig/HOSTNAME  

手工创建/etc/sysconfig/HOSTNAME文件,并在其中写入主机名。

210Linux   //自定义主机名

Step5:添加fstab文件

在/etc目录下添加fstab文件,该文件中指定了系统需要挂载的文件系统。本文的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

为保证挂载成功,在根目录下手工创建/proc、/sys、/var、/tmp、/dev目录。Step6:添加profile文件

在/etc目录下添加profile文件。

profile文件也将被linuxrc进程调用,在Linux终端命令行提示符中显示主机名。本文的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

Step6:添加用户登录文件(passwd、shadow文件)

passwd文件中存储的是用户的密码设置,shadow文件中存储的是加密后的密码。

直接复制ubuntu系统中的/etc/passwd和/etc/shadow文件到当前制作的根目录下,然后再做修改即可。

修改后passwd文件内容如下:

root:x:0:0:root:/root:/bin/sh     #登录成功后,进入/root目录

修改后passwd文件内容如下:

root::17680:0:99999:7:::     #root用户密码为空

在根目录下创建/root目录。重新启动即可使用 root 登录,登录后使用 passwd root 命令设置用户密码。

Step7:拷贝动态链接库

在根目录下创建lib目录,并将交叉编译工具链arm-2009q3的动态链接库拷贝至/lib目录下。
//*so*是过滤掉非动态链接库的文件,-rdf是保证符号链接仍是符号链接
cp  /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/*so*   ./   -rdf   
使用“ arm-linux-strip”去掉链接库中的符号信息,缩小库的体积。

3. 测试

(1)挂载测试

将所创建的根文件系统的文件夹拷贝至NFS服务器所在目录,并在uboot中设置bootargs参数。启动后即可进入Linux终端。详细步骤见。

(2)应用程序运行测试

编写helloword程序,并将其分别编译为一个动态链接可执行程序、静态链接可执行程序。

arm-none-linux-gnueabi-gcc hello.c -o hello_statci -static   //静态编译

arm-none-linux-gnueabi-gcc hello.c -o hello_dynamic         //动态编译

将可执行程序拷贝至/root目录下,在开发板的Linux终端运行,两个程序都运行成功。

原文地址:https://www.cnblogs.com/linfeng-learning/p/9285544.html