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

目录

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中主流的三个文件系统:Ext4XFS以及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虚拟文件系统

高级篇-文件系统黑科技

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值