朱小明 武汉学院信息及传播学院信息系
Linux操作系统文件管理概论
朱小明 武汉学院信息及传播学院信息系
随着计算机操作系统的发展,系统的稳定性也是越来越重要,但是由于windows操作系统的先天不足,所以linux系统越来越受到欢迎,服务器操作系统,大多都采用linux操作系统用来管理文件。
linux 文件管理 支持系统
Linux系统因为使用VFS,所以其核心可以支持如ext、ext2、ext3、ext4、JFS2等的多种的文件系统。下面咱们就说一下文件系统,我们还是从外部使用与内部实现两部分来分开讲。
我们知道我们操作系统内核的外面也就是用户空间下,我们是通过系统调用来使用操作系统提供的功能的。下面我们介绍一下关于文件和目录的系统调用。
2.1 文件系统调用
Fd=create(fileName,mode); 创建文件系统调用(文件名,权限状态位)
Fd=open(filename,how); 打开文件(文件名,模式(读or写))
Close(fd) 关闭一个文件,意味着对一个文件的操作全部结束
N=read(fd,buffers,nbytes) 读取文件(文件句柄,缓存区,读取的字节大小)
N=write(fd,buffer,nbytes) 把数据从缓冲区写入文件(文件句柄,缓冲区,要写入的字节数)
Position=lseek(fd,offset,whence); 移动文件指针
S=stat(name,&buf) 获取文件状态信息
S=fstat(fd,&bug); 获取文件状态信息
2.2 关于目录的系统调用
S=mkdir(path,mode) 创建目录(目录路径,权限)
S=rmdir(path) 删除目录
S=link(oldPath,newPaht) 创建指向已有文件的链接
S=unlink(path); 删除已有链接
S=chdir(path) 改变工作目录
Dir=opendir(path); 打开目录
S=closedir(dir) 关闭目录
dirInfo=readdir(path); 读取目录项
下面我们以linux下ext2文件系统来说一下文件系统的内部实现。我们首先看一下磁盘的分区示意图:
引导区(启动时读取哪个分区上的操作系统)分区表(记录各个分区的位置) 1分区 2分区 3分区
再看一下每个分区下的数据块:
超级块(记录了文件系统的类型,包含的i节点的个数、磁盘块数、以及空闲块链表的其实位置)组描述符(存放了空闲块位图以及i节点位图的位置、目录的个数)块位图用来记录空闲块的位置I节点位图用来记录空闲i节点I节点存储区数据存储区
3.1 Inode(i节点)
因为文件系统要知道所有文件的属性信息,还要知道文件数据在磁盘上的实际存储位置,所以还要记录一个文件所占用的磁盘块。无论是采用链表或者位图来存储一个硬盘上的文件和目录信息,都是要耗费不少的磁盘空间和内存空间,磁盘越大,文件或目录项或空闲块就越多。为了解决这个问题,设计者就想出了这个i节点的注意,并且在文件系统上实现了。这样在内存中就不必存储所有文件的位置信息了,需要打开哪些文件就将那些文件的i节点存储到内存中即可。
3.2 文件系统的空间分配
操作系统根据文件中空间块位图以及i节点位图来分配和回收文件的创建和消除的存储分配。
3.2.1 日志文件系统
为了防止由于系统崩溃或电源突然中断导致正在进行的文件操作中断所造成的数据丢失,ext2文件系统就必须在每个数据块创建或修改后即刻写入磁盘。
Ext3其实只是ext2文件系统加上了一个日志维护功能,增强了文件系统的健壮性。每一个磁盘操作都会将其具体的操作位置以及数据记录到日志里。当发生系统崩溃或电源中断时,再次启动时,文件系统会比对日志与磁盘是否一致,不一致则根据日志来完善操作。
3.2.2 网络文件系统(NFS)
网络功能在linux中占据着不可动摇的地位,当然文件系统也要强大到支持非本地文件系统。其实网络文件系统就是在linux操作系统下,将远程机器上的目录挂载到本地的文件系统上,首先远程机器会检查客户机器的挂载请求以及权限验证,通过则将自己的文件系统类型以及被挂载目录的i节点信息组成的一个唯一标识放到本地。当本地有对此文件操作时,文件系统就会检查当前被挂载的目录是本地文件系统还是网络文件系统。如果是网络文件系统,则通过网络文件系统协议发送读取文件或者打开文件的请求,包含文件名以及读取的位置或要写入的数据或位置,然后远程机器返回相应。
尽管文件系统的实现并不复杂,但它是可伸缩和可扩展的体系结构的好例子。文件系统体系结构已经发展了许多年,并成功地支持了许多不同类型的文件系统和许多目标存储设备类型。由于使用了基于插件的体系结构和多层的函数间接性,Linux文件系统发展很值得关注。
[1]文东戈,孙昌立,王旭.Linux操作系统实用教程[M].北京:清华大学出版社,2010.
[2]阿正.linux文件系统概述[J]