一、什么是文件系统 (Filesystem)

A directory structure contained within a disk drive or disk area.

The total available disk space can be composed of one or more

filesystems. A filesystem must be mounted before it can be accessed. To

mount a filesystem, you must specify a directory to act as the mount

point. Once mounted, any access to the mount point directory or its

subdirectories will access the separate filesystem.

文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。

二、主要嵌入式采用的文件系统

* Linux 中,rootfs 是必不可少的。PC 上主要实现有 ramdisk 和直接挂载 HD(Harddisk,硬盘) 上的根文件系统;嵌入式中一般不从 HD 启动,而是从 启动,最简单的方法是将 rootfs load 到 RAM 的 RAMDisk,稍复杂的就是 直接从 读取的 Cramfs,更复杂的是在 上分区,并构建 JFFS2 等文件系统。

* RAMDisk 将制作好的 rootfs 压缩后写入 Flash,启动的时候由 Bootloader load

到RAM,解压缩,然后挂载到 /。这种方法操作简单,但是在 RAM 中的文件系统不是压缩的,因此需要占用许多嵌入式系统中稀有资源 RAM。

ramdisk 就是用内存空间来模拟出硬盘分区,ramdisk通常使用磁盘文件系统的压缩存放在flash中,在系统初始化时,解压缩到SDRAM并挂载根文件系统, 在系统中,ramdisk有二种,一种就是可以格式化并加载,在内核2.0/2.2就已经支持,其不足之处是大小固定;另一种是 2.4的内核才支持,通过,ramfs来实现,他不能被格式化,但用起来方便,其大小随所需要的空间增加或减少,是目前linux常用的ramdisk技术.

* initrd 是 RAMDisk 的格式,kernel 2.4 之前都是 image-initrd,Kernel 2.5 引入了

cpio-initrd,大大简化了 Linux 的启动过程,附合 Linux 的基本哲学:Keep it simple,

stupid(KISS). 不过cpio-initrd 作为新的格式,还没有经过广泛测试,嵌入式 Linux 中主要采用的还是

image-initrd。

* Cramfs 是 Linus 写的很简单的文件系统,有很好的压缩绿,也可以直接从 Flash 上运行,不须 load 到 RAM

中,因此节约了 RAM。但是 Cramfs 是只读的,对于需要运行时修改的目录(如: /etc, /var,

/tmp)多有不便,因此,一般将这些目录做成ramfs 等可写的 fs。

* SquashFS 是对 Cramfs 的增强。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具有优势。不过,据开发者介绍,在性能上可能不如 Cramfs。这也是一种新方法,在嵌入式系统采用之前,需要经过更多的测试。

三、建一个包含所有文件的目录

1。建一个目录rootfs 用来装文件系统

2。mkdir bin dev etc lib proc sbin tmp usr var

3. ln -fs bin/busybox linuxrc(使用busybox)

4. 到系统 /dev 把所有的device打一个包,拷贝到 dev下面(最省事的做法);或者使用mknod来自己建所需要的device,我自己用的如下:

crw-rw-rw- 1 root root 5, 1 2006-02-24 13:12 console

crw-rw-rw- 1 root root 5, 64 2006-02-24 13:12 cua0

crw-rw-rw- 1 root root 63, 0 2006-02-24 13:12 dk0

crw-rw-rw- 1 root root 63, 1 2006-02-24 13:12 dk1

drwxr-xr-x 2 root root 4096 2006-02-24 13:12 flash

brw-rw-rw- 1 root root 3, 0 2006-02-24 13:12 hda

crw-rw-rw- 1 root root 36, 10 2006-02-24 13:12 ipsec

crw-rw-rw- 1 root root 241, 0 2006-02-24 13:12 ixNpe

crw-rw-rw- 1 root root 1, 2 2006-02-24 13:12 kmem

crw-rw-rw- 1 root root 126, 0 2006-02-24 13:12 ledman

