返回顶部
首页 > 资讯 > 操作系统 >Linux中的EXT系列文件系统格式详解
  • 274
分享到

Linux中的EXT系列文件系统格式详解

linux文件系统Linuxext文件系统ext文件系统 2022-06-04 22:06:10 274人浏览 薄情痞子
摘要

linux文件系统 常见的硬盘如上图所示,每个盘片分多个磁道,每个磁道分多个扇区,每个扇区512字节,是硬盘的最小存储单元,但是在操作系统层面会将多个扇区组成块(block),是操作系统存储数据的最小单元,通常是8个

linux文件系统

常见的硬盘如上图所示,每个盘片分多个磁道,每个磁道分多个扇区,每个扇区512字节,是硬盘的最小存储单元,但是在操作系统层面会将多个扇区组成块(block),是操作系统存储数据的最小单元,通常是8个扇区组成4K字节的块。
对于linux文件系统,需要考虑以下几点:

  • 文件系统需要有严格的组织形式,使文件能够以块为单位存储
  • 文件系统需要有索引区,方便查找一个文件分成的多个块存在了什么位置
  • 如果有文件近期经常被读写,需要有缓存
  • 文件应该用文件夹的形式组织起来方便管理和查询
  • Linux内核要在自己的内存里维护一套数据结构,保持哪些文件被哪些进程打开和使用

Linux里面一切皆文件,都有以下几种文件(从ls -l结果的第一位标识位可以看出来):

  • - 表示普通文件
  • d 表示文件夹
  • c 表示字符设备文件
  • b 表示块设备文件
  • s 表示套接字Socket文件
  • l 表示软链接

Inode和块存储

下面就以EXT系列格式为例来看一下文件是如果存在硬盘上的。首先文件会被分成一个个的块,分散得存在硬盘上,就需要一个索引结构来帮助我们找到这些块以及记录文件的一些元信息,这就是inode,其中i代表index。inode数据结构如下:


struct ext4_inode {
 __le16 i_mode;  
 __le16 i_uid;  
 __le32 i_size_lo; 
 __le32 i_atime; 
 __le32 i_ctime; 
 __le32 i_mtime; 
 __le32 i_dtime; 
 __le16 i_gid;  
 __le16 i_links_count; 
 __le32 i_blocks_lo; 
 __le32 i_flags; 
 uNIOn {
  struct {
   __le32 l_i_version;
  } linux1;
  struct {
   __u32 h_i_translator;
  } hurd1;
  struct {
   __u32 m_i_reserved1;
  } masix1;
 } osd1;    
 __le32 i_block[EXT4_N_BLOCKS];
 __le32 i_generation; 
 __le32 i_file_acl_lo; 
 __le32 i_size_high;
 __le32 i_obso_faddr; 
 union {
  struct {
   __le16 l_i_blocks_high; 
   __le16 l_i_file_acl_high;
   __le16 l_i_uid_high; 
   __le16 l_i_gid_high; 
   __le16 l_i_checksum_lo;
   __le16 l_i_reserved;
  } linux2;
  struct {
   __le16 h_i_reserved1; 
   __u16 h_i_mode_high;
   __u16 h_i_uid_high;
   __u16 h_i_gid_high;
   __u32 h_i_author;
  } hurd2;
  struct {
   __le16 h_i_reserved1; 
   __le16 m_i_file_acl_high;
   __u32 m_i_reserved2[2];
  } masix2;
 } osd2;    
 __le16 i_extra_isize;
 __le16 i_checksum_hi; 
 __le32 i_ctime_extra; 
 __le32 i_mtime_extra; 
 __le32 i_atime_extra; 
 __le32 i_crtime; 
 __le32 i_crtime_extra; 
 __le32 i_version_hi; 
 __le32 i_projid; 
};

其中__le32 i_block[EXT4_N_BLOCKS]存储了到数据块的引用,EXT4_N_BLOCKS定义如下:


#define EXT4_NDIR_BLOCKS 12
#define EXT4_IND_BLOCK EXT4_NDIR_BLOCKS
#define EXT4_DIND_BLOCK (EXT4_IND_BLOCK + 1)
#define EXT4_TIND_BLOCK (EXT4_DIND_BLOCK + 1)
#define EXT4_N_BLOCKS (EXT4_TIND_BLOCK + 1)

