基础篇-Linux存储体系核心概念之文件系统入门

Linux存储四层架构:块设备、分区、文件系统与挂载点详解 Linux存储体系基于分层抽象设计,核心包含块设备(block device)、分区(partition)、文件系统(filesystem)和挂载点(mount point)四个逻辑层级。块设备是内核对物理存储的统一接口,提供扇区级读写能力;分区在块设备上建立逻辑边界,由MBR或GPT表管理;文件系统则定义数据组织方式,如ext4、XFS等,负责inode、目录树与元数据管理;挂载点将文件系统接入VFS树,实现用户态可见路径。这一架构决定了磁盘识别、格式化、挂载及故障排查的技术路径——例如`lsblk`输出 阅读详情

目录

1 概述

2 linux文件系统目录解析

2.1 Linux 文件目录结构

2.2 目录及其功能详解

2.3 Linux 文件目录层次的核心逻辑

2.4 目录权限管理

3 常见文件系统对比(Ext4/XFS/Btrfs)

3.1 什么是文件系统

3.2 为什么要选择文件系统

3.3 ext4文件系统

3.4 XFS文件系统

3.5 Btrfs文件系统

3.6 Ext4 和 Btrfs 文件系统的比较

3.7 ext4 vs. XFS vs. Btrfs

4 文件系统层次结构解析(超级块/inode/数据块)

4.1 文件系统的基本组成

4.2 super block -- 超级块

4.3 inode table -- inode表/索引节点表

4.4 data blocks -- 数据块

4.5 文件系统结构分析

5 实操:使用mkfs创建文件系统并挂载

5.1 虚拟机中添加硬盘

5.2 对磁盘进行分区

5.3 创建文件系统

5.4 挂载


1 概述

浪潮信息KOS是浪潮信息基于Linux Kernel、OpenAnolis等开源技术自主研发的一款服务器操作系统,支持x86、ARM等主流架构处理器,性能和稳定性居于行业领先地位,具备成熟的 CentOS 迁移和替换能力,可满足云计算、大数据、分布式存储、人工智能、边缘计算等应用场景需求。详细介绍见官网链接https://www.ieisystem.com/kos/product-kos-xq.thtml?id=12126

2 linux文件系统目录解析

Linux 系统中的文件和目录结构遵循 FHS(Filesystem Hierarchy Standard),即文件系统层次结构标准。整个文件系统的根目录为 /,其他文件和目录以此为基础组织层次。以下是对 Linux 系统文件和目录的详解:

2.1 Linux 文件目录结构

2.2 目录及其功能详解

/(根目录)

功能:文件系统的顶层目录,所有文件和目录都以 / 为基础。

注意事项:不要在根目录中直接存储文件,建议将文件分类到子目录中。

/bin(基本命令目录)

功能:存放系统中最基本的用户命令,例如文件操作命令(如 ls、cp、mv)、系统管理命令(如 ps、kill)。

特性:这些命令可以在单用户模式或最小化环境中使用。

/boot(启动文件目录)

功能:存放启动加载程序及内核相关文件。

内容:

vmlinuz:Linux 内核文件。

initrd.img:初始化 RAM 磁盘文件。

grub/:GRUB 启动引导配置文件。

/dev(设备文件目录)

功能:存放设备文件,Linux 中所有硬件设备都表示为文件,称为设备文件。

分类:

块设备(Block devices):如硬盘(/dev/sda)。

字符设备(Character devices):如终端(/dev/tty)。

虚拟设备:如 /dev/null、/dev/zero。

/etc(配置文件目录)

功能:存放系统的全局配置文件。

特性:通常是纯文本文件,管理员可手动编辑。

/home(用户家目录)

功能:普通用户的默认工作目录,每个用户在 /home 下有一个独立的子目录。

示例:

/home/user1:用户 user1 的家目录。

/home/user2:用户 user2 的家目录。

/lib 和 /lib64(系统库目录)

功能:存放系统启动和运行所需的共享库(类似 Windows 的 DLL 文件)。

特性:/lib 用于 32 位系统,/lib64 用于 64 位系统。

/media(可移动介质挂载点)

功能:挂载可移动存储设备,如 U 盘、光盘。

示例:

/media/usb:U 盘挂载点。

/media/cdrom:光驱挂载点。

/mnt(临时挂载点)

功能:管理员手动挂载设备的临时挂载目录。

/opt(可选软件目录)

功能:存放第三方应用程序的安装目录。

示例:

/opt/google/chrome:Google Chrome 浏览器。

/opt/mysql:MySQL 数据库。

/proc(进程文件系统)

功能:虚拟文件系统,存储内核和进程的运行时信息。

特性:内容动态生成,随内核变化。

/root(管理员家目录)

功能:超级用户(root)的家目录。

特性:与普通用户的 /home/user 区别,默认位于 /root。

/run(运行时数据目录)

功能:存储系统启动后产生的运行时数据。

示例:

/run/lock:锁文件。

/run/user:用户会话相关信息。

/sbin(系统管理命令目录)

功能:存放管理员使用的系统命令。

示例:

/sbin/reboot:重启系统。

/sbin/fsck:文件系统检查。

/sbin/ifconfig:网络配置。

/srv(服务数据目录)

功能:存放一些网络服务的数据。

示例:

/srv/ftp:FTP 服务数据。

/srv/www:Web 服务数据。

/sys(系统信息目录)

功能:存储系统和硬件设备相关信息。

特性:类似 /proc,也是虚拟文件系统。

/tmp(临时文件目录)

