Linux 文件系统

文件系统总体介绍

文件系统是操作系统中很重要的一个子系统,来完成对持续存储介质的数据保存与恢复,能够更加方便的访问磁盘上的一些数据包括读或者写。
可以从三个部分理解文件系统

一. 从用户的角度理解文件系统的功能

1. 文件基本概念
  • 文件和文件系统
  • 文件描述符
  • 目录
  • 文件别名
  • 文件系统种类

文件系统:是一种用于持久性存储的系统抽象
文件:文件系统中一个单元的相关数据在操作系统中的抽象

分配文件磁盘空间
  • 管理文件块(那一块属于哪一个文件)
  • 管理空闲空间(哪一块是空闲的)
  • 分配算法(策略)

文件是展现给我们用户看到的抽象的概念,对应到永久存储(比如说硬盘)来说,文件是什么呢?

文件有他的文件名,他的文件数据,管理这些文件信息。在磁盘空间中,为了较好的抽象出文件的概念,就会有文件块。类似于进程的控制块,文件块用来管理文件,文件空间的管理。

如果要分配文件,从哪取得磁盘块的信息?它的分配算法是什么,这都是管理文件需要考虑的问题,和磁盘有紧密的交互,根据磁盘的特性来选择紧密地分配方式

管理文件集合
  • 定位文件及其内容
  • 命名:通过名字找到文件的接口
  • 最常见:分层文件系统
  • 文件系统类型(组织文件的不同方式)

通过文件的名字作为唯一的标识来找到文件,文件系统提供分层的功能也就是目录,那么文件就可以通过路径名来找到文件

提供便利以及特征
  • 保护:分层来保护数据安全
  • 可靠性/持久性:保持文件的持久性即使发生崩溃、媒体错误、攻击等

关于文件的读写问题的安全可靠也是文件系统需要考虑的问题

文件属性

名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间、…

文件头
  • 存储元数据中保存了每个文件的信息
  • 保存文件的属性
  • 跟踪哪一块存储块属于逻辑上文件结构的哪个偏移
文件描述符

从编程者的角度来看,打开一个文件需要name等信息,接下来为了更简便的处理。读写处理会使用文件描述符(一个整形的数),这个数就代表了这个文件。文件描述符代表了这个文件给程序访问和各种各样的控制。

那么文件描述符一个整数是如何代表文件的呢?

这个整数并不是一般的数字,在操作系统内核里面它对每一个进程打开的文件有一个表,叫做打开文件表,这个文件描述符就是这个文件表的索引指出了文件表中的第几项代表这个文件,每一个项包含了很多的这个文件的信息。

那么需要管理好文件,需要哪些元素数据呢?

  • 文件指针:指向最近的一次读写位置,每次打开了这个文件的进程都有该指针
  • 文件打开计数:记录文件打开的次数,当最后一个进程关闭了文件时,允许将其从打开的文件表中移除
  • 文件磁盘位置:缓存数据访问信息
  • 访问权限:每个程序访问模式信息

文件视角

  • 用户视角:持久的数据结构
  • 系统访问接口:字节的集合;系统不会关心你想存储在磁盘上的任何数据结构
  • 操作系统内部视角:块的集合(块是逻辑转换单元,而扇区是物理转换单元);块大小,扇区大小

用户视角与操作系统视角

用户访问的字节在操作系统磁盘上是以磁盘块为单位读取的

用户怎么访问文件
在系统层面需要知道用户的访问模式

顺序访问:按字节依次读取
几乎所有的访问都是这种方式
随机访问:从中间读写
不常用,但是仍然重要. 例如虚拟内存支持文件:内存页存储在文件中
更加快速:不希望获取文件中间的内容的时候也必须先获取块内所有的字节
基于内容访问:通过特征
许多系统不提供此种访问方式,相反,数据库是建立在索引内容的磁盘访问,需要高效的随机访问

文件的内部结构

无结构

  • 单词、比特的队列

简单的记录结构

  • 固定长度
  • 可变长度

复杂结构

  • 格式化的文档
  • 可执行的文件

操作系统把文件理解为串行的字节流,去完成接下来的读或者写。应用程序和操作系统分开了,可以用很复杂的结构,但是这个文件和特定的应用相关和操作系统无关,这样就大大简化了操作系统的实现,使得操作系统更加具有通用性。

多用户系统中的文件共享是很必要的

访问控制

  • 谁能够获取哪些文件的哪些访问权限
  • 访问模式:读、写、执行、删除、列举等

文件访问控制列表

  • 文件实体,权限

Unix 模式

  • 用户 | 组 | 所有人, 读 | 写 | 可执行
  • 用户ID标识用户,表明用户所允许的权限及保护模式
  • 组ID允许用户组成组,并指定了组访问权限

指定多用户如何同时共享文件

  • 和过程同步算法类似
  • 因磁盘I/O和网络延迟而设计简单

Unix 文件系统(UFS)语义

  • 对打开的文件的写入内容立即对其他打开同一文件的其他用户可见
  • 共享文件指针允许多用户同时读取和写入文件

会话语义

  • 写入的内容只有当文件关闭时可见

  • 一些操作系统和文件系统提供该功能
目录

文件以目录的方式组织起来

目录是一类特殊的文件

  • 每个目录都包含了一张表<name, pointer to file header>