在ext2和ext3中i_block前12项存储了直接到数据块的引用,第13项存储的是到间接块的引用,在间接块里存储着数据块的位置,以此类推,第14项里存储着二次间接快的位置,第15项里存储着三次间接块的位置,如下图所示:

不难看出,对于大文件,需要多次读取硬盘才能找到相应的块,在ext4中就提出了Extents Tree来解决这一问题,其核心思想就是把连续的块用开始位置加块的个数来表示,不再是一个一个去记录每一个块的位置,这样就能节约存储空间。首先,它将i_block中原来415=60字节的空间换成了一个extent header(ext4_extent_header)加4个extent entry(ext4_extent),因为ext4_extent_header和ext4_extent都是占用了12字节。ee_len中的第一个bit用来判断是否初始化,所以它还能存储最大32K个数,所以一个extent entry里最大可以存32K4K=128M的数据,如果一个文件大于4128M=512M或者这个文件被分散到多于4个不连续的块中存储,我们就需要扩展inode中的i_block结构。它的extent entry就要从ext4_extent被换成ext4_extent_idx结构体,它所指向的是一个块,有4K字节,除去header占用的12字节,还能存340个ext4_extent,最大可以存340128M=42.5G的数据。可以看出这种索引结构在文件用连续的块存储时非常高效。


struct ext4_extent_header {
 __le16 eh_magic; 
 __le16 eh_entries; 
 __le16 eh_max; 
 __le16 eh_depth; /gHEPMWg* 当前层级在树中的深度,0为叶子节点,即数据节点,>0代表索引节点 */
 __le32 eh_generation; 
}
struct ext4_extent {
 __le32 ee_block; 
 __le16 ee_len; 
 __le16 ee_start_hi; 
 __le32 ee_start_lo; 
};//数据节点中的extent_body格式
struct ext4_extent_idx {
 __le32 ei_block; 
 __le32 ei_leaf_lo;  
 __le16 ei_leaf_hi; 
 __u16 ei_unused;

};//索引节点中的extent_body格式

举一个/var/log/messages文件的例子如下图所示:

inode位图和块位图

硬盘上会有专门存放块数据的区域也会有存放inode的区域,但是当我们要新建一个文件时,就需要知道哪个inode区域和哪个块是空的,这就需要分别用一个块来存储inode位图和一个块来存储块位图,每一个bit为1表示占用,为0表示未占用。但是一个块最多有4K*8=32K个位,也就最多能表示32K个块的状态,所以需要让这些块组成一个块组,来搭出更大的系统。

硬链接和软链接

硬链接与原文件共用一个inode,且inode不能跨文件系统,所以硬链接也不能跨文件系统。

软链接有自己inode,只是打开文件时是指向另外一个文件,所以可以跨文件系统且当原文件被删除后仍存在。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

--结束END--

本文标题: Linux中的EXT系列文件系统格式详解

