Linux 操作系统原理-文件系统(1)
简介
虚拟文件系统(Virtual File System,简称VFS)是Linux内核的子系统之一,它为用户程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节。借助VFS可以直接使用open()、read()、write()这样的系统调用操作文件,而无须考虑具体的文件系统和实际的存储介质。
通过VFS系统,Linux提供了通用的系统调用,可以跨越不同文件系统和介质之间执行,极大简化了用户访问不同文件系统的过程。另一方面,新的文件系统、新类型的存储介质,可以无须编译的情况下,动态加载到Linux中。
“一切皆文件”是Linux的基本哲学之一,不仅是普通的文件,包括目录、字符设备、块设备、套接字等,都可以以文件的方式被对待。实现这一行为的基础,正是Linux的虚拟文件系统机制。
VFS之所以能够衔接各种各样的文件系统,是因为它抽象了一个通用的文件系统模型,定义了通用文件系统都支持的、概念上的接口。新的文件系统只要支持并实现这些接口,并注册到Linux内核中,即可安装和使用。
举个例子,比如Linux写一个文件:
1int ret = write(fd, buf, le ...
Linux 操作系统原理-文件系统(2)
文件类型普通文件类型理解了文件系统的结构之后,我们来看一下文件的类型。
Linux以文件的形式对计算机中的数据和硬件资源进行管理,也就是彻底的一切皆文件,反映在Linux的文件类型上就是:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等。而这些种类繁多的文件被Linux使用目录树进行管理, 所谓的目录树就是以根目录(/)为主,向下呈现分支状的一种文件结构。
普通文件从Linux的角度来说,类似mp4、pdf、html这样应用层面上的文件类型都属于普通文件,Linux用户可以根据访问权限对普通文件进行查看、更改和删除。我们知道,文件的属性,权限,大小,占用那些数据块是存在inode当中。所以,这里注意一旦,inode 当中并没有存放文件名,至于为什么,我们接下来看目录文件。
目录文件本质上来书,目录页是文件,目录文件inode除了存放一些目录的权限,等属性之外,目录文件的内容则是该目录文件下文件名和其inode编号的一个映射关系。最简单的保存格式就是列表,就是一项一项地将目录下的文件信息(如文件名、文件 inode、文件类型等) ...
Linux内核sysfs文件系统
内核源码:linux-2.6.38.8.tar.bz2
目标平台:ARM体系结构
sysfs是基于内存的文件系统,用于向用户空间导出内核对象并且能对其进行读写。
1、sysfs文件系统不支持特殊文件,只支持目录、普通文件(文本或二进制文件)和符号链接文件等三种类型,在内核中都使用struct sysfs_dirent结构体来表示,相当于其他文件系统在硬盘或flash里的数据。源代码如下所示:
1234567891011121314151617181920212223242526272829303132333435363738394041424344/* fs/sysfs/sysfs.h */struct sysfs_dirent { atomic_t s_count; //struct sysfs_dirent结构体实例自身的引用计数 atomic_t s_active; //struct sysfs_elem_*所涉及的外部对象的引用计数#ifdef CONFIG_DEBUG_LOCK_ALLOC struct lockdep_map dep_map; //死锁检测模块 ...
Linux内核加密文件系统(eCryptfs)
eCryptfs是在Linux内核2.6.19版本中,由IBM公司的Halcrow,Thompson等人引入的一个功能强大的企业级加密文件系统,它支持文件名和文件内容的加密。
1、eCryptfs架构设计
图片摘自《eCryptfs: a Stacked Cryptographic Filesystem》
eCryptfs的架构设计如图所示。eCryptfs堆叠在底层文件系统之上,用户空间的eCryptfs daemon和内核的keyring共同负责秘钥的管理,当用户空间发起对加密文件的写操作时,由VFS转发给eCryptfs ,eCryptfs通过kernel Crypto API(AES,DES)对其进行加密操作,再转发给底层文件系统。读则相反。
eCryptfs 的加密设计受到OpenPGP规范的影响,其核心思想有以下两点:
1.1文件名与内容的加密eCryptfs 采用对称秘钥加密算法来加密文件名及文件内容(如AES,DES等),秘钥FEK(FileEncryption Key)是随机分配的。相对多个加密文件使用同一个FEK,其安全性更高。
1.2FEK的加密eCryptf ...
Linux内核文件系统原理与实现
1、定义
文件系统为我们直接操作文件和目录与存储设备之间充当桥梁和中介的角色
2、分类
基本文件文件(拓展文件系统)
ext
单文件大小最大2GB
数据块分散在存储设备(碎片化),读取速度慢
ext2
单文件最大支持32TB
数据块分组,读取速度提升
系统崩溃和断电时易损坏文件系统
存储文件依赖于索引节点表
日志文件系统
定义
先将数据写入到日志,直到文件成功写入存储设备和更新索引节点表后再删除日志项,系统崩溃或断电恢复后,继续将上次未写入存储设备的日志文件继续写入
日志方法
数据模式
索引节点和文件都会被写入日志(安全性好但性能差)
有序模式
只有索引节点数据会被写入日志,但只有数据成功写入后才删除(安全性和性能居中)
回写模式
只有索引节点数据会被写入日志,但不控制文件数据何时写入(安全性差但性能好)
分类
ext3
日志方法为有序模式(可修改)
没有数据压缩和加密功能
无法恢复误删文件
ext4
支持数据压缩和加密功能
支持extent(区段)特性
预分配技术为大文件预留空间
Reiser
日志方法为回写模式
支持在线调整文件系统大小
可 ...
Linux内核文件系统挂载
1、前言
环境:处理器架构:arm64内核源码:linux-5.11ubuntu版本:20.04.1代码阅读工具:vim+ctags+cscope
我们知道,Linux系统中我们经常将一个块设备上的文件系统挂载到某个目录下才能访问这个文件系统下的文件,但是你有没有思考过:为什么块设备挂载之后才能访问文件?挂载文件系统Linux内核到底为我们做了哪些事情?是否可以不将文件系统挂载到具体的目录下也能访问?下面,本文将详细讲解Linxu系统中,文件系统挂载的奥秘。注:本文主要讲解文件系统挂载核心逻辑,暂不涉及挂载命名空间和绑定挂载等内容(后面的内容可能会涉及),且以ext2磁盘文件系统为例讲解挂载。本专题文章分为上下两篇,上篇主要介绍挂载全貌以及具体文件系统的挂载方法,下篇介绍如何通过挂载实例关联挂载点和超级块。
2、vfs 几个重要对象
在这里我们不介绍整个IO栈,只说明和文件系统相关的vfs和具体文件系统层。我们知道在Linux中通过虚拟文件系统层VFS统一所有具体的文件系统,提取所有具体文件系统的共性,屏蔽具体文件系统的差异。VFS既是向下的接口(所有文件系统都必须实现该接口), ...
Linux内核文件系统知识大总结
1、文件系统特点
文件系统要有严格的组织形式,使得文件能够以块为单位进行存储。
文件系统中也要有索引区,用来方便查找一个文件分成的多个块都存放在了什么位置。
如果文件系统中有的文件是热点文件,近期经常被读取和写入,文件系统应该有缓存层。
文件应该用文件夹的形式组织起来,方便管理和查询。
Linux内核要在自己的内存里面维护一套数据结构,来保存哪些文件被哪些进程打开和使用。
总体来说,文件系统的主要功能梳理如下:
2、EXT系列的文件系统的格式2.1,inode与块的存储硬盘分成相同大小的单元,我们称为块(Block)。一块的大小是扇区大小的整数倍,默认是4K。在格式化的时候,这个值是可以设定的。
一大块硬盘被分成了一个个小的块,用来存放文件的数据部分。这样一来,如果我们像存放一个文件,就不用给他分配一块连续的空间了。我们可以分散成一个个小块进行存放。这样就灵活得多,也比较容易添加、删除和插入数据。
inode就是文件索引的意思,我们每个文件都会对应一个inode;一个文件夹就是一个文件,也对应一个inode。
inode数据结构如下:
12345678910111213141516 ...
Linux操作系统学习之文件系统
一. 前言 本节开始将分析Linux的文件系统。Linux一切皆文件的思想可谓众所周知,而其文件系统又是字符设备、块设备、管道、进程间通信、网络等等的必备知识,因此其重要性可想而知。本文将先介绍文件系统基础知识,然后介绍最重要的结构体inode以及构建于其上的一层层的文件系统。
二. 文件系统基础知识 一切设计均是为了实现需求,因此我们从文件系统需要的基本功能来看看其该如何设计。首先,一个文件系统需要有以下基本要求
文件需要让人易于读写,并避免名字冲突等
文件需要易于查找、整理归类
操作系统需要有文档记录功能以便管理
由此,文件系统设计了如下特性
采取树形结构、文件夹设计
对热点文件进行缓存,便于读写
采用索引结构,便于查找分类
维护一套数据结构用于记录哪些文档正在被哪些任务使用
依此基本设计,我们可以开始慢慢展开看看Linux博大而精神的文件系统。
三. inode结构体和文件系统3.1 块存储的表示 硬盘中我们以块为存储单元,而在文件系统中,我们需要有一个存储块信息的基本结构体,这就是文件系统的基石inode,其源码如下。inode意为index node,即 ...
Linux文件系统详解
Linux的一切皆文件Linux 中的各种事物比如像文档、目录(Mac OS X 和 Windows 系统下称之为文件夹)、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,还有进程间通信(IPC)和网络通信等输入/输出资源都是定义在文件系统空间下的字节流。一切都可看作是文件,其最显著的好处是对于上面所列出的输入/输出资源,只需要相同的一套 Linux 工具、实用程序和 API。你可以使用同一套api(read, write)和工具(cat , 重定向, 管道)来处理unix中大多数的资源.设计一个系统的终极目标往往就是要找到原子操作,一旦锁定了原子操作,设计工作就会变得简单而有序。“文件”作为一个抽象概念,其原子操作非常简单,只有读和写,这无疑是一个非常好的模型。通过这个模型,API的设计可以化繁为简,用户可以使用通用的方式去访问任何资源,自有相应的中间件做好对底层的适配。现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程创建信息的逻辑单元可被多个进程并发使用。在 UNIX 系统中,操作系统为磁盘上的文本与图像、鼠标与键盘等输 ...
磁盘IO那些事
背景计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的CPU主频早已超过3GHz,内存也进入了普及DDR4的时代。然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时SSD硬盘价格高昂,不能在短时间内完全替代传统硬盘。传统磁盘的I/O读写速度成为了计算机系统性能提高的瓶颈,制约了计算机整体性能的发展。
硬盘性能的制约因素是什么?如何根据磁盘I/O特性来进行系统设计?针对这些问题,本文将介绍硬盘的物理结构和性能指标,以及操作系统针对磁盘性能所做的优化,最后讨论下基于磁盘I/O特性设计的技巧。
硬盘的物理结构硬盘内部主要部件为磁盘盘片、传动手臂、读写磁头和主轴马达。实际数据都是写在盘片上,读写主要是通过传动手臂上的读写磁头来完成。实际运行时,主轴让磁盘盘片转动,然后传动手臂可伸展让读取头在盘片上进行读写操作。磁盘物理结构如下图所示:
由于单一盘片容量有限,一般硬盘都有两张以上的盘片,每个盘片有两面,都可记录信息,所以一张盘片对应着两个磁头。盘片被分为许多扇形的区域,每个区域叫一个扇区,硬盘中每个扇区的大小固定为512字节。盘片 ...