嵌入式Linux文件系统制作详解

转载 2007年10月08日 14:53:00
 一、什么是文件系统 (Filesystem) 

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

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

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

  * RAMDisk 将制作好的 rootfs 压缩后写入 Flash,启动的时候由 Bootloader load 到RAM,解压缩,然后挂载到 /。这种方法操作简单,但是在 RAM 中的文件系统不是压缩的,因此需要占用许多嵌入式系统中稀有资源 RAM。

  ramdisk 就是用内存空间来模拟出硬盘分区,ramdisk通常使用磁盘文件系统的压缩存放在flash中,在系统初始化时,解压缩到SDRAM并挂载根文件系统, 在linux系统中,ramdisk有二种,一种就是可以格式化并加载,在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 作为新的格式,还没有经过广泛测试,嵌入式 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。

BusyBox制作Initramfs嵌入式Linux根文件系统

嵌入式Linux系统由linux内核与根文件系统两部分构成,两者缺一不可(无根文件系统的内核无法启动) 使用busybox构建嵌入式根文件系统目录结构,配置内核,并且使用Initramfs制作成根...
  • mcu_tian
  • mcu_tian
  • 2016年06月01日 15:44
  • 3161

嵌入式开发制作最小的linux文件系统

要求:编译器的版本是4.4.6   查看当前交叉编译器的版本:arm-linux-gcc -v   如果不是4.4.6编译器,需要修改一下两个文件:   vim /home/tarena/...
  • a1299600490
  • a1299600490
  • 2016年05月08日 18:46
  • 1492

嵌入式 详解制作根文件系统以及文件系统中init以及其他文件详解

一、FHS(Filesystem Hierarchy Standard)标准介绍 当我们在linux下输入ls  / 的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linu...
  • skdkjxy
  • skdkjxy
  • 2014年06月17日 19:46
  • 2947

嵌入式Linux根文件系统制作和挂载

嵌入式Linux系统由三部分组成: uboot、kernel、根文件系统, 还是这张老图 这里的根文件系统可以说是包含两个部分: 一个是根,一个是文件系统 那么什么是根呢?哈哈 其实根表示...
  • coding__madman
  • coding__madman
  • 2016年05月02日 20:33
  • 10415

对嵌入式Linux中的根文件系统的理解和解析

虽然前面已经利用Busybox制作了根文件系统,但是对于根文件系统的作用和普通的文件系统之间的区别还是有点模糊。通过查找资料总结了一 下对根文件系统的理解,也欢迎大家一起讨论。    首先要明...
  • special00
  • special00
  • 2016年04月27日 16:58
  • 2155

一步步制作根文件系统 (一)

开发环境:Ubuntu 12.04                             开发板:mini2440  256M NandFlash   64M SDRAM              ...
  • ASKLW
  • ASKLW
  • 2016年09月21日 18:47
  • 4018

嵌入式 制作x86平台Linux跟文件系统initrd.img

什么是初始 RAM 磁盘? 初始 RAM 磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd 与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:44
  • 1391

嵌入式Linux常用文件系统

Linux支持很多文件系统,在选择时应根据应用的功能选择文件系统 内核只认识VFS(虚拟文件系统),不同的文件系统实现的都是和VFS的相互调用,进而通过VFS访问内核 MTD(Memeory ...
  • hisense20112784
  • hisense20112784
  • 2015年07月07日 08:56
  • 377

创建嵌入式linux混合文件系统(ramdisk+jffs2)

1、 Ramdisk文件系统 Ramdisk就是将内存中的一块区域作为物理磁盘来使用的一种技术,内存盘的存取速度要远快于目前的物理硬盘,所以它具有读写速度高的优势。在嵌入式设备中,我们可以把Ramdi...
  • u013305541
  • u013305541
  • 2014年01月01日 14:33
  • 2365

嵌入式linux烧写内核,文件系统的2种方式

一.网络下载烧写 tftpboot 二.linux下的DNW,win7下的DNW无法使用 第一种方式 1.设置开发板ip,及其服务器IP在同一段 set ipaddr 192.168.1.X ...
  • u013426958
  • u013426958
  • 2015年05月20日 21:46
  • 1031
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式Linux文件系统制作详解
举报原因:
原因补充:

(最多只允许输入30个字)