功能:存放系统和用户运行时产生的临时文件。

特性:系统重启后 /tmp 下的内容通常会被清空。

/usr(用户程序目录)

功能:存放用户安装的应用程序及其支持文件。

子目录结构:

/usr/bin:普通用户的应用程序。

/usr/sbin:管理员的应用程序。

/usr/lib:共享库文件。

/usr/local:本地安装的应用程序。

/var(动态数据目录)

功能:存放动态变化的数据,如日志、缓存、邮件等。

示例:

/var/log:日志文件。

/var/mail:邮件数据。

/var/www:网站数据。

/var/tmp:临时文件。

2.3 Linux 文件目录层次的核心逻辑

分层:将静态数据(如命令和库)与动态数据(如日志和缓存)分开。

易于管理:不同用途的数据存放在独立的目录中,便于维护。

标准化:遵循 FHS 标准,使得跨发行版的文件系统布局保持一致。

2.4 目录权限管理

在Linux中,文件和目录的权限管理至关重要,它决定了用户和组对文件和目录的访问能力。权限分为所有者权限、属组权限和其他人权限,每个部分包含读(r)、写(w)和执行(x)三个子权限。权限可以用符号或数字表示,例如-rwxr-xr--表示所有者有读、写和执行权限,属组成员有读和执行权限,其他用户只有读权限。

通过理解Linux系统目录结构和权限管理,用户和管理员可以更有效地组织和管理系统文件,确保系统的安全性和稳定性。

3 常见文件系统对比(Ext4/XFS/Btrfs)

Linux 操作系统支持多种文件系统,其中 ext4、XFS 和 Btrfs 是最为常用的三种。它们各自具有独特的特点和优势,适用于不同的使用场景。首先让我们对文件系统有一个简单的认识,然后我们再对Linux下几个常用的文件系统做一个详细的比较。

3.1 什么是文件系统

我们使用硬盘,并不是直接读写物理硬盘设备,而是通过文件系统来管理和访问硬盘上的文件。

文件系统是操作系统用于管理和存储数据的机制。它提供了数据的组织、存储、检索和管理功能。常见的文件系统包括 FAT、NTFS、ext 系列、XFS、Btrfs 等。文件系统通过分层结构管理数据,包括超级块、i节点、数据块等。

3.2 为什么要选择文件系统

文件系统的选择,其重要性不言而喻,可能仅次于Linux发行版的选择。其实,各个文件系统在功能及性能方面是有不小的差异的。我们主要讨论Linux中主流的三个文件系统:Ext4、XFS以及Btrfs的功能特点

ext4 文件系统由 ext3 文件系统改进而来,而后者又是从 ext2 文件系统改进而来。虽然 ext4 文件系统已经非常稳定,是过去几年中绝大部分发行版的默认选择,但它是基于陈旧的代码开发而来。另外, Linux 操作系统用户也需要很多 ext4 文件系统本身不提供的新功能。虽然通过某些软件能满足这种需求,但性能会受到影响,在文件系统层次做到这些能获得更好的性能。

而Btrfs提供了更多新的功能,也扩大了容量,也可作为新的选择。但因为它是一种新的文件系统,有可能会有些Bug或稳定性的问题。所以选择文件系统需要考虑多方面的因素,综合考虑。

3.3 ext4文件系统

概念

ext4(第四扩展文件系统)是 ext3 的后继者,由 Theodore Ts'o 开发,旨在提高性能、可靠性和功能。ext4 具有向后兼容性,可以挂载和读取 ext3 和 ext2 文件系统。

结构

ext4 文件系统由以下几个主要部分组成:

超级块(Superblock):存储文件系统的元数据,如大小、状态、版本等。

块组描述符(Block Group Descriptor):管理块组的结构和信息。

块位图(Block Bitmap):跟踪块的使用情况。

i节点(Inode):存储文件的元数据,如权限、所有者、大小、时间戳等。

数据块(Data Block):存储文件的实际数据。

日志(Journal):记录文件系统的变更,确保系统崩溃后的数据一致性。

特性

大文件支持

最大卷 1EiB ,最大文件 16TiB (对于4KiB块)。Ext4中实现了基于extent的数据管理。extents可以简单理解为连续的块,有了它管理大文件就更方便,大大降低了用于索引大文件的元数据量——原来用间接块索引(Indirect Block)的方法是非常浪费的——自然访问也性能也提升。而且,Ext4的inode比Ext3大一倍,达到256字节。

增加并优化了日志校验和(journal check summing)功能,fsck过程更快

这两个特性XFS和Btrfs也都支持。

无日志模式

多块分配、延迟分配

在线去除碎片(defragmentation)

ext4的限制:最大文件大小是 16 tebibytes(大概是 17.6 terabytes),但这比我们当前能买到的硬盘都要大,所以这个限制暂时并不是太大的问题。使用 ext4 能创建的最大卷/分区是 1 exbibyte(大概是 1,152,921.5 terabytes)

ext4 比 ext3 有很大的速度提升。另它是一个日志文件系统,意味着它会对文件在磁盘中的位置以及任何其它对磁盘的更改都会做记录。不过它还不支持透明压缩、重复数据删除或者透明加密。技术上支持了快照,但该功能还处于实验性阶段。

使用场景

ext4 文件系统适用于以下场景:

个人计算机和笔记本ext4 稳定可靠,适合日常使用
中小型服务器ext4 性能优异,适用于中小型企业的服务器部署
嵌入式系统ext4 具有较低的资源占用,适合嵌入式设备

