搜索
您的当前位置:首页Linux与Windows_NT文件系统

Linux与Windows_NT文件系统

来源:爱问旅游网
Linux与Windows NT系统的文件系统

【摘要】本文参阅了一些书籍和论文,总结了一些主要内容,概述了Linux和Windows NT的文件系统并加以比较。通过文件系统的基本框架、系统调用、具体实现、设计思想等方面介绍了文件文件系统,对比Windows NT和Linux的文件系统,提炼出几点主要的不同和区别。

【关键词】Linux,Windows NT,文件系统

1. Linux系统的文件系统

最初的Linux系统使用MINIX 1文件系统,但是此系统只支持14字节的文件名和最大64MB的文件,限制非常大,所以Linux开发之后的第五年便出现了ext文件系统。然而ext文件系统相比MINIX 1速度更慢,为此人们又开发出ext 2文件系统,成为Linux系统的主流文件系统,此后还有ext 3文件系统,但是基本框架和ext 2没有差别。需要说明的是,Linux使用虚拟文件系统(VFS),因而可以支持多类型的文件系统。 1.1 Linux的文件系统调用 1.1.1 单个文件的系统调用

创建一个文件可以使用creat系统调用,其参数是文件名和保护模式,其中mode决定了文件的访问权限和方式。creat创建成功时会返回一个非负整数即文件描述符。若文件已存在,调用creat会使得该文件的内容丢失,文件长度变为0。下图是常用的文件系统调用函数表[1]: 系统调用 fd=creat(name, mode) fd = open(file, how, „) s = close(fd) n = read(fd, buffer, nbytes) n = write(fd, buffer, nbytes) position= lseek(fd, offset, whence) s = stat(name, &buf) s = fstat(fd, &buf) s = pipe(&fd[0]) s = fcntl(fd, cmd, „) 描述 创建新文件的一种方法 打开文件读、写或者读写 关闭一个文件已经打开的文件 从文件中读取数据到一个缓冲区 把数据从缓冲区写到文件 移动文件指针 获取一个文件的状态信息 获取一个文件的状态信息 创建一个管道 文件加锁及其他操作 这个表格列举了常见的操作调用,其中lseek用以改变文件读写的指针,借此可以实现随机读写或者指定位置读写,其返回值是读写位置变化之后的位置,但是“lseek是唯一一个从不引起实际的磁盘寻道的文件系统调用,因为它所做的只是修改了内存中的一个值(文件读写位置)”[1]。

Linux记录了每个文件的信息,包括:文件类型、大小、最近一次修改时间等。程序通过stat查看文件信息,stat第二个参数是指向将要获取的文件信息存放结构的指针。pipe是创建一个shell管线,而fcntl用于加锁和解锁文件,可以有共享锁和互斥锁。加锁是为了解决多个程序同时使用同个文件导致的竞争,文件的部分已经被添加了共享锁,那么可以继续添加共享锁,添加互斥锁不行。若文件已经被添加了互斥锁,那么必须等到互斥锁解除才能继续添加其它的锁。 1.1.2 目录的系统调用

目录同单个文件类似,也可以被创建和删除等操作。使用mkdir和rmdir可以创建和删除目录,其中删除时若目录内还有其它文件则不能删除。常用的系统调用如下表[1]:

系统调用 s = mkdir (path, mode) s = rmdir (path) s = link (oldpath, newpath) s = unlink (path) s = chdir (path) s = opendir (path) s = closedir (dir) dirent = readdir (dir) rewinddir (dir) 描述 建立新目录 删除目录 创建指向已有文件的链接 取消文件链接 改变工作目录 打开目录 关闭目录 读取一个目录项 回转目录使其再次被读取 1.2 Linux文件系统的实现 1.2.1 Linux虚拟文件系统

Linux虚拟文件系统(Virtual File System, VFS)可以使得应用程序在不同的文件系统进行交互。它定义了文件系统的抽象和操作,使用1.1中的那些系统调用就可以访问文件系统。VFS支持的四个主要系统结构包括:superblock,dentry, i-node和file。superblock内有文件系统布局的重要信息,每个i-node都表示一个确定的文件。dentry是目录项,是路径的一个部分,用它可以遍历路径,而file是跟进程相关联的打开文件,支持read、write等系统调用。

1.2.2 Linux ext2文件系统

ext 2是Linux最流行的文件系统,应用十分广泛。ext 2的磁盘分区中包含下图的文件系统:

引导块 超级块 块0 块1 块2 组描述符 块位图 i节点位图 i节点 数据块 图一:Linux ext 2文件系统的磁盘结构[1] 块0不被Linux使用,每个块组的结构包含了:超级快、组描述符、块位图、i节点位图、i节点和数据块。

