使用BusyBox制作linux根文件系统(CramFS+mdev)

发布者:EuphoricVoyage最新更新时间:2024-08-30 来源: cnblogs关键字:BusyBox  linux  根文件系统 手机看文章 扫描二维码
随时随地手机看文章

操作系统:Ubuntu9.04

内核版本:linux-2.6.24.7  

开发板:博创arm2410s    

交叉编译工具:arm-linux-gcc-4.1.1 

BusyBox:busybox-1.11.1      

CramFS:CramFS-1.1

 

注意:由于要制作的根文件系统使用了mdev(BusyBox简化版的udev),因此,需要内 核支持sysfs、procfs和ramfs(tmpfs)文件系统以及hotplug(uevent)事件机制。

 

浅蓝色为命令,橘红色为 代码和脚步
1、准备根文件系统
使用shell脚本create_rootfs.sh,建立根文件系统的目录框架
lingd@ubuntu:~/arm2410s$ vi create_rootfs.sh

create_rootfs.sh 内容如下:
#!/bin/sh
echo '------Create rootfs directons......'
mkdir rootfs
cd rootfs
echo '--------Create root,dev......'
mkdir root dev etc bin sbin mnt sys proc lib home tmp var usr
mkdir usr/sbin usr/bin usr/lib usr/modules
mkdir mnt/usb mnt/nfs mnt/etc mnt/etc/init.d
mkdir lib/modules
chmod 1777 tmp
cd ..
echo '-------make direction done---------'

为 create_rootfs.sh添加执行权限
lingd@ubuntu:~/arm2410s$ chmod a+x create_rootfs.sh
执行create_rootfs.sh,建立根文件系统的目录框架
lingd@ubuntu:~/arm2410s$ ./create_rootfs.sh
lingd@ubuntu:~/arm2410s$ cd rootfs
lingd@ubuntu:~/arm2410s/rootfs$ ls
bin  dev  etc  home  lib  mnt  proc  root  sbin  sys  tmp  usr  var


2、创建设备 文件
mdev 是通过 init 进程来启动的,在使用 mdev 构造 /dev 目录之前,init 至少要用到设备文件/dev/console、 /dev/null ,所以需要事先建立这两个设备文件:
lingd@ubuntu:~/arm2410s/rootfs$ cd dev
lingd@ubuntu:~/arm2410s/rootfs/dev$ sudo mknod -m 660 console c 204 64
[sudo] password for lingd:
lingd@ubuntu:~/arm2410s/rootfs/dev$ sudo mknod -m 660 null c 1 3
lingd@ubuntu:~/arm2410s/rootfs/dev$ ls -l
total 0
crw-rw---- 1 root root 5, 1 2010-04-02 15:49 console
crw-rw---- 1 root root 1, 3 2010-04-02 15:50 null

注意:本来console的主次设备号应为5和1.但是因为init在执行完/etc/init.d/rcS脚本后,就 会在一个控制台上,按照inittab的指示开一个shell(或者是开getty+login,这样用户就会看到提示输入用户名的提示符)。在mdev -s未执行之前,/dev目录下只有我们创建的/dev/null和/dev/console,也就是说,没有控制台可供init用来按照inittab 的指示开一个shell。而在s3c24xx 系列芯片的串口驱动里面用了s3c2410_serial做为设备名(在内核源码的“drivers/serial/s3c2410.c”文件的949 行),因此,启动时可用s3c2410_serial0、s3c2410_serial1或s3c2410_serial2作为init用来按照 inittab的指示开一个shell的控制台,这里我用了串口0,即s3c2410_serial0(主次设备号为204和64)作为控制台。这里直接 将console当s3c2410_serial0,所以console的主次设备号才会为204和64。