常用命令

创建文件系统mkfs.ext4 /dev/sdX1
挂载文件系统mount /dev/sdX1 /mnt
检查和修复文件系统fsck.ext4 /dev/sdX1
调整文件系统大小resize2fs /dev/sdX1
显示文件系统信息tune2fs -l /dev/sdX1

3.4 XFS文件系统

概念

XFS 是由 Silicon Graphics, Inc. (SGI) 开发的一种高性能文件系统,最初用于 IRIX 操作系统,后来移植到 Linux。XFS 以其卓越的性能和可扩展性著称,特别适用于大文件和高并发访问场景。

结构

XFS 文件系统由以下几个主要部分组成:

超级块(Superblock)存储文件系统的基本信息
分配组(Allocation Group)将文件系统分成多个分配组,便于并行处理和分配
i节点(Inode)存储文件的元数据
数据块(Data Block)存储文件的数据
日志(Journal)记录文件系统的元数据变更,确保数据一致性

特性

XFS能支持单卷可达 8EiB ,最大文件也到 8EiB ,相比Ext4的16TiB可高了几个数量级。而且是其实动态分配inode的实现机制,只要有空间,就不会耗尽inode。通过df命令看出,其inode初始值就是ext4的10倍左右。

另外,XFS可以更高效支持并行IO操作,RAID上的扩展性更好,多线程并行读写时相比Ext4有优势。

使用场景

XFS 文件系统适用于以下场景:

大规模存储系统XFS 适合处理大量数据和大文件,如视频存储和备份系统
高性能计算(HPC)XFS 的高并发性能适用于 HPC 环境
企业级服务器XFS 适合需要高吞吐量和低延迟的企业级应用

常用命令

创建文件系统mkfs.xfs /dev/sdX1
挂载文件系统mount /dev/sdX1 /mnt
检查和修复文件系统xfs_repair /dev/sdX1
调整文件系统大小xfs_growfs /mnt
显示文件系统信息xfs_info /mnt

3.5 Btrfs文件系统

概念

Btrfs(B-Tree 文件系统)是一个现代化的文件系统,由 Oracle Corporation 开发,旨在提供高级功能和高效管理大规模存储系统。Btrfs 支持快照、子卷、压缩和在线扩展等特性。

结构

Btrfs 文件系统由以下几个主要部分组成:

超级块(Superblock)存储文件系统的基本信息
树结构(Tree Structure)使用 B-Tree 组织和管理数据
子卷(Subvolume)类似于独立的文件系统,可以单独管理和快照
快照(Snapshot)子卷的只读副本,用于数据备份和恢复
块组(Block Group)存储数据和元数据的物理块集合

特性

Btrfs支持大文件,16EiB最大卷和文件大小
集成了卷管理功能,可以以卷的方式动态地增减设备,实现硬盘资源池化
高效的数据完整性check,如基于cow的自恢复(self-healing)、基于checksum的数据清理(data scrubbing)
高性能的读写/只读快照,得益于cow,增量快照和备份非常直接、灵活且低成本
软raid支持,数据和元数据的stripe和mirror生产环境级别支持
透明的压缩,支持lzo和zlib
在线去碎片(online defragmentation)
数据去重(data deduplication)

使用场景

Btrfs 文件系统适用于以下场景:

大规模存储系统Btrfs 支持高效的数据管理和快照功能,适合大规模存储系统
云存储Btrfs 的在线扩展和压缩功能适合云存储环境
开发测试环境Btrfs 快照和回滚功能适合频繁变更和测试的开发环境

常用命令

创建文件系统mkfs.btrfs /dev/sdX1
挂载文件系统mount /dev/sdX1 /mnt
创建子卷bash
复制代码btrfs subvolume create /mnt/my_subvolume
创建快照btrfs subvolume snapshot /mnt/my_subvolume /mnt/my_snapshot
检查和修复文件系统btrfs check /dev/sdX1
调整文件系统大小btrfs filesystem resize +10G /mnt
显示文件系统信息btrfs filesystem df /mnt

3.6 Ext4 和 Btrfs 文件系统的比较

在各种关键特性上对Ext4 和 Btrfs文件系统进行比较。

特性BtrfsExt4
日志和写时复制支持而 Btrfs 是一个 Copy-on-Write (CoW) 文件系统这是两个文件系统之间出现的第一个主要区别。Ext4 文件系统是一个日志文件系统
多设备支持将单个文件系统分布在多个设备上提供了某些优势,例如容量增加和可靠性更高。Btrfs 具有内置的 RAID 支持,可以轻松地在文件系统级别管理多个设备。Ext4 文件系统没有对多设备的内置支持。您将不得不使用LVM 2之类的第 3 方逻辑卷管理器将文件系统跨越多个设备和磁盘
文件系统级重复数据删除重复数据删除是一种自动从文件系统中删除重复数据副本以节省磁盘空间的功能。Btrfs 文件系统通过将文件系统中的相同块替换为指向该块的单个副本的逻辑链接来支持重复数据删除。此功能可节省大量磁盘空间。Ext4 文件系统不支持重复数据删除
文件系统级压缩Btrfs 使用压缩算法来支持文件系统级别的数据压缩。这意味着数据将在写入文件系统时自动压缩。Ext4 文件系统没有内置的压缩支持
最大分区和文件大小Btrfs 支持的最大分区和文件大小高达 16Eib。使用 ext4 可以创建的最大分区是 1 exbibyte——相当于大约 1,152,921.5 TB。最大文件大小为 16 TiB,比普通消费者目前可以购买的任何硬盘都要大得多Ext4 允许您创建最多 232 个(= 4,294,967,296 ~= 40 亿)文件。Btrfs 允许您创建最多 264 个(= 18,446,744,073,709,551,616 ~= 18 quintillion)文件
校验和/ECC支持Btrfs 文件系统使用 CRC32C 校验和来确保数据完整性并避免数据损坏。Ext4 文件系统不保证数据的完整性
快照支持Btrfs 文件系统支持文件的只读和可写快照。快照是一个子卷,它使用 COW 功能与另一个子卷共享其数据和元数据。Ext4 文件系统不支持创建文件系统的快照
块子分配和尾打包块子分配是一种功能,将大文件存储在块中,同时有效利用最后一个块末尾的尾部空间。块子分配是一种将另一个文件块的一部分存储到尾块并节省磁盘空间的方法。Btrfs 旨在利用此可用空间,并可以将多个块的尾部与其他文件打包在一起。这提高了文件系统性能并提高了存储效率。Ext4 不支持尾部打包
碎片整理Btrfs 文件系统的最大缺点是大文件容易碎片化,因此需要定期进行碎片整理