超级块中包含了该文件系统的信息(包括i节点个数、磁盘块数和空闲块链表的起始位置)。组描述符存放了位图的位置、空闲块数、组中的i节点数和组中的目录信息。接下来的块位图和i节点位图分别存储空闲块和空闲节点,位图的大小是一个块。i节点是编号从1开始到某个最大值的数,其大小是128字节,且每个i节点刚好描述一个文件。数据块区是所有文件和目录的存放区域。

“目录对应的i节点散布在磁盘块中。如果没有足够的空间,ext 2会把普通文件与父亲目录相同的块组上,而把同一块上的数据文件组织成初始文件i节点。”[1]位图用于快速确定新文件系统数据的分配位置,在分配新文件块时,ext 2会给该文件多分配8个额外的数据块,这样做的好处是为减少了将来写入文件数据产生的文件碎片。这种策略实现了文件系统的负载平衡,并且由于文件碎片减少,其性能也很好。

访问文件时必须先使用Linux的系统调用,系统调用解析文件的路径名,若使用相对路径名,则从当前目录开始查找。目录文件的文件名最多允许255个字符,“每一个目录都是由整数个磁盘块组成,这样目录就可以整体写入磁盘。在一个目录里,文件和子目录的目录项是未排序的,并且一个紧挨着一个。目录项不能跨越磁盘块,所以通常在每个磁盘块的尾部会有部分未使用的字节。”[1]下图是目录示意图[1]:

块3 块4 „„

由于目录按照现行查找,对于寻找位于目录尾端的目录项花费是巨大的,为此系统维护了一个近期访问过的目录缓存。在寻找目录项的时候,如果缓存中的文件名命中,则可以避免线性查找。

在ext 2文件系统中,i节点是基本的数据结构,每个文件与目录有且仅有一个i节点与之对应。每个模块中的i节点保存在i节点表中,同时也保存有跟踪节点分配情况的位图。每个i节点有15个块指针,每个指针32位,其中前12个块指针用做直接数据块指针,后3个指针分别为一级间接指针、二级间接指针、三级间接指针。[2] 1.2.3 Linux ext 3文件系统

“为了防止由系统崩溃和电源故障造成的数据丢失,ext 2文件系统必须在每个数据块创建者之后立即将其写到磁盘上。必须的磁盘磁头寻道操作导致的延迟是如此之长以至于性能差得无法让人接受。因此,写操作被延迟,对文件的改动可能在30秒都内不会提交给磁盘,而相对于现代的计算机硬件来说,这是一段相当长的时间间隔。”[1]

ext 3增加了日志文件系统,其核心思想是维护一个日志文件,它记录了所有文件的系统操作。日志文件顺序记录了文件数据的改动,当这些改动被写到适当的磁盘位置后,相应的日志项被丢弃。如果发生电源故障或者系统崩溃,且日志文件的操作还没有被提交,那么在重新启动过程中,系统会检测文件系统,然后遍历日志文件,执行相应的文件系统操作。

日志文件是以一种环形缓冲器形式组织的。日志操作本身是有独立的日志块设备执行的,不会被日志文件记录。 1.2.4 /proc文件系统

/proc是Linux的另一种文件系统,来源于Bell实验室的第八版UNIX,基本概念是为系统中的每一个进程创建一个目录。目录下是进程的信息文件,如进程的命令行、环境变量和信号掩码等,但这些文件并不真实存在,当读取这些文件时,系统只是从进程中抽取相应信息,以标准格式返回。

“许多Linux扩展与/proc中其他的文件和目录相关。”[1]相对而言应用较少,这里不作详细论述。

2. NTFS文件系统

NTFS(New Technology File System)是微软专门为Windows NT开发的,且具有较好容错性和安全性的文件系统。随着Windows 操作系统的发展,FAT32文件系统已经完全被取代。NTFS限制了独立文件名的字符数为255,全路径名为32767,文件名使用Unicode编码且区分大小写。

与Linux、Unix的文件系统不同,NTFS文件不是简单的字节现形排列。NTFS中文件有很多属性,每个属性用一个字节流,流的名字由一个文件名、一个冒号和一个流名组成。NTFS也是一个层次化的文件系统,名字之间采用“\\”分离,支持当前目录(.)和父目录(..)。

2.1 NTFS的文件系统结构

NTFS 的主要结构是卷,卷由硬盘上的逻辑分区组成。一个磁盘可能包含一个或多个卷。每个卷中又包含许多文件。在NTFS 文件系统中,并没有特别为文件系统自身提供额外的空间。而将文件系统所需的全部数据,如记录卷的分配状态位图、文件、目录和系统引导程序等数据,像一般的文件一样储存在硬盘上。这些系统文件称为元文件(metafile),这些数据则称为元数据(metadata)。磁盘上的文件使用簇链接在一起。一个簇的长度一定是物理扇区长度的整数据。

