一种构建嵌入式Linux根文件系统的方法

2016-09-08 06:13刘二钢
电子设计工程 2016年9期
关键词:源码内核命令

刘二钢

(海南大学 信息科学技术学院,海南 海口 570228)

一种构建嵌入式Linux根文件系统的方法

刘二钢

(海南大学 信息科学技术学院,海南 海口570228)

根文件系统是构建嵌入式Linux系统的非常重要的组成部分。文中主要以制作Yaffs2根文件系统为例,研究如何使用BusyBox构建嵌入式Linux的根文件系统,包括BusyBox的配置、编译和安装,以及在嵌入式Linux环境下生成根文件系统映像文件的方法。文中所介绍的方法能够成功地在ARM开发板中移植和运行,为嵌入式系统的开发提出了一种简单易行的研究思路。

BusyBox;Yaffs2;嵌入式Linux;文件系统

在嵌入式系统中如果引入操作系统,研发人员可以根据需求直接在操作系统基础上设计开发而不必从头开始。这样会使研发工作变得简单方便,因此带操作系统的开发模式正逐步成为嵌入式系统开发的主流。Linux操作系统由于其开源稳定,安全高效,一直是嵌入式操作系统的应用首选。应用Linux操作系统,必须构建Linux根文件系统。但是大多数开发板所提供的构建Linux根文件系统的文献资料都非常简单,甚至未提及应用方法,许多用户难以理解和掌握。本文就Linux根文件系统做了简单介绍,并提出一种切实可行构建根文件系统的方法。

1 Linux根文件系统简介

由于Linux嵌入式产品成本低廉,开发资源丰富,因此其越来越受到重视,应用也越来越广泛。对于Linux操作系统来说,并没有类似于WINDOWS中盘符的概念,而是将分区挂载到目录上,被挂载的目录就称之为挂载点(mount point),然后通过目录来访问分区上的文件。常见的根文件系统都呈倒挂状树形层次结构,主要目录及含义如图1所示。

图1 根文件目录结构

对于操作系统而言,存储在上面的文件和目录必须遵循一定的格式,这种格式就称之为文件系统类型,Linux操作系统常见的文件系统类型有 Ext2、Ext3、Jffs2、Cramfs、Yaffs、Yaffs2等。这些文件系统各有自己的特点,主要区别在于是否可写、是否能够压缩及是否具有日志功能等。根文件系统是嵌入式Linux的重要组成部分,是内核启动加载的第一个文件系统,并为内核的启动提供各种工具软件、库文件、脚本和配置文件,而且可以作为数据的存取区域,是决定系统能否正常启动的关键[1]。

制作根文件系统就是生成上述各种文件目录的过程。常见的制作根文件系统的方法是利用工具BusyBox制作根文件系统,用这种方法制作根文件系统可以做到短小精悍且效率较高。文中主要以制作Yaffs2根文件系统为例,论述利用BusyBox工具制作根文件系统的整个过程。系统宿主机是PC机,操作系统是Ubuntu10.04,目标板是基于ARM9-S3C2440微控制器的开发板,内核是Linux2.6.30.4,Bootloader是U-boot。

2 BusyBox简介

BusyBox是一个集成多个Linux命令和工具的软件,具有实用稳定、短小精悍等特点,因此BusyBox常常被称作“The Swiss Army Knife of Embedded Linux”[2]。它将许多常用的Unix命令和工具集合到一个单独的可执行程序中,虽然与相应的GUN工具比较,其所提供的功能和参数略少,但在比较小的嵌入式系统中已经够用[3]。BusyBox利用Linux实用工具中代码大量重复的事实,将重复的代码重新整理放到一个文件中,减少了多次包含,这样就可以节省系统的空间并提高程序的执行速度[4]。

3 BusyBox编译和安装

首先要到其官方网站 http://www.busybox.net/downloads/下载BusyBox源码,本文下载的版本为BusyBox-1.13.0.tar. bz2,下载后将其解压,随后修改顶层目录下的MakeFile文件。由于硬件环境是ARM平台,需要修改编译工具和系统架构为:

CROSS_COMPILE=arm-linux-

ARCH=arn

下面进行菜单配置,在终端中输入make menuconfig,选择需要添加的命令和文件。一般保留默认配置即可,这里不再详细论述。

设定好配置菜单并保存退出后就可以进行BusyBox的安装了。在安装之前首先设定安装目录,这里假设安装在/ home/rootbox下。创建目录rootbox,然后安装BusyBox到此目录下。具体命令如下:

sudo mkdir/home/rootbox/*建立目录rootbox*/

cd~/busybox-1.13.0/*进入到BusyBox目录*/

make

make CONFIG PREFIX=/home/rootbox install/*安装到rootbox目录*/