Ext4与Btrfs对比表

Ext4与Btrfs相比的优点:

Ext4是一种可靠而稳定的文件系统,可以在大多数不希望发生的事件(如电源丢失)中保证数据的安全。

它已经使用了很长一段时间,因此测试和bug修复已经大大改进了它。

Ext4传输文件的速度比Btrfs快,因此它是用户的好选择。

Btrfs相对于Ext4的优点:

Btrfs使用校验和来确保数据不会被破坏,另一方面,Ext4不能确保数据的完整性
Btrfs提供了文件系统中存在的压缩算法,允许在将数据写入系统时在文件系统级进行压缩. Ext4中没有这种内置的压缩支持
Btrfs直接从磁盘删除重复数据,而Ext4不能这样做
Btrfs支持CoW功能,用户可以创建文件的可写快照和只读快照。Ext4缺乏此特性
Btrfs可以处理比Ext4更多的数据

3.7 ext4 vs. XFS vs. Btrfs

在各种关键特性上对Ext4 和 Btrfs文件系统进行比较。

特性BtrfsExt4
日志和写时复制支持而 Btrfs 是一个 Copy-on-Write (CoW) 文件系统这是两个文件系统之间出现的第一个主要区别。Ext4 文件系统是一个日志文件系统
多设备支持将单个文件系统分布在多个设备上提供了某些优势,例如容量增加和可靠性更高。Btrfs 具有内置的 RAID 支持,可以轻松地在文件系统级别管理多个设备。Ext4 文件系统没有对多设备的内置支持。您将不得不使用LVM 2之类的第 3 方逻辑卷管理器将文件系统跨越多个设备和磁盘
文件系统级重复数据删除重复数据删除是一种自动从文件系统中删除重复数据副本以节省磁盘空间的功能。Btrfs 文件系统通过将文件系统中的相同块替换为指向该块的单个副本的逻辑链接来支持重复数据删除。此功能可节省大量磁盘空间。Ext4 文件系统不支持重复数据删除
文件系统级压缩Btrfs 使用压缩算法来支持文件系统级别的数据压缩。这意味着数据将在写入文件系统时自动压缩。Ext4 文件系统没有内置的压缩支持
最大分区和文件大小Btrfs 支持的最大分区和文件大小高达 16Eib。使用 ext4 可以创建的最大分区是 1 exbibyte——相当于大约 1,152,921.5 TB。最大文件大小为 16 TiB,比普通消费者目前可以购买的任何硬盘都要大得多Ext4 允许您创建最多 232 个(= 4,294,967,296 ~= 40 亿)文件。Btrfs 允许您创建最多 264 个(= 18,446,744,073,709,551,616 ~= 18 quintillion)文件
校验和/ECC支持Btrfs 文件系统使用 CRC32C 校验和来确保数据完整性并避免数据损坏。Ext4 文件系统不保证数据的完整性
快照支持Btrfs 文件系统支持文件的只读和可写快照。快照是一个子卷,它使用 COW 功能与另一个子卷共享其数据和元数据。Ext4 文件系统不支持创建文件系统的快照
块子分配和尾打包块子分配是一种功能,将大文件存储在块中,同时有效利用最后一个块末尾的尾部空间。块子分配是一种将另一个文件块的一部分存储到尾块并节省磁盘空间的方法。Btrfs 旨在利用此可用空间,并可以将多个块的尾部与其他文件打包在一起。这提高了文件系统性能并提高了存储效率。Ext4 不支持尾部打包
碎片整理Btrfs 文件系统的最大缺点是大文件容易碎片化,因此需要定期进行碎片整理

Ext4与Btrfs对比表

Ext4与Btrfs相比的优点:

Ext4是一种可靠而稳定的文件系统,可以在大多数不希望发生的事件(如电源丢失)中保证数据的安全。

它已经使用了很长一段时间,因此测试和bug修复已经大大改进了它。

Ext4传输文件的速度比Btrfs快,因此它是用户的好选择。

Btrfs相对于Ext4的优点:

Btrfs使用校验和来确保数据不会被破坏,另一方面,Ext4不能确保数据的完整性
Btrfs提供了文件系统中存在的压缩算法,允许在将数据写入系统时在文件系统级进行压缩. Ext4中没有这种内置的压缩支持
Btrfs直接从磁盘删除重复数据,而Ext4不能这样做
Btrfs支持CoW功能,用户可以创建文件的可写快照和只读快照。Ext4缺乏此特性
Btrfs可以处理比Ext4更多的数据

