| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 【Linux】文件系统与硬盘存储(分区、格式化、挂载、inode、软链接与硬链接) -> 正文阅读 |
|
[系统运维]【Linux】文件系统与硬盘存储(分区、格式化、挂载、inode、软链接与硬链接) |
一、Linux系统的文件存储结构在Linux系统中,目录、字符设备、套接字、硬盘、光驱、打印机等都被抽象成文件形式(“Linux系统一切皆文件”)。既然平时我们打交道的都是文件,那么又应该如何找到它们呢? 在Windows操作系统中,想要找到一个文件,要依次进入该文件所在的磁盘分区(也叫盘符),然后再进入该分区下的具体目录,最终找到这个文件。 但是在Linux系统中并不存在C、D、E、F等盘符,Linux系统中的一切文件都是从“根”目录(/)开始的,并按照文件系统层次标准(FHS)采用倒树状结构来存放文件,以及定义了常见目录的用途。
Linux系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、Root、rooT均代表不同的目录,并且文件名称中不得包含斜杠(/)。 (1) Linux系统中的文件存储结构?(2)Linux系统中常见的目录名称以及相应内容
(3) 路径Linux系统的路径指如何定位到某个文件,分为绝对路径和相对路径。
(4)常见的物理(硬件)设备及其文件名称在Linux系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。 ?常用的硬件设备及其文件名称:
?一般的硬盘设备都是以“/dev/sd”开头。而一台主机上可以有多块硬盘,因此系统采用a~z来代表26块不同的硬盘(默认从a开始分配)。
?【注意】对于分区名称sda3只能表示是编号为3的分区,而不能判断sda设备已经存在了3个分区。 示例:/dev/sda5 表示“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件” 二、硬盘设备及分区硬盘的基础概念
硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录(Master boot record,MBR)与分区表(partition table)信息。硬盘主引导记录放有最基本的引导加载程序(boot loader),是系统开机启动的关键环节。而分区表则跟分区有关,它记录了硬盘分区的相关信息。 分区存储的信息:分区号(partition id)、分区的起始柱面和分区的柱面数量。Linux操作系统在初始化时就可以根据分区表中三种信息来识别硬盘设备。 主引导记录需要占用446字节,分区表占用64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。 ?第一个扇区中的数据信息:? 【问题】每块硬盘最多只能创建4个分区吗? 这显然是不合理也不够用的。为解决分区个数不够的问题,可以将第一个扇区的分区表中16字节(原本要写入主分区信息)的空间(称之为“扩展分区”)拿出来指向另一个分区。所以,扩展分区其实不是一个真正的分区,更像是一个占用16字节分区表空间的指针(一个指向另一个分区的指针)。这样,用户一般会选择使用3个主分区加1个扩展分区的方法,然后再扩展分区中创建出数个逻辑分区,从而满足多分区(>4个分区)的要求。 扩展分区自身不能存储数据,用户需要在其指向的对应分区(称为“逻辑分区”)上进行操作。
Linux 创建分区命令(1)查看分区情况:lsblk ??(2)使用fdisk工具创建分区 fdisk工具命令集合: ?①启动fdisk工具(使用管理员权限) ?②创建一个分区n(new的缩写) ③查看分区p(打开分区列表) ? ?④删除分区d (delete缩写) ? ?⑤保存分区并写入磁盘 ? 三、文件系统用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。 Linux系统支持数十种文件系统,而最常见的文件系统如下所示。 Ext2:最早可追溯到1993年,是Linux系统的第一个商业级文件系统,它基本沿袭了UNIX文件系统的设计标准。但由于不包含日志读写功能,数据丢失的可能性很大,因此大家能不用就不用,或者顶多建议用于SD存储卡或U盘。 Ext3:是一款日志文件系统,它会把整个硬盘的每个写入动作的细节都预先记录下来,然后再进行实际操作,以便在发生异常宕机后能回溯追踪到被中断的部分。Ext3能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能100%地保证资料不会丢失。 Ext4:Ext3的改进版本,作为RHEL 6系统中默认的文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block(块),从而极大地提高了读写效率。现在很多主流服务器也会使用Ext4文件系统。 XFS:是一种高性能的日志文件系统,而且是RHEL 7/8中默认的文件管理系统。它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只需花费极低的计算和存储性能。它支持的最大存储容量为18EB(18EB等于18,874,368TB。假设每块硬盘的容量是100TB,那么大概需要19万块硬盘才能把18EB的数据都装下。),这几乎满足了所有需求。
?四、硬盘格式化Linux操作系统支持很多不同的文件系统,比如ext2、ext3、XFS等等,而Linux把对不同文件系统的访问交给了VFS(虚拟文件系统),VFS能访问和管理各种不同的文件系统。所以分区完需要把它格式化成具体的文件系统以便VFS访问。
Linux 格式化命令格式化命令mkfs
( Windows下的文件系统有Fat32、NTFS,CentOS使用的文件系统为ext,之前centOS5版本使用ext3作为默认的文件系统,而CentOS6使用ext4作为默认的文件系统) mkfs本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。例如,若在"-t" 参数中指定ext2,则?mkfs会调用mke2fs?来格式化创建文件系统。 mkfs.ext3 mkfs.reiserfs mkfs.ext2 mkdosfs mkfs.msdos mkfs.vfat ,通过文件名,我们知道这些工具是支持什么文件系统。 文件系统存储结构?ExtX文件系统存储结构如下图所示: ?Super block(超级块):存放文件系统本身的结构信息。记录的主要信息:
GDT(Group Description Table ,块组描述符):描述每个块组属性信息。包括块组(block group)的开始与结束号,以及说明每个段区(superblock、bitmap、inode map、data block)分别介于哪个block号之间。 inode Bitmap(inode 位图):每个bit表示一个inode是否空闲可用。 Block Bitmap(块位图):记录着Data block 数据块的占用情况。 inode Table(节点表):记录文件的属性以及文件实际数据的位置。 (每个文件仅占用一个inode,每个inode大小固定为128字节,记录一个block消耗4字节。当文件的inode被写满后,Linux系统会自动分配出一个block,专门用于像inode那样记录data block块的信息)
Data Block(数据块):存放具体文件内容。 文件系统中所支持的 block 大小通常有1kB、2KB及4KB三种。在格式化时,block的大小就固定了,且每个block都有编号,以便inode记录。由于block大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。
最大单一文件容量的计算方法一个文件对应一个inode。ext2文件系统为了让inode记录尽可能多的data?block,定义了四个记录block号码的区域,分别为12个直接记录区,1个间接记录区,1个双间接记录区,1个三间接记录区,所谓间接记录区就是用data?block记录data block号码. 以每个 block 的大小1KB为例: 【注意】该方法仅限于<2k的block,受到文件系统本身的限制,ext2文件系统限制单个文件最大容量为2T。 虚拟文件系统(Virtual File System,VFS)为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个虚拟文件系统(Virtual File System,VFS)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了,如下VFS的架构示意图所示。从中可见,实际文件系统在VFS下隐藏了自己的特性和细节,这样用户在日常使用时会觉得“文件系统都是一样的”,也就可以随意使用各种命令在任何文件系统中进行各种操作了。 使用Linux命令查看inode信息(1) 查看文件的inode信息:stat ? ?(2) 查看文件类型:file ? ?(3) 查看inode号码:ls -i ? ? ?(可以看到stat命令中也有Inode,22360就是inode号) ?(4) 查看硬盘分区的inode数量和使用情况:df -i ? 五、挂载在一个区被格式化为一个文件系统之后,它就可以被Linux操作系统使用了,只是这个时候Linux操作系统还找不到它,所以我们还需要把这个文件系统注册进Linux操作系统的文件体系里,这个操作就叫挂载?(mount)。 由于整个 Linux 系统最重要的是根目录,因此根目录一定需要挂载到某个分区。 而其他的目录则可依用户自己的需求来给予挂载到不同的分去。 【小结】 硬盘经过分区和格式化,每个区都成为了一个文件系统,挂载这个文件系统后就可以让Linux操作系统通过VFS访问硬盘时跟访问一个普通文件夹一样。 Linux挂载和卸载命令挂载mount ?卸载umount ?强制卸载加参数-l 六、文件寻址(文件读取)一个文件由一个目录项、inode、数据区域块组成。 目录结构: 在 Linux 下的 ext2 文件系统创建一个目录时, ext2 会分配一个 inode 与至少一块 block 给该目录。 如下图所示: 上面的图描述的是查看文件的流程,从图中可以看出 tmp/ 目录文件对应的 Block 块中存储的是该目录下文件名以及文件名对应的 inode 号码,而 a.txt、c.txt 文件对应的 Block 块中存储的是 a.txt?c.txt 文件的内容 由于目录树是由根目录(/)开始读起,因此系统透过挂载的信息可以找到挂载点的 inode 号码(通常一个 文件系统 的最顶层 inode 号码会由 2 号开始),此时就能够得到根目录的 inode 内容,并依据该 inode 读取根目录的 block 内的文件名数据,再一层一层的往下读。
七、?软硬方式链接在Windows系统中,快捷方式就是指向原始文件的一个链接文件,可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方,会导致链接文件失效。但是,这个看似简单的东西在Linux系统中可不太一样。Linux系统中存在软链接和硬链接两种不同的类型。 软链接(soft link):也叫符号链接(symbolic link),仅仅包含所链接文件的名称和路径,很像一个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之失效,不能被访问。可以针对文件、目录设置软链接,跨文件系统进行链接也不是问题。从这一点来看,它与Windows系统的“快捷方式”具有一样的性质。(可以通过readlink查看其指向) 硬链接(hard link):可以将它理解为一个“指向原始文件block的指针”,系统会创建出一个与原来一模一样的inode信息块。所以,硬链接文件与原始文件其实是一模一样的,只是名字不同。每添加一个硬链接,该文件的inode个数就会增加1;而且只有当该文件的inode个数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件block的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,不能跨分区对目录文件进行硬链接。 ?【注意】目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。是不能对目录做硬链接。 Linux 命令创建文件的软硬链接ln(全称“link”)语法格式:
?创建软链接示例: ?由上图可知,新创建的软链接文件test_softlink.txt和test.txt文件内容是一致的,但是两个文件对应的inode号码是不一样的。 ?当删掉原始文件test.txt 后,软链接文件test_softlink.txt立刻就无法读取了。 创建硬链接示例: ?由上图可以看到,源文件与目标文件的inode号码相同,都指向同一个inode,硬链接数变成了2(这表示的是文件的inode信息块的数量变为2),test_hardlink.txt类型也成为了普通文件。 删除源文件test.txt,后仍然可以打开test_hardlink.txt文件。 删除一个文件名test.txt,使得inode节点中的"链接数"减1(仅仅删除了一个指向真实文件的指针而已)。但是它的链接数并没有减为0,所以这个文件数据块并没有删除。 参考链接: (1)?Inode与block详解【图文】_moakia_51CTO博客 (2)理解 Linux 中的 inodes - Linux开发那些事儿 - 博客园 (cnblogs.com) (3)Linux inode 详解 - LinSenGeGe - 博客园 (cnblogs.com) (4)存储管理:Linux中磁盘的管理(分区、格式化、挂载)、LVM_wangxu_190的博客-CSDN博客 (5)Linux文件系统(inode、block……) - xumenger - 博客园 (cnblogs.com) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 22:42:55- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |