Linux 文件系统基础

     这篇文章是关于linux文件系统的,但没有真正的解除我对文件系统的疑问,也记录一下。

 

        文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。一个操作系统的运行离不开对文件的操作,因此必然要拥有并维护自己的文件系统。 linux文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。

     索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。

  linux文件系统将文件索引节点号和文件名同时保存在目录中。所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。

如下图:

 

   当一个文件系统被格式化成ext2或者ext3的时候,就会产生Inode number。大家注意到,在文件系统中每一个inode-no对应一个文件:例如图中对应的1-F1(文件名)、2-D1等等而每一个Inode-no对应一个inode-table,即图中下面部分的一张表首先我们看看,我们是怎么样读取和修改一个文件的:(VFS文件系统中描述的更详细些) 

1、我们首先根据文件名,找到这个文件的Inode-no(节点数)。
2、当我们找到个文件的Inode-no时,就会根据这个number数在inodetable中找到对应的条目。
3、现在要我们看一看inodetable中的信息:从左到右依次是:节点数、文件类型、文件的权限、硬链接数、用户ID、组ID、文件的大小、时间戳记,最后为指向硬盘上存放数据的数据块的指针。

    

     对于一个文件来说有唯一的索引节点号与之对应,对于一个索引节点号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问它。

 

在此也顺便说一下inode

 

一、inode的分类及其具体涵义
  inode分为内存中的inode文件系统中的inode,为了避免混淆,我们称前者为VFS inode, 而后者以EXT2为代表,我们称为Ext2 inode。下面分别对VFS inodee与Ext2 inode做一下简单的描述:
  1、VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。它是linux管理文件系统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。inode结构中的静态信息取自物理设备上的文件系统,由文件系统指定的函数填写,它只存在于内存中,可以通过inode缓存访问。虽然每个文件都有相应的inode结点,但是只有在需要的时候系统才会在内存中为其建立相应的inode数据结构,建立的inode结构将形成一个链表,我们可以通过遍历这个链表去得到我们需要的文件结点,VFS也为已分配的inode构造缓存和哈希表,以提高系统性能。inode结构中的struct inode_operations *i_op为我们提供了一个inode操作列表,通过这个列表提供的函数我们可以对VFS inode结点进行各种操作。每个inode结构都有一个i结点号i_ino,在同一个文件系统中每个i结点号是唯一的。

  2、EXT2 inode用来定义文件系统的结构以及描述系统中每个文件的管理信息,每个文件都有且只有一个inode,即使文件中没有数据,其索引结点也是存在的。每个文件用一个单独的Ext2 inode结构来描述,而且每一个inode都有唯一的标志号。Ext2 inode为内存中的inode结构提供了文件的基本信息,随着内存中inode结构的变化,系统也将更新Ext2 inode中相应的内容。Ext2 inode对应的是Ext2_inode结构。
  从结构的定义中可以看出来inode(VFS inode)与ext2_inode的差别是很大的,它们都包含动态信息和静态信息,通过union指定的内容一定是动态的。inode结构中的union u实际上反映了VFS支持的文件系统。

     3、从上面的描述,我们可以对VFS inode与ext2 inode做出比较:
  位置:   VFS inode结构位于内存中,而Ext2_inode位于磁盘。
  生存期:VFS inode在需要时才会被建立,如果系统断电,此结构也随之消失。
              Ext2_inode的存在与系统是否上电无关,而且无论文件是否包含数据,Ext2_inode都是存在的。
  唯一性:两者在自己的作用域中都是唯一的。
  关系:   VFS inode是Ext2 inode的抽象、映射与扩充,而后者是前者的静态信息部分,也是对前者的具体化、实例化和持久化。
  操作:   对VFS inode的操作具有通用性,对文件系统inode的操作则是文件系统相关的,依赖于特定的实现。
  组织管理:系统通过VFS inode链表来对其进行组织,并且为了提高访问效率相应地构造了inode构造缓存和hash table。
              Ext2 inode的信息位于EXT2文件系统的划分的块组中(inode块),在每个块组中包含相应的inode位图、inode表指定具体的inode信息,每个inode对应Ext2_inode结构。

