Linux-文件系统

目录

文件系统是什么?

为什么要有虚拟文件系统vfs?

linux文件系统的几大分类?

常见文件系统的区别?

什么是软链接和硬链接?

经常说的文件IO又是什么?


文件系统是什么?

⽂件系统的基本数据单位是⽂件,它的⽬的是对磁盘上的⽂件进⾏组织管理,那组织的⽅式不同,就会形成不同的⽂件系统。Linux ⽂件系统会为每个⽂件分配两个数据结构:索引节点(inode)和⽬录项(directory entry),它们主要⽤来记录⽂件的元信息和⽬录层次结构。

基本架构:

Linux-文件系统_第1张图片

为什么要有虚拟文件系统vfs?

文件系统的种类众多,而操作系统希望对用户提供一个统一的接口,于是在用户层与文件系统层引入了中间层,这个中间层就称为虚拟文件系统(Virtual File System,VFS)

Linux-文件系统_第2张图片

linux文件系统的几大分类?

  1. 磁盘的文件系统,它是直接把数据存储在磁盘中,比如 Ext 2/3/4、XFS 等都是这类文件系统。
  2. 内存的文件系统,这类文件系统的数据不是存储在硬盘的,而是占用内存空间,我们经常用到的 /proc 和 /sys 文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据数据。
  3. 网络的文件系统,用来访问其他计算机主机数据的文件系统,比如 NFS、SMB 等等。

文件系统首先要先挂载到某个目录才可以正常使用,比如 Linux 系统在启动时,会把文件系统挂载到根目录。

常见文件系统的区别?

Linux

xfs - XFS 是高度灵活性的高性能文件系统,最大可支持 16 EB(大约一千六百万 TB)的文件系统,大小为 8EB 的文件(大约八百万 TB),同时目录结构包含千百万条目。XFS 支持元数据日志,它可提高崩溃恢复速度。XFS 文件系统还可在挂载和激活的情况下清除磁盘碎片并重新定义大小。默认选择并推荐使用这个文件系统。XFS 最大支持分区大小为 500 TB。

ext4 - ext4 是基于 ext3 文件系统,并有大量改进。这些改进包括支持大文件系统和大文件;更迅速、有效的磁盘空间分配;目录中无限的子目录数;更快速的文件系统检查及更强大的日志功能。Red Hat Enterprise Linux 7 中目前支持的最大 ext4 文件系统为 50 TB。

ext3- ext3 文件系统是基于 ext2 文件系统,其主要优点是日志功能(journaling)。使用记录日志的文件系统可减少崩溃后恢复文件系统所需时间,因为它不需要在每次发生崩溃时都运行 fsck 程序检查文件系统元数据一致性。

ext2 - ext2 文件系统支持标准的 Unix 文件类型,包括常规文件、目录、符号链接等等。可分配长文件名,最多有 255 个字符。

vfat - VFAT 文件系统是一个 Linux 文件系统,它兼容 FAT 文件系统中的微软 Windows 长文件名

Windows

NTFS:最早出现在windowsNT的日志文件系统,有文件加密(权限管理)、磁盘文件压缩(节省磁盘空间)、目录索引(方便快速查找)、支持长文件名(255个字符)、磁盘预警、大容量(根据簇的不同最大容量可以达到16~256TB,但存储文件过多,由于索引增多,文件碎片化可能会导致实际性能下降)、记录操作日志(数据安全)等特性

FAT32:较早的文件系统类型,兼容性好,但是最大仅支持2TB分区,NT内核仅限制为32GB,单个文件最大也仅4GB

exFAT:微软为了解决FAT32在大文件上表现不佳的问题,专门为闪存盘设计的文件系统类型。但是由于没有NTFS的许多特性并不适合作为系统分区使用

什么是软链接和硬链接?

硬链接

就像一个文件有多个文件名
硬链接是多个目录项中的「索引节点」指向一个文件,也就是指向同一个 inode,但是 inode 是不可能跨越文件系统的,每个文件系统都有各自的 inode 数据结构和列表,所以硬链接是不可用于跨文件系统的。由于多个目录项都是指向一个 inode,那么只有删除文件的所有硬链接以及源文件时,系统才会彻底删除该文件。

软链接

软链接相当于重新创建一个文件,这个文件有独立的 inode,但是这个文件的内容是另外一个文件的路径,所以访问软链接的时候,实际上相当于访问到了另外一个文件,所以软链接是可以跨文件系统的,甚至目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。

经常说的文件IO又是什么?