lrwxrwxrwx 1 root root 16 2007-09-19 14:08 log -> /tmp/var/log/log

crw-rw-rw- 1 root root 1, 1 2006-02-24 13:12 mem

crw-rw-rw- 1 root root 90, 0 2006-02-24 13:12 mtd0

brw-rw-rw- 1 root root 31, 0 2006-02-24 13:12 mtdblock0

brw-rw-rw- 1 root root 31, 1 2006-02-24 13:12 mtdblock1

brw-rw-rw- 1 root root 31, 2 2006-02-24 13:12 mtdblock2

brw-rw-rw- 1 root root 31, 3 2006-02-24 13:12 mtdblock3

brw-rw-rw- 1 root root 31, 4 2006-02-24 13:12 mtdblock4

brw-rw-rw- 1 root root 31, 5 2006-02-24 13:12 mtdblock5

brw-rw-rw- 1 root root 31, 6 2006-02-24 13:12 mtdblock6

crw-rw-rw- 1 root root 90, 1 2006-02-24 13:12 mtdr0

crw-rw-rw- 1 root root 1, 3 2006-02-24 13:12 null

crw-rw-rw- 1 root root 108, 0 2006-02-24 13:12 ppp

crw-r——r—— 1 root root 5, 2 2006-03-29 15:56 ptmx

drwxr-xr-x 2 root root 4096 2006-03-29 15:56 pts

crw-rw-rw- 1 root root 2, 0 2006-02-24 13:12 ptyp0

brw-rw-rw- 1 root root 1, 0 2006-02-24 13:12 ram0

crw-rw-rw- 1 root root 1, 8 2006-02-24 13:12 random

crw-rw-rw- 1 root root 5, 0 2006-02-24 13:12 tty

crw-rw-rw- 1 root root 4, 0 2006-02-24 13:12 tty0

crw-rw-rw- 1 root root 3, 0 2006-02-24 13:12 ttyp0

crw-rw-rw- 1 root root 4, 64 2006-02-24 13:12 ttyS0

crw-rw-rw- 1 root root 1, 9 2006-02-24 13:12 urandom

crw-rw-rw- 1 root root 1, 5 2006-02-24 13:12 zero

举例: mknod console c 5 1 这样 crw-rw-rw- 1 root root 5, 1 2006-02-24 13:12 console

5。将编译好的busybox拷贝到/bin下面,除了busybox外,所有其他的命令都是他的link

ash chgrp clear dd echo fgrep gzip ip ls modprobe mv ping pwd sed

stty tar true zcat busybox chmod cp df egrep grep hostname kill mkdir

more netstat ping2file rm sh sync tftp umount cat chown date dmesg

false gunzip ifconfig ln mknod mount pidof ps rmdir sleep sysinfo touch

uname

所有的命令你可以在busybox下面用make menuconfig来增减

6。同样/sbin下面也是busybox的link

halt ifconfig init insmod klogd losetup lsmod mkswap modprobe reboot rmmod route swapoff swapon

7。同样/usr/bin下面也是busybox的link

basename dirname env free id logger reset tail tr tty uptime which xargs

awk cut du expr head killall mkfifo sort test traceroute uniq wc whoami yes

上面几乎是最全的link,各个看官可以酌情删减,不过link也不占什么空间!

8。同样/usr/sbin下面放着所有编译完的可执行文件,具体就不多说了

9。非常重要之/lib,务必重视

找到你编译环境的target目录,把需要的lib文件先用strip压縮(非target目录下的,而已编译环境提供的strip),先把最基本的libc, ld等等,必须同样做跟target/lib里面一样的link。

然后根据特定的应用加相应的lib,不要把不用的加进去,lib比较占空间。

10。在/etc下面加上需要的配置文件,最最重要的是rcS

#!/bin/sh

export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin/scripts

UTC=yes

mount -n -t proc proc /proc