目录和文件的树形结构

  • 早期的文件系统是扁平的(只有一层目录)

层次名称空间

目录的典型操作

  • 搜索文件
  • 创建文件
  • 删除文件
  • 枚举目录
  • 重命名文件
  • 在文件系统中遍历一个路径

操作系统只允许内核模式修改目录

  • 确保映射的完整性
  • 应用程序能够读目录(如ls)

文件名的线性列表,包含了指向数据块的指针

  • 编程简单
  • 执行耗时

Hash表 - hash数据结构的线性表

  • 减少目录搜索时间
  • 碰撞 - 两个文件名的hash值相同
  • 固定大小

文件系统有一个很大的开销,就是文件路径的遍历

文件系统的挂载

在Unix系统里面有不同类型的文件系统,不同的文件系统挂载在不同的目录下形成一个分层次的跨文件系统的访问。挂载文件的挂载点在用户看来是一个目录,但是这个目录很特别,这个目录代表根的起始位置,我们把它称之为挂载点。

一个文件系统需要先挂载才能被访问
一个未挂载的文件系统被挂载在挂载点

文件别名

两个或多个文件名关联同一个文件
硬链接:多个文件项指向一个文件
软连接:以“快捷方式”指向其他文件(根据路径访问的一个链接)
通过存储真实文件的逻辑名称来实现

文件系统种类

磁盘文件系统

  • 文件存储在数据存储设备上,如磁盘
  • 例如:FAT,NTFS,ext2/3,ISO9660,等

数据库文件系统

  • 文件根据其特征是可被寻址的(辨别)
  • 例如:WinFS

日志文件系统

  • 记录文件系统的修改/事件
  • 例如:journaling file system

网络/分布式文件系统

  • 例如:NFS,SMB,AFS,GFS

特殊/虚拟文件系统

二. 如何实现文/件系统

从实现的角度来理解,文件系统如何组织,设计,管理,运行

1. 虚拟文件系统

虚拟文件系统对操作系统内不同的文件系统的抽象

  • 上层:虚拟(逻辑)文件系统
  • 底层:特定文件系统模块

目的:对所有不同文件系统的抽象

功能

  • 提供相同的文件和文件系统接口
  • 管理所有文件和文件系统关联的数据结构
  • 高效查询例程,遍历文件系统
  • 与特定文件系统模块的交互

总文件系统应该包含什么呢?

卷控制块(Unix:“superblock”)

  • 每个文件系统一个
  • 文件系统详细信息
  • 块、块大小、空余块、数据库位置

文件控制块(Unix:“vnode” or “inode”)

  • 每个文件一个
  • 文件详细信息
  • 许可、拥有者、大小、数据库位置等

目录节点

  • 每个目录项一个(目录和文件)
  • 将目录数据结构及树形布局编码成树形数据结构
  • 指向文件控制块、父节点、项目列表等
2. 数据块缓存

磁盘的容量虽然比内存大,但是内存的访问速度远远大于磁盘。
因此有必要数据块缓存

数据块按需读入内存

  • 提供read() 操作
  • 预读:预选读取后面的数据块

数据块使用后被缓存

  • 假设数据将会再次被使用
  • 写操作可能被缓存和延迟写入

两种数据块缓存方式

  • 普通缓冲区缓存
  • 页缓存:统一缓存数据块和内存页
3. 打开文件的数据结构

如果我们打开一个文件(read、close)就可以对文件进行读写了,那么打开文件后操作系统干了什么事情呢?

打开文件描述

  • 每个被打开的文件一个
  • 文件状态信息
  • 目录项、当前文件指针、文件操作设置等

打开文件首先我们要找到这个文件在硬盘的什么地方,所以打开就是把硬盘中存储的文件的文件控制块读到内存中来,把相关的控制信息放到打开的文件表里面,给文件表里面设置了这么一项,再把这一项的索引index返回给我们的应用程序(文件相关的数据在于硬盘的什么地方)。应用程序通过读取文件项实际上操作系统转换成具体磁盘扇区上数据的操作。

打开文件表

  • 一个进程一个
  • 一个系统级的
  • 每个卷控制块也会保存一个列表
  • 所以如果有文件被打开将不能被卸载
4. 文件分配

大多数文件都很小

  • 需要对小文件提供强力的支持
  • 块空间不能太大

一些文件非常大

  • 必须支持大文件(64-bit 文件偏移)
  • 大文件访问需要相当高效
5. 空闲空间列表
  • 跟踪在存储中的所有未分配的数据块
  • 空闲空间列表存储在哪里?
  • 空闲空间列表的最佳数据结构是什么样的?

用位图代表空闲数据块列表

  • 1111111111000010101101010100000
  • 如果i = 0 表明数据块i是空闲,反之则已分配

使用简单但是可能会是一个big vector

空闲链表能够快速的找到空闲的磁盘块。不同的分配方式根据实际情况适用于不同的操作系统。

三. 多磁盘管理(了解)

1. 多磁盘管理 - RAID

通常磁盘通过分区来最大限度减小寻道时间

  • 一个分区是一个柱面的集合
  • 每个分区都是逻辑上独立的磁盘

分区:硬件磁盘的一种适合操作系统指定格式的划分
卷:一个拥有一个文件系统实例的可访问的存储空间

2. 磁盘调度

典型的电梯算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值