文件io按文件读写磁盘时不同的方式分为以下几种:

1、缓冲与非缓冲 I/O

缓冲 I/O,利用的是标准库的缓存实现文件的加速访问,而标准库再通过系统调用访问文件。

非缓冲 I/O,直接通过系统调用访问文件,不经过标准库缓存。

比方说,很多程序遇到换行时才真正输出,而换行前的内容,其实就是被标准库暂时缓存了起来,这样做的目的是,减少系统调用的次数,毕竟系统调用是有 CPU 上下文切换的开销的。

2、直接与非直接 I/O

直接 I/O,不会发生内核缓存和用户程序之间数据复制,而是直接经过文件系统访问磁盘。

非直接 I/O,读操作时,数据从内核缓存中拷贝给用户程序,写操作时,数据从用户程序拷贝给内核缓存,再由内核决定什么时候写入数据到磁盘。

如果你在使用文件操作类的系统调用函数时,指定了 O_DIRECT 标志,则表示使用直接 I/O。如果没有设置过,默认使用的是非直接 I/O。如果用了非直接 I/O 进行写数据操作,内核什么情况下才会把缓存数据写入到磁盘?

问题:如果用了非直接 I/O 进行写数据操作,内核什么情况下才会把缓存数据写入到磁盘?

以下几种场景会触发内核缓存的数据写入磁盘:

在调用 write 的最后,当发现内核缓存的数据太多的时候,内核会把数据写到磁盘上;

用户主动调用 sync,内核缓存会刷到磁盘上;

当内存十分紧张,无法再分配页面时,也会把内核缓存的数据刷到磁盘上;

内核缓存的数据的缓存时间超过某个时间时,也会把数据刷到磁盘上;

3、阻塞与非阻塞 I/O VS 同步与异步 I/O

阻塞 I/O
当用户程序执行 read ,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到应用程序的缓冲区中,当拷贝过程完成,read 才会返回。
注意,阻塞等待的是「内核数据准备好」和「数据从内核态拷贝到用户态」这两个过程。

非阻塞i/o
非阻塞的 read 请求在数据未准备好的情况下立即返回,可以继续往下执行,此时应用程序不断轮询内核,直到数据准备好,内核将数据拷贝到应用程序缓冲区,read 调用才可以获取到结果

I/O 多路复用(基于非阻塞I/o)
如 select、poll,它是通过 I/O 事件分发,当内核数据准备好时,再以事件通知应用程序进行操作。
这个做法大大改善了应用进程对 CPU 的利用率,在没有被通知的情况下,应用进程可以使用 CPU 做其他的事情。

异步 I/O
当我们发起 aio_read 之后,就立即返回,内核自动将数据从内核空间拷贝到应用程序空间,这个拷贝过程同样是异步的,内核自动完成的,和前面的同步操作不一样,应用程序并不需要主动发起拷贝动作。

用一个去食堂吃饭的例子来通俗的理解以上几种文件io:

举个你去饭堂吃饭的例子,你好比用户程序,饭堂好比操作系统。

阻塞 I/O 好比,你去饭堂吃饭,但是饭堂的菜还没做好,然后你就一直在那里等啊等,等了好长一段时间终于等到饭堂阿姨把菜端了出来(数据准备的过程),但是你还得继续等阿姨把菜(内核空间)打到你的饭盒里(用户空间),经历完这两个过程,你才可以离开。

非阻塞 I/O 好比,你去了饭堂,问阿姨菜做好了没有,阿姨告诉你没,你就离开了,过几十分钟,你又来饭堂问阿姨,阿姨说做好了,于是阿姨帮你把菜打到你的饭盒里,这个过程你是得等待的。

基于非阻塞的 I/O 多路复用好比,你去饭堂吃饭,发现有一排窗口,饭堂阿姨告诉你这些窗口都还没做好菜,等做好了再通知你,于是等啊等(select 调用中),过了一会阿姨通知你菜做好了,但是不知道哪个窗口的菜做好了,你自己看吧。于是你只能一个一个窗口去确认,后面发现 5 号窗口菜做好了,于是你让 5 号窗口的阿姨帮你打菜到饭盒里,这个打菜的过程你是要等待的,虽然时间不长。打完菜后,你自然就可以离开了。

异步 I/O 好比,你让饭堂阿姨将菜做好并把菜打到饭盒里后,把饭盒送到你面前,整个过程你都不需要任何等待。

你可能感兴趣的:(Linux操作系统,linux,运维)