http://blog.sina.com.cn/s/blog_6795385f01011ifg.html

作一个嵌入式Linux rootfs,并且实现 web 服务

1. 文件系统简介
•理论上说一个嵌入式设备如果内核能够运行起来,且不需要运行用户进程的话,是不需要文件系统的,文件系统简单的说就是一种目录结构,由于 linux操作系统的设备在系统中是以文件的形式存在,将这些文件进行分类管理以及提供和内核交互的接口,就形成一定的目录结构也就是文件系统,文件系统是为用户反映系统的一种形式,为用户提供一个检测控制系统的接口。
•根文件系统,我认为根文件系统就是一种特殊的文件系统,那么根文件系统和普通的文件系统有什么区别呢?由于根文件系统是内核启动时挂在的第一个文件系统,那么根文件系统就要包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在 Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。
•Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、yaffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。
•Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为 RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs,ramdisk, ramfs/tmpfs等。
2.    基于FLASH的文件系统 
•2.1 Cramfs:Compressed ROM File System
•它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。由于以上特性,Cramfs在嵌入式系统中应用广泛。但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。Cramfs映像通常是放在Flash中。
 
•2.2 jffs2
•Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)

•主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日

志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。

•缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。jffs不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffs 文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。
2.3.yaffs:Yet Another Flash File System 
•yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与 VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。
•yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。
 
•2.4. 网络文件系统NFS (Network File System)
•NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。
•在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。
 
•所采用的工具:mkfs.cramfs,mkfs.jffs2,mkfs.yaffs
•http://sourceforge.net/projects/cramfs/
•http://sourceforge.net/projects/jffs2os/
•http://sourceforge.net/projects/yaffs/
3.根文件系统的组成
•目录  内容
•Bin  :基本的可执行文件
•Opt  :添加的软件包
•Boot :启动时需要的一些文件
•Proc :内核及进程信息的虚拟文件系统
•Dev : 设备文件
 
Root:root用户目录

•Etc: 系统配置文件
•Sbin:系统管理的程序
•Home : 用户目录
•Tmp : 临时文件
•Lib : 库文件
•Usr : 应用程序
•Mnt : 挂载文件系统的挂载点
•Var : 存放系统日志或一些服务程序的临时文件
•根文件系统中的每一个顶级目录都有特定的用途和目的 
•但并不是所有的目录在嵌入式环境下都需要,
•我们只创建需要的一些目录:
•/bin /sbin /etc /proc /tmp /var /dev /mnt
•Linux的根文件系统至少应包括以下几项内容。
•1.基本的文件系统结构,包含一些必需的目录比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等。
•2.基本程序运行所需的库函数,如Glibc/uClibc。
•3.基本的系统配置文件,比如rc.sysinit,inittab等脚本文件。
•4.必要的设备文件支持:/dev/hd*,/dev/tty*,/dev/fd0。
•5.基本的应用程序,如sh,ls,cp,mv等。
•1.把全局配置文件放入/etc目录下。
•2.将设备文件信息放入/dev目录下,设备名可以作为符号链接定位在/dev中或/dev子目录中的其他设备存在。
•3.操作系统核心定位在/或/boot,若操作系统核心不是作为文件系统的一个文件存在,不应用它。
•4.库存放的目录是/lib。
•5.存放系统编译后的可执行文件、命令的目录是/bin,/sbin,/usr。
•
4. 定制文件系统 ,基于 ELDK,busybox
•安装ELDK:
#mount –o loop arm-2008-11-24.iso /mnt

•#/mnt/install –d /opt/eldk
•#mkdir rootfs ;假定以下内容都是在 rootfs 目录下:
•4.1自定义文件系统
•目录bin
•-------->用busybox编译,下面说明
•目录sbin
•-------->用busybox编译,下面说明
•目录usr
•-------->建立bin sbin两个空目录 
•目录var
•-------->建立log空目录 
•目录etc
•------->可以把/opt /eldk/arm下或者s3c2410_recover
•的etc 拷贝过来修改,怎么修改下面说明,需要包括:
•inittab
•rc.local -> rc.d/rc.local
•rc.sysinit -> rc.d/rc.sysinit
•
目录dev
•------->这里不能直接从/opt/eldk/下 拷贝
•       应当如下制作否则系统启动是会说明找不到设备文件console之类
•      cd /  rootfs/dev
•      /mnt/ELDK_MAKEDEV  //ELDK_MAKEDEV从 ELDK ISO 文件里copy出来
•这样在目录dev 节点文件就出现了
•目录lib
•------->如果是采用静态编译,这里就空着;
•如果采用动态编译 ,
从s3c2410_recover\lib

•或 /usr/local/arm/3.4.1/arm-linux/lib
•或/opt/eldk/arm/lib copy 过来,再裁减lib 库
•目录 proc
•------->空着但必须有这目录
•4.2.etc/下文件内容修改
•4.2.1 etc/rc.d/rc.sysinit
•这里你还可以按自己的要求修改
•4.2.2 etc/rc.d/rc.local
•以后要启动的程序你可以加在这里
•=============================================================
•#!/bin/sh
•#
•# This script will be executed *after* all the other init scripts.
•# You can put your own initialization stuff in here if you don't
•# want to do the full Sys V style init stuff.
•#touch /var/lock/subsys/local
•=======================================
•4.2.3 etc/inittab
•init启动后会首先执行这个文件
•===========================================================•#
•# inittab       This file describes how the INIT process should set up
•#               the system in a certain run-level.
•# Default runlevel. The runlevels used by RHS are:
•#   0 - halt (Do NOT set initdefault to this)
•#   1 - Single user mode
•#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
•#   3 - Full multiuser mode
•#   4 - unused
•#   5 - X11
•#   6 - reboot (Do NOT set initdefault to this)
•#

