作一个嵌入式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)
•#

【1】文件系统

挂载文件系统
  mount  -t     vfat                               /dev/mmcblk1p1    /mnt
  挂载         指定需要挂载的文件系统的类型       设备节点(文件)  挂载点(文件系统挂载到rootfs的地方)

【2】内核调试

1)点灯是用 GPIO 作为输出,观察程序运行阶段和状态的方法
 
 2)printk
   内核解压后
   信息输出显示是在 console 初始化之后

printascii
   console初始化前

printk打印级别:数字越低,级别越高
   

  1. #define KERN_EMERG "<0>" /* system is unusable */
  2.  #define LERT "<1>” /* action must be taken immediately */
  3.  #define KERN_CKERN_ARIT "<2>" /* critical conditions */
  4.  #define KERN_ERR "<3>" /* error conditions */
  5.  #define KERN_WARNING "<4>" /* warning conditions */
  6.  #define KERN_NOTICE "<5>" /* normal but significant condition */
  7.  #define KERN_INFO "<6>" /* informational */
  8.  #define KERN_DEBUG "<7>" /* debug-level messages

ubuntu系统:
   
   通过proc在运行时查看和修改日志级别
   cat /proc/sys/kernel/printk
    4 4 1 7
    echo “7 4 1 7” >/proc/sys/kernel/printk
    cat /proc/sys/kernel/printk
    7 4 1 7
 3)OOPS
    pc寄存器保存内核崩溃时,运行的地址

定位                  系统崩溃时的地址
linux@ubuntu:~/work/day_2/linux-3.14-fs4412$ arm-none-linux-gnueabi-addr2line 0xc0278e1c       
-e vmlinux               -f
指定定位镜像文件     指定出错的文件以及行号
 
    dm9000_probe
    /home/linux/work/day_2/linux-3.14-fs4412/drivers/net/ethernet/davicom/dm9000.c:1414

4)调试信息
  调试信息一般显示在两个地方 :终端、log日志
 
  klogd进程:执行系统调用,去访问内核的打印消息
  syslog进程:记录非内核打印的消息
 
 
  void openlog(const char *ident, int option, int facility);
  功能:打开日志
  参数:ident  日志的标志
        option     LOG_PID        Include PID with each message.  打印的消息附加上进程ID
                       LOG_CONS       Write directly to system console if there is an error while sending to system logger.
                                                  把消息显示到log日志
        facility   表示的是消息出自于什么类型的进程
        LOG_DAEMON     system daemons without separate facility value
        void syslog(int priority, const char *format, ...);
        功能:将消息显示到日志中
        参数:priority  级别
                         LOG_WARNING    warning conditio
                         LOG_NOTICE     normal, but significant, condition

LOG_INFO       informational message

LOG_DEBUG      debug-level message

void closelog(void);
  功能:关闭日志
 
  查看日志消息: var/log/syslog日志

【3】文件系统

文件系统:文件存储的格式
 文件系统的类型:
 磁盘文件系统:驻留在磁盘上的文件系统
 FAT16、FAT32、NTFS、EXT2、EXT3、EXT4 
 网络文件系统:可以远程访问的文件系统
 nfs(network filesystem)
 内存文件系统:存在内存上的文件系统
 tmpfs
 只读文件系统:
 cramfs
 
 根文件系统(root  filesystem)是存放运行、维护系统所必须的各种工具软件、库文件、脚本、
            配置文件和其他特殊文件的地方,也可以安装各种软件包。

根文件系统是内核运行之后,加载的第一个文件系统,是其他文件系统的根,可用来挂载其他类型的文件系统,也可视其为特殊的文件系统
 必须存在,不存在内核无法运行
  
 文件系统的目录结构:
        /etc  存放内核所需要的配置文件(启动文件)
====================================================================
        /bin: 普通用户和root用户都能执行的基本程序
               ping, mknod, mount, tar, grep, gzip, etc
        /sbin: root用户能执行的基本程序
               int, insmod, route, mkfs, rmmod, ifconfig
   ====================================================================
        /usr/bin: 更多非必须的用户程序
               autorun, bibtex, latex, biff, ftp, wc, whereis, whoami
        /usr/sbin: 更多非必须的root工具程序
               automount, httpd, in.telnetd, in.talkd, sendmail
        ====================================================================
        /proc  挂载proc文件系统,记录进程的信息
/sys   挂载sysfs文件系统,记录内核所需的特殊文件,设备,总线等信息
/mnt   临时挂载点,挂载其他文件系统使用
/tmp   临时挂载点,挂载其他文件系统使用
====================================================================
        /dev   设备节点(文件)

【4】根文件系统的制作

1)make
    生成bin sbin usr/bin usr/sbin linuxrc

2)mkdir  dev  etc  mnt  proc  var  tmp  sys  root

3)/etc
    inittab  fstab  init.d/rcS  profile