4 文件系统层次结构解析(超级块/inode/数据块)

4.1 文件系统的基本组成

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

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

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

索引节点,也就是 inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以索引节点同样占用磁盘空间。

目录项,也就是 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存。

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

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

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

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

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

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

文件数据如何存储在磁盘

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

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

我们这里引入一个块组的概念

什么是块组

我们把磁盘抽象成线性结构:

每一个扇区就变成了一个块状结构

平铺下来,就像数组一样:

经过不断分区,我们可以得到块组这一概念,每个块组包含一定数量的数据块、索引块、超级块以及其他与文件系统操作相关的数据结构。

下面这张图就很好的展示了索引节点、目录项以及超级块、数据块的关系:

4.2 super block -- 超级块

功能简介

核心数据块

存储了文件系统的元信息

eg:文件系统的大小、块大小、inode数量、挂载次数等

还存储了文件系统的状态信息,以便在系统崩溃或意外关机时进行文件系统检测和修复

也就是说,超级块并不是作用于一个块组,而是用来管理整个文件系统的,那么为什么将它放在块组中?

为了备份

防止这么重要的数据块被损坏后,整个分区都无法使用了

所以在很多个块组中,都会存储一个超级块

4.3 inode table -- inode表/索引节点表

inode和inode编号

ls指令带上-i选项后可以显示出每个文件的索引节点号 ,也就是inode编号

第一列数字就是每个文件的inode编号

介绍

inode是一个大小为128字节的空间,保存了有关文件或目录的元数据信息,也就是文件属性

(包括文件类型、权限、所有者、大小、创建时间、修改时间、链接计数、数据块的指针等)

而inode编号是每个文件的标识符(唯一性)

一般来说,一个文件对应一个inode,一个inode编号

文件数据与元数据分离,可以提高文件系统性能并使某些操作更加高效

Inode表

顾名思义,它保存了[该块组内所有文件]的inode空间

inode表是一个数组或表格,每个元素都是一个inode结构

通过inode编号,可以在inode表中 查找相应的inode结构

4.4 data blocks -- 数据块

块大小的由来 -- 4kb

磁盘基本单位是扇区(512字节)

os和磁盘进行io的基本单位是4kb(也就是8*512字节)

内存页面大小一般是4kb

该怎么选择呢?

512字节太小了,会导致多次io,效率降低

但我们空间其实很大很大,所以尽量用空间换时间

经过多重考虑,许多文件系统选择使用4kb作为块大小

4kb块大小与底层硬件(包括内存和存储子系统)很好地对齐,对齐可以带来更高效的 I/O 操作

4kb 块大小通常被认为是 I/O 性能的最佳权衡

介绍

数据块是用来存储文件内容的基本单位,磁盘也就被叫做块设备

文件=内容+属性

所以linux在硬盘上存储文件,是将内容和属性分开存储

文件系统以数据块的形式将文件的实际内容存储在磁盘上

data blocks除了可以保存文件实际内容,也可以存其他数据块的块号

4.5 文件系统结构分析

文件系统结构

自举块(boot block):占用1 block;主要存储分区的操作系统类型、分区起始地址;pc联盟规定的大小,和各个文件系统无关;每个分区只有一个;

超级块:占用1 block;存储分区操作系统版本、块大小、文件系统;

块组描述表(GDT):占用3 block;存储一个块组的描述信息;

块位图(block bitmap):占用1 block;每个比特位表示一个数据块是否被标记使用;1:已使用,0:未使用;

inode 位图(inode bitmap):占用1 block;每一个比特位表示一个inode节点。1:已使用,0:未使用;

inode节点:占用128B;分为文件属性部分和数据指针部分;数据指针占用60B,长度为15的指针数组;每个数据块的大小是1 block,那么15个指针最多只能维护15*1K个文件大小,显然,文件大小的上限太小了。所以文件系统通过三级间接寻址的方式来提高文件大小的上限。块大小若以1 block计算,文件大小的上限为16G,若以4 block为块大小,那文件大小的上限超过了1T;ext4文件系统中,数据指针有256B,那文件大小上限就非常大了;

数据块:存储文件的内容;

数据块存储内容

数据块中存储的是一条一条的记录项,每条记录项都由文件名、indoe编号、记录长度(该记录项首地址到下一条记录项的首地址的长度)。每一个记录项就是该目录下“ls -a”的结果。

普通文件结构

由图可以看出,每个inode节点可以对应多个数据块,和上文在分析inode节点的内容一致。然后,若干个目录块中的记录项指向每个inode节点,通过inode节点中链接数这个数据成员来标识指向其的记录项个数,这就是硬链接。当然,这些目录块都是目录文件的数据块;

目录文件结构

由上图知,inode节点在文件系统中被维护成了结构体数组,inode编号为数组的下标;2549号i节点是1267号i节点的子目录,因为1267号i节点的数据块中有2549号i节点的记录项;“.”目录文件和 “..”目录文件都是硬链接。

从以上分析能够得出结论:所有的目录块都是不同目录文件的数据块。

文件创建和查询过程

执行命令:mkdir /home/kos/a.c

通过块位图区找到空闲的数据块,存放a.c中的内容

通过inode位图区找到空闲的inode节点块,生成相应的inode节点

在kos目录文件的数据块中添加一条a.c的记录项

执行命令:vim /home/kos/a.c

