Linux文件系统的实现
Posted wanao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文件系统的实现相关的知识,希望对你有一定的参考价值。
存储设备组成与分区
文件系统的最终目的是把大量数据有组织的放入持久性的存储设备中(如硬盘和磁盘)。
磁盘的物理组成为:
- 扇区(Sector)为最小的物理储存单位,目前主要有512bytes和4K两种格式;扇区组成的同一个位置上的⚪,就是磁柱(Cylinder);早期的分区主要以磁柱为最小分区单位,现在的分区通常使用扇区为最小分区单位。
- 磁盘分区表主要有两种格式:MBR分区表和GPT分区表;MBR分区表的第一个扇区最重要,里面有:MBR(Master boot record,主引导记录)和分区表(partition table);GPT分区表除了分区数量扩充较多以外,支持的磁盘容量也可以超过2TB。
常见存储设备最开始的扇区由MBR和分区表组成,Linux开机启动需要MBR加载开机管理程序(grub、grub2等)。剩余的空间可能被分成数个分区,每个分区的信息被记录在第一个扇区的分区表中。
典型的Linux分区如下所示:
- 分区的第一个部分是启动区(boot block):主要为Linux开机服务,Linux开机启动后会首先载入MBR,随后MBR从某个硬盘的启动区加载开机管理程序。一般为了方便管理,即使某个分区没有安装操作系统,也会预留启动区。
- 分区的第二个部分是超级区(super block):记录文件系统的整体信息,包括inode和block的总量、剩余量、使用量,以及文件系统的类型与相关信息等;
- 分区的第三个部分是多个inodes:inode记录文件的权限和属性,一个文件对应一个inode,inode中包含多个指针指向属于该文件的各个data block。
- 分区的最后一个部分就是数据块们(data blocks):实际记录文件的内容(大文件会占用多个block)。
磁盘分区完毕后需要进行格式化之后操作系统才能够使用这个文件系统,为什么需要格式化?因为每种操作系统所设定的文件属性/权限不同,为了存放这些文件所需的数据,需要将分区进行格式化成为操作系统能够使用的文件系统格式。
传统的磁盘与文件系统,一个分区只能够被格式化成为一个文件系统。但是LVM与RAID这些技术可以将一个分区格式化为多个文件系统(LVM),也能将多个分区合成一个文件系统(LVM,RAID),因此现在成一个可被挂载的数据为一个文件系统,而不是一个分区为一个文件系统。
inode
inode记录的文件的权限属性以及该文件实际数据存放的data block号,inode至少记录如下数据:
每个inode有一个唯一的整数编号(inode number)表示,每个文件都只对应一个inode(因此文件系统能够建立的文件数量与inode的数量有关);
inode的数量和大小在格式化的时候确定,每个inode能够存储的数据块指针总数是固定的,如果文件需要的数据块超过了这一总数,inode需要额外的空间来存储数据块指针(直接、间接、双间接、三间接记录区);
系统读取一个文件时需要先找到文件对应的inode,并分析inode记录的权限与用户是否符合,若符合则沿着指针将指向的block内容收集起来,就可以在内存中组成一个文件的数据。
系统写入一个文件时,分配一个空白inode给该文件,将其inode编号记入该文件所属目录,然后选取空白数据块,让inode的指针指向这些数据块,并放入内存中的数据。
superblock
superblock记录整个filesystem相关信息,主要记录如下信息:
一般来说一个superblock的大小为1024bytes。
文件系统与目录树的关系
在Linux下的文件系统建立一个目录时,文件系统会分配一个inode与至少一块block给该目录:
- inode记录该目录的相关权限和属性,并记录分配到的block号码;
- block记录这个目录下的文件名与文件名对应的inode号码。
inode本身不记录文件名,文件名的记录是在目录的block中,因此文件的新增/删除/更名文件名与目录的w权限有关。当读取某个文件时,必须经过目录的inode与block才能找到待读取文件的inode号码,并最终读取文件的block数据。
挂载点的意义
每个文件系统都有独立的inode/block/superblock等信息,文件系统需要能够链接到目录树才能够被使用,将文件系统与目录树结合的动作称之为:挂载,挂载点必须是目录,该目录作为进入该文件系统的入口。
虚拟文件系统VFS
Linux支持多种文件系统,那么Linux的核心如何管理不同的文件系统?
整个Linux系统透过虚拟文件系统(Virtual Filesystem System)的核心功能去读取文件系统,即Linux支持的文件系统都是由VFS管理。虚拟文件系统作为一个通用的文件系统,抽象了文件系统的四个基本概念:文件、目录项(dentry)、索引节点(inode)、挂载点,VFS在内核中为用户层的文件系统提供了相关的接口,VFS实现了open()、read()等系统调用使得用户层程序可跨文件系统操作。
VFS存在四个基本对象:
- 超级块对象(superblock object):代表一个已安装的文件系统
- 索引节点对象(inode object):代表一个文件
- 目录项对象(dentry object ):代表一个目录
- 文件对象(file object):由进程打开的文件
常见文件系统
EXT文件系统家族
Ext 文件系统家族对于文件格式化的处理方面,采用的是预先规划出所有的 inode/block/meta data 等 数据,未来系统可以直接取用, 不需要再进行动态配置的作法。但如果磁盘容量很大,在格式化的时候预先分配inode和block的时间会很长很长。
XFS文件系统
xfs 文件系统在资料的分布上,主要规划为三个部份,一个资料区 (data section)、一个文件系统活动 登录区 (log section)以及一个实时运作区 (realtime section)。
data section
inode/data block/superblock 等数据都放置在这个区块,数据区与 ext 家族的 block group 类似,也是分为多个储存区群组 (allocation groups) 来分别放置文件系统所需要的数据。 inode 与 block 都是系统需要用到时动态配置产生,故格式化动作超级快。
log section
主要用来纪录文件系统的变化,文件的变化会在这里纪录下来,直到该变化完整的写入到数据区后, 该笔纪录才会被终结。
realtime section
当有文件要被建立时,xfs 会在这个区段里面找一个到数个的 extent 区块,将文件放置在这个区块内,等到分配完毕后,再写入到 data section 的 inode 与 block 去 ( extent 区块的大小 得要在格式化的时候就先指定 4K -1G)
硬链接与软链接
为了解决文件的共享使用,Linux引入了两种链接:
硬链接(hard link)
一个inode号对应多个文件名,这些文件为硬链接(它们有共同的inode),硬链接特性如下:
- 文件具有相同的inode及data block;
- 只能对已存在的文件创建;
- 不能跨文件系统创建硬链接;
- 不能对目录创建硬链接,只能对文件创建;
- 删除一个硬链接文件不影响具有相同inode号的其他文件。
软链接(soft link or symbolic link)
若文件的data block中存放的是另一个文件的路径名的指向,则该文件是软链接,软链接的特性如下:
- 软链接有自己的inode和block;
- 软链接可对不存在的文件或目录创建;
- 软链接可以跨文件系统;
- 删除软链接不影响被指向的文件,但被指向的文件删除相关软链接会成为死链接。
参考技术书籍:《鸟哥的Linux私房菜》
参考博客:https://www.cnblogs.com/vamei/p/3506566.html
https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/
以上是关于Linux文件系统的实现的主要内容,如果未能解决你的问题,请参考以下文章
Linux 系统定时拷贝(发送)文件到 windows 系统,实现异地备份