linux rootfs制作的更多相关文章

  1. 在Linux下制作一个磁盘文件,在u-boot 阶段对emmc 烧写整个Linux系统方法

    在Linux 下制作一个磁盘文件, 可以给他分区,以及存储文件,然后dd 到SD卡便可启动系统. 在u-boot 下启动后可以读取该文件,直接在u-boot 阶段就可以做烧写操作,省略了进入系统后才进 ...

  2. 嵌入式linux内核制作、根文件系统制作

    嵌入式系统构成: 主要由bootloader.kernel.以及根文件系统三部分组成. 内核制作步骤: 制作嵌入式平台使用的linux内核制作方法与pc平台上的linux内核基本一致 1.清除原有配置 ...

  3. linux下制作img文件

    一.简介 制作img文件可以使用linux系统中的dd命令制作,Linux dd 命令用于读取.转换并输出数据.dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件.设备或标准输 ...

  4. Linux系统内核制作和内核模块的基础

    Linux系统内核制作 1.清除原有配置与中间文件 x86:  make distclean arm:  make distclean 2.配置内核 x86:  make menuconfig arm ...

  5. 如何在linux下制作一个windows的可启动u盘?

    如何在linux下制作一个windows的可启动u盘? 情景是这样的,有一个windows10的iso,现在想通过U盘安装,要求即支持UEFI(启动引导器),又支持Legacy(启动引导器),因为有一 ...

  6. Linux库函数制作(静态库、动态库)

    Linux库函数制作(静态库.动态库) 静态库与动态库 链接方式 链接分为两种:静态链接.动态链接 静态链接: 由链接器在链接时将库的内容加入到可执行程序中 静态链接的特点是: 优点: 对运行环境的依 ...

  7. [国嵌攻略][100][嵌入式Linux内核制作]

    Linux内核制作步骤 1.清除原有配置 make distclean 2.配置内核 选择一个已有的配置文件简化配置 make menuconfig ARCH=arm 3.编译内核 ARCH指明处理器 ...

  8. 在GNU/Linux下制作Windows 10安装U盘

    今年春节回家期间,我需要将家里的一台安装了Debian Stretch的ZaReason笔记本电脑更换为Windows 10系统,好让爸妈从老台式机上的XP系统升级到新的平台上来.回家前,小仙女已在微 ...

  9. Linux上制作Window启动盘

    Linux上制作Window启动盘 注意: U盘在Linux中的标签(依具体情况而定:执行df查看) U盘 ----- /dev/sdb4 格式化U盘 建立U盘的启动分区 安装关键工具 ms-sys ...

随机推荐

  1. SQL union和union all的区别

    Union因为要进行重复值扫描,所以效率低.如果合并没有刻意要删除重复行,那么就使用Union All  两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致): 如果我们需要将两个 ...

  2. iOS 转载一篇利用dispatch_once创建单例的文章

    感谢文章原作者,http://bj007.blog.51cto.com/1701577/649413

  3. Android Services重点记录

    今天阅读了google的官方文档 Services,对重点做下记录. 首先,Services默认运行在主线程中,所以一般情况下,要手动创建一个thread. 系统除了Services,还为我们提供了一 ...

  4. 升级Windows10后Apache服务器启动失败的解决方法

    升级windows10系统后,微软内置了ASP.NET的web高级服务,默认安装了IIS服务器和MSSQL数据库,因为80端口被占用的原因,导致Apache服务器无法正常启动,但是MySQL服务一切正 ...

  5. Greedy:Allowance(POJ 3040)

    零用钱大作战 题目大意:农夫和牛又搞新花样了,现在农夫想给Bessie每个星期都给一点零用钱,农夫有一堆面值的钱币,并且这个钱币都能被上一个钱币整除(1,5,10,50),并且钱币有一定数量,要你求最 ...

  6. Linux底下的第一个C程序

    首先保证你的Linux底下安装了GCC,假如没有安装GCC的话请参考: http://www.cnblogs.com/aspirant/p/3544398.html 假如输入 gcc -v 不再是co ...

  7. hdu 4585 map **

    题意: Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temple every ...

  8. Codeforces Gym 100513G G. FacePalm Accounting

    G. FacePalm Accounting Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100513 ...

  9. loadrunner录制脚本出现urs.asmx解决方法:

    在loadrunner录制过程中可能出现如下脚本: 解决方法: 解决办法:打开IE9的Internet选项-->高级,把设置下面安全中“启用SmartScreen筛选器”不选中,IE默认是选中的 ...

  10. 使用java自带的定时任务ScheduledThreadPoolExecutor

    ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类: JDK api里是这么说的: ThreadPoolExecutor,它可另行安排在给定的延迟后运行 ...