找到inode编号为2的inode节点

遍历根目录文件的数据块中的记录项,匹配kos记录项,获取其inode编号

通过kos目录文件的inode编号,找到kos文件对应的数据块

遍历kos文件的数据块中的记录项,匹配a.c记录项。同理,找到对应的a.c的数据块。用vim打开相应文件

unix和Linux系统是通过文件名来对应inode节点号,从而找到对应的数据块,完成文件查询的过程

inode节点中没有文件名就是因为基于这种定位文件位置的机制

5 实操:使用mkfs创建文件系统并挂载

5.1 虚拟机中添加硬盘

首先我们在宿主机执行virt-manager打开虚拟机管理器

双击对应的虚机进入对应虚机的管理界面并点击小灯泡

点击添加硬件,选择存储,可直接在默认位置为虚拟机创建磁盘镜像,我们选择创建自定义存储

点击管理,选择一个文件系统目录,点击红框中的+号

输入名称和大小点击完成

回到刚才的界面选中刚刚创建的qcow2文件,点击Choose Volume

点击完成按钮完成创建

可以看到多了一个磁盘3

Ssh 连接该虚机执行lsblk,可以看到新添加的vdc磁盘

5.2 对磁盘进行分区

对于一块新添加的硬盘我们知道不能直接去使用它,需要先将它格式化,然后也可以对它进行分区

fdisk命令

命令说明:观察硬盘使用情形与硬盘分区

在终端上输入 fdisk -l /dev/vda ,观察硬盘之实体使用情形

分区步骤

第一步:在终端上输入 fdisk /dev/vdc,可进入分割硬盘模式

第二步:输入m显示所有的命令列示,我们可以先按p看一下它之前有没有创建分区

第三步:输入n设定新的硬盘分割区

第四步:查看

第五步:这个时候只是创建了分区表,没有保存,这个时候你输入q的话就前功尽弃了,我们要输入w保存。然后就退出了fdisk模式

5.3 创建文件系统

mkfs命令

命令说明:mkfs用来在一个设备上构建Linux支持的相关文件系统,也可称之为格式化工具,这里的设备通常是指标硬盘分区。在linux上通过fdisk等工具进行完分区后,还需要对分区进行处理,使之支持相应的文件系统,这时候就需要用到mkfs这个工具,建立文件系统过程的实质是在磁盘空间上面建立文件系统所需的结构,根据文件系统设计在磁盘空间上写入关于文件系统的数据(称之为文件系统元数据),基于这些数据实现对文件系统的管理和进行相关的操作。实际上,mkfs是一个linux下不同文件系统构建器(mkfs.fstype)的简化前端工具。

    命令格式:mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
    参数说明
    device : 预备检查的硬盘分区,例如:/dev/sda1
    -V : 详细显示模式
    -t : 给定档案系统的类型,Linux 的预设值为 ext4
    -c : 在制做档案系统前,检查该partition 是否有坏轨
    -l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面
    block : 给定 block 的大小

实例:  

在/dev/vdc4 上建一个msdos的档案系统,同时检查是否有坏轨存在,并且将过程详细列出来:
mkfs -V -t msdos -c /dev/vdc4
将vdc3分区格式化为ext3格式
mfks -t ext3 /dev/vdc3

注意:这里的文件系统是要指定的,比如 ext3 ;reiserfs ;ext2 ;fat32 ;msdos 等。

创建文件系统

给上面刚刚创建的vdc1分区创建一个文件系统

mkfs -t ext4 /dev/vdc1

我们创建好了分区但是我们还没有给这个分区创建一个访问路径。接下来我们需要将这个分区挂载到一个系统的目录当中,才能使用这个分区。

5.4 挂载

mount命令

命令说明: mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要访问这个文件夹,就相当于访问该分区了。

Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。

命令语法:      

      mount [-hV]
      mount -a [-fFnrsvw] [-t vfstype]
      mount [-fnrsvw] [-o options [,...]] device | dir
      mount [-fnrsvw] [-t vfstype] [-o options] device dir
    参数说明
      -V:显示程序版本
      -h:显示辅助讯息
      -v:显示较讯息,通常和 -f 用来除错。
      -a:将 /etc/fstab 中定义的所有档案系统挂上。
      -F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
      -f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
      -n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
      -s-r:等于 -o ro
      -w:等于 -o rw
      -L:将含有特定标签的硬盘分割挂上。
      -U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
      -t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。
      -o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。
      -o sync:在同步模式下执行。
      -o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。
      -o auto、-o noauto:打开/关闭自动挂上模式。
      -o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
      -o dev、-o nodev-o exec、-o noexec允许执行档被执行。
      -o suid、-o nosuid:允许执行档在 root 权限下执行。
      -o user、-o nouser:使用者可以执行 mount/umount 的动作。
      -o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
      -o ro:用唯读模式挂上。
      -o rw:用可读写模式挂上。
      -o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。

实例:    

将/dev/vdc3挂在/mnt/test1之下,并设置文件系统的类型为ext4。
  # mount -t ext4 /dev/vdc3 /mnt/test1


  将/dev/vdc3用唯读模式挂在/mnt/test2之下。
  #mount -o ro /dev/vdc3 /mnt/test2


umount命令

命令格式:umount 挂载点
命令说明:对某个挂载点进行卸载  

示例:

将/dev/vdc3卸载

umount /dev/vdc3

永久挂载磁盘