每个卷中主要结构是MFT(主文件表,Master File Table),该表是以1KB为固定大小的文件记录数组,每个MFT记录描述了一个文件或者目录。[1]MFT本身也有一条记录,其本身就是一个文件。每个MFT记录由属性头和属性值的序列组成的,依照属性值的大小会存在不同的位置。若属性值足够小,则直接存在记录里,称为直接文件,若属性值太大,则只存一个指向属性的值指针。

刚开始的16个记录为NTFS元数据文件。如图四所示[1]:

其中“$”表示元数据文件,第一个记录描述MFT本身,说明MFT文件块的位置。记录1是MFT文件早期的部分信息,记录2是Log文件,保存目录、文件属性修改的动作历史。记录3则是卷的大小、卷标和版本信息。记录4是一个属性头和值得数据对,记录5则是对根目录文件的描述。记录6描述了位图的属性值和磁盘地址,记录7指向引导装载程序,记录8链接坏块,记录9包含安全信息,记录10用于大小字母转换,记录11是拓展项。后面的四条记录留作备用。

当目录的属性值存放在MFT 表的基本文件记录中,该属性就称为常驻属性(resident attribute)。对于常驻属性,属性值存放在属性名的后面。如果一个目录的属性值太大,不能存放在一个文件记录中,那么NTFS 将从Data 区为该属性值分配存储空间。这些存储空间通常称为一个运行图四: NTFS主文件表

(run),用来存放属性值,存储在运行中的属性称为非常驻

属性(non-residentattribute)。MFT中的基本文件记录有一个指针指向大小为2KB的运行,那是一个非常驻索引缓冲区,包含着下一层的目录或文件。采用b+树结构储存目录信息,可以以很快的速度对目录进行查询,并且不需要去读文件自身的文件记录。在存储大量的小文件时,NTFS 文件系统能节约存储空间,访问速度也比较快的主要原因即在此。[3] 2.2 存储分配

数据流中的块通过一串记录描述,单个记录只描述逻辑上连续的块,因此对于没有孔的流只有一个记录,对于有一个孔的流则有两个记录。每个记录的开始称为头,给出了第一个块在流中的偏移量,下面是没有被记录覆盖的第一个块的偏移量。后面跟着一个或多个对,每个对给出了磁盘地址和持续长度[1]。

用这种方式表示的流大小没有上限,不压缩地址情况下,每一个对需要两个64位的数表示。这样,这种对的表示需要占据16字节,但是硬盘地址中高位往往含有多个零,因此可以压缩地址。可以忽略这些重复的零,数据头记录有多少个高位的零被省略了,也有不同的压缩方式,一般的出现的只有4个字节。当文件太大或者碎片化程度太高,一条MFT记录不能满足需求的时候便会使用两条记录。MFT记录会计算需要多少个拓展记录,所有记录的索引会放在首记录中,首记录的剩余空间用来存放行串。当首记录的空间用完以后,即用第一拓展记录的空间,一次类推来处理分段存储文件。倘若文件需要的MFT记录太多超出了首记录的空间范围,那么拓展的MFT记录列表将记录在硬盘区域而不是首记录中,这样就能根据需要适时扩大。 2.3 文件压缩与文件加密

文件压缩的大致流程是:“当NTFS写一个有压缩标志的文件到磁盘时,它检查这个文件前16个块,而不管它们占用多少个项,然后对他们运行压缩算法,如果压缩后的数据能够存放在15个甚至更少的块中,压缩数据将写到硬盘中;如果可能的话,这些块将在一个行串里。如果压缩后的数据仍然占据16块,这16块以不压缩的方式写到硬盘中。之后,对下面的16个块进行同样的尝试。”[1]当系统访问压缩文件时,首先判断行串是否被压缩过,然后再进行相应的读写策略。随机读写时,需要对压缩过的部分解压缩再进行读写。

对于文件加密,Windows是将重要的目录标记为加密,但是这不是由NTFS完成的,是由EFS(Encryption File System)驱动程序管理的。 2.4 日志与文件恢复、加密

NTFS支持两种查询文件、目录变化信息。第一种,调用NtNotifyChangeDirectory File的I/O操作,系统将目录变化记录在一个缓冲区中。第二种,NTFS变化日志,将目录和文件变化记录保存到一个文件,以供以后使用。

利用日志,NTFS可以实现文件恢复,这是NTFS的一个重要特性。为了从一次系统故障中恢复回来,使磁盘上的卷保持一致,NTFS 使用一个在卷内运行的事务日志登记系统来实现这一目的。程序使用格式命令和日志文件服务(LFS)可以创建日志文件,系统还提供内核模式的服务例程,可以访问日志文件,并允许记录新的日志信息。[3]

