文件系统 订阅
文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。 展开全文
文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
信息
外文名
file system
类    别
操作系统
中文名
文件系统
目    的
为了管理空间
文件系统简介
在计算机中,文件系统(file system)是命名文件及放置文件的逻辑存储和恢复的系统。DOS、Windows、OS/2、Macintosh和UNIX-based操作系统都有文件系统,在此系统中文件被放置在分等级的(树状)结构中的某一处。文件被放置进目录(Windows中的文件夹)或子目录,在树状结构中你希望的位置中。文件系统指定命名文件的规则。这些规则包括文件名的字符数最大量,哪种字符可以使用,以及某些系统中文件名后缀可以有多长。文件系统还包括通过目录结构找到文件的指定路径的格式。 [1]  文件系统是软件系统的一部分,它的存在使得应用可以方便的使用抽象命名的数据对象和大小可变的空间。
收起全文
精华内容
下载资源
问答
  • 文件系统

    千次阅读 2018-09-05 09:17:21
    操作系统层:即文件系统,操作系统如何将各个硬件管理并对上提供更高层次接口; 单机引擎层:常见存储系统对应单机引擎原理大概介绍,利用文件系统接口提供更高级别的存储系统接口; 分布式层:如何将多个...

    在工程架构领域里,存储是一个非常重要的方向,这个方向从底至上,我分成了如下几个层次来介绍:

    1. 硬件层:讲解磁盘,SSD,SAS, NAS, RAID等硬件层的基本原理,以及其为操作系统提供的存储界面;
    2. 操作系统层:即文件系统,操作系统如何将各个硬件管理并对上提供更高层次接口;
    3. 单机引擎层:常见存储系统对应单机引擎原理大概介绍,利用文件系统接口提供更高级别的存储系统接口;
    4. 分布式层:如何将多个单机引擎组合成一个分布式存储系统;
    5. 查询层:用户典型的查询语义表达以及解析;

                                                               元数据——块数据——缓冲数据——文件数据

    概述

    操作系统对系统的软件资源(不论是应用软件和系统软件)的管理都以文件方式进行,承担这部分功能的操作系统称为文件系统。

    文件系统

    文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

    在计算机中,文件系统(file system)是命名文件及放置文件的逻辑存储和恢复的系统。DOS、Windows、OS/2、Macintosh和UNIX-based操作系统都有文件系统,在此系统中文件被放置在分等级的(树状)结构中的某一处。文件被放置进目录(Windows中的文件夹)或子目录,在树状结构中你希望的位置中。【linux树形目录,也就是树谱总分关系无限下延续】

    文件系统指定命名文件的规则。这些规则包括文件名的字符数最大量,哪种字符可以使用,以及某些系统中文件名后缀可以有多长。文件系统还包括通过目录结构找到文件的指定路径的格式。 

    文件系统是软件系统的一部分,它的存在使得应用可以方便的使用抽象命名的数据对象和大小可变的空间。

    文件系统种类

    FAT(8/16/32)
    NTFS
    CDFS
    exFAT
    RAW
    Ext
         1.Ext2
         2.Ext3
         3.Ext4

    XFS
    Btrfs
    ZFS
    HFS
    HFS+
    ReiserFS
    JFS
    VMFS
    UFS
    VXFS
    ReFS
    WBFS
    PFS

    简单介绍

    FAT16:我们以前用的DOS、Windows 95都使用FAT16文件系统,现在常用的Windows 98/2000/XP等系统均支持FAT16文件系统。它最大可以管理大到2GB的分区,但每个分区最多只能有65525个簇(簇是磁盘空间的配置单位)。随着硬盘或分区容量的增大,每个簇所占的空间将越来越大,从而导致硬盘空间的浪费。 

    FAT32:随着大容量硬盘的出现,从Windows 98开始,FAT32开始流行。它是FAT16的增强版本,可以支持大到2TB(2048G的分区。FAT32使用的簇比FAT16小,从而有效地节约了硬盘空间。 

    NTFS:最大分区2TB。另:简单卷最大2TB,动态卷最大16TB。
    
    Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:
    1. 与 Ext3 兼容。执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。
    
    2. 更大的文件系统和更大的文件。较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。
    
    3. 无限数量的子目录。Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。
    
    ext3和ext4的最大区别在于,ext3在fsck时需要耗费大量时间(文件越多,时间越长),而ext4在fsck时用的时间会少非常多
    
    ext4是第四代扩展文件系统(英语:Fourth EXtended filesystem,缩写为ext4)是linux系统下的日志文件系统,是ext3文件系统的后继版本
    ext4的文件系统容量达到1EB,而文件容量则达到16TB,这是一个非常大的数字了。对一般的台式机和服务器而言,这可能并不重要,但对于大型磁盘阵列的用户而言,这就非常重要了。
    ext3目前只支持32000个子目录,而ext4取消了这一限制,理论上支持无限数量的子目录。
    
    xfs是一种非常优秀的日志文件系统,它是SGI公司设计的。xfs被称为业界最先进的、最具可升级性的文件系统技术
    xfs是一个64位文件系统,最大支持8EB减1字节的单个文件系统,实际部署时取决于宿主操作系统的最大块限制。对于一个32位Linux系统,文件和文件系统的大小会被限制在16TB
    xfs在很多方面确实做的比ext4好,ext4受限制于磁盘结构和兼容问题,可扩展性和scalability确实不如xfs,另外xfs经过很多年发展,各种锁的细化做的也比较好。
    
    注:Ext2: 是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86 电脑系统中,簇最大为 4KB, 则单一文件大小上限为 2048GB, 而文件系统的容量上限为 16384GB。但由于目前核心 2.4 所能使用的单一分割区最大只有 2048GB,因此实际上能使用的文件系统容量最多也只有 2048GB。

    centos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3

     

    各种文件系统支持的最大硬盘容量

    NTFS格式(windows的分区,Linux也能用):支持最大分区为2TB,最大文件为2TB;

    FAT32格式(windows的分区,Linux也能用):支持最大分区为128GB,最大文件为4GB;

    Ext2格式:最大分区大小为4TB,最大文件大小为1TB;

    Ext3格式:最大分区大小为16TB,最大文件大小为2TB;

    EXT4格式:最大分区大小为1EB,最大文件大小为16TB;

    XFS格式:最大支持8EB减1字节的单个文件系统;实际部署时取决于宿主操作系统的最大块限制。对于一个32位Linux操作系统,文件和文件系统的大小会被限制在16TB;

    ReiserFS格式:最大分区大小为4TB,最大文件大小为1TB;

     注:1EB=1024PB,1PB=1024TB,1TB=1024GB

    EXT4是第四代扩展文件系统(英语:Fourth EXtended filesystem,缩写为ext4)是Linux系统下的日志文件系统,是ext3文件系统的后继版本。
    Ext4的文件系统容量达到1EB,而文件容量则达到16TB,这是一个非常大的数字了。对一般的台式机和服务器而言,这可能并不重要,但对于大型磁盘阵列的用户而言,这就非常重要了。

    XFS是一个64位文件系统,最大支持8EB减1字节的单个文件系统,实际部署时取决于宿主操作系统的最大块限制。对于一个32位Linux系统,文件和文件系统的大小会被限制在16TB。

    二者各有特点,而性能表现基本上是差不多的。例如,谷歌公司就考虑将EXT2系统升级,最终确定为EXT4系统。谷歌公司表示,他们还考虑过XFS和JFS。结果显示,EXT4和XFS的表现类似,不过从EXT2升级到EXT4比升级到XFS容易。

    对于存储海量的小文件,或者超大规模的文件,文件大小也偏大的话,建议你使用xfs,否则使用ext4,ext4比较稳定,是主流的Linux文件系统

    在Linux下,理论上文件最大可以达到4T(看清楚是4T不是4G),但在实际操作中都在2G左右(一般不超过4G),超过2G的单个文件较之小于2G的文件安全系数降低不少。另外对于ext3系统,如果突然断电,容易出现硬盘问题,这种问题在大文件多的硬盘硬盘中大文件多的区域特别容易发生,而且经常是毁灭性的。如果要存放大文件,建议使用reiserfs系统。

    功能

    结构图
    结构图

     

    文件的系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。因此,可以说"我有2个文件系统"意思是他有2个分区,一个存文件,或他用 "扩展文件系统",意思是文件系统的种类。

    磁盘或分区和它所包括的文件系统的不同是很重要的。少数程序(包括最有理由的产生文件系统的程序)直接对磁盘或分区的原始扇区进行操作;这可能破坏一个存在的文件系统。大部分程序基于文件系统进行操作,在不同种文件系统上不能工作。

    一个分区或磁盘在作为文件系统使用前,需要初始化,并将记录数据结构写到磁盘上。这个过程就叫建立文件系统。

    大部分UNIX文件系统种类具有类似的通用结构,即使细节有些变化。其中心概念是超级块superblock,i节点inode,数据块data block,目录块directory block,和间接块indirection block。超级块包括文件系统的总体信息,比如大小(其准确信息依赖文件系统)。i节点包括除了名字外的一个文件的所有信息,名字与i节点数目一起存在目录中,目录条目包括文件名和文件的i节点数目。i节点包括几个数据块的数目,用于存储文件的数据。i节点中只有少量数据块数的空间,如果需要更多,会动态分配指向数据块的指针空间。这些动态分配的块是间接块;为了找到数据块,这名字指出它必须先找到间接块的号码。

    UNIX文件系统通常允许在文件中产生孔,意思是文件系统假装文件中有一个特殊的位置只有0字节,但没有为这文件的这个位置保留实际的磁盘空间。这对小的 [2]  二进制文件经常发生,Linux共享库、一些数据库和其他一些特殊情况。

    孔有一定的用处。在笔者的系统中,一个简单的测量工具显示在200MB使用的磁盘空间中,由于孔,节约了大约4MB。在这个系统中,程序相对较少,没有 [3]  数据库文件

    文件系统的功能包括:管理和调度文件的存储空间,提供文件的逻辑结构、物理结构和存储方法;实现文件从标识到实际地址的映射,实现文件的控制操作和存取操作,实现文件信息的共享并提供可靠的文件保密和保护措施,提供文件的安全措施。

    文件的逻辑结构是依照文件的内容的逻辑关系组织文件结构。文件的逻辑结构可以分为流式文件和记录式文件。

    流式文件:文件中的数据是一串字符流,没有结构。

    记录文件:由若干逻辑记录组成,每条记录又由相同的数据项组成,数据项的长度可以是确定的,也可以是不确定的。

    主要缺陷:数据关联差,数据不一致,冗余性。

    linux文件系统详解

    最近在做磁盘性能优化,需要结合文件系统原理去思考优化方向,因此借此机会进一步加深了对文件系统的认识。在看这篇文章之前,建议先看下前面一篇关于磁盘工作原理的解读。下面简单总结一些要点分享出来:

    Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。

    一、文件系统层次分析

    由上而下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层

    用户层:最上面用户层就是我们日常使用的各种程序,需要的接口主要是文件的创建、删除、打开、关闭、写、读等。 

    VFS层:我们知道Linux分为用户态和内核态,用户态请求硬件资源需要调用System Call通过内核态去实现。用户的这些文件相关操作都有对应的System Call函数接口,接口调用 VFS对应的函数。 

    文件系统层:不同的文件系统实现了VFS的这些函数,通过指针注册到VFS里面。所以,用户的操作通过VFS转到各种文件系统。文件系统把文件读写命令转化为对磁盘LBA的操作,起了一个翻译和磁盘管理的作用。 

    缓存层:文件系统底下有缓存,Page Cache,加速性能。对磁盘LBA的读写数据缓存到这里。

    块设备层:块设备接口Block Device是用来访问磁盘LBA的层级,读写命令组合之后插入到命令队列,磁盘的驱动从队列读命令执行。Linux设计了电梯算法等对很多LBA的读写进行优化排序,尽量把连续地址放在一起。

    磁盘驱动层:磁盘的驱动程序把对LBA的读写命令转化为各自的协议,比如变成ATA命令,SCSI命令,或者是自己硬件可以识别的自定义命令,发送给磁盘控制器。Host Based SSD甚至在块设备层和磁盘驱动层实现了FTL,变成对Flash芯片的操作。 

    磁盘物理层:读写物理数据到磁盘介质。

    二、文件系统结构与工作原理(主要以ext4为例)

    我们都知道,windows文件系统主要有fat、ntfs等,而linux文件系统则种类多的很,主要有VFS做了一个软件抽象层,向上提供文件操作接口,向下提供标准接口供不同文件系统对接,下面主要就以EXT4文件系统为例,讲解下文件系统结构与工作原理:

    上面两个图大体呈现了ext4文件系统的结构,从中也相信能够初步的领悟到文件系统读写的逻辑过程。下面对上图里边的构成元素做个简单的讲解:

    引导块:为磁盘分区的第一个块,记录文件系统分区的一些信息,,引导加载当前分区的程序和数据被保存在这个块中。一般占用2kB,

    超级块:

    超级块用于存储文件系统全局的配置参数(譬如:块大小,总的块数和inode数)和动态信息(譬如:当前空闲块数和inode数),其处于文件系统开始位置的1k处,所占大小为1k。为了系统的健壮性,最初每个块组都有超级块和组描述符表(以下将用GDT)的一个拷贝,但是当文件系统很大时,这样浪费了很多块(尤其是GDT占用的块多),后来采用了一种稀疏的方式来存储这些拷贝,只有块组号是3, 5 ,7的幂的块组(譬如说1,3,5,7,9,25,49…)才备份这个拷贝。通常情况下,只有主拷贝(第0块块组)的超级块信息被文件系统使用,其它拷贝只有在主拷贝被破坏的情况下才使用。

    块组描述符:

    GDT用于存储块组描述符,其占用一个或者多个数据块,具体取决于文件系统的大小。它主要包含块位图,inode位图和inode表位置,当前空闲块数,inode数以及使用的目录数(用于平衡各个块组目录数),具体定义可以参见ext3_fs.h文件中struct ext3_group_desc。每个块组都对应这样一个描述符,目前该结构占用32个字节,因此对于块大小为4k的文件系统来说,每个块可以存储128个块组描述符。由于GDT对于定位文件系统的元数据非常重要,因此和超级块一样,也对其进行了备份。GDT在每个块组(如果有备份)中内容都是一样的,其所占块数也是相同的。从上面的介绍可以看出块组中的元数据譬如块位图,inode位图,inode表其位置不是固定的,当然默认情况下,文件系统在创建时其位置在每个块组中都是一样的,如图2所示(假设按照稀疏方式存储,且n不是3,5,7的幂)

    块组:

    每个块组包含一个块位图块,一个 inode 位图块,一个或多个块用于描述 inode 表和用于存储文件数据的数据块,除此之外,还有可能包含超级块和所有块组描述符表(取决于块组号和文件系统创建时使用的参数)。下面将对这些元数据作一些简要介绍。

    块位图:

    块位图用于描述该块组所管理的块的分配状态。如果某个块对应的位未置位,那么代表该块未分配,可以用于存储数据;否则,代表该块已经用于存储数据或者该块不能够使用(譬如该块物理上不存在)。由于块位图仅占一个块,因此这也就决定了块组的大小。

    Inode位图:

    Inode位图用于描述该块组所管理的inode的分配状态。我们知道inode是用于描述文件的元数据,每个inode对应文件系统中唯一的一个号,如果inode位图中相应位置位,那么代表该inode已经分配出去;否则可以使用。由于其仅占用一个块,因此这也限制了一个块组中所能够使用的最大inode数量。

    Inode表:

    Inode表用于存储inode信息。它占用一个或多个块(为了有效的利用空间,多个inode存储在一个块中),其大小取决于文件系统创建时的参数,由于inode位图的限制,决定了其最大所占用的空间。

    以上这几个构成元素所处的磁盘块成为文件系统的元数据块,剩余的部分则用来存储真正的文件内容,称为数据块,而数据块其实也包含数据和目录。

    了解了文件系统的结构后,接下来我们来看看操作系统是如何读取一个文件的:

    大体过程如下:

    1、根据文件所在目录的inode信息,找到目录文件对应数据块

    2、根据文件名从数据块中找到对应的inode节点信息

    3、从文件inode节点信息中找到文件内容所在数据块块号

    4、读取数据块内容

    到这里,相信很多人会有一个疑问,我们知道一个文件只有一个Inode节点来存放它的属性信息,那么你可能会想如果一个大文件,那它的block一定是多个的,且可能不连续的,那么inode怎么来表示呢,下面的图告诉你答案:

     

     也就是说,如果文件内容太大,对应数据块数量过多,inode节点本身提供的存储空间不够,会使用其他的间接数据块来存储数据块位置信息,最多可以有三级寻址结构。

     到这里,应该都已经非常清楚文件读取的过程了,那么下面再抛出两个疑问:

    1、文件的拷贝、剪切的底层过程是怎样的?

    2、软连接和硬连接分别是如何实现的?

    下面来结合stat命令动手操作一下,便知真相:

    1)拷贝文件:创建一个新的inode节点,并且拷贝数据块内容

    2)剪切文件:同个分区里边mv,inode节点不变,只是更新目录文件对应数据块里边的文件名和inode对应关系;跨分区mv,则跟拷贝一个道理,需要创建新的inode,因为inode节点不同分区是不能共享的。

    3)软连接:创建软连接会创建一个新的inode节点,其对应数据块内容存储所链接的文件名信息,这样原文件即便删除了,重新建立一个同名的文件,软连接依然能够生效。

     

     4)硬链接:创建硬链接,并不会新建inode节点,只是links加1,还有再目录文件对应数据块上增加一条文件名和inode对应关系记录;只有将硬链接和原文件都删除之后,文件才会真正删除,即links为0才真正删除。

     三、文件顺序读写和随机读写

    从前面文章了解了磁盘工作原理之后,也已经明白了为什么文件随机读写速度会比顺序读写差很多,这个问题在windows里边更加明显,为什么呢?究其原因主要与文件系统工作机制有关,fat和ntfs文件系统设计上,每个文件所处的位置相对连续甚至紧靠在一起,这样没有为每个文件留下足够的扩展空间,因此容易产生磁盘碎片,用过windows系统的应该也知道,windows磁盘分区特别提供了磁盘碎片整理的高级功能。如下图:

    那回过来,看看linux 文件系统ext4,都说linux不需要考虑磁盘碎片,究竟是怎么回事?

    主要是因为Linux的文件系统会将文件分散在整个磁盘,在文件之间留有大量的自由空间,而不是像Windows那样将文件一个接一个的放置。当一个文件被编辑了并且变大了,一般都会有足够的自由空间来保存文件。如果碎片真的产生了,文件系统就会尝试在日常使用中将文件移动来减少碎片,所以不需要专门的碎片整理程序。但是,如果磁盘空间占用已经快满了,那碎片是不可避免的,文件系统的设计本来就是用来满足正常情况下使用的。如果磁盘空间不够,那要么就是数据冗余了,要么就该换容量更大的磁盘。你可以使用fsck命令来检测一下一个Linux文件系统的碎片化程度,只需要在输出中查看非连续i节点个数(non-contiguous inodes)就可以了。

    关于文件系统的就讲这么多,下篇会讲解linux内核提供的一个资源管控机制cgroup,分析其原理及使用过程。

    ext4文件系统bug:
    http://www.phoronix.com/scan.php?page=news_item&px=MTIxNDQ

    Linux(unix)与微软文件系统比较

    相同点

    用户和组

    Linux是多用户多任务操作系统而Windows是单用户多任务操作系统。都可以由许多不同的用户来使用,为每个用户提供单独的环境和资源。基于用户身份来控制安全性。都可以以组成员的方式来控制资源的访问权限,这样在用户数目较大时可以不必为每一个帐号设置权限。

    用户和组可以集中管理,让多个服务器共享相同的用户和身份验证数据。

    文件系统

    Linux和Windows都支持多种文件系统。文件资源可以通过NetBIOS、FTP或者其他协议与其他客户机共享。可以很灵活地对各个独立的文件系统进行组织,由管理员来决定它们在何处可以以何种方式被访问。

    端口和设备

    两种操作系统都支持各种物理设备端口,比如并口、串口和 USB 接口。支持各种控制器,比如 IDE 和 SCSI 控制器。Linux 还支持很多“刚刚上市”的标准硬件。

    网络

    Linux和Windows都支持多种网络协议,比如TCP/IP、NetBIOS和IPX。都支持多种类型的网络适配器。都具备通过网络共享资源的能力,比如共享文件和打印。都可以提供网络服务能力,比如 DHCP 和 DNS。

    服务

    Linux和Windows都提供服务。所谓服务,指的是那些在后台运行的应用程序,可以为系统和远程调用该服务的计算机提供一些功能。在系统引导的时候可以单独控制并自动启动这些程序。(注意:Linux 中沿用了 Unix 的习惯,称这种应用程序为 daemon)

    不同点

    Linux 的应用目标是网络而不是打印

    Windows最初出现的时候,这个世界还是一个纸张的世界。Windows的伟大成就之一在于您的工作成果可以方便地看到并打印出来。这样一个开端影响了 Windows 的后期发展。

    同样,Linux 也受到了其起源的影响。Linux 的设计定位于网络操作系统。它的设计灵感来自于 Unix操作系统,因此它的命令的设计比较简单,或者说是比较简洁。由于纯文本可以非常好地跨网络工作,所以 Linux 配置文件和数据都以文本为基础。

    对那些熟悉图形环境的人来说,Linux服务器初看可能比较原始。但是Linux开发更多关注的是它的内在功能而不是表面上的东西。即使是在纯文本的环境中,Linux同样拥有非常先进的网络、脚本和安全能力。执行一些任务所需的某些表面上看起来比较奇怪的步骤是令人费解的,除非您认识到 Linux 是期望在网络上与其他 Linux系统协同执行这些任务。Linux的自动执行能力也很强,只需要设计批处理文件就可以让系统自动完成非常详细的任务。Linux 的这种能力来自于其基于文本的本质。

    可选的 GUI

    Linux有图形组件。Linux支持高端的图形适配器和显示器,完全胜任图形相关的工作。许多数字效果艺术家在Linux工作站上来进行他们的设计工作,而以前这些工作需要使用IRIX系统来完成。但是,图形环境并没有集成到 Linux 中,而是运行于系统之上的单独一层。这意味着您可以只运行 GUI,或者在需要时才运行 GUI。如果您的系统主要任务是提供Web应用,那么您可以停掉图形界面,而将其所用的内存和CPU资源用于您的服务。如果您需要在 GUI 环境下做一些工作,可以再打开它,工作完成后再将其关闭。

    Linux 有图形化的管理工具,以及日常办公的工具,比如电子邮件、网络浏览器和文档处理工具等。不过,在 Linux 中,图形化的管理工具通常是控制台 (命令行) 工具的扩展。也就是说,用图形化工具能完成的所有工作,用控制台命令同样可以完成。同样,使用图形化工具并不妨碍您对配置文件进行手工修改。其实际意义可能并不是特别显而易见,但是,如果在图形化管理工具中所做的任何工作都可以以命令行的方式完成,这就表示那些工作也可以由一个脚本来实现。脚本化的命令可以成为自动执行的任务。Linux 同时支持这两种方式,并不要求您只用文本或者只用 GUI。您可以根据您的需要选择最好的方法。

    Linux 中的配置文件是人类可读的文本文件,这与过去的 Windows 中的 INI 文件类似,但与 Windows 的注册表机制在思路上有本质的区别。每一个应用程序都有其自己的配置文件,而且通常不与其他的配置文件放在一起。不过,大部分的配置文件都存放于一个目录树 (/etc) 下的单个地方,所以看起来它们在逻辑上是在一起。文本文件的配置方式使得不通过特殊的系统工具就可以完成配置文件的备份、检查和编辑工作。

    文件名扩展

    Linux不使用文件名扩展来识别文件的类型。相反,Linux根据文件的头内容来识别其类型。为了提高文件可读性您仍可以使用文件名扩展,但这对 Linux 系统来说没有任何作用。不过,有一些应用程序,比如 Web 服务器,可能使用命名约定来识别文件类型,但这只是特定的应用程序的要求而不是 Linux 系统本身的要求。

    Linux通过文件访问权限来判断文件是否为可执行文件。任何一个文件都可以赋予可执行权限,这样程序和脚本的创建者或管理员可以将它们识别为可执行文件。这样做有利于安全。保存到系统上的可执行的文件不能自动执行,这样就可以防止许多脚本病毒

    重新引导是最后的手段

    如果您使用Windows已经很长时间了,您可能已经习惯出于各种原因(从软件安装到纠正服务故障)而重新引导系统。在Linux思想中您的这一习惯需要改变。Linux在本质上更遵循“牛顿运动定律”。一旦开始运行,它将保持运行状态,直到受到外来因素的影响,比如硬件的故障。实际上,Linux系统的设计使得应用程序不会导致内核的崩溃,因此不必经常重新引导(与Windows系统的设计相对而言)。所以除了Linux内核之外,其他软件的安装、启动、停止和重新配置都不用重新引导系统。

    如果您确实重新引导了 Linux 系统,问题很可能得不到解决,而且还会使问题更加恶化。学习并掌握 Linux 服务和运行级别是成功解决问题的关键。学习 Linux 最困难的就是克服重新引导系统的习惯。

    另外,您可以远程地完成Linux中的很多工作。只要有一些基本的网络服务在运行,您就可以进入到那个系统。而且,如果系统中一个特定的服务出现了问题,您可以在进行故障诊断的同时让其他服务继续运行。当您在一个系统上同时运行多个服务的时候,这种管理方式非常重要。

    命令区分大小写

    所有的 Linux 命令和选项都区分大小写。例如, -R 与 -r 不同,会去做不同的事情。控制台命令几乎都是小写的。

    【参考资料】

    1、存储系统科普——文件系统介绍 - 玄苦 - 博客园 https://www.cnblogs.com/xuanku/p/io_fs.html

    2、对文件系统的理解 - 一肩担风月 - 博客园 https://www.cnblogs.com/shangye/p/6177993.html

    3、Linux文件系统详解 - AlanTu - 博客园 https://www.cnblogs.com/alantu2018/p/8461749.html

    4、Linux文件系统_ https://baike.baidu.com/item/Linux%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/10986747

    5、linux文件系统特点-linux操作系统-麦子学院 http://www.maiziedu.com/wiki/linux/feature/

    6、深入理解操作系统原理之文件系统 -  https://blog.csdn.net/xiaokang123456kao/article/details/74171875

    展开全文
  • Linux基础之-BTRFS文件系统

    万次阅读 2019-10-18 21:54:52
    BTRFS(通常念成Butter FS),被称为下一代的LINUX文件系统,由Oracle于2007年宣布并进行中的COW(copy-on-write式)文件系统。目标是取代Linux目前的ext3文件系统,改善ext3的限制,特别是单一文件大小的限制,总文件...

    BTRFS

    BTRFS(通常念成Butter FS),被称为下一代的LINUX文件系统,由Oracle于2007年宣布并进行中的COW(copy-on-write式)文件系统。目标是取代Linux目前的ext3文件系统,改善ext3的限制,特别是单一文件大小的限制,总文件系统大小限制以及加入文件校验和特性。加入目前ext3/4未支持的一些功能,例如可写的磁盘快照(snapshots),以及支持递归的快照(snapshots of snapshots),内建磁盘阵列(RAID)支持,支持子卷(Subvolumes)的概念,允许在线调整文件系统大小。

    BTRFS特性:

    首先是扩展性 (scalability) 相关的特性,btrfs 最重要的设计目标是应对大型机器对文件系统的扩展性要求。 Extent,B-Tree和动态 inode 创建等特性保证了 btrfs 在大型机器上仍有卓越的表现,其整体性能而不会随着系统容量的增加而降低。

    其次是数据一致性 (data integrity) 相关的特性。系统面临不可预料的硬件故障,Btrfs 采用 COW 事务技术来保证文件系统的一致性。 btrfs 还支持 checksum,避免了 silent corrupt 的出现。而传统文件系统则无法做到这一点。

    第三是和多设备管理相关的特性。 Btrfs 支持创建快照 (snapshot),和克隆 (clone) 。 btrfs 还能够方便的管理多个物理设备,使得传统的卷管理软件变得多余。

    最后是其他难以归类的特性。这些特性都是比较先进的技术,能够显著提高文件系统的时间 / 空间性能,包括延迟分配,小文件的存储优化,目录索引等。

    优化支持

    SSD 是固态存储 Solid State Disk 的简称。在过去的几十年中,CPU/RAM 等器件的发展始终遵循着摩尔定律,但硬盘 HDD 的读写速率却始终没有飞跃式的发展。磁盘 IO 始终是系统性能的瓶颈。

    SSD 采用 flash memory 技术,内部没有磁盘磁头等机械装置,读写速率大幅度提升。 flash memory 有一些不同于 HDD 的特性。 flash 在写数据之前必须先执行擦除操作;其次,flash 对擦除操作的次数有一定的限制,在目前的技术水平下,对同一个数据单元最多能进行约 10 万次擦除操作,因此,为了延长 flash 的寿命,应该将写操作平均到整个 flash 上。

    SSD 在硬件内部的微代码中实现了 wear leveling 等分布写操作的技术,因此系统无须再使用特殊的 MTD 驱动和 FTL 层。虽然 SSD 在硬件层面做了很多努力,但毕竟还是有限。文件系统针对 SSD 的特性做优化不仅能提高 SSD 的使用寿命,而且能提高读写性能。 Btrfs 是少数专门对 SSD 进行优化的文件系统。 btrfs 用户可以使用 mount 参数打开对 SSD 的特殊优化处理。

    Btrfs 的 COW 技术从根本上避免了对同一个物理单元的反复写操作。如果用户打开了 SSD 优化选项,btrfs 将在底层的块空间分配策略上进行优化:将多次磁盘空间分配请求聚合成一个大小为 2M 的连续的块。大块连续地址的 IO 能够让固化在 SSD 内部的微代码更好的进行读写优化,从而提高 IO 性能 。

    btrfs文件系统的创建

    使用 mkfs.btrfs 命令来创建BTRFS文件系统(Centos 7):

    查看系统上现有的硬盘、分区信息,我们使用3块空闲硬盘来创建BTRFS(在同一个分区上创建BTRFS意义不大):

    默认DATA数据存储类型为:RAID0,元数据METADATA存储类型为:RAID1,后面可以通过命令来修改RAID模式

    挂载使用BTRFS,3个组成的磁盘都可以成为挂载设备:

    查看BTRFS信息:

    调整BTRFS的大小,先减少10G,再增加2G,最后扩容到最大:

    由于BTRFS 支持在线调整,不需要事先卸载。

    下面将其中一块硬盘移除出BTRFS,这之前先拷贝一些文件进来,前后对比文件读写是否有问题:

    下面将 /dev/sdb 磁盘移除,BTRFS在移除设备时会先自动移动数据,查看分区内的文件是否能正常读取:

    注:移除分区内的存储文件不足以在剩余的BTRFS空间上保存时,数据将会丢失请谨慎操作!

    下面将刚才移除的 /dev/sdb 重新添加进来:

    使用 balance 选项开启平衡特性,这个时间因数据大小而延长。

    下面我们使用 balance start 参数将数据、元数据的RAID类型更改为RAID5(RAID5需要至少3块硬盘,不然会转换失败):

    BTRFS还支持创建多个子卷,相当于多个分区,子卷可以分别挂载到系统的不同路径下:

    使用 balance   list   show 选项可以显示子卷名称、信息:

    使用 balance snapshot选项给子卷创建快照:

    使用 btrfs-convert 可以将其他类型的分区,在不损坏分区存储文件的前提下转换为BTRFS类型:

    我们将 /dev/sdb1 和 sdb2 分区都转换成BTRFS类型,验证文件是否能正常读写:

    之前2个分区挂载、读写都正常:

    卸载2个分区后,分别转换,然后重新挂载:

    使用 -r 选项可以还原到原先的分区类型:

     

    展开全文
  • Linux基础之磁盘、文件系统管理

    万次阅读 2019-10-14 15:28:34
    在Linux系统下常用的磁盘、文件系统管理命令有: df du free blkid lsblk fdiskpartprobe partx kpartx mkfs mke2fs tune2fs dumpe2fs resize2fs fsck e2label mkswap swapon swapoff mount umount 磁盘管理: ...

    在Linux系统下常用的磁盘、文件系统管理命令有:

    df  du  free blkid  lsblk fdisk  partprobe  partx  kpartx  mkfs  mke2fs    tune2fs    dumpe2fs   resize2fs  fsck    e2label   mkswap swapon swapoff  mount umount

    磁盘管理:

    首先我们用 fdisk -l 命令查看现在使用的所有磁盘分区情况:

    然后在虚拟机上添加两块硬盘,一块为SCSI硬盘,一块为SATA硬盘:

    使用cat /proc/partitions 查看内核已经识别的硬盘信息,发现系统内核只识别出了一块新的硬盘 sdb

    要想系统内核识别出新的SCSI硬盘需要重启系统,如果不想重启系统可以使用以下方法:

    为使该命令正常运行,必须指定正确的参数值 w、x、y 和 z,如下所示:

    w 是主机适配器标识,第一个适配器为零(0)

    x 是主机适配器上的 SCSI 通道,第一个通道为零(0)

    y 是设备的 SCSI 标识

    z 是 LUN 号,第一个 LUN 为零(0)

    scsi add-single-device 为添加硬盘信息,remove-single-device为移除硬盘信息:

    注:只有使用管理员账号才能实现此功能

    或者使用以下命令,注:有几个host文件夹就要使用几次 

    下面使用fdisk 命令分别为两块新硬盘进行分区:

    fdisk命令说明:

    常用选项有:

    使用 fdisk /dev/sdb 为新硬盘分区:

    这里常用到的有:

    p 显示现有分区表

    n 创建新分区

    d 删除分区

    t 更改分区类型

    l 查看已知分区类型以及对应ID号

    w 保存退出 q 为不保存退出

    m 查看帮助信息

    这里我们将sdb分为3个分区,一个主分区,两个逻辑分区:

    注:在使用MBR(Master Boot Record)作为主引导记录的硬盘上,最多可以拥有4个主分区,所以这里显示分区号(1-4),默认1

    然后将剩余的空间创建成扩展分区:

    扩展分区无法直接使用,要将扩展分区创建为逻辑分区才能使用,同一块硬盘上只能有一个扩展分区,可以拥有多个逻辑分区:

    然后我们将其中一块逻辑分区类别更改为SWAP交换分区类型:输入 t 选项,将/dev/sdb5的分区类型更改为 ID号为82的 SWAP 分区

    输入 l 可以列出已知的类型和相对应的ID号

    最后确认一下分区情况,没有问题输入 w 保存退出,如果不保存使用 q 退出:

    下面我们使用mkfs命令对新建的分区进行格式化操作:

    mkfs命令说明: 创建一个Linux类型的文件系统

    常用选项有:

    我们使用默认选项来格式化/dev/sdb1 分区,默认为ext2文件系统格式:

    使用 blkid 命令查看分区UUID号和文件系统类型。

    下面我们将 /dev/sdb6 分区格式化为ext3文件系统格式,并指定LABLE为MYDATA,block-size块大小设定为2048

    注:block-size块大小设定好以后将不能更改,要想更改只能重新格式化分区

    接下来将 /dev/sdb5 分区格式化为 SWAP 分区,指定了分区类型后只能格式化为相应的类型:

    mkswap命令说明:

    常用选项有:

    格式化/dev/sdb5分区,指定分区LABLE为MYSWAP

    使用swapon命令来启用刚才格式化好的分区:

    设置开机自动挂载好刚才创建的3个分区,需要写入/etc/fstab 文件:

    /etc/fstab 文件说明:

    设备   挂载点    文件系统类型     挂载选项    转储频率     自检次序

    挂载选项包括:

    sync同步写入磁盘  async异步写入磁盘 

    atime/noatime 文件是否更新访问时间戳 ,noatime可以节省系统资源开销

    diratime/nodiratime 目录是否更新访问时间戳,nodiratime可以节省系统资源开销

    remount 支持自动重新挂载

    acl 支持访问控制列表 

    dev/nodev 是否允许创建设备文件

    exec/noexec 是否允许运行此设备上的程序文件

    auto/noauto 是否允许支持-a 自动挂载

    user/nouser  是否允许普通用户挂载

    suid/nosuid  是否支持使用SUID权限

    defaults 默认:rw, suid, dev, exec, auto, nouser, async, and relatime

    第一个数字 :0 不备份 1 每天备份 2 根据上次备份时间,隔一天备份

    第二个数字 :0 不自检 1首先自检 2 次级自检 3 ....

     

    要想使用格式化好的分区,必须要在系统上挂载才可以,分别创建对应的挂载目录并且挂载分区:

    mount命令说明:

    常用选项有:

    使用umount命令来卸载挂载的分区:

    使用 df 命令查看分区大小和使用情况:

    使用 du 命令可以查看文件夹大小:

    使用 tune2fs 命令来查看、修改分区属性:

    tune2fs命令说明:

    常用选项有:

    -l 选项列出分区超级块信息:

    使用tune2fs 修改/dev/sdb1的LABEL、预留分区空间大小、开启日志功能及更改默认挂载支持ACL访问控制列表:

    可以使用dumpe2fs 命令来查看分区超级块信息:

    注:在CENTOS 5 系列系统中使用 dumpe4fs  用于显示ext4文件系统的超级块信息

     使用fsck -t指明类型 -r交互式修复文件系统:

    使用 partx 查看分区信息(CentOS 5,7: 使用partprobe ):

    partx 命令说明:

    常用选项有:

    使用 dd 命令来清空硬盘的分区表信息:

    使用 partx -d 来更新内核识别的分区信息:

    Centos7 使用 partprobe 来通知内核更新硬盘信息:

     

     

     

    展开全文
  • 一口气搞懂「文件系统」,就靠这 25 张图了

    万次阅读 多人点赞 2020-08-13 21:48:43
    文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。 Linux 最经典的一句话是:「一切皆文件」,不仅普通的文件和目录,就连块设备、管道、socket 等...


    前言

    不多 BB,直接上「硬菜」。


    正文

    文件系统的基本组成

    文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。

    文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。

    Linux 最经典的一句话是:「一切皆文件」,不仅普通的文件和目录,就连块设备、管道、socket 等,也都是统一交给文件系统管理的。

    Linux 文件系统会为每个文件分配两个数据结构:索引节点(index node)和目录项(directory entry,它们主要用来记录文件的元信息和目录层次结构。

    • 索引节点,也就是 inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以索引节点同样占用磁盘空间
    • 目录项,也就是 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存

    由于索引节点唯一标识一个文件,而目录项记录着文件的名,所以目录项和索引节点的关系是多对一,也就是说,一个文件可以有多个别字。比如,硬链接的实现就是多个目录项中的索引节点指向同一个文件。

    注意,目录也是文件,也是用索引节点唯一标识,和普通文件不同的是,普通文件在磁盘里面保存的是文件数据,而目录文件在磁盘里面保存子目录或文件。

    目录项和目录是一个东西吗?

    虽然名字很相近,但是它们不是一个东西,目录是个文件,持久化存储在磁盘,而目录项是内核一个数据结构,缓存在内存。

    如果查询目录频繁从磁盘读,效率会很低,所以内核会把已经读过的目录用目录项这个数据结构缓存在内存,下次再次读到相同的目录时,只需从内存读就可以,大大提高了文件系统的效率。

    注意,目录项这个数据结构不只是表示目录,也是可以表示文件的。

    那文件数据是如何存储在磁盘的呢?

    磁盘读写的最小单位是扇区,扇区的大小只有 512B 大小,很明显,如果每次读写都以这么小为单位,那这读写的效率会非常低。

    所以,文件系统把多个扇区组成了一个逻辑块,每次读写的最小单位就是逻辑块(数据块),Linux 中的逻辑块大小为 4KB,也就是一次性读写 8 个扇区,这将大大提高了磁盘的读写的效率。

    以上就是索引节点、目录项以及文件数据的关系,下面这个图就很好的展示了它们之间的关系:

    在这里插入图片描述

    索引节点是存储在硬盘上的数据,那么为了加速文件的访问,通常会把索引节点加载到内存中。

    另外,磁盘进行格式化的时候,会被分成三个存储区域,分别是超级块、索引节点区和数据块区。

    • 超级块,用来存储文件系统的详细信息,比如块个数、块大小、空闲块等等。
    • 索引节点区,用来存储索引节点;
    • 数据块区,用来存储文件或目录数据;

    我们不可能把超级块和索引节点区全部加载到内存,这样内存肯定撑不住,所以只有当需要使用的时候,才将其加载进内存,它们加载进内存的时机是不同的:

    • 超级块:当文件系统挂载时进入内存;
    • 索引节点区:当文件被访问时进入内存;

    虚拟文件系统

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

    VFS 定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解 VFS 提供的统一接口即可。

    在 Linux 文件系统中,用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间的关系如下图:

    Linux 支持的文件系统也不少,根据存储位置的不同,可以把文件系统分为三类:

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

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


    文件的使用

    我们从用户角度来看文件的话,就是我们要怎么使用文件?首先,我们得通过系统调用来打开一个文件。

    write 的过程

    fd = open(name, flag); # 打开文件
    ...
    write(fd,...);         # 写数据
    ...
    close(fd);             # 关闭文件
    

    上面简单的代码是读取一个文件的过程:

    • 首先用 open 系统调用打开文件,open 的参数中包含文件的路径名和文件名。
    • 使用 write 写数据,其中 write 使用 open 所返回的文件描述符,并不使用文件名作为参数。
    • 使用完文件后,要用 close 系统调用关闭文件,避免资源的泄露。

    我们打开了一个文件后,操作系统会跟踪进程打开的所有文件,所谓的跟踪呢,就是操作系统为每个进程维护一个打开文件表,文件表里的每一项代表「文件描述符」,所以说文件描述符是打开文件的标识。

    打开文件表

    操作系统在打开文件表中维护着打开文件的状态和信息:

    • 文件指针:系统跟踪上次读写位置作为当前文件位置指针,这种指针对打开文件的某个进程来说是唯一的;
    • 文件打开计数器:文件关闭时,操作系统必须重用其打开文件表条目,否则表内空间不够用。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件,该计数器跟踪打开和关闭的数量,当该计数为 0 时,系统关闭文件,删除该条目;
    • 文件磁盘位置:绝大多数文件操作都要求系统修改文件数据,该信息保存在内存中,以免每个操作都从磁盘中读取;
    • 访问权限:每个进程打开文件都需要有一个访问模式(创建、只读、读写、添加等),该信息保存在进程的打开文件表中,以便操作系统能允许或拒绝之后的 I/O 请求;

    在用户视角里,文件就是一个持久化的数据结构,但操作系统并不会关心你想存在磁盘上的任何的数据结构,操作系统的视角是如何把文件数据和磁盘块对应起来。

    所以,用户和操作系统对文件的读写操作是有差异的,用户习惯以字节的方式读写文件,而操作系统则是以数据块来读写文件,那屏蔽掉这种差异的工作就是文件系统了。

    我们来分别看一下,读文件和写文件的过程:

    • 当用户进程从文件读取 1 个字节大小的数据时,文件系统则需要获取字节所在的数据块,再返回数据块对应的用户进程所需的数据部分。
    • 当用户进程把 1 个字节大小的数据写进文件时,文件系统则找到需要写入数据的数据块的位置,然后修改数据块中对应的部分,最后再把数据块写回磁盘。

    所以说,文件系统的基本操作单位是数据块


    文件的存储

    文件的数据是要存储在硬盘上面的,数据在磁盘上的存放方式,就像程序在内存中存放的方式那样,有以下两种:

    • 连续空间存放方式
    • 非连续空间存放方式

    其中,非连续空间存放方式又可以分为「链表方式」和「索引方式」。

    不同的存储方式,有各自的特点,重点是要分析它们的存储效率和读写性能,接下来分别对每种存储方式说一下。

    连续空间存放方式

    连续空间存放方式顾名思义,文件存放在磁盘「连续的」物理空间中。这种模式下,文件的数据都是紧密相连,读写效率很高,因为一次磁盘寻道就可以读出整个文件。

    使用连续存放的方式有一个前提,必须先知道一个文件的大小,这样文件系统才会根据文件的大小在磁盘上找到一块连续的空间分配给文件。

    所以,文件头里需要指定「起始块的位置」和「长度」,有了这两个信息就可以很好的表示文件存放方式是一块连续的磁盘空间。

    注意,此处说的文件头,就类似于 Linux 的 inode。

    连续空间存放方式

    连续空间存放的方式虽然读写效率高,但是有「磁盘空间碎片」和「文件长度不易扩展」的缺陷。

    如下图,如果文件 B 被删除,磁盘上就留下一块空缺,这时,如果新来的文件小于其中的一个空缺,我们就可以将其放在相应空缺里。但如果该文件的大小大于所有的空缺,但却小于空缺大小之和,则虽然磁盘上有足够的空缺,但该文件还是不能存放。当然了,我们可以通过将现有文件进行挪动来腾出空间以容纳新的文件,但是这个在磁盘挪动文件是非常耗时,所以这种方式不太现实。

    磁盘碎片

    另外一个缺陷是文件长度扩展不方便,例如上图中的文件 A 要想扩大一下,需要更多的磁盘空间,唯一的办法就只能是挪动的方式,前面也说了,这种方式效率是非常低的。

    那么有没有更好的方式来解决上面的问题呢?答案当然有,既然连续空间存放的方式不太行,那么我们就改变存放的方式,使用非连续空间存放方式来解决这些缺陷。

    非连续空间存放方式

    非连续空间存放方式分为「链表方式」和「索引方式」。

    我们先来看看链表的方式。

    链表的方式存放是离散的,不用连续的,于是就可以消除磁盘碎片,可大大提高磁盘空间的利用率,同时文件的长度可以动态扩展。根据实现的方式的不同,链表可分为「隐式链表」和「显式链接」两种形式。

    文件要以「隐式链表」的方式存放的话,实现的方式是文件头要包含「第一块」和「最后一块」的位置,并且每个数据块里面留出一个指针空间,用来存放下一个数据块的位置,这样一个数据块连着一个数据块,从链头开是就可以顺着指针找到所有的数据块,所以存放的方式可以是不连续的。

    隐式链表

    隐式链表的存放方式的缺点在于无法直接访问数据块,只能通过指针顺序访问文件,以及数据块指针消耗了一定的存储空间。隐式链接分配的稳定性较差,系统在运行过程中由于软件或者硬件错误导致链表中的指针丢失或损坏,会导致文件数据的丢失。

    如果取出每个磁盘块的指针,把它放在内存的一个表中,就可以解决上述隐式链表的两个不足。那么,这种实现方式是「显式链接」,它指把用于链接文件各数据块的指针,显式地存放在内存的一张链接表中,该表在整个磁盘仅设置一张,每个表项中存放链接指针,指向下一个数据块号

    对于显式链接的工作方式,我们举个例子,文件 A 依次使用了磁盘块 4、7、2、10 和 12 ,文件 B 依次使用了磁盘块 6、3、11 和 14 。利用下图中的表,可以从第 4 块开始,顺着链走到最后,找到文件 A 的全部磁盘块。同样,从第 6 块开始,顺着链走到最后,也能够找出文件 B 的全部磁盘块。最后,这两个链都以一个不属于有效磁盘编号的特殊标记(如 -1 )结束。内存中的这样一个表格称为文件分配表(File Allocation Table,FAT

    显式链接

    由于查找记录的过程是在内存中进行的,因而不仅显著地提高了检索速度,而且大大减少了访问磁盘的次数。但也正是整个表都存放在内存中的关系,它的主要的缺点是不适用于大磁盘

    比如,对于 200GB 的磁盘和 1KB 大小的块,这张表需要有 2 亿项,每一项对应于这 2 亿个磁盘块中的一个块,每项如果需要 4 个字节,那这张表要占用 800MB 内存,很显然 FAT 方案对于大磁盘而言不太合适。

    接下来,我们来看看索引的方式。

    链表的方式解决了连续分配的磁盘碎片和文件动态扩展的问题,但是不能有效支持直接访问(FAT除外),索引的方式可以解决这个问题。

    索引的实现是为每个文件创建一个「索引数据块」,里面存放的是指向文件数据块的指针列表,说白了就像书的目录一样,要找哪个章节的内容,看目录查就可以。

    另外,文件头需要包含指向「索引数据块」的指针,这样就可以通过文件头知道索引数据块的位置,再通过索引数据块里的索引信息找到对应的数据块。

    创建文件时,索引块的所有指针都设为空。当首次写入第 i 块时,先从空闲空间中取得一个块,再将其地址写到索引块的第 i 个条目。

    索引的方式

    索引的方式优点在于:

    • 文件的创建、增大、缩小很方便;
    • 不会有碎片的问题;
    • 支持顺序读写和随机读写;

    由于索引数据也是存放在磁盘块的,如果文件很小,明明只需一块就可以存放的下,但还是需要额外分配一块来存放索引数据,所以缺陷之一就是存储索引带来的开销。

    如果文件很大,大到一个索引数据块放不下索引信息,这时又要如何处理大文件的存放呢?我们可以通过组合的方式,来处理大文件的存。

    先来看看链表 + 索引的组合,这种组合称为「链式索引块」,它的实现方式是在索引数据块留出一个存放下一个索引数据块的指针,于是当一个索引数据块的索引信息用完了,就可以通过指针的方式,找到下一个索引数据块的信息。那这种方式也会出现前面提到的链表方式的问题,万一某个指针损坏了,后面的数据也就会无法读取了。

    链式索引块

    还有另外一种组合方式是索引 + 索引的方式,这种组合称为「多级索引块」,实现方式是通过一个索引块来存放多个索引数据块,一层套一层索引,像极了俄罗斯套娃是吧。

    多级索引块

    Unix 文件的实现方式

    我们先把前面提到的文件实现方式,做个比较:

    在这里插入图片描述

    那早期 Unix 文件系统是组合了前面的文件存放方式的优点,如下图:

    早期 Unix 文件系统

    它是根据文件的大小,存放的方式会有所变化:

    • 如果存放文件所需的数据块小于 10 块,则采用直接查找的方式;
    • 如果存放文件所需的数据块超过 10 块,则采用一级间接索引方式;
    • 如果前面两种方式都不够存放大文件,则采用二级间接索引方式;
    • 如果二级间接索引也不够存放大文件,这采用三级间接索引方式;

    那么,文件头(Inode)就需要包含 13 个指针:

    • 10 个指向数据块的指针;
    • 第 11 个指向索引块的指针;
    • 第 12 个指向二级索引块的指针;
    • 第 13 个指向三级索引块的指针;

    所以,这种方式能很灵活地支持小文件和大文件的存放:

    • 对于小文件使用直接查找的方式可减少索引数据块的开销;
    • 对于大文件则以多级索引的方式来支持,所以大文件在访问数据块时需要大量查询;

    这个方案就用在了 Linux Ext 2/3 文件系统里,虽然解决大文件的存储,但是对于大文件的访问,需要大量的查询,效率比较低。

    为了解决这个问题,Ext 4 做了一定的改变,具体怎么解决的,本文就不展开了。


    空闲空间管理

    前面说到的文件的存储是针对已经被占用的数据块组织和管理,接下来的问题是,如果我要保存一个数据块,我应该放在硬盘上的哪个位置呢?难道需要将所有的块扫描一遍,找个空的地方随便放吗?

    那这种方式效率就太低了,所以针对磁盘的空闲空间也是要引入管理的机制,接下来介绍几种常见的方法:

    • 空闲表法
    • 空闲链表法
    • 位图法

    空闲表法

    空闲表法就是为所有空闲空间建立一张表,表内容包括空闲区的第一个块号和该空闲区的块个数,注意,这个方式是连续分配的。如下图:

    空闲表法

    当请求分配磁盘空间时,系统依次扫描空闲表里的内容,直到找到一个合适的空闲区域为止。当用户撤销一个文件时,系统回收文件空间。这时,也需顺序扫描空闲表,寻找一个空闲表条目并将释放空间的第一个物理块号及它占用的块数填到这个条目中。

    这种方法仅当有少量的空闲区时才有较好的效果。因为,如果存储空间中有着大量的小的空闲区,则空闲表变得很大,这样查询效率会很低。另外,这种分配技术适用于建立连续文件。

    空闲链表法

    我们也可以使用「链表」的方式来管理空闲空间,每一个空闲块里有一个指针指向下一个空闲块,这样也能很方便的找到空闲块并管理起来。如下图:

    空闲链表法

    当创建文件需要一块或几块时,就从链头上依次取下一块或几块。反之,当回收空间时,把这些空闲块依次接到链头上。

    这种技术只要在主存中保存一个指针,令它指向第一个空闲块。其特点是简单,但不能随机访问,工作效率低,因为每当在链上增加或移动空闲块时需要做很多 I/O 操作,同时数据块的指针消耗了一定的存储空间。

    空闲表法和空闲链表法都不适合用于大型文件系统,因为这会使空闲表或空闲链表太大。

    位图法

    位图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。

    当值为 0 时,表示对应的盘块空闲,值为 1 时,表示对应的盘块已分配。它形式如下:

    1111110011111110001110110111111100111 ...
    

    在 Linux 文件系统就采用了位图的方式来管理空闲空间,不仅用于数据空闲块的管理,还用于 inode 空闲块的管理,因为 inode 也是存储在磁盘的,自然也要有对其管理。


    文件系统的结构

    前面提到 Linux 是用位图的方式管理空闲空间,用户在创建一个新文件时,Linux 内核会通过 inode 的位图找到空闲可用的 inode,并进行分配。要存储数据时,会通过块的位图找到空闲的块,并分配,但仔细计算一下还是有问题的。

    数据块的位图是放在磁盘块里的,假设是放在一个块里,一个块 4K,每位表示一个数据块,共可以表示 4 * 1024 * 8 = 2^15 个空闲块,由于 1 个数据块是 4K 大小,那么最大可以表示的空间为 2^15 * 4 * 1024 = 2^27 个 byte,也就是 128M。

    也就是说按照上面的结构,如果采用「一个块的位图 + 一系列的块」,外加「一个块的 inode 的位图 + 一系列的 inode 的结构」能表示的最大空间也就 128M,这太少了,现在很多文件都比这个大。

    在 Linux 文件系统,把这个结构称为一个块组,那么有 N 多的块组,就能够表示 N 大的文件。

    下图给出了 Linux Ext2 整个文件系统的结构和块组的内容,文件系统都由大量块组组成,在硬盘上相继排布:

    最前面的第一个块是引导块,在系统启动时用于启用引导,接着后面就是一个一个连续的块组了,块组的内容如下:

    • 超级块,包含的是文件系统的重要信息,比如 inode 总个数、块总个数、每个块组的 inode 个数、每个块组的块个数等等。
    • 块组描述符,包含文件系统中各个块组的状态,比如块组中空闲块和 inode 的数目等,每个块组都包含了文件系统中「所有块组的组描述符信息」。
    • 数据位图和 inode 位图, 用于表示对应的数据块或 inode 是空闲的,还是被使用中。
    • inode 列表,包含了块组中所有的 inode,inode 用于保存文件系统中与各个文件和目录相关的所有元数据。
    • 数据块,包含文件的有用数据。

    你可以会发现每个块组里有很多重复的信息,比如超级块和块组描述符表,这两个都是全局信息,而且非常的重要,这么做是有两个原因:

    • 如果系统崩溃破坏了超级块或块组描述符,有关文件系统结构和内容的所有信息都会丢失。如果有冗余的副本,该信息是可能恢复的。
    • 通过使文件和管理数据尽可能接近,减少了磁头寻道和旋转,这可以提高文件系统的性能。

    不过,Ext2 的后续版本采用了稀疏技术。该做法是,超级块和块组描述符表不再存储到文件系统的每个块组中,而是只写入到块组 0、块组 1 和其他 ID 可以表示为 3、 5、7 的幂的块组中。


    目录的存储

    在前面,我们知道了一个普通文件是如何存储的,但还有一个特殊的文件,经常用到的目录,它是如何保存的呢?

    基于 Linux 一切皆文件的设计思想,目录其实也是个文件,你甚至可以通过 vim 打开它,它也有 inode,inode 里面也是指向一些块。

    和普通文件不同的是,普通文件的块里面保存的是文件数据,而目录文件的块里面保存的是目录里面一项一项的文件信息。

    在目录文件的块中,最简单的保存格式就是列表,就是一项一项地将目录下的文件信息(如文件名、文件 inode、文件类型等)列在表里。

    列表中每一项就代表该目录下的文件的文件名和对应的 inode,通过这个 inode,就可以找到真正的文件。

    目录格式哈希表

    通常,第一项是「.」,表示当前目录,第二项是「..」,表示上一级目录,接下来就是一项一项的文件名和 inode。

    如果一个目录有超级多的文件,我们要想在这个目录下找文件,按照列表一项一项的找,效率就不高了。

    于是,保存目录的格式改成哈希表,对文件名进行哈希计算,把哈希值保存起来,如果我们要查找一个目录下面的文件名,可以通过名称取哈希。如果哈希能够匹配上,就说明这个文件的信息在相应的块里面。

    Linux 系统的 ext 文件系统就是采用了哈希表,来保存目录的内容,这种方法的优点是查找非常迅速,插入和删除也较简单,不过需要一些预备措施来避免哈希冲突。

    目录查询是通过在磁盘上反复搜索完成,需要不断地进行 I/O 操作,开销较大。所以,为了减少 I/O 操作,把当前使用的文件目录缓存在内存,以后要使用该文件时只要在内存中操作,从而降低了磁盘操作次数,提高了文件系统的访问速度。


    软链接和硬链接

    有时候我们希望给某个文件取个别名,那么在 Linux 中可以通过硬链接(Hard Link软链接(Symbolic Link 的方式来实现,它们都是比较特殊的文件,但是实现方式也是不相同的。

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

    硬链接

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

    软链接


    文件 I/O

    文件的读写方式各有千秋,对于文件的 I/O 分类也非常多,常见的有

    • 缓冲与非缓冲 I/O
    • 直接与非直接 I/O
    • 阻塞与非阻塞 I/O VS 同步与异步 I/O

    接下来,分别对这些分类讨论讨论。

    缓冲与非缓冲 I/O

    文件操作的标准库是可以实现数据的缓存,那么根据「是否利用标准库缓冲」,可以把文件 I/O 分为缓冲 I/O 和非缓冲 I/O

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

    这里所说的「缓冲」特指标准库内部实现的缓冲。

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

    直接与非直接 I/O

    我们都知道磁盘 I/O 是非常慢的,所以 Linux 内核为了减少磁盘 I/O 次数,在系统调用后,会把用户数据拷贝到内核中缓存起来,这个内核缓存空间也就是「页缓存」,只有当缓存满足某些条件的时候,才发起磁盘 I/O 的请求。

    那么,根据是「否利用操作系统的缓存」,可以把文件 I/O 分为直接 I/O 与非直接 I/O

    • 直接 I/O,不会发生内核缓存和用户程序之间数据复制,而是直接经过文件系统访问磁盘。
    • 非直接 I/O,读操作时,数据从内核缓存中拷贝给用户程序,写操作时,数据从用户程序拷贝给内核缓存,再由内核决定什么时候写入数据到磁盘。

    如果你在使用文件操作类的系统调用函数时,指定了 O_DIRECT 标志,则表示使用直接 I/O。如果没有设置过,默认使用的是非直接 I/O。

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

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

    • 在调用 write 的最后,当发现内核缓存的数据太多的时候,内核会把数据写到磁盘上;
    • 用户主动调用 sync,内核缓存会刷到磁盘上;
    • 当内存十分紧张,无法再分配页面时,也会把内核缓存的数据刷到磁盘上;
    • 内核缓存的数据的缓存时间超过某个时间时,也会把数据刷到磁盘上;

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

    为什么把阻塞 / 非阻塞与同步与异步放一起说的呢?因为它们确实非常相似,也非常容易混淆,不过它们之间的关系还是有点微妙的。

    先来看看阻塞 I/O,当用户程序执行 read ,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到应用程序的缓冲区中,当拷贝过程完成,read 才会返回。

    注意,阻塞等待的是「内核数据准备好」和「数据从内核态拷贝到用户态」这两个过程。过程如下图:

    阻塞 I/O

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

    非阻塞 I/O

    注意,这里最后一次 read 调用,获取数据的过程,是一个同步的过程,是需要等待的过程。这里的同步指的是内核态的数据拷贝到用户程序的缓存区这个过程。

    举个例子,访问管道或 socket 时,如果设置了 O_NONBLOCK 标志,那么就表示使用的是非阻塞 I/O 的方式访问,而不做任何设置的话,默认是阻塞 I/O。

    应用程序每次轮询内核的 I/O 是否准备好,感觉有点傻乎乎,因为轮询的过程中,应用程序啥也做不了,只是在循环。

    为了解决这种傻乎乎轮询方式,于是 I/O 多路复用技术就出来了,如 select、poll,它是通过 I/O 事件分发,当内核数据准备好时,再以事件通知应用程序进行操作。

    这个做法大大改善了应用进程对 CPU 的利用率,在没有被通知的情况下,应用进程可以使用 CPU 做其他的事情。

    下图是使用 select I/O 多路复用过程。注意,read 获取数据的过程(数据从内核态拷贝到用户态的过程),也是一个同步的过程,需要等待:

    I/O 多路复用

    实际上,无论是阻塞 I/O、非阻塞 I/O,还是基于非阻塞 I/O 的多路复用都是同步调用。因为它们在 read 调用时,内核将数据从内核空间拷贝到应用程序空间,过程都是需要等待的,也就是说这个过程是同步的,如果内核实现的拷贝效率不高,read 调用就会在这个同步过程中等待比较长的时间。

    而真正的异步 I/O 是「内核数据准备好」和「数据从内核态拷贝到用户态」这两个过程都不用等待。

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

    异步 I/O

    下面这张图,总结了以上几种 I/O 模型:

    在前面我们知道了,I/O 是分为两个过程的:

    1. 数据准备的过程
    2. 数据从内核空间拷贝到用户进程缓冲区的过程

    阻塞 I/O 会阻塞在「过程 1 」和「过程 2」,而非阻塞 I/O 和基于非阻塞 I/O 的多路复用只会阻塞在「过程 2」,所以这三个都可以认为是同步 I/O。

    异步 I/O 则不同,「过程 1 」和「过程 2 」都不会阻塞。

    用故事去理解这几种 I/O 模型

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

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

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

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

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


    迟到理由

    是的,小林依然迟到了,因为最近发生了一件非常倒霉的事情,我之前使用的图床挂掉了……

    这就导致我所有文章的图片都挂了,好在大部分博客平台都会转存图片,所以微信公众号、CSDN、知乎等平台都正常,但我的本地文章笔记和博客园平台的图片都挂掉了,在博客园还有个读者私信提醒我的文章图片挂了,他很喜欢小林文章,希望早点恢图片,太感动了。

    这就是白嫖免费图床的下场,本打算换阿里云图床,但阿里云图床是按访问流量收费的,如果有人搞你,那直接刷爆你的钱包,想想都可怕,小林穷搞不起搞不起。

    后来,询问了一位朋友 guide 哥,他说可以使用 GitHub 作为图床,用开源工具 Picgo 关联 GitHub 上传图片,再通过 jsdelivr CDN 加速访问,这一套组合很完美,于是我就采用了此方案搭建了自己的图床,依旧继续白嫖,我就不信 GitHub 也挂!

    图床虽然搞定了,最糟糕的事情才开始,我要把以前近 500 张的图片重新保存(以前有的图片丢了)和分类,并一个一个上传到 Github,接着还得把图片的新地址改到本地文章,这工作量简直要命,到现在我也才搞定了操作系统篇的图片,网络篇的图片还有 2/3 没弄完,瞬间后悔自己画那么多图。

    唉,发完这篇文章,小林还得继续恢复图片……

    最近,我都在 B 站学习操作系统,但有时候是想看操作系统,但奈何 B 站首页推送太丰富,看着看着半天就过去了,甚至还花了一天时间专门看一个 UP 主解说「火影忍者」动漫全集,于是就这么忘了文章的事情,哈哈哈。

    不过,确实很过瘾,毕竟偷的了忙中闲,方能人上人嘛。

    好了,小林是专为大家图解的工具人,我们下次见!


    好文推荐

    凉了!张三同学没答好「进程间通信」,被面试官挂了…

    万粉福利,300 页图解网络 PDF 打包送你

    展开全文
  • moosefs使用辅助文件系统,恢复文件

    万次阅读 2020-11-19 10:15:16
    文章目录一 查看moosefs垃圾回收时间二 挂载moosefs辅助文件系统三 undel恢复文件1 单文件恢复2 多文件批量恢复 moosefs文件系统,client客户端误删除或丢失的文件是可以通过moosefs的文件辅助系统恢复的。 一 查看...
  • Linux文件系统详解

    万次阅读 多人点赞 2019-05-29 16:07:53
    从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。本文参考: http://blog.chinaunix.net/uid-8698570-id-1763151.html ...
  • Linux文件系统

    万次阅读 2019-03-25 18:49:40
    Linux系统启动时,首先挂载根文件系统,之后可以自动或手动挂载其他的文件系统,这些文件系统要挂载到挂载点上,与虚拟文件系统(Virtual File System)和通用块设备层(General Block Device Layer)建立联系。...
  • linux系统下创建文件系统

    万次阅读 2018-06-16 23:51:04
    任何硬盘和u盘等存储介质都需要建立文件系统之后,才能使用。我们u盘和硬盘之所以跟买的容量不一样,就是因为里面存储着文件系统。没有文件系统,那就是纯粹的硬件,我们是不能使用的。windows中我们可以格式化u盘...
  • 操作系统文件系统题库

    万次阅读 多人点赞 2018-08-02 15:14:47
    网络课课后题 1、UNIX系统中,把输入输出设备看做是 A、普通文件 ...3、文件系统实现文件的按名存取是通过下列哪一项工作完成的? A、文件寻址 B、位示图查找 C、目录项分解 D、文件目录查找 ...
  • FAT32文件系统结构详解

    万次阅读 多人点赞 2018-04-13 15:38:58
    1. SD卡中FAT32文件系统快速入门 1.1. 理论知识 1.1.1. MBR(Main Boot Record) 主引导记录,占446字节, 为计算机启动后从可启动介质上首先装入内存并且执行的代码,通常用来解释分区结构 1.1.2. DBR(DOS Boot ...
  • FATFS 文件系统

    千次阅读 2016-06-18 16:26:08
    1、文件系统是什么? 负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。 即在磁盘上组织文件的方法。 常用的文件系统: -FAT / FATFS -NTFS: 基于安全性的文件系统,是Windows NT所采用的独特的...
  • 分布式文件系统

    千次阅读 2018-09-05 10:24:44
    相对于本机端的文件系统而言,分布式文件系统(英语:Distributed file system, DFS),或是网络文件系统(英语:Network File System),是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户...
  • 最近在学习hadoop时关于分布式文件系统(hdfs)中的块定义有点模糊,以及它内部与操作系统中物理磁盘块的...而构建于单个磁盘之上的文件系统(linux文件系统)通过磁盘块来管理该文件系统中的块,该文件系统中的文件大小是
  • 一、什么是Linux设备文件系统  首先我们不看定义,定义总是太抽象很难理解,我们先看现象。当我们往开发板上移植了一个新的文件系统之后(假如各种设备驱动也移植好了),启动开发板,我们用串口工具进入开发板,...
  • windows 文件系统

    千次阅读 2018-07-05 22:53:55
    1.什么是文件系统文件系统是操作系统用于明确存储设备(磁盘、固态硬盘)上组织文件的方法。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。FAT...
  • Xfs 文件系统的备份与恢复

    万次阅读 2021-03-13 14:13:08
    XFS一种高性能的日志文件系统,最早于1993年,由Silicon Graphics为他们的IRIX操作系统而开发,是IRIX 5.3版的默认文件系统。2000年5月,Silicon Graphics以GNU通用公共许可证发布这套系统的源代码,之后被移植到...
  • 文件系统与数据库系统区别

    万次阅读 2018-10-12 10:29:54
    本文从结构性、数据共享、数据独立、数据冗余介绍文件系统与数据库系统区别: 文件系统把数据组织成相互独立的数据文件,实现了记录内的结构性,但整体无结构;而数据库系统实现整体数据的结构化,也是数据库系统...
  • 嵌入式根文件系统一般都是使用busybox 1.下载 https://busybox.net/ 我没安装git工具,我就直接下载源码了 我们就下载一个19.2的版本 放入linux系统中某个目录,解压 需改顶层Makefile nfs服务器搭建,...
  • Windows系统常见的文件系统格式

    千次阅读 2019-05-12 08:43:17
    FAT文件系统诞生于1977年,它最初是为软盘设计的文件系统,但是后来随着微软推出dos和win 9x系统,FAT文件系统经过适配被逐渐用到了硬盘上,并且在那时的20年中,一直是主流的文件系统。 后来随着硬件技术的进步...
  • NAS文件系统

    千次阅读 2019-01-18 15:10:23
    NAS是一个可共享访问,弹性扩展,高可靠,高性能的分布式文件系统。它基于 POSIX 文件接口,天然适配原生操作系统,提供共享访问,同时保证数据一致性和锁互斥。 NAS 具有以下特性: 无缝集成 NAS 支持标准的文件...
  • 虚拟化、文件系统、查找文件

    万次阅读 2019-11-27 12:27:27
    文章目录虚拟化虚拟化的概念安装KVM安装gustos了解并配置KVM网络桥接:NAT:仅主机(hostonly):文件系统了解文件系统的概念:了解硬链接的概念:挂载文件系统:查找文件: 虚拟化 虚拟化的概念 虚拟化≠虚拟机 虚拟化...
  • Linux 文件系统类型 磁盘文件系统。 包括硬盘、CD-ROM、DVD、USB存储器、磁盘阵列等。常见文件系统格式有:autofs、coda、Ext(Extended File sytem,扩展文件系统)、Ext2、Ext3、VFAT、ISO9660(通常是CD-ROM...
  • 对linux系统而言,对一个文件系统,如果想要使用它,就必须对其进行挂载,挂载就是将文件系统安装到linux文件系统的某个目录下,这个目录可以自己创建,或则选择linux存在的目录,必须是目录文件就行了,挂载后,这...
  • FAT文件系统详解(一)

    万次阅读 2020-03-30 21:22:20
    我说是为了“虚拟文件系统”管理讲解做铺垫,我一直的想法就是“一定要知道原理,才能做的更远更好”,因为你知道这其中的原理了,之后如果遇到问题了,就不好慌乱,一切让你心慌意乱的事儿都是一些你不能把握的事情...
  • 常见文件系统

    千次阅读 2016-09-12 21:40:22
    常见文件系统 一、常见嵌入式根文件系统 1、JFFS文件系统 2、Jffs2: 日志闪存嵌入式系统文件系统版本2 (Journalling Flash FileSystem v2) 3、yaffs/yaffs2是专为嵌入式系统使用 NAND型闪存而设计的一种日志...
  • 操作系统概论【五】- - 文件系统

    千次阅读 多人点赞 2020-09-06 17:52:53
    文章目录第五章、文件系统一、文件1. 文件命名2. 文件结构3. 文件类型4. 文件存取5. 文件属性6. 文件操作二、目录1. 目录文件的结构2. 目录结构3. 路径名4. 目录操作三、文件系统的实现1. 实现文件文件存储的4种常用...
  • 数据库与文件系统

    千次阅读 2018-06-26 16:36:57
    由于工作需要,我简单的了解了一下文件系统与数据库系统,现总结如下,希望对广大读者有所帮助。文件系统的简单介绍文件系统是操作系统的子系统,用于操作系统明确存储设备或分区上的文件的方法和数据结构。文件系统...
  • Linux系统如何支持NTFS文件系统

    万次阅读 2017-03-16 07:32:35
    由于Linux系统默认是不支持NTFS文件系统的,因此,我们基本不能在Linux系统中挂载NTFS文件系统类型的硬盘或移动硬盘。为此,最主要的问题是如何使Linux系统支持NTFS文件系统。一般情况下,在Linux系统中,我们并不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 918,850
精华内容 367,540
关键字:

文件系统