通过上述的mount命令只是临时的挂载,在及其重启之后需要再次进行挂载,很不方便,于是就需要进行永久挂载或者是开机自动挂载。
步骤:
首先得到/dev/vdc1这个分区的UUID,使用以下命令:sudo blkid /dev/vdc1


用vi编辑器打开/etc/fstab文件,参照该文件中已存在的挂载信息再添加一条来挂载vdc1。

其中第一列为UUID
第二列为挂载目录,该目录必须为空目录
第三列为文件系统类型
第四列为参数
第五列0表示不备份
最后一列必须为2或0(除非引导分区为1)
最后使用mount -a命令来检测挂载,该命令用来检测fstab文件是否有错,如果有错误则不会挂载成功,如下图示例无报错即可。

本文系统讲解了文件系统入门相关知识,本系列共4篇,链接如下:

基础篇-Linux存储体系核心概念之文件系统入门

进阶篇-系统机制与优化基础之VFS虚拟文件系统

高级篇-文件系统黑科技

实战篇-典型故障排查与性能问题诊断与优化

ADS学习笔记 1. 功率放大器设计 基于ADS2023 update2的学习笔记1.功率放大器设计 阅读详情

相关推荐

MRI脑影像分析从哲学到技术:一文搞懂VBM预处理基本原理(全网最详细解析)

   分析大脑解剖学差异最常用方法之一是基于体素的形态学方法(voxel-based morphometry, VBM)。 VBM的基本思想是测量大脑组织,尤其是灰质的局部浓度的差异。在大脑的每个体素处进行操作,然后在两个或多个实验组之间进行统计比较,从而在受调查的组之间建立特定大脑区域中脑组织浓度的统计学显着差异。 VBM分析基于(高分辨率)MRI脑部扫描,涉及大量处理步骤,主要是空间归一化,分割,平滑和统计分析,最终结果是统计图,显示了各组之间组织类型明显不同的区域[^1]。 参考 [^1] ..

意疏的学习笔记 3万+

【基础篇】Linux存储体系核心概念之文件系统入门

浪潮信息KOS是浪潮信息基于Linux Kernel、OpenAnolis等开源技术自主研发的一款服务器操作系统,支持x86、ARM等主流架构处理器,性能和稳定性居于行业领先地位,具备成熟的 CentOS 迁移和替换能力,可满足云计算、大数据、分布式存储、人工智能、边缘计算等应用场景需求。我们使用硬盘,并不是直接读写物理硬盘设备,而是通过文件系统来管理和访问硬盘上的文件。文件系统是操作系统用于管理和存储数据的机制。它提供了数据的组织、存储、检索和管理功能。

ITer_szlgz的博客 831

微磁模拟实战指南:从OOMMF安装到首个3D模型运行

本文详细介绍了OOMMF微磁模拟软件的安装与使用,从环境配置到首个3D模型运行的完整教程。涵盖Windows、Linux和macOS平台的安装避坑指南,以及MIF文件编写、并行计算优化等实战技巧,帮助研究人员快速掌握这一开源工具在磁畴壁运动、磁滞回线等微磁学问题中的应用。

weixin_29294597的博客 153

彻底搞懂存储核心概念:块设备、分区、文件系统究竟是啥关系?

计算机存储设备采用分层结构管理数据:块设备(如硬盘)被划分为多个分区,分区信息记录在分区表(MBR或GPT格式)中。每个分区内创建文件系统,通过超级块、inode表等元数据结构管理文件和目录。MBR有4个主分区限制,GPT支持更多分区且更可靠。文件访问时,系统通过分区表定位分区,再根据文件系统元数据逐级查找inode和数据块。这种分层抽象机制实现了高效的数据存储与访问。

yao00037的博客 1134

ABB RobotWare数据包全版本归档与高效获取指南

记得去年有个汽车产线升级项目,客户现场用的是RobotWare 6.05.0166版本,而我的RobotStudio里只有最新的7.x系列。RobotWare数据包本质上就是ABB机器人的"操作系统镜像",不同版本的机器人控制器需要匹配特定版本的RobotWare。有个容易忽略的细节:偶数版本号(如6.04、6.06)通常比奇数版本更稳定,因为ABB的内部发布策略是偶数版用于正式产线,奇数版多用于测试新功能。最终实现了零停机升级,这个经验告诉我们:版本切换不是简单的覆盖安装,而是需要系统性的验证流程。

weixin_30764883的博客 278

Win11下USB-Blaster驱动安装全攻略:Quartus用户必看(附常见问题解决)

本文详细介绍了在Windows 11系统下为Intel FPGA开发工具Quartus安装USB-Blaster驱动的完整流程与常见问题解决方案。针对Win11更严格的驱动签名验证机制,提供了从标准安装步骤到高级故障排查(如禁用驱动强制签名、使用测试模式)的实用指南,帮助用户快速解决驱动安装失败问题,确保FPGA编程调试顺利进行。

weixin_29256771的博客 663

第七板块:Android 存储体系与文件系统 | 第二十一篇:Vold 与 FUSE 存储架构

这是 Android 设备数据持久化的基石。如果说内存是暂存的思绪,那么存储就是永久的记忆。本篇将彻底拆解 Vold(Volume Daemon) 的存储管理架构、FUSE(Filesystem in Userspace) 的虚拟挂载机制、多用户存储隔离(Emulated Storage)、SD 卡与 OTG 的动态挂载、StorageManagerService 的配额管理。

9年Android老兵,专注车载系统与移动架构。深耕Java/Kotlin,玩转Lua/Python。擅长百度/高德地图深度定制,分享拒绝浅尝辄止的硬核干货。 342

