文件系统
文件保护
文件的保护通过口令保护、加密保护、和访问控制等方式实现。其中,口令和加密是为了防止用户文件被他人存取或窃取,而访问控制则用于控制用户对文件的访问方式。
口令保护
口令指用户在建立一个文件时提供一个口令,系统为其建立FCB时附上相应的口令,同时告诉允许共享该文件的其他用户。用户在请求访问时必须提供口令。
优点:这种方式需要的时间和空间开销不多
缺电:正确的“口令”存放在系统内部,不够安全
加密保护
使用``密码`对文件进行加密,在访问文件时需要提供正确的密码,才能对文件进行正确的解密。如下图是对文件实现的一种简单加密:
优点:保密性强,不需要在系统中存储密码
缺点: 编码/译码,或者说是要加密/解密要花费一定时间
访问控制
在每个文件的FCB(或索引结点)中增加一个访问控制列表(Access-Control List ACL),该表中记录了各个用户可以对该文件执行的哪些操作。为减短了访问控制表,精简ACL可以精简访问列表,以“组”为单位,标记各“组”的用户可以对文件执行哪些操作。
需要注意的是如果对某个目录进行了访问权限的控制,哪也要对目录下的所有文件进行相同的访问权限控制。
文件系统的层次结构
文件系统提供高效和便捷的磁盘访问,以便允许存储、定位、提取数据。
文件系统的全局结构
文件在磁盘上的结构
文件系统存放在磁盘上,文件系统可能包含如下信息:启动存储在那里的操作系统的方式、总的块数、空闲块的数量和位置、目录结构以及各个具体文件等。
物理格式化,即低级格式化——划分扇区,检测坏扇区,并用备用扇区替换坏扇区
- 主引导记录(MBR),位于磁盘的0号扇区,用来引导计算机,MBR后面是分区表,该表给出了每个分区的起始和结束地址。当计算机启动时,BIOS读入并执行MBR。MBR做的第一件事情即使确定活动分区,读入它的第一个块,即引导块(用于对操作系统的引导,一般只在启动操作系统时使用)
- 超级块反映了文件系统整体的控制信息。超级块中的典型信息包括分区的块数量、块的大小、空闲块的数量和指针、空闲的FCB数量和FCB指针等
- 文件系统的空闲块信息,可以用位示图或者指针链接给出。后面给出的则是i结点,每个i节点包含了文件的详细信息
- 最后就是文件的根目录,它存放了文件系统目录树的根部
文件在内存中的结构
下图展示了文件系统在内存中的的结构。近期访问过的目录文件会被缓存在内存中,不用每次都从磁盘读入,这样加速了目录检索的速度。在内存中的信息用于管理文件并通过缓存来提高性能。这些结构的类型可能包括:
- 安装表(mount table),包含每个已安装文系统分区的有关信息
- 内存中的目录结构的缓存包含最近访问目录的信息。对安装分区的目录,它可以包括一个指向分区表的指针
- 整个系统的打开文件表,包含每个打开文件的FCB(不打开的没有)及其他信息
- 每个进程的打开文件表,包含一个指向整个系统的打开文件表中的对应条目的指针,及其他信息
下图展示的系统执行open
系统调用的过程:
- 当用户使用open系统调用,并指定对应的参数,会根据路径一级一级读入目录
- 找到目标文件的FCB,复制到系统打开文件表
- 在进程打开文件表中新建一个条目,并返回文件描述符(Windows系统中为文件句柄)
下图展示了执行read
系统调用的执行过过程:
- 根据文件的描述符(句柄)在对应进程的打开文件表中找到在系统打开文件表中的索引
- 在系统打开文件表中找到对应的FCB信息
- 根据FCB中指向文件物理地址的指针,去访问磁盘读取文件数据
虚拟文件系统
虚拟文件系统(VFS)为用户提供了文件系统操作的统一接口,屏蔽了不同文件系统的差异和操作细节。用户可以通过CFS提供的统一调用函数来操作不同系统的文件,而无需考虑具体的文件系统和实际的存储介质
虚拟文件系统的三大特点:
- 向上层用户提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异
- VFS要求下层的文件系统必须实现某些规定的函数功能,如open/read/write。一个新的文件系统想要在某操作系统上被使用,就必须满足该操作系统VFS的要求
- 每打开一个文件,VFS就在主存中新建一个
vnode
,用统一的数据结构表示文件,无论该文件存储在哪个文件系统。注意:vnode
只存在于主存中,而inode
既会被调入主存,也会在外存中存储。在打开文件后,创建vnode
,并将文件信息复制到vnode中,vnode的功能指针指向具体文件系统的函数功能
为了实现VFS,Liunx主要抽象了四种对象类型。每个VFS对象都存放在一个适当的数据结构中,其中包含:
- 超级块对象:表示一个已安装的特定文件系统
- 索引节点对象:表示一个特定的文件
- 目录项对象:表示一个特定的目录项
- 文件对象:表示一个与进程相关的已打开文件
文件系统的挂载
文件系统挂载要做的事:
- 在VFS中注册挂载的文件系统。**内存中的挂载表(mount table)**包含每个文件系统的相关信息,包含文件系统类型、容量大小等
- 新挂载的文件系统,要向VFS提供函数地址列表
- 将新文件系统加到挂载点(mount point),也就是将新文件系统挂载在某个父目录下
参考
- https://www.eet-china.com/mp/a38145.html