分享

各种文件系统

 望穿墙 2016-04-20

首先,所谓文件系统就是用户程序和文件的集合,在LINUXPC机上放到一个统一的目录下,然后通过一个工具打包成一个image文件,这通常是个压缩的过程。然后烧制到板子上后,LINUX内核启动完成后,会逐个挂接这些文件系统映象文件并做解包的工作,当然第一个挂接的就是rootfs了,有了rootfs并提供了SHELL之后,就可以通过mount这个SHELL命令来挂载其它FS了。
     所以,若用户要添加自己的程序到文件系统的image里面去,就是把自己的程序或文件复制到这个FSPC LINUX上的目录里面去,然后重新打包生成image,这样你的东东就加进去了,以后就是下载和烧写的问题了。
那么具体在做把自己的程序或文件复制到这个FSPC LINUX上的目录里面去这个步骤的时候,不同的文件系统就略有区别了:
例如您的程序是一个可执行程序hello,放在/目录下面:
对于RAMDISK
它是要先在PC上解压到一个目录上的
mkdir /mydir
mount –o loop ramdisk.image /mydir
cp /hello /mydir
umount mydir
gzip ramdisk.image
这样就加入了

对于JFFS2,则不要解压原有的jffs2.img,而是直接往原来的目录里面添加即可:
注意:下面的这个jffs2_dir是你的软件包里面原来就有的,例如HHARM9-EDU就是
/HHARM9-EDU/Images/backup/jffs2目录,这个目录里面原来就有我们默认添加的一些文件和目录,你只要把自己的程序复制进去即可。
当然了,若你的软件包里面没有提供我们原来的这个目录,那也没关系,您完全可以自己重新
mkdir /jffs2_dir
这样做就是你新做的jffs2.img里面除了你刚刚添加的hello外没有任何目录和文件,而这完全可以工作,启动后自己添加即可。
mkfs.jffs2 d  /jffs2_dir  o  jffs2.img
这个mkfs.jffs2工具是要额外提供的,如果您没有,可发信索取。

对于CRAMFS
JFFS2完全相同的做法,你也完全可以自己
mkdir /cramfs_dir
mkcramfs /cramfs_dir cramfs.img
当然了,和JFFS2不同的是,它是只读的,你在PC机上添加了什么,到板子上就只能有什么,不能再动态创建目录和复制进去文件了,要添加必须重做cramfs.img烧 写到FLASH上才行。
这个mkcramfs的工具是REDHAT LINUX自带的。

对于uClinux上用的ROMFS:
genromfs -v -V "ROMdisk" –f romfs.img –d romfs_dir
当然了,这个romfs目录是任何一个uClinux-dist包里面都会默认带有的目录。

romfs, cramfsramdisk

cramfsromfs只是一个文件系统类型,ramdisk相当于一块硬盘空间,可以理解为在内存中虚拟出一块硬盘来,所以它上面就可以有你 linux支持的各种文件系统什么的。所以你问的,它和romfscramfs确实不是一个层次的概念。 ^-^恭喜你,你答对了,加10
cramfs是只读压缩的文件系统,文件系统类型可以是ext2ext3,什么的,
制作方法: 假如你的根文件系统的目录是 rootfs (你将来要用到的所有的文件就在这里)
like this mkcramfs rootfs rootfs.cramfs 就搞定了。如名字所言,它是只读压缩,所以比较省空间,如果你的flash比较小,就用这个吧! 系统启动后,kernel把他load到内存中,解压,所以比较占内存。看你的需要了。

ramdisk呢?这个用的比较多,ramdisk相当于一块硬盘空间,可以理解为在内存中虚拟出一块硬盘来,所以它上面就可以有你linux支持的各种文件系统什么的。所以你问的,它和romfscramfs确实不是一个层次的概念。 关键是以后,在ramdisk里面可以写,这是一个和cramfs重要的区别了。
具体制作方法:
dd if=/dev/zero of=rootfs.img bs=1M count=一个整数(看你的实际的需要的空间了,一般也就10M)
把它格式化为你需要的文件系统,比如 ext2 ,ext3 ,reiserfs 什么的,
比如ext3 : mkfs.ext3 root.img
然后把它mount到某个目录,比如tmp 吧:
mount -t ext3 /tmp/