mount -n -t ramfs ramfs /tmp

mount -n -t devpts devpts /dev/pts

# build var directories

/bin/mkdir -m 0777 /tmp/var

/bin/mkdir -m 0777 /var/lock

/bin/mkdir -m 0777 /var/log

/bin/mkdir -m 0777 /var/run

/bin/mkdir -m 0777 /var/tmp

#/bin/mkdir -m 0777 /tmp/etc

#/bin/cp -a /usr/etc/* /etc

#/bin/cp -a /usr/dev/* /dev/

# loads the NPE ethernet modules into the kernel.

insmod /lib/modules/2.6.13.2/intel/ixp400.ko

# Firmware code for NPE Engine.

cat /etc/IxNpeMicrocode.dat > /dev/ixNpe

insmod /lib/modules/2.6.13.2/intel/ixp400_eth.ko netdev_max_backlog=500

insmod /lib/modules/led.ko

insmod /lib/modules/push_button.ko

下面的具体应用没有再举例加上了,这个是系统init必须的。

其他的情况类似如此了,下面里面给了一个lunksys的GPL项目的target。

四、生成一个ramdisk

#!/bin/sh

MODULE_NAME=ramdisk

RAMPATH=`pwd`

TMPPATH=${RAMPATH}/tmp

SOURCE=${RAMPATH}/……/target

if [ ! -d ${TMPPATH} ]

then

mkdir ${TMPPATH}

fi

if [ `whoami` != 'root' ]

then {

echo "You should run the shell as root, Please rerun as a root."

echo "Aborting."

exit 1

}

fi

# Clear in tmp path

rm -rf ${TMPPATH}/tmpmnt

rm -rf ${TMPPATH}/ramrootfs

mkdir ${TMPPATH}/tmpmnt

# Clear the old ramdisk

rm -f ${RAMPATH}/$MODULE_NAME

# Make a temp file which size is suitable

dd if=/dev/zero of=${TMPPATH}/ramrootfs bs=1k count=6144

# Create a ext2 filesystem

mke2fs -F -m 0 -i 2000 ${TMPPATH}/ramrootfs

# Mount it to tmpmnt/

mount -o loop -t ext2 ${TMPPATH}/ramrootfs ${TMPPATH}/tmpmnt

# Copy everything from kernel to this.

cd ${TMPPATH}/tmpmnt

echo ${SOURCE}