基于BERTopic模型的英文20新闻数据集主题聚类及可视化

BERTopic是基于深度学习的一种主题建模方法。BERT是一种用于NLP的预训练策略,它成功地利用了句子的深层语义信息。

Cachel Wood的博客 1460

Linux 硬盘及分区概念

Linux 硬盘及分区概念

lizhengyu891231的博客 869

Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库

本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO)

2201_76125261的博客 1382

基于深度学习 YOLOv11 的快递包裹检测系统(Python + PySide6 界面 + 训练代码)

成为亟需优化的重要环节。随着电子商务的快速发展,物流行业面临着越来越大的压力,为了解决这些问题,我们提出了一种。目标检测算法,实现快递包裹的。的界面,供用户进行实时监控。本项目的主要目标是利用。

斌擎科技 762

Linux文件系统(一):从磁盘结构到文件系统基础

速度 vs 容量 vs 价格磁盘(这里主要指HDD,机械硬盘)在整个存储体系中占据着极其关键的地位。它是计算机的持久化存储设备核心特征:持久性内存:往往具有易失性,一旦断电,所有电信号瞬间消失,数据归零磁盘:永久存储。它通过改变盘片上磁粉的极性来记录数据。无论你关机一个月还是搬运服务器,只要磁头不物理损坏,数据就会安然无损地保留其中为什么它是主力虽然现在 SSD(固态硬盘)风头正盛,但在企业级存储和海量数据备份场景下,机械硬盘仍然占据主导地位:同等价位,磁盘能提供比 SSD 大得多的容量。

cui_ruicheng的博客 451

信奥赛csp初赛高频考点【位运算】(详细解析)

信奥赛csp初赛高频考点【位运算】(详细解析)

王老师青少年编程 371

Linux文件系统核心概念与实战技巧详解

Linux文件系统作为操作系统的核心组件,采用独特的层次化结构设计(FHS标准)实现硬件与数据的统一管理。其'一切皆文件'的哲学通过虚拟文件系统(VFS)层抽象硬件设备,使得用户可以使用相同命令操作磁盘、终端等各类资源。理解/bin、/sbin目录区别与/dev设备文件管理机制是掌握Linux存储体系的基础,而find、less等命令的高效使用能显著提升系统管理效率。在权限控制方面,除传统rwx权限外,SUID/SGID特殊权限和ACL机制为多用户环境提供了更精细的访问控制方案。这些技术广泛应用于服务器运维

weixin_29895109的博客 314

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

程序员必知的 89 个操作系统核心概念!

操作系统的89个概念!

Linuxer_Martin 535

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

16_Linux内核源码

1 linux内核源码代码简介 1.1 前面的章节,已经对计算机系统和操作系统有了一个初步的了解,总结起来就是计算机有“3大法宝” 存储程序计算机 函数调用堆栈 中断 1.2 操作系统有“两把宝剑” 中断上下文 进程上下文 2 内核目录介绍 2.1 arch目录 arch目录是与体系结构相关的子目录列表,里面存放了许多CPU体系结构的相关代码,比如arm,x86等。arch目录中的代码在linux内核代码中占比相当庞大,主要原因是arch目录中的代码可以使linux内核支持不同的CPU和体系结构。

weixin_39247141的博客 279

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux 计算机基础知识必知必会

基础知识回顾 这部分我们简单回顾一下计算机存储体系、虚拟内存、栈和堆,以及堆内存的管理,这部分内容对理解和掌握内存管理比较重要。 存储金字塔 这幅图表达了计算机的存储体系,从上至下依次是: CPU寄存器 Cache 内存 硬盘等辅助存储设备 鼠标等外接设备 从上至下,访问速度越来越慢,访问时间越来越长。 你有没有思考过下面2个简单的问题,如果没有不妨想想: 如果CPU直接访问硬盘,CPU能充分利用吗? 如果CPU直接访问内存,CPU能充分利用吗? CPU速度很快,但硬盘等持久.

小楼一夜听春雨,深巷明朝卖杏花 436

Ext系列文件系统 [ 上 ]

我们之前说过,文件=内容+属性,这是我们从一个文件得视角去谈的,而系统当中存在成百上千的文件,在系统层面上,文件也就被打开了一小部分,操作是将那么多的文件是进行怎么样的管理呢?更重要的是,我们之前fopen()打开文件的时候,为什么我们的系统就能够准确的把我们想要打开的文件打开,并且可以在系统层面上将文件信息加载到内存?怎么可以做到如此精准?被打开的文件是在内存当中的,因为操作系统要管理他,如果文件没有被打开呢?他在哪里呢?答案是在磁盘上!

Small_entreprene的博客 1159

Ext 文件系统基础:Linux 存储基石入门(下)

本篇我们从磁盘硬件的扇区、LBA寻址出发,一步步完成了**块、分区、inode**三大核心概念的铺垫,正式深入 Ext2 文件系统底层架构。我们拆解了块组的完整组成,读懂了超级块、块组描述符、各类位图、inode 表与数据块的分工逻辑,理清了 inode 元数据存储、多级指针映射数据块的核心原理,解答了大文件存储的实现逻辑。

2402_88639790的博客 422
上一篇: 【KeyarchOS:KOS操作系统】一文搞定 Ktransformers-AMX 大模型部署:核心步骤 + 常见问题解决
下一篇: 进阶篇-系统机制与优化基础之VFS虚拟文件系统
KeyarchOS
博客等级 码龄3年 1312粉丝 339原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值