3、准备一些配置文件和系统启动时所需的文件
3.1、mdev配置文件mdev.conf
mdev 会在/etc目录下找mdev的配置文件: mdev.conf. 如果该文件不存在,那么在执行mdev –s这个命令时,会提示找不到mdev.conf。我们不需要mdev规则,所以只是touch生成一个空文件就OK了。当然也可以根据mdev的规则来 编写mdev.conf。我把所有配置文件都是在/mnt/etc下,而不是/etc,后面解释这么做的原因。
lingd@ubuntu:~/arm2410s/rootfs/dev$ cd ../mnt/etc
lingd@ubuntu:~/arm2410s/rootfs/mnt/etc$ touch mdev.conf
lingd@ubuntu:~/arm2410s/rootfs/mnt/etc$ ls
init.d  mdev.conf

3.2、linuxrc
linuxrc 位于根文件系统的顶层目录/,这里为rootfs。/Linuxrc 执行init 进程初始化文件。主要工作是把已安装根文件系统中的/etc 安装为ramfs,并拷贝/mnt/etc/目录下所有文件到/etc,这里存放系统启动后的许多特殊文件;接着Linuxrc 重新构建文件分配表inittab;之后执行系统初始化进程/sbin/init。
lingd@ubuntu:~/arm2410s/rootfs/mnt/etc$ cd ../..
lingd@ubuntu:~/arm2410s/rootfs$ vi linuxrc
linuxrc 内容如下:
#!/bin/sh
echo 'Processing /linuxrc'