然后,你的文件系统所在的目录的所有文件copytmp目录下: 比如你的文件系统目录在/root/rootfs-test :
cp -av /root/rootfs-test/* /tmp/ (这里注意一个细节:copy的时候,用参数a表示copy全部,v表示只copy链接本身,不copy它指向的内容,这点很关键哦!) ,另外,有的人常用:cp -pdR 这个你也可以试试,意思就是原来什么样,copy过去就什么样。

然后卸载/tmp/ 目录就好了。
umount /tmp

一般的情况下,ramdisk是要压缩的,对于上面的生成好的imgrootfs.img ,你可以这样压缩:
gzip -v9 rootfs.img 会自动生成rootfs.img.gz ,一般压缩率,30%吧!

romfs
uCLinux系统采用ROMFS文件系统,这种文件系统相对于一般的ext2文件系统要求更少的空间。空间的节约来自于两个方面:首先内核支持ROMFS文件系统比支持ext2文件系统需要更少的代码;其次ROMFS文件系统相对简单,在建立文件系统超级块(superblock)需要更少的存储空间。ROMFS文件系统不支持动态擦写保存,对于系统需要动态保存的数据采用虚拟RAM盘的方法进行处理(RAM盘将采用ext2文件系统).
可以从http://romfs./下载生成romfs的工具genromfs

个人经验: 你自己要创建文件系统,一般是先建一个目录在里面建一些常用的目录,比如bin ,sbin ,root ,etc lib 什么的,正如楼上所言,lib比较烦,需要考虑你要用的程序需要的动态链接库, 建议你先搞一个别人的,拿过来,参考,自己去改,一开始,自己去作肯定要疯的。

你可以到网上搜搜的。 有个网站,http://user-mode-linux./  这个里面提供了一些简单的文件系统,你可以拿过来,自己改改。 这是个比较快的方法,其实,里面要改基本是:
/etc/rc.d/** 下面的启动脚本。
lib/下的一些动态链接库。
shell busybox知道吗? 利用这个,可以省很多空间, 到google上搜搜

 

在内存上建立自己的文件系统

目的:学习内核数天,跃跃欲试

决定在RAM上建立一个ROOT文件系统,从而对Linux的启动过程,挂载root文件系统加深理解.

参考:www. 上的电子期刊第一期《走进Linux 操作系统》的一个试验

操作步骤:
先解释下几个文章中提到的文件

work.tar.gz - 一些脚本,用于生成root文件系统,initrd文件系统以及它们的镜像文件比较有用的就是mkimage.sh,其它两个生成rootsinitrdfs的好像不太好用
rootfs.tar - 现成的rootfs文件系统
initrdfs.tar - 现成的initrdfs文件系统

准备工作是把work.tar.gz 解压到/root/kernel/,形成/root/kernel/work工作目录

1 创建Root文件系统内容直接用文章提供的做好的rootfs,解压就可以了
2 生成rootfs文件在Ram中的镜像ramlinux.img.gz

(1). /etc/lilo.conf当前启动的内核镜像的下面加入append="ramdisk_size=20000"使其支持在Ram中建立20M的文件系统区域然后运行liloreboot

(2). dd if=/dev/zero of=/dev/ram bs=1k count=20000

#/dev/ram文件对应的设备清零,目的是提高后来的压缩率
mke2fs –m0 /dev/ram 20000         #建立文件系统,其对应的物理设备就是/dev/ram 
mount /dev/ram /mnt/ #mount进文件系统
cp –av /rootfs/* /mnt/ram

#rootfs文件数据拷贝到新建的文件系统上,也即/dev/ram对应的物理设备上运行df ,注意1k-blocks一栏中/dev/ram的数值,假定为ramsize

umount /dev/ram
dd if=/dev/ram of=ramlinux.img bs=1k count=ramsize
gzip –9v ramlinux.img
3 创建initrd文件夹此步骤可以直接把initrdfs解压,修改其中linuxrc文件的内容,使其指向的文件夹是正确的

4 生成initrd镜像

和第二步类似

或者直接执行脚本mkimage.sh生成initrd.img.gzramlinux.img.gz
5 拷贝initrd.img.gz/boot目录下
修改/etc/lilo.conf
6 lilo reboot

它的工作原理是:
1) 硬件启动后,挂initrd到内存里
2initrd作为小的系统做一些工作,把做好的rootfs镜像写入到内存中去,也即是/dev/ram对应的文档
3) 挂载文件/dev/ram设备对应的文件作为root目录完成

 

Linux文件系统

1、  Linux文件系统概述

Linux中用户能看到的文件空间是一个单树状结构的,该树的根在顶部,称为根目录(root,用“/”表示。文件空间中的各种目录和文件从树根向下分支。

对用户而言,该目录树就象一个无缝的整体,用户能看见的是紧密联系的目录和文件。实际上,文件树中的许多目录存放在一个磁盘、不同磁盘甚至不同的计算机的不同分区中。当磁盘分区之一被“mount”到文件树中称为“安装点”(mount point)的目录上时,就成为了该目录树的一个组成部分。

windows 98C:盘(其本身是FAT32文件系统)未被安装时,/mnt/winc是根文件系统中的一个普通子目录(格式可能是Linux  EXT2/3),里面可以存放任何数据。而FAT32格式的C盘上的数据独立于Linux系统,不能被Linux系统所读取。安装(mount)之后,/mnt/winc/就成了安装点,其中所有的数据都将被FAT32文件系统所屏蔽,用户只能看到FAT32文件系统中存放的数据,只能将该文件系统卸载之后,/mnt/winc中原有的数据才会出现,不会丢失。

Linux正是通过这种将不同文件系统装配在一起的技术,实现了个文件系统之间的无缝连接,为用户的操作提供了极大的方便,用户也不用费心思去考虑光盘驱动器的盘符是什么了。

2、Linux文件系统组成

Linux操作系统由一些目录和文件组成。根据安装的方式不同,这些目录可能是不同的文件系统。通常,一个系统可以有多个文件系统组成:根分区文件系统(/),和安装在/usr下的文件系统,还有其他安装在/home/var文件系统。其中根文件系统必须是Linux ext2/3.顺便提一下最简单的Linux操作系统分区是/和交换分区(SWAP)。

根目录中包含了组成根目录的内容,也为其他的文件系统提供了安装点。

/dev目录  包含所有的设备文件、这些设备式系统设置的、一般都和系统的硬件有一定相互对应关系的特殊文件,分为快设备,字符设备和特殊设备,一般不要随便更改和删除

/bin 目录  包含称为二进制文件的可执行程序

/sbin目录  /bin目录类似,这些文件往往是用来进行系统管理的,一般只有root才有运行的权限

/etc 目录  Linux系统的绝大部分配置文件都存放在这里,这些文件是系统更符合用户的需要。

/proc 目录 这实际是一个虚拟的文件系统,使系统启动是从内存中建立的,用于内存读取数据。

/tmp 目录 用于存放各种临时文件,这些文件大都是程序运行是产生的,程序结束时一般将他们删除

/home目录 存放一般用户的个人目录

/var 目录 保存大小和内容随时改变的文件,通常各种系统日志文件放在这里

/lib 目录 存放系统的各种库文件,库文件在编译程序时会用到。

/mnt 目录 为其他的文件系统提供安装点

/boot 目录 存放系统启动时所需的各项文件

/root 目录 超级用户的个人目录,普通用户没有权限访问

/lost+found目录 :放置一些垃圾文件

/usr目录 一般用户程序安装所在的目录,使系统中最庞大和最重要的目录。

3、 文件系统管理

Linux文件系统管理最上层模块是文件系统。系统启动时,必首先装入“根”文件系统,然后根据/etc/fstab中制订,逐个建立文件系统。此外用户也可以通过mountumount操作,随时安装和卸载文件系统。

当装入一个文件系统时,应首先向系统核心注册该系统及其类型。当卸载一个文件系统时,应向核心申请注销该系统和类型。文件系统的注册和注销反映在以vfsmnlist为链头,vfsmntail为链尾,以vfsmount为节点的单向链表中。从链表的每一个vfsmount可以找出一个已注册的文件系统的信息。文件系统类型的注册和注销反映在以file_systems为链头,以file_system_type为节点的单向链表中。链表中的每一个file_system-type节点描述了一个已注册的文件系统类型。

4、虚拟文件系统(VFS

VFS是物理文件系统与服务之间的一个接口层,他对每一个Linux文件系统的所有细节进行抽象,使得不同的文件系统在Linux核心以及系统中运行的其他进程看来,都是相同的。

严格说来,VFS并不是一种实际的文件系统。他只存在内存中,不存在于任何外存空间。VFS在系统启动是建立,在系统关闭时消亡

VFS的功能包括

记录可用的文件系统的类型

将设备同对应的文件系统联系起来

处理一些面向文件的通用操作

涉及到针对文件系统的操作时,VFS把他们映射到与控制文件、目录、以及inode相关的物理文件系统。

5、安装和卸载文件系统

要在Linux目录树中安装一个文件系统,必须要有实际要安装的硬盘分区、光盘或软盘,并且作为该文件系统安装点的目录必须是实际存在的。

手工安装文件系统。命令是mount [options] <device> <mount_point>,device是要安装的实际设备文件,mount_point是安装点。Optionsmount接收的命令行选项。如果用户没有给出所需的选项,mount将尝试从相关的/etc/fstab文件中查找。

Mount的常用选项有:

1-r以只读方式安装文件系统。

2-w以可读写方时安装文件系统。

3-v verbose模式,mount将给出许多信息以报告其工作状态

4-a 安装/etc/fstab文件中所列的所有文件系统

5-o list_of_options选项列表,各选项之间用逗号隔开。

6-t file_type指定要安装的文件系统类型。

直接装载文件系统的最基本命令就是 mount –t <fs_type> <device> <mount_point>, -t选项接受auto作为其参数,这使得mount能够自动检测文件系统类型。

卸载文件系统的命令是umount,由四种基本的命令格式

umount <device>

umount <mount_point>

umount –a

umount –t fs_type

前两种方式卸下由devicemount_point指定的文件系统,第三种形式卸下所有的文件系统,第四种方式卸下制定类型的文件系统。Umount不能卸下正在使用的文件系统,当然系统的根分区也不能卸载,知道系统退出Linux的运行状态。

 

合并内核与romfs(以及独立的内核与romfs)映象文件的方法

image.ramromfs.img的分两次下载可能已经使您觉得很麻烦了,下面是将两者合并为一个文件(image.ram)下载的方法,

修改linux2.4.x/driver/block/blkmem.c文件:

#ifdef CONFIG_BOARD_MBA 44
{0, romfs_data, -1}, //{0, 0xc500000, -1},
#endif

重新编译,就会生成一个较大的合并了的image.ram了。

05429)现在的bootloaderuClinux源码包都是支持合并映像文件的了,但有部分做应用的用户使用两者分离的更为方便,因此现在我们也提供这样的bootloader,请需要的用户来信索取。
在这个bootloader下烧录uClinux映象文件,按照以下地址:
44bapp.bin下载到0xC008000;
bootloader.bin下载到0xC200000;
imagerom.bin下载到0xC220000;
romfsimg.bin下载到0xC320000;
然后从0xC008000运行,即开始烧录。
如果您需要频繁修改romfsimag,但内核部分不变,可以仅仅将imagerom烧录到flash中:
44bapp.bin下载到0xC008000;
bootloader.bin下载到0xC200000;
imagerom.bin下载到0xC220000;
0xC008000运行,开始烧录。
以后只要将romfsimg.bin下载到0xC500000,然后用选项7启动uClinux即可。
注意要产生独立的内核和文件系统,将uClinux/linux-2.4.x/drivers/block/blkmem.c文件中的:
#ifdef CONFIG_BOARD_MBA44
{0, romfs_data, -1}, //{0, 0xc500000, -1},
#endif
改为
#ifdef CONFIG_BOARD_MBA44
{0, 0xc500000, -1},
#endif
即可。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多