cp -av ${SOURCE}/* .

cd ${TMPPATH}

# Unmount it the ext2 filesystem

umount ${TMPPATH}/tmpmnt

cat ${TMPPATH}/ramrootfs | gzip -9 > /${RAMPATH}/ramdisk

echo Copying ramdisk image to ${RAMPATH}

sync

这里给出一个自动生成脚本!

五、生成一个cramfs

找到cramfs的toolchain。/mkcramfs -r $(FS1_DIR) $(FS_NAME).1

六、生成一个mksquashfs

找到squashfs的toolchain。/mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments -noI

做文件系统最困难和最可能出问题的地方是在/lib库和/dev方面,请大家多注意这两方面。

arm linux rcs文件分析,详细解析:如何制作嵌入式Linux文件系统【转载】相关推荐

  1. 电脑上的linux是什么文件夹,linux删除文件夹,详细教您电脑的linux怎么样删除文件夹...

    上期小编讲解了重装系统win7旗舰版64位教程,本次正特手机网小编给大家讲解一下linux删除文件夹,详细教您电脑的linux怎么样删除文件夹,linux主要是做什么用的?有用户在网上提出这样的提问, ...

  2. Linux操作系统Ifconfig命令详细解析

    无论是Linux 自动安装还是我们手工安装,Linux 都会向你询问有关网络的问题并配置相关的软件.这个用于配置网卡的基本命令就是ifconfig. 在执行ifconfig 命令后,系统将在内核表中设 ...

  3. 分析FLV文件分析和解析器的开源代码

    分析一下GitHub上一份FLV文件分析和解析器的开源代码 GitHub源码地址:功能强大的 FLV 文件分析和解析器 :可以将flv文件的视频tag中的h264类型数据和音频tag中的aac类型数据 ...

  4. Linux操作系统PS命令详细 解析

    http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=74654 Linux操作系统PS命令详细 解析 要对系统中进程 ...

  5. linux core文件的信息,linux core文件分析

    linux core文件分析 王钰琪 2017年3月2日 No Comment linux系统的core文件是进程崩溃时产生的快照信息,用于复现进程崩溃时的场景,是程序员分析进程崩溃原因的重要信息. ...

  6. windows命令行下访问linux,Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux...

    原标题:Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux 晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 微软,致力于做最好的Linux发行版. 今天, ...

  7. 怎么删除linux中文件夹,linux删除文件夹,手把手教你电脑的linux怎么样删除文件夹...

    有些爱学习的用户会去操弄linux软件程序,在操作linux的过程中,有时候要删除一个文件夹,往往会提示次此文件非空,没法删除,这对于刚接触的用户来说无疑是一个巨大的困难,为此,小编这就来跟大家分享l ...

  8. Linux安全增强技术,采用MAC技术的嵌入式Linux安全增强技术研究.pdf

    采用MAC技术的嵌入式Linux安全增强技术研究.pdf Practical Method .实践方法 采用 MAC 技术的 嵌入式 Linux 安全增强技术研究 吴新勇 1 杨霞2 (1.四川九於1 ...

  9. 嵌入式linux 用虚拟机,如何制作嵌入式Linux虚拟机

    简介 本文介绍如何在ESXi虚拟化平台下,利用内核文件(bzImage)和内存文件(initrd.img)制作嵌入式Linux虚拟机模板. 虚拟机创建 可以通过vSphere Client来创建一个L ...

最新文章

  1. Java 遍历map
  2. linux centos yum错误 You could try using --skip-broken to work around the problem
  3. linux permit用法,技术|12 条实用的 zypper 命令范例
  4. VTK:灯光之Light
  5. OpenGL GLFX开放GL效果库
  6. word List40
  7. spring boot 配置动态刷新
  8. [转]在SSIS中,使用“包配置”时的常见错误与解析
  9. bzoj 1552: [Cerc2007]robotic sort bzoj 3506: [Cqoi2014]排序机械臂(splay区间翻转)
  10. mysql connections
  11. 1.Zabbix企业级分布式监控系统 --- 监控系统简介
  12. 基于SNMP协议的电信网络监测系统的实现
  13. Layer 提示框tips使用(批量提示)
  14. 高等代数——大学高等代数课程创新教材(丘维声)——3.7笔记+习题
  15. lbj学习日记 07 函数基础
  16. MySQL面试核心25问(附答案),心有猛虎,细嗅蔷薇
  17. 智能交通组合拳--飞桨实现车辆类别/车牌/车速检测、跨境头跟踪、车流密度检测、逆行检测
  18. python下的考勤签到系统
  19. 杰理之linein为DAC进使用打断方式播放提示音,一直有linein背景音【篇】
  20. 怎么做UI全栈设计师 UI怎么学习比较好

热门文章

  1. python数据分析 - 关联规则Apriori算法
  2. C++——C++创建动态二维数组+memset()函数初始化
  3. 【解决方案】Oracle插入/更新CLOB字段报ORA-01704:字符串文字太长
  4. VIN码车架号 麦谈帮API数据接口
  5. 06 Jewels and Stones
  6. 学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)7.3.5-9章
  7. BZOJ 1038: [ZJOI2008]瞭望塔
  8. Oracle Database DRA 不支持11gR2版本的RAC
  9. 怒!移动免费上网卡是骗人的!还是黑我的手机费!
  10. ChatGPT - 使用28原则快速学习的Prompt