《嵌入式linux根文件系统rootfs》由会员分享,可在线阅读,更多相关《嵌入式linux根文件系统rootfs(7页珍藏版)》请在金锄头文库上搜索。
1、一、什么是文件系统 (Filesystem) 文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备 )或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。二、主要嵌入式采用的文件系统* Linux 中,rootfs 是必不可少的。PC 上主要实现有 ramdisk 和直接挂载 HD(Harddisk,硬盘) 上的根文件系统;嵌入式中一般不从 HD 启动,而是从 Flash 启动,最简单的方法是将 rootfs load 到 RAM 的 RAMDisk,
2、稍复杂的就是 直接从 Flash 读取的 Cramfs,更复杂的是在 Flash 上分区,并构建 JFFS2 等文件系统。* RAMDisk 将制作好的 rootfs 压缩后写入 Flash,启动的时候由 Bootloader load 到RAM,解压缩,然后挂载到 /。这种方法操作简单,但是在 RAM 中的文件系统不是压缩的,因此需要占用许多嵌入式系统中稀有资源 RAM。ramdisk 就是用内存空间来模拟出硬盘分区,ramdisk 通常使用磁盘文件系统的压缩存放在 flash 中, 在系统初始化时,解压缩到 SDRAM 并挂载根文件系统 , 在 linux 系统中,ramdisk 有二种,
3、 一种就是可以格式化并加载, 在 linux 内核 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 作为新的格
4、式,还没有经过广泛测试,嵌入式 Linux 中主要采用的还是 image-initrd。* Cramfs 是 Linus 写的很简单的文件系统,有很好的压缩绿,也可以直接从 Flash 上运行,不须 load 到 RAM 中,因此节约了 RAM。但是 Cramfs 是只读的,对于需要运行时修改的目录(如: /etc, /var, /tmp)多有不便,因此,一般将这些目录做成 ramfs 等可写的 fs。* SquashFS 是对 Cramfs 的增强。突破了 Cramfs 的一些限制,在 Flash 和 RAM 的使用量方面也具有优势。不过,据开发者介绍,在性能上可能不如 Cramfs。这也是
5、一种新方法,在嵌入式系统采用之前,需要经过更多的测试三、建一个包含所有文件的目录1。建一个目录 rootfs 用来装文件系统2。mkdir bin dev etc lib proc sbin tmp usr var3. 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 consolecrw-rw-rw- 1 roo
6、t root 5, 64 2006-02-24 13:12 cua0crw-rw-rw- 1 root root 63, 0 2006-02-24 13:12 dk0crw-rw-rw- 1 root root 63, 1 2006-02-24 13:12 dk1drwxr-xr-x 2 root root 4096 2006-02-24 13:12 flashbrw-rw-rw- 1 root root 3, 0 2006-02-24 13:12 hdacrw-rw-rw- 1 root root 36, 10 2006-02-24 13:12 ipseccrw-rw-rw- 1 root
7、root 241, 0 2006-02-24 13:12 ixNpecrw-rw-rw- 1 root root 1, 2 2006-02-24 13:12 kmemcrw-rw-rw- 1 root root 126, 0 2006-02-24 13:12 ledmanlrwxrwxrwx 1 root root 16 2007-09-19 14:08 log - /tmp/var/log/logcrw-rw-rw- 1 root root 1, 1 2006-02-24 13:12 memcrw-rw-rw- 1 root root 90, 0 2006-02-24 13:12 mtd0b
8、rw-rw-rw- 1 root root 31, 0 2006-02-24 13:12 mtdblock0brw-rw-rw- 1 root root 31, 1 2006-02-24 13:12 mtdblock1brw-rw-rw- 1 root root 31, 2 2006-02-24 13:12 mtdblock2brw-rw-rw- 1 root root 31, 3 2006-02-24 13:12 mtdblock3brw-rw-rw- 1 root root 31, 4 2006-02-24 13:12 mtdblock4brw-rw-rw- 1 root root 31,
9、 5 2006-02-24 13:12 mtdblock5brw-rw-rw- 1 root root 31, 6 2006-02-24 13:12 mtdblock6crw-rw-rw- 1 root root 90, 1 2006-02-24 13:12 mtdr0crw-rw-rw- 1 root root 1, 3 2006-02-24 13:12 nullcrw-rw-rw- 1 root root 108, 0 2006-02-24 13:12 pppcrw-r-r- 1 root root 5, 2 2006-03-29 15:56 ptmxdrwxr-xr-x 2 root r
10、oot 4096 2006-03-29 15:56 ptscrw-rw-rw- 1 root root 2, 0 2006-02-24 13:12 ptyp0brw-rw-rw- 1 root root 1, 0 2006-02-24 13:12 ram0crw-rw-rw- 1 root root 1, 8 2006-02-24 13:12 randomcrw-rw-rw- 1 root root 5, 0 2006-02-24 13:12 ttycrw-rw-rw- 1 root root 4, 0 2006-02-24 13:12 tty0crw-rw-rw- 1 root root 3
11、, 0 2006-02-24 13:12 ttyp0crw-rw-rw- 1 root root 4, 64 2006-02-24 13:12 ttyS0crw-rw-rw- 1 root root 1, 9 2006-02-24 13:12 urandomcrw-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 console5。将编译好的 busybox 拷贝到/bin 下面,除了 busybox 外,所有
12、其他的命令都是他的linkash 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所有的命令你可
13、以在 busybox 下面用 make menuconfig 来增减6。同样/sbin 下面也是 busybox 的 linkhalt ifconfig init insmod klogd losetup lsmod mkswap modprobe reboot rmmod route swapoff swapon7。同样/usr/bin 下面也是 busybox 的 linkbasename dirname env free id logger reset tail tr tty uptime which xargsawk cut du expr head killall mkfifo so
14、rt 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 。在 /et
15、c 下面加上需要的配置文件,最最重要的是 rcS#!/bin/shexport PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin/scriptsUTC=yesmount -n -t proc proc /procmount -n -t ramfs ramfs /tmpmount -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/mk
16、dir -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/ixNpeinsmod /lib/modules/2.6.13.2/intel/ixp400_eth.ko netdev_max_backlog=500insmod /lib/modules/led.koinsmod /lib/modules/push_button.ko下面的具体应用没有再举例加上了,这个是系统 init 必须的。其他的情