编译结束后会在rootbox目录下面生成构建根文件系统所需要的一些文件和目录,分别为bin目录、sbin目录、usr目录以及linuxrc文件。如果没有指定路径,则会在BusyBox目录下生成_install目录并包含上述目录和文件。虽然产生的文件并不是很多,但大部分都是经常用到的一些命令,这也正体现出BusyBox的短小精悍。

通过这个步骤,已经实现了BusyBox的安装,从而完成了最基本的Linux文件框架,下面开始制作根文件系统。

4 制作根文件系统

进入目录rootbox,在此路径下继续建立所需的dev,etc, home,lib,mnt,proc,root,sys,tmp,bin,opt,web,udisk,sddisk,var等目录。

4.1创建etc目录下的文件

系统所需的配置文件存放于/home/rootbox/etc这个目录。配置文件主要依赖于系统中所拥有的应用程序以及这些程序的配置方式。文中主要创建了inittab、init.d/rcS和fstab文件。

4.1.1创建etc/inittab文件

init最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设置、语系处理、文件系统格式及其他服务的启动等[5],而这些操作主要是根据/etc/inittab这个配置文件进行规划的。

在BusyBox源码下面存在一个 “examples/inittab”文件,可以参考这个文件内容设定inittab代码:

#/etc/inittab

::sysint:/etc/init.d/rcs/*定系统启动的脚本*/

::respawn:-/bin/sh/*打开一个登录会话*/

S3C2440_seria10:askfirst:-/bin/sh/*指定打开一个无需登陆验证的*/

shell,以s3c2440_seria10作为控制台*/

::ctrlaltdel:/sbin/reboot/*指定当按下ctrl+alt+del时执行命令*/

::shutdown:/bin/umount-a-r/*关机时执行的操作*/

4.1.2创建etc/init.d/rcS文件

这个文件是一个脚本文件,主要作用是添加可以自动运行的程序及其执行权限。文中添加的命令是配置IP地址以及挂接下面4.1.3所述/etc/fstab指定的文件系统,也可根据需要添加其它命令。命令内容如下:

#!/bin/sh

ifconfig eth0 192.168.1.10

mount-a

chmod+x etc/init.d/rcs

4.1.3创建etc/fstab文件

Linux将硬盘,分区及可移动磁盘等设备都作为一种文件目录进行管理,etc/fstab文件就是专门用来配置这些文件目录进行自动挂载的过程,相当于将mount挂载过程变为自动执行。因此fstab对于文件系统来说非常重要,是Linux系统开机自动引导挂载时所依赖的唯一配置标准。文中创建代码如下:

#devicemount-pointtypeoptionsdump fsck order

proc/procprocdefaults 00

tmpfs/tmptmpfs defaults 00

sysfs/syssysfsdefaults 00

tmpfs/devtmpfs defaults 00

文件中各字段的含义表示如下:

1)device:挂接设备文件名或设备 Label,比如/dev/ mtdblock1;

2)mount-point:挂载点;

3)type:挂载文件系统类型;

4)options:文件系统参数,如只读、可执行等,中间以逗号隔开;

5)dump和fsck order:控制dump备份与fsck扇区检验。

4.2构建dev目录

从Linux-2.6.12内核开始,设备管理系统的devfs选项已经从内核配置中删除[6]。新版本的udev是一个应用层的管理文件,已经不再属于内核,在内核启动时并不能自动创建设备节点,必须进行手动创建。这里主要需要两个设备,一个是用于终端连接的console控制台,另一个则是用于处理垃圾文件的null。可以采用变通的办法,利用BusyBox中内置的mdev文件生成一个简化的udev版本。

s mknod dev/console c 5 1

s mknod dev/nullc 1 3

如果上述操作没有执行,文件系统在启动时将不能够连接控制台,从而出现错误信息。

4.3安装glibc库

在嵌入式目标板上还需动态库和加载器,因此执行命令如下:

scd/hone/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib scp*.so*/home/rootbox/lib

5 在Linux内核中添加对于Yaffs2文件系统的支持

由于文件系统的启动依赖于嵌入式Linux系统内核,因此必须要在Linux系统内核中添加对于文件系统的支持。

首先需要下载Yaffs文件系统补丁cvs-root.tar.gz,读者可以在网上搜索下载。下载之后将其解压,并将这个补丁打在Linux系统内核目录中,具体命令如下:

star xvfx cvx-root.tar.gz

scd cvs/yaffs2/

s./patch-ker.shc/home/linux-2.6.30.4/

执行之后就会在Linux内核的“fs/”目录下面看到新添加了一个名为 “yaffs2/”的目录,同时在“fs/”目录下面的“Makefile”文件和“Kconfig”文件也添加了 yaffs2的配置和编译条件。然后编译配置内核,在内核中添加硬件ECC校验和YAFFS文件系统的选项,否则yaffs2文件系统可能会挂载不成功。

6 制作文件系统映像