inittab   
 |
 |
fstab
 |
 |
init.d ---- rcS
 |
 |
profile
 
    1)initab  内核在加载rootfs的时候,解析该文件

  1.  ::sysinit:/etc/init.d/rcS 文件系统中运行第一个脚本
  2.  :askfirst:-/bin/sh 指定脚本的类型
  3.  ::restart:/sbin/init 文件系统运行的第一个进程(sbin/init) init=/linuxrc 守护进程
  4.  开启当前的shell环境,服务其他进程,打开其他进程
  5.  ::ctrlaltdel:/sbin/reboot reboot系统重启

2)init.d/rcS

  1.  #!/bin/sh
  2.  # This is the first script called by init process
  3.  /bin/mount -a 执行挂载,与之匹配的是fstab中设置好的挂载点
  4.  echo /sbin/mdev > /proc/sys/kernel/hotplug 生效热插拔机制
  5.  /sbin/mdev -s

3)fstab  设置不同的文件系统的挂载点
      #device     mount-point   type     options         dump     fsck order
      proc      /proc       proc     defaults     0     0
      tmpfs /tmp       tmpfs     defaults         0           0
      sysfs     /sys         sysfs     defaults         0           0
      tmpfs   /dev       tmpfs     defaults         0           0

4)申明库文件,以及进程的路径
     export HOSTNAME=farsight
     export USER=root

PATH=/bin:/sbin:/usr/bin:/usr/sbin
     LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH

嵌入式ROOTFS transplantation的更多相关文章

  1. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS

    上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...

  2. 嵌入式 emmc 中 安装 烧录 内核 kernel,设备树 devicetree ,根文件系统 rootfs

    一般调试嵌入式开发板喜欢选择  利用 TFTP 传送  内核与 设备树,  利用 nfs 加载根文件系统. uboot 环境变量 设置如下: bootargs=root=/dev/nfs rw nfs ...

  3. 嵌入式开发软件环境:uboot、kernel、rootfs、data布局分析

    uboot+linux的整体方案 开发板的datasheet中都有详细的地址空间的划分,其中比较重要的两块是:DDR地址空间和Flash地址空间.DDR空间是系统和应用的运行空间,一般由linux系统 ...

  4. 制作自己的嵌入式Linux电脑_转

    制作自己的嵌入式Linux电脑 http://os.51cto.com/art/201409/450334.htm 原文链接:http://blog.jobbole.com/75414/ 包含器件选择 ...

  5. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel

    经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...

  6. 【4412嵌入式开发板学习笔记】认识uboot

    转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...

  7. 嵌入式Linux内核制作【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51291316 1. Linux体系结构 从整体上来分,linux可以分为User ...

  8. linux rootfs制作

    http://blog.sina.com.cn/s/blog_6795385f01011ifg.html 作一个嵌入式Linux rootfs,并且实现 web 服务 1. 文件系统简介 •理论上说一 ...

  9. 三种嵌入式web服务器(Boa / lighttpd / shttpd)的 linux移植笔记

    一:移植Boa(web服务器)到嵌入式Linux系统 一.Boa程序的移植 1.下载Boa源码    下载地址: http://www.boa.org/    目前最新发行版本: 0.94.13   ...

随机推荐

  1. c++ 的类 和 类继承, 什么是c++中的基类和派生类?

    闲云潭影日悠悠,物换星移几度秋 你既然已经做出了选择, 又何必去问为什么选择.鬼谷绝学的要义, 从来都不是回答, 而是抉与择 普通类 #ifndef TABTENN0_H_ #define TABTE ...

  2. (笔记)Linux常用命令大全

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  3. MyBatis打印输出SQL语句

    Hibernate是可以配置 show_sql 显示 自动生成的SQL 语句,用 format_sql 可以格式化SQL 语句,但如果用 mybatis 怎么实现这个功能呢?如果你搜索看一下,基本都是 ...

  4. e799. 限制JSlider的数值在标记以内

    By default, the slider can take on any value from the minimum to the maximum. It is possible to conf ...

  5. jQuery 文件上传插件:uploadify、swfupload

    jQuery 文件上传插件: uploadify.swfupload

  6. Linux可视化服务器管理工具webmin

    webmin是一个可视化的linux服务器管理工具,可以帮助我们实现很多功能. Webmin官网: http://www.webmin.com/ 下载地址:http://prdownloads.sou ...

  7. CentOS6.8下安装MySQL5.6

    一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ...

  8. C# 获取本机的所有ip地址,并过滤内网ip

    private void Initialization_Load(object sender, EventArgs e) { cboxip.Items.Add("请选择IP地址") ...

  9. linux 下启动tomca慢问题

    编辑文件vim /etc/profile 后面加入一句:export JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" 设置立 ...

  10. 【转】MongoDB学习笔记(查询)

    原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...