日志文件有两个区域组成:重启区域和日志区域,重启区域存储数据恢复开始信息,日志区域存储I/O操作历史。重启区域的恢复信息包含了两份,若其中一份损坏或者不能访问,可以使用另外一份。NTFS使用逻辑顺序号(LSN)来识别这些记录。在一个I/O 事务实现其对卷的改变之前,它被登记在日志文件中。这样,如果系统发生故障,日志文件中的记录可以用于完成数据恢复。改变一个卷的过程的步骤简述如下[3]:

(1)LFS在日志文件中记录将要对卷进行编辑的I/O事务,该记录现位于高速缓冲存储器中;

(2)修改高速缓冲存储器中的卷数据;

(3)LFS 刷新高速缓冲存储器中的日志文件到磁盘上;

(4)高速缓冲存储器中已修改的卷数据被刷新到磁盘。在实际的卷操作被刷新到磁盘之前,NTFS首先记录这一操作,并将记录保存在磁盘,根据对这些记录的分析,即可实现对数据的恢复。

日志文件的记录有更新记录和检查点记录两种类型。 “更新记录是用于实现恢复与撤消工作的信息。如果在高速缓冲存储器的卷数据刷新到

磁盘之前,发生了系统故障,恢复信息可以告诉NTFS 如何重新实现I/O 事务中未完成的部分,将高速缓冲存储器的卷数据写到磁盘上。如果日志文件中的记录指示,事务已经在高速缓冲存储器中完成,该事务即被认为已提交。即使后来系统发生了故障,已提交的事务也必须完成。撤销信息用来告诉NTFS 如何撤销一个未提交的事务的已完成部分。NTFS 对下列的各种文件活动都要记录更新信息记录:创建、删除、扩展、剪切、设置文件信息、重命名及改变文件安全属性。”[3]

检查点记录用于指出在系统故障之后恢复工作的开始位置。每隔5 秒,一个事务表、脏页表和检查点记录就被写到日志文件中。事务表不断的跟踪那些已经开始但而未提交的事务,这些事务的已完成部分必须撤销。脏页表则不断跟踪那些包含对文件系统结构的修改但没有刷新到磁盘的页,这些页的数据必须刷新到磁盘上。

NTFS 在完成恢复工作时要对日志文件做三次扫描。第一次是分析扫描。NTFS 寻找由检查点记录所标记的最新的事务表和脏页表,找到的更新记录存于另一个表中。然后,使用这张表来查找最后一个更新记录的逻辑顺序号,这些更新记录中包含未被写到磁盘的操作的记录。第二次扫描是恢复扫描,从分析扫描中找到的LSN开始,每一个更新记录所记录的操作,都在高速缓冲存储器中重做一次,再通过后台写到磁盘。最后一次是撤销扫描,它利用事务表找出系统故障的时没有提交的事务,撤销每个事务的已完成部分。当上面的过程完成时,高速缓冲存储器的所有改变都将刷新到磁盘中。LFS 清空日志文件的重启区域。至此,数据恢复工作全部完成。 3. 两种文件系统的主要区别

Linux和Windows NT文件系统权限不一样,在Windows 系统中,用户分为两类:计算机管理员和受限用户。某些软件只能由管理员安装,但是一般使用中,计算机的多个用户都是管理员,都可以任意安装、删除软件文件。

在Linux系统中,用户分为四类:root(超级管理员),普通用户,同一组用户,其他用户。“root用户拥有最高权限,可以对计算机系统进行任何操作。普通用户分别有自己的主目录,对自己主目录下的文件拥有所有权限,对其他文件(如系统文件和其他用户文件)操作则需要文件所有者授权。自己拥有的文件可以对自己,同一组用户和其他用户分别授权。权限分三种读、写和运行。”[4]

Linux和Windows NT的目录结构不同,这一点在上文中的文件系统实现有较为详细的说明,总得来说:NTFS中硬盘分区,每个区都是一棵树。Linux中只有一棵树,也有分区。此外,NTFS中文件名有拓展名用以分别文件的类型,Linux中则没有明显的区分。

【参考文献】

[1] 机械工业出版社.Tanenbaum Andrew S. 现代操作系统[M]. 机械工业出版社. [2]高晓蓉. 浅析Linux文件系统[J]. 南京广播电视大学学报. 2003(02): 28-31.

[3] 王兰英,居锦武. NTFS文件系统结构分析[J]. 计算机工程与设计. 2006(03): 418-419. [4] 杨延军,孔庆月,米青. 浅议Linux与Windows文件系统的区别[J]. 中国科技信息. 2006(07): 206.

因篇幅问题不能全部显示,请点此查看更多更全内容

Top