本文链接: https://lsjlt.com/news/20347.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linux中的EXT系列文件系统格式详解
    linux文件系统 常见的硬盘如上图所示,每个盘片分多个磁道,每个磁道分多个扇区,每个扇区512字节,是硬盘的最小存储单元,但是在操作系统层面会将多个扇区组成块(block),是操作系统存储数据的最小单元,通常是8个...
    99+
    2022-06-04
    linux 文件系统 Linux ext文件系统 ext文件系统
  • Linux系统中.bash_profile文件详解
    目录一. 环境变量$PATH:二. 修改环境变量:三.bash_profile的用途 总结一. 环境变量$PATH: linux是一个多用户操作系统,每个用户都有自己专有的运行环境。用户所使用的环境由一系列变量...
    99+
    2022-06-04
    Linux的.bash_profile文件说明
  • Linux中文件系统truncate.c详解
    目录linux-0.11 文件系统truncate.c详解free_indfree_dindtruncateLinux-0.11 文件系统truncate.c详解 free_ind static void free_in...
    99+
    2023-03-24
    文件系统truncate.c linux 文件系统truncate.c
  • Linux系统有哪些解压文件的方式?详解
    Linux系统中有多种解压文件的方式,以下为详细解释: tar命令 .tar文件是Linux系统中的一种归档文件格式,可以使用tar命令将其解压。语法如下: ``` tar -xvf 文件名.tar ``` 其中,x表示解压操作,v表示输...
    99+
    2023-08-31
    linux 服务器 centos 运维 bash
  • Windows系统中的DLL文件详解
    DLL(Dynamic Link Library)文件是Windows系统中的一种动态链接库文件,它包含了一组可被应用程序调用的函数...
    99+
    2023-09-15
    Windows
  • 如何理解Linux系统中的虚拟文件系统
    这篇文章主要介绍“如何理解Linux系统中的虚拟文件系统”,在日常操作中,相信很多人在如何理解Linux系统中的虚拟文件系统问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Linux系统中的虚拟文件系统...
    99+
    2023-06-12
  • Linux系统下怎么转换文件编码格式
    本篇内容介绍了“Linux系统下怎么转换文件编码格式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、利用iconv命令进行文件内容编码转换...
    99+
    2023-06-12
  • Linux下如何查看磁盘文件系统格式
    这篇文章主要为大家展示了“Linux下如何查看磁盘文件系统格式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux下如何查看磁盘文件系统格式”这篇文章吧。文件系统的种类有很多,每一种文件系统...
    99+
    2023-06-27
  • Linux系统中怎么发送html格式的邮件
    这篇文章主要介绍了Linux系统中怎么发送html格式的邮件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在Linux系统中发送html格式的邮件需要使用mail函数发送需要...
    99+
    2023-06-28
  • XP系统中如何删除TMP格式文件
    小编给大家分享一下XP系统中如何删除TMP格式文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  一、临时文件产生  在系统中C:WindowsTemp文件夹中...
    99+
    2023-06-14
  • Windows和linux系统文件合并命令格式介绍
    我们在Windows下实现文件合并,用"copy"命令就能实现: 格式:copy /b <filename1>+<filename2>+…+<filenam...
    99+
    2023-05-29
    Windows linux 合并 系统文件 命令
  • linux系统下hosts文件详解及配置
     hosts文件   hosts —— the static table lookup for host name(主机名查询静态表)。   hosts文件是Linux系统上一个负责ip地址与域名快速解...
    99+
    2022-06-04
    详解 文件 系统
  • Linux系统中的文件传输
    目录 一、文件传输 二、文档的归档压缩 总结 实验环境: 需要2台主机并且保证两台主机可以通信 systemctl disable firewalld        设定防火墙开启不启动 systemctl stop firewalld...
    99+
    2023-09-20
    linux 服务器 运维
  • 【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接
    🍎作者:阿润菜菜 📖专栏:Linux系统编程 这是目录 理解缓冲区1.观察调用C库接口的现象2.理解缓冲区存在的意义(节省进程IO数据的时间)3.调用系统接口对文件进行封装 --- 模仿C库设...
    99+
    2023-08-18
    linux 运维 服务器
  • Linux系统中常见的文件系统有哪些?
      Linux系统是现在非常受欢迎的操作系统,在Linux之中,一切都是文件,因为有很多操作都是依靠文件系统才可以完成的,而且文件系统可以满足用户正常的使用,那么Linux中常见的文件系统有哪些为大家介绍一下。  总体来说,在Linux之中...
    99+
    2023-06-05
  • Linux系统中的文件系统路径是什么
    这篇文章主要讲解了“Linux系统中的文件系统路径是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux系统中的文件系统路径是什么”吧!1、Linux文件系统是从/开始的;在Linu...
    99+
    2023-06-12
  • Node.js测试中的Mock文件系统详解
    Mock文件系统相关的工具包括: Mock fs 模块的工具mock-fs 。 Mock require 模块的工具mock-require 。 安装 mock-fs和 mock-req...
    99+
    2022-06-04
    文件系统 详解 测试中
  • Xp系统下如何查看文件的格式
       1.双击打开任意文件夹(小编打开的是d盘),点击工具栏中的“工具”,选择“文件夹选项”,如下图所示。   2.切换到“查看”选项卡...
    99+
    2023-06-06
    Xp 文件 系统
  • Xp系统下怎么查看文件的格式
    这篇文章主要介绍“Xp系统下怎么查看文件的格式”,在日常操作中,相信很多人在Xp系统下怎么查看文件的格式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Xp系统下怎么查看文件的格式”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-13
  • Linux的文件系统(3)
    本章学习目标: 掌握Linux下文件目录的属性 掌握Linux下的权限管理 掌握如何切换用户身份及权限委派       3.1文件系统简介 文件系统(File system)泛...
    99+
    2023-01-31
    文件系统 Linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作