下面就可以制作文件系统映像了。在http://www.yaffs.net/可以得到yaffs文件系统的源码压缩包,在yaffs源码中可以找 到 utils目 录 ,里 面 包 含 Makefile、mkyaffsimage和mkyaffs2image三个文件。其中mkyaffsimage和mkyaffs2image这两个文件主要是用来做系统映像,二者的区别是前者用来制作yaffs文件映像,后者用来制作yaffs2文件映像[7]。另外再加入两个文件:nand-ecc.c和yaffs_packedtags1.c,具体文件这里不列出,源码可参见文献[8]。

因为yaffs_packedtags1.c和nand-ecc.c文件是后加上去的,可以增加制作好的文件系统支持大容量磁盘等功能,但是这样文件数目及内容发生了变化,必须修改Makefile文件 。在 MKYAFFS2SOURCES=mkyaffs2image.c后 面 加yaffs_packedtags1.c nand-ecc.c,将这两个文件也载入系统映像。然后执行make命令后重新生成mkyaffs2image工具,复制此工具到PC机usr/local/bin目录下,利用makyaffs2image工具执行命令:

scd/home

smkyaffsimage2 rootbox rootbox.bin

之后就可以生成文件系统映像文件名称为rootbox.bin。至此,整个根文件系统就制作完成。

7 烧写文件系统映像

最后需要完成的是将制作好的Linux内核映像和根文件系统映像下载到目标开发板,本文中使用的是基于S3C2440微处理器的开发板,这个步骤可以借助于Windows提供的超级终端工具进行下载。

#tftp 30008000 zImage.bin/*下载Linux内核映像到目标板内存*/

#tftp 30800000 rootbox.bin/*下载根文件系统映像到目标板内存*/

#go30008000/*启动目标板Linux*/

下载成功后在超级终端中显示的结果如图2所示,可见系统已经正常启动,从而成功生成了根文件系统所必须的文件目录结构。

图2 根文件运行结果

8 结束语

根文件系统是Linux嵌入式系统中重要的部分,好的文件系统可以更好的利用软硬件资源,提高系统性能。Linux嵌入式文件系统种类多样,在选取时需要根据系统的Flash容量、SDRAM大小以及对文件系统读写的需求而定。文中通过对文件系统的制作以及移植的阐述,为Linux嵌入式研究者提供了一种借鉴方法。

[1]陈海燕,任松岩.嵌入式Linux根文件系统的研究[J].现代电子技术,2010(4):73-75.

[2]Erik Andersen.BusyBox:The Swiss Army Knife of Embedded Linux[EB/OL].(2008)[2014-12-11],http://www.busybox.net/about.html.

[3]陈峰,李滨滔,戈志华.基于S3C2410的嵌入式Linux系统构建[J].现代电子技术,2007(24):55-57.

[4]陈立定,杨俊辉,陈伟欣.使用Busybox制作Cramfs根文件系统[J].计算机技术与发展,2009(4):146-148,153.

[5]鸟哥.鸟哥的linux私房菜-基础学习篇(第三版)[M].北京:人民邮电出版社,2010.

[6]王磊,谢维波.AdHoc网络在嵌入式Linux上的实现[J].华侨大学学报自然科学版,2011(3):161-164.

[7]龙亚春,黄璞,吴胜.超大容量NAND Flash文件系统-YAFFS2 在Linux下的实现 [J].北京电子科技学院学报,2007,15(2):81-84.

[8]小龙.利用BusyBox做yaffs根文件系统 [EB/OL].(2009-01)[2014-12-11],http://blog.mcuol.com/User/longren/Article/9633_1. htm.

A method of building embedded Linux root file system

LIU Er-gang
(College of Information Science&Technology,Hainan University,Haikou 570228,China)

The root file system is a very important part of building the embedded Linux system.This paper mainly makes Yaffs2 root file system as an example of studying how to use the BusyBox to build embedded Linux root file system,including the BusyBox configuration,compilation and installation,and generates the system image files of root file in the embedded Linux environment.The method introduced in the paper is able to transplant and run successfully in the ARM development board,and puts forward a kind of feasible research ideas for the development of embedded system.

BusyBox;Yaffs2;Embedded Linux;file system

TN99

A

1674-6236(2016)09-0160-03

2015-05-29稿件编号:201505255

海南省自然科学基金资助项目(614225)

刘二钢(1980—),男,山西长治人,硕士研究生,讲师。研究方向:嵌入式系统、图像处理。

猜你喜欢
源码内核命令
多内核操作系统综述①
只听主人的命令
面向数据可靠传输的高译码率带反馈的LT码
强化『高新』内核 打造农业『硅谷』
国内一站式工程设备租赁平台众能联合完成C2、C3两轮融资
活化非遗文化 承启设计内核
浅谈开源操作系统的历史
企业如何保护源码
Linux内核mmap保护机制研究
移防命令下达后