二、 inode的分配 (对于ext2 inode)
 1、每个inode的大小为128个字节,下面具体介绍哪几个字节代表什么内容。
 0~1 表示文件的类型和属性(2 bytes)0×41ed (rwxr-xr-x) 0×8180 (-rw——-)
 2~3 表示文件的长度(2 bytes)
 4~7 表示文件宿主用户id(4 bytes)
 8~19 表示三个时间属性,每4个字节代表一个时间,分别是atime,ctime,mtime12B)
 20~23 表示Deletion Time 即删除的时间。
 24~25 表示用户组id (2 bytes)
 26~27 表示硬链接的个数。
 28~31 表示Blockcount 的大小
 32~39 暂不清楚??
 40~99 这60个字节就是inode中的15个指针,每个指针占4个字节。
 100~103 暂不清楚??
 104~107 表示文件访问控制表号(File ACL)
 108~111 表示(Directory ACL)
 112~127 暂不清楚??

 2、在分割扇区时,系统会先做出一堆inode以供以后使用,inode的数量关系着系统中 可以建立的档案及目录总数。有时候,这些inode或许会不够用,例如当一个程序产生大量小文件的时候,此时文件系统就需要增加索引节点。
  同样,如果我们事先知道此文件系统只用来存放少数大文件,我们就可以通过减少索引节点的数目来达到节省磁盘空间的目的——毕竟每个索引节点占用128字节。
  创建文件系统的时候,可以使用newfs命令的-i选项来增加或者减少索引节点的数目。
 3、newfs -i 2048 -b 8192 -f 1024
  newfs创建新的文件系统
  -i 2048更改inode每2KB创建一个
  -b 8192设置block size的大小为8kB
  -f 1024设置fragments的大小为1KB

由上一节知道,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。这里所说的按一定方式就是指的挂载。将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载。把该子目录称为挂载点。

注意:

l     1挂载点必须是一个目录

l     2、一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。
对于其他操作系统建立的文件系统的挂载也是这样。但是需要理解的是:光盘、软盘、其他操作系统使用的文件系统的格式与linux使用的文件系统格式是不一样的。光盘是ISO9660;软盘是fat16ext2windows NTfat16NTFSwindows98fat16fat32windows2000windowsXPfat16fat32NTFS。挂载前要了解linux是否支持所要挂载的文件系统格式。

挂载时使用mount命令
格式:mount [-参数] [设备名称] [挂载点]
其中常用的参数有
-t<
文件系统类型> 指定设备的文件系统类型,常见的有:
minix linux
最早使用的文件系统
ext2 linux
目前常用的文件系统
msdos MS-DOS
fat,就是fat16
vfat windows98
常用的fat32
nfs
网络文件系统
iso9660 CD-ROM
光盘标准文件系统
ntfs windows NT 2000
的文件系统
hpfs OS/2
文件系统
auto
自动检测文件系统
-o<
选项> 指定挂载文件系统时的选项。有些也可用在/etc/fstab中。常用的有
codepage=XXX
代码页
iocharset=XXX
字符集
ro
以只读方式挂载
rw
以读写方式挂载
nouser
使一般用户无法挂载
user
可以让一般用户挂载设备

自动挂载:

每次开机访问windows分区都要运行mount命令显然太烦琐,为什么访问其他的linux分区不用使用mount命令呢?
其实,每次开机时,linux自动将需要挂载的linux分区挂载上了。那么我们是不是可以设定让linux在启动的时候也挂载我们希望挂载的分区,如windows分区,以实现文件系统的自动挂载呢?
这是完全可以的。/etc目录下有个fstab文件,它里面列出了linux开机时自动挂载的文件系统的列表

Eg: /dev/hda2 / ext3 defaults 1 1

/etc/fstab文件里,第一列是挂载的文件系统的设备名,第二列是挂载点,第三列是挂载的文件系统类型,第四列是挂载的选项,选项间用逗号分隔。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值