echo 'mount /etc as ramfs'
/bin/mount -n -t ramfs ramfs /etc      
/bin/cp -a /mnt/etc/* /etc

echo 're-create the /etc/mtab entries'
/bin/mount -f -t cramfs -o remount,ro /dev/bon/3 /
/bin/mount -f -t ramfs ramfs /etc

echo 'start init'
exec /sbin/init


lingd@ubuntu:~/arm2410s/rootfs$ ls
bin  dev  etc  home  lib  linuxrc  mnt  proc  root  sbin  sys  tmp  usr  var

Linuxrc 脚本分析
/bin/mount -n -t ramfs ramfs /etc
这句话的作用加载一个ramfs作为/etc目录。这样 /etc就是一个可写目录。
从这个脚本可知,你的根文件系统是一个cramfs(只读文件系统),而/etc作为系统运行配置文件的存放地点,可 能会写一些运行状态在这里,linuxrc第一件事情就是将一个ramfs mount到/etc只读目录中,使得/etc/目录可写,指定参数 -n的目的是告诉mount不要写/etc/mtab, 这个文件存放当前系统已挂载(mount)的文件系统清单。因为现在/etc/目录还是只读,所以这次mount不要写这个文件,否则会失败。而且 mount上后,原/etc会覆盖掉(原/etc下的文件都不见了,umount后会重新出现),所以我们把配置文件都保存在/mnt /etc,mount上ramfs到/etc后,再把配置文件拷贝到/etc。而不是直接将配置文件保存在/etc/下

 /bin/cp -a /mnt/etc/* /etc
/etc成为可写目录后,将所有/mnt/etc中的配置文件拷贝到/etc/中,这说明ramfs可能 是一个空的ramfs,没有配置文件,或者配置文件比较老。同时也说明这个系统是一个只读系统,每次系统运行中写入的配置不会保留。
将以前 mount的那些信息重新写到/etc/mtab中,命令就是下面这些。
/bin/mount -f -t cramfs -o remount,ro /dev/bon/3 /
/bin/mount -f -t ramfs ramfs /etc
这些命令只是将这 些mount信息写到/etc/mtab中,不会实际去mount这些block device,说明你的根文件系统依然是以前的那个/dev/bon/3
exec /sbin/init
执行根文件系统中的init执行 程序,使其成为1号进程。shell正式运行。

3.3、rcS
rcS 文件位于/etc/init.d,是busybox版init第一个运行的脚步(常见的init还有Sys V init版,其第一个执行的脚步是/etc/rc.d/rc.sysinit)。/mnt/etc/init.d/rcS 完成各个文件系统的 mount,再执行/mnt/etc/rc.local;通过rcS 可以调用 ifconfig 程序配置网络。rcS 执行完了以后,init 就会在一个 console 上,按照 inittab 的指示开一个 shell,或者是开 getty + login,这样用户就会看到提示输入用户名的提示符。/etc/init.d/rcS文件内容如下:
lingd@ubuntu:~/arm2410s/rootfs$ cd mnt/etc/init.d
lingd@ubuntu:~/arm2410s/rootfs/mnt/etc/init.d$ vi rcS
/etc/init.d/rcS内容如下:
#!/bin/sh
echo 'Processing /etc/init.d/rcS'

echo 'mount -a'
mount -a #mount上fstab文件中所有文件系统
exec /etc/rc.local


3.4、/etc/rc.local
/etc/rc.local是被init.d/rcS 文件调用执行的特殊文件,与Linux 系统硬件平台相关,如安装核心模块、进行网络配置、运行应用程序、启动图形界面等。内容如下:
lingd@ubuntu:~/arm2410s/rootfs/mnt/etc/init.d$ cd ..
lingd@ubuntu:~/arm2410s/rootfs/mnt/etc$ vi rc.local
/etc/rc.local内容如下:
#!/bin/sh
echo 'Processing /etc/rc.local'

echo 'get hostname'
/bin/hostname -F /etc/hostname

echo 'Starting mdev'
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

echo 'ifconfig eth0 192.168.1.21'
ifconfig eth0 192.168.1.21

echo '**************************************************'
echo '*                                                *'
echo '*        lingd  rootfs for linux 2.6.24.7        *'
echo '*                                                *'
echo '*          arm-linux-gcc version 4.1.1           *'
echo '*                                                *'
echo '*                 2010-03-30                     *'
echo '*                                                *'
echo '**************************************************'


lingd@ubuntu:~/arm2410s/rootfs/mnt/etc$ ls
init.d  rc.local

在rc.local使用了'/bin/hostname -F /etc/hostname'来设置主机名(设置主机名主要是为了后面设置命令提示符PS1)。这条命令需要了一个主机名配置文件/etc /hostname,其内容如下:

arm2410s


3.5、/etc/profile
rc.local 首先执行该文件配置应用程序需要的环境变量等。
lingd@ubuntu:~/arm2410s/rootfs/mnt/etc$ vi profile
/etc/profile内容如下:

#/etc/profile
echo 'Processing /etc/profile'
echo 'set user path'
PATH=/bin:/sbin:/usr/bin:/usr/sbin

echo 'set search library path'
LD_LIBRARY_PATH=/lib:/usr/lib

echo 'set PS1'
HOSTNAME=`/bin/hostname`
PS1='u@h:w$ ' #设置命令提示符为ubuntu风格
export PATH LD_LIBRARY_PATH HOSTNAME PS1


lingd@ubuntu:~/arm2410s/rootfs/mnt/etc$ ls
init.d  profile  rc.local


改变这四个文件的权限
lingd@ubuntu:~/arm2410s/rootfs/mnt/etc$ cd ../..
lingd@ubuntu:~/arm2410s/rootfs$ chmod 775 linuxrc mnt/etc/init.d/rcS mnt/etc/rc.local mnt/etc/profile

3.6、/etc/inittab
内核引导完成后,内核会启动初始化进程init(用户级进程)来进行 系统的各项配置。init是系统第一个进程,它是系统上运行的所有其他进程的父进程,他会观察其子进程,并在需要时启动、停止、重启它们。init主要是 用来完成系统的各项配置。init从/etc/inittab获取所有信息。想了解BusyBox init及其inittab基本原理的,可以看这篇文章http://blog.chinaunix.net/u3/109117/showart_2208026.html。lingd@ubuntu:~/arm2410s/rootfs$ cd mnt/etc
lingd@ubuntu:~/arm2410s/rootfs/mnt/etc$ vi inittab
/etc /inittab内容如下:
#/etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh    

::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

'console::askfirst:-/bin/sh'中 的-表示的是让busybox开启一个登录(login)shell,login shell在执行前都会读取配置文件/etc/profile和.profile。由BusyBox源码的shell/ash.c文件可知 这一点:

int ash_main(int argc ATTRIBUTE_UNUSED, char **argv)

{

    …………

    if (argv[0] && argv[0][0] == '-')
        isloginsh = 1;
    if (isloginsh) {
        state = 1;
        read_profile('/etc/profile');
state1:
        state = 2;
        read_profile('.profile');

    …………

}


因为我们在/etc/profile对PATH、LD_LIBRARY_PATH、 HOSTNAME、PS1等环境变量进行了修改,所以BusyBox开启的必须是一个login shell(这样可以保证/profile的内容对开发板上所有shell都是有效的);否则/etc/profile定义的内容将不会执行。
做 个小实验(以这次做好的根文件系统为基础):

Please press Enter to activate this console.         #启动开发板,引导linux内核并进行各系统配置后,执行到这里。按下回车键,显示以下内 容:                            
starting pid 797, tty '/dev/console': '-/bin/sh '    #在控制台/dev/console上开启一个login shell                            
Processing /etc/profile                              #执行/etc/profile配置文 件                            
set user path                                                                    
set search library path                                                          
set PS1       

[1] [2] [3] [4]
关键字:BusyBox  linux  根文件系统 引用地址:使用BusyBox制作linux根文件系统(CramFS+mdev)

上一篇:常用 U-boot命令详解
下一篇:使用Busybox制作CRAMFS文件系统成功

推荐阅读最新更新时间:2026-03-24 11:27

imx6ull之文件系统busybox移植
开发板:飞凌 OKMX6ULL-S + 7寸电阻屏 交叉编译工具链:gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf busybox: busybox-1.32.1.tar.bz2 一、busybox移植   1、上传并解压busybox-1.32.1.tar.bz2:tar -jxvf busybox-1.32.1.tar.bz2   2、修改Makefile     164 CROSS_COMPILE ?= arm-linux-gnueabihf-     190 ARCH ?= arm   3、配置     make menuconfig     Settings -
[单片机]
imx6ull之<font color='red'>根</font><font color='red'>文件系统</font><font color='red'>busybox</font>移植
构建文件系统(3)编译、安装Busybox、安装glibc
1、从http://www.busybox.net/downloads/ 下载busybox-1.9.2.tar.bz2 2、tar xjf busybox-1.9.2.tar.bz2 3、配置Busybox make menuconfig 根据不同需要在配置时选上,退出、保存配置。 4、修改Makefile,使用交叉编译器 ARCH ?= arm CROSS_COMPILE ?= arm-linux- 5、编译Busybox make 6、安装Busybox make CONFIG_PREFIX=/work/nfs_root/fs_mini install 在work/nfs_root/下面自动生成fs_
[单片机]
基于S3C2440的busybox的移植 yaffs文件系统制作
硬件平台:FL2440 操作系统:Linux2.6.28.7 交叉编译工具:arm-linux-gcc-3.4.1 飞凌公司默认的文件系统,不具有文件延伸功能,比如在/dev下有mmcblk0p1这个文件,在 挂载SD卡驱动时,需要敲入命令mount /dev/mmcblk0p1,如果具有延伸功能,在敲入mm后,可以直接按TAB键,如果/dev目录下只有一个以mm形状的文件,将会自动补全后面的字符。初步推断该功能应该为busybox集成,从网上下载busybox-1.9.2.tar.bz2,计划安装该版本的busybox。 第一步:下载busybox源代码:http://busybox.net/downloads/busybox-
[单片机]
基于S3C2440的<font color='red'>busybox</font>的移植 yaffs<font color='red'>根</font><font color='red'>文件系统</font>制作
ARM-Linux移植之(四)——文件系统构建
相关工具版本: busybox-1.7.0 arm-linux-4.3.2 linux-2.6.22 1.配置busybox并安装。 在我们的根文件系统中的/bin和/sbin目录下有各种命令的应用程序,而这些程序在嵌入式系统中都是通过busybox来构建的,每一个命令实际上都是一个指向busybox的链接,busybox通过传入的参数来决定进行何种命令操作。 1)配置busybox 解压busybox-1.7.0,然后进入该目录,使用makemenuconfig进行配置。这里我们这配置两项 一是在编译选项选择动态库编译,当然你也可以选择静态,不过那样构建的根文件系统会比动态编译的的大。 - Busybox Settings
[单片机]
嵌入式Linux NFS文件系统的构建及研究
随着信息技术的发展,嵌入式系统技术已经广泛应用于国防、通信、工业控制、消费电子等诸多领域。其中,Linux作为一款开源、成熟且高效稳定的多任务操作系统,先天具有许多不可比拟的优势,已成为目前最具潜力的嵌入式操作系统。众所周知,构建根文件系统对于嵌入式Linux开发至关重要,它是内核启动后加载的第1个文件系统,是决定系统能否正常启动的关键所在。在开发阶段,程序往往需要反复多次的调试,鉴于此,构建基于NFS(Network File System)的根文件系统就尤为重要;这样就免去了对目标开发板的反复烧写,方便地在线对程序进行更改与调试。本文以Busybox软件为基础,介绍了一种实用的NFS根文件系统构建方法。 1 嵌入式根文件系统简
[单片机]
嵌入式<font color='red'>Linux</font> NFS<font color='red'>根</font><font color='red'>文件系统</font>的构建及研究
mini2440 u-boot linux 内核启动,Mini2440 uboot,kernel,文件系统搭建
按照mini2440的手册,我所学到的uboot,kernel以及根文件系统的搭建过程分别如下,具体细节暂时不考虑,只考虑整个编译烧写的过程。 首先我们的宿主机一定要有nfs服务器,tftp服务器,具体搭建的过程,可以自己参考 1. mini 2440 编译uboot过程 下载u-boot-2010.03-embedclub-201111.tar.gz, 1:tar zxf u-boot-2010.03-embedclub-201111.tar.gz 2:cd u-boot-2010.03 3:make disclean #执行清理工作 4:make smdk2440a_config #Makefile的对应项 5:make
[单片机]
基于S3C2440的嵌入式Linux文件系统构建
  嵌入式Linux早已成为IT界家喻户晓的一个名字,使用Linux进行嵌入式产品开发有一个很大的优势,就是开发资源丰富,且成本低廉,嵌入式Linux操作系统越来越受到重视,其应用也越来越广泛。而文件系统作为操作系统的重要组成部分,用于控制对数据文件及设备的存取,提供对文件和目录的分层组织形式,数据缓冲以及对文件存取权限的控制。根文件系统一直是Linux系统不可或缺的组件,在嵌入式Lin-ux中,内核在启动期间进行的最后操作之一就是安装根文件系统。busybox是构建嵌入式Linux根文件系统的软件,用它制作根文件系统简单、方便,而且设置灵活。    1 根文件   Linux要在一个分区上存放系统启动所必需的文件,如内核
[嵌入式]
文件系统构建(JZ2440-S3C2440)
uboot的目的是启动内核,内核的目的是为了启动应用程序,应用程序位于根文件系统上面。 一、使用busybox制作根文件系统 busybox下载地址:http://www.busybox.net/downloads/ 这里使用busybox-1.7.0(包名:busybox-1.7.0.tar.bz2 ) 解压命令:tar xjf busybox-1.7.0.tar.bz2 busybox目录下的INSTALL文件中部分代码: 1、配置busybox 在busybox-1.7.0目录下,执行:“make menuconfig”命令进入配置界面 (1)设置“TAB”键补全 Busyb
[单片机]
<font color='red'>根</font><font color='red'>文件系统</font>构建(JZ2440-S3C2440)
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved