漫话Linux:磁盘与文件系统

1.linux系统的文件系统是Ext系列,由于Ext2缺少日志功能导致数据丢失时需要更长的时间去恢复,所有现在linux系统的文件系统是改进之后的Ext4系统

2.磁盘是计算机重要的存储工具,存储文件的属性(inode)和文件的内容(数据块),且分开存储

3.磁盘存储:

        1.家用电脑使用固态硬盘,淘汰了运行效率较低且故障率较高的机械硬盘

        2.公司服务器cun由于数据庞大,一般采取存取容量大且耐用的机械银盘,存储时需要频繁调用的数据会存放在固态硬盘或其他快速磁盘阵列,成为热存储,调用不那么频繁的数据一般存储在机械硬盘或者云存储服务

        3.磁盘是二进制存储,通过磁头充电放电使用(充放电和强弱波,类似于磁铁的N和S)

        4.磁盘是永久性存储

        5.高温会消磁

        6.为了防止泄密,部分磁盘需要厂商调用接口去除

4.磁盘是一个外设,也是一个机械设备(计算机唯一的机械设备)

5.磁盘的存储构成:

        1.磁盘的最基本单元是扇区,大小可能是512字节/4kb

        2.可以把磁盘看作有无数扇区的存储介质

5.磁盘的数据寻找(CHS寻址,柱面,磁头,扇区)

        1.定位扇区:找磁头,找磁面,找扇区

        2.磁头摆动,定位磁道和柱面

        3.盘面转动,定位扇区

        4.软件寻址(为了提高寻找效率,相关内容会放在一起)

6.新的寻址方法:LAB(逻辑块地址)寻址,用结构体储存磁盘的扇形分区,将磁盘所有扇区设为一个线性序列,寻找时系统只会在序列中寻找对应扇区的位置,而不需要寻找CHS的具体位置

7.LAB对扇区一视同仁的划分,管理少量内存的扇形就管理好了大量内存的扇区,是一种分治思想

8.inode结构

        1.boot block启动块:文件系统不仅需要存储文件内容,还需要存储文件的元数据,如文件大小、所有者、权限等。这些元数据存储在索引节点(inode)中

        2.一般boot block位于磁盘的最前端,一般在磁盘的第一个扇区,也被称作主引导记录MBR

        3.boot block的功能:

                1.引导加载:计算机启动时,BIOS会读取磁盘的第一个扇区(即Boot Block),并将控制权传递给该扇区中的主引导程序

                2.分区检测:引导程序会检查分区表,确定启动分区的位置

                3.操作系统加载:主引导程序会根据分区表中的信息选择一个活动分区,并加载该分区上的引导加载程序(如GRUB或LILO)

        4.boot block的示例(传统MBR分区布局):主引导程序(MBR前446字节),分区表(接下来64个字节,每个分区条目16个字节,共4个),引导签名最后两个字节0xAA55

        5.现代系统的变化:于使用GUID分区表(GPT)的现代系统,Boot Block的概念略有不同。在GPT分区方案中,磁盘的第一个扇区(通常称为保护MBR)通常包含一个简单的MBR,用于兼容旧版BIOS系统。真正的引导加载程序和GPT分区表位于磁盘的其他位置

        6.查看boot block:使用dd命令复制磁盘的第一个扇区

sudo dd if=/dev/sda of=mbr bs=512 count=1

 这将把磁盘/dev/sda的第一个扇区(即Boot Block)复制到文件mbr中。随后,可以使用十六进制编辑器或特定的工具来查看该扇区的内容

        7.Boot Block是磁盘上非常重要的一个区域,它包含了启动系统所需的关键信息。无论是传统的MBR还是现代的GPT,Boot Block都扮演着启动过程中的关键角色

        8.super block(超级块)

                1.超级块是文件系统中的一种特殊的数据结构,它包含了整个文件系统的全局信息。这些信息包括但不限于:文件系统类型:如Ext家族,文件系统快大小(1024字节,2048字节等),文件系统的总块数和剩余块数,文件系统的总inode数和剩余inode数,文件系统的挂载时间,上次写入时间,上次检查时间等,文件系统的特征标准(如是否具有日志功能)

                2.超级块对于文件系统的正确操作至关重要。如果超级块损坏,可能导致文件系统无法被识别或挂载。大多数文件系统都会在不同的位置保存多个超级块副本,以防止单点故障

        9.group descriptor block(块组描述符)

                1.在某些文件系统中,如ext2、ext3和ext4,文件系统被分割成多个块组,以提高性能和简化管理。每个块组都包含一个块组描述符,该描述符包含了该块组的一些重要信息,例如:该块组内的数据块总数,该快组内可用数据块的数量,该快组中inode总数,该快组后可用inode数量,该块组的块位图和inode位图,该块组inode表的位置

                2.块组描述符使得文件系统能够快速访问每个块组的状态信息,而无需每次都访问超级块。这对于大型文件系统尤其有用,因为它减少了对超级块的访问频率,提高了性能

                3.块组描述符管理特定块组,超级块管理所有块组,这些结构对于文件系统的管理和维护至关重要,确保了文件系统能够正确地处理文件和目录的存储、检索和删除等操作

        10.data blocks(数据块)

                1.数据块是文件系统中用于存储文件实际内容的基本单位。每个文件的内容都分布在磁盘上的一个或多个数据块中。数据块的大小取决于文件系统的配置,通常为1024字节、2048字节或4096字节等

                2.特点:

                        1.可变大小:数据块的大小在文件系统创建时被定义,并且在整个文件系统的生命周期中保持不变

                        2.非连续存储:文件的内容不一定存储在连续的数据块中,而是可以分散在磁盘的不同位置

                        3.间接寻址:文件的内容通过inode中的指针来间接寻址,这些指针指向文件的数据块

                3.用途:

                        1.存储文件内容:每个文件的实际内容(如文本、图像、音频等)都存储在数据块中

                        2.高效利用磁盘空间:过允许文件内容分散存储,文件系统可以更高效地利用磁盘空间

        11.inode table(inode表)

                1.inode是文件系统中的一个数据结构,用于存储文件的元数据。每个文件都有一个与之对应的inode。inode表则是inode的集合,它包含了文件系统中所有inode的列表

                2.特点:

                        1.固定大小:每个inode的大小通常是固定的,通常是128字节或256字节

                        2.元数据存储:inode中存储了文件的元数据,包括文件的大小、创建时间、修改时间、权限、所有者等

                        3.文件内容指针:inode中包含指向文件数据块的指针,这些指针告诉系统文件内容存储在哪里

                3.用途:

                        1.存储文件元数据:inode存储了文件的重要属性,如权限、所有者、大小等

                        2.文件内容的间接寻址:inode通过指针间接指向文件的内容,这意味着文件名和文件内容是分离的

                        3.inode与文件名的关联:文件名不在inode中存储,而是存储在目录项中。目录项将文件名与inode编号关联起来,以便通过文件名找到对应的inode

        12.stat:查看文件的具体信息

stat [OPTION]... FILE...

FILE:文件名或者目录名

OPTION:可以是多个选项,用于定制输出信息

                1.选项:

                        1.-c或--formate:指定输出格式,可以使用特定的格式化字符串来自定义输出结果

                        2.-f或--file-system:显示文件所在文件系统的统计信息,而不是文件本身的统计信息

                        3.-L:递归地显示符号链接的目标的统计信息

                        4.-1:显示符号链接本身的统计信息,而不是链接的目标             

                        5.-t或--time=WORD:指定输出的时间戳类型,WORD可以是atime,mtime或ctime

                        6.-h或--human-readable:以人类易读的格式显示文件大小(例如2K,5M,10G)

                2.使用场景:

                        1.文件调试:当需要了解文件的具体信息时,比如权限、所有者等

                        2.脚本编写:在编写 shell 脚本时,可以利用stat获取文件的详细信息,进行条件判断或动态生成文件列表

                        3.系统监控:监控文件的访问、修改或状态改变时间,用于安全审计或性能分析

                3.stat命令是 Linux 系统管理员和开发者不可或缺的工具之一,它提供了文件系统的深入视图,有助于更好地理解和管理文件和文件系统

                4.显示时间戳:

                        1.文件的三个时间:Access:最后访问时间,Modify:文件内容最后修改时间,Change:属性最后修改时间

                5.示例:查找文件example.txt的inode信息

stat example.txt

        这个命令将显示文件example.txt的inode信息,包括inode编号、文件大小、权限等

                6.查找文件example.txt的inode编号

                        1.回顾:ls -l 做的就是读取存储在磁盘上的文件信息,然后把它们显示出来

ls -i example.txt

                         2.这个命令将显示文件example.txt的inode编号

                7.查找文件example.txt的内容

cat example.txt

        这个命令将输出目标文件的内容到标准输出

                8.假设需要直接访问数据块200(不建议,绕过文件系统)

首先,需要确定文件系统的设备文件,比如/dev/sdal。然后使用dd命令读取数据块。以下是一个示例命令,假设每个数据块大小为4096字节,数据块200的偏移量计算方式为200*4096

dd if=/dev/sda1 bs=4096 skip=200 count=1 of=data_block_200.bin

                          代码解析:

                                1.if:指定输入文件(文件系统设备)

                                2.bs:设置块大小(这里为4096字节)

                                3.skip:指定跳过的块数(这里为200)

                                4.count:指定复制的块数(这里为1)

                                5.of指定输出文件(这里将数据块内容输出到data_block_200.bin)

                  9.假设需要修改文献权限

chmod 644 example.txt

                                      这个命令将更改目标文件的说有在为user,所属组为group

                                1.注意:

                                        1.直接访问数据块的操作通常不应该在正常操作中进行,因为它可能破坏文件系统结构

                                        2.  在执行这些操作之前,请确保备份重要数据,避免数据丢失

                                        3.这些命令可能需要root权限才能执行

                                        4.文件系统的具体实现可能会有所不同,上述命令是在一般情况下的示例

                        10.data blocks:存储文件的实际内容,inode table:存储各种文件各自的 inode 元数据,包括文件内容所在的数据块的指针,通过这种方式,文件系统可以有效地管理文件的内容和元数据,同时也提供了灵活的方式来处理文件的存储和检索

        13.bitmap位图:

                1.inode bitmap(属性)位图:比特位的内容表示inode 是否有效的

                2.block bitmap(文件内容)位图,和块号联系起来,申请和释放有关,内容块是否存在

                3.删除文件,无需清理具体内容,只需清零管理位图

                4.inode理论上连续,但会搜索空位添加

                5.inode和data block都有对应的编号找到对应的扇区

                6.super block 整个文件的基本信息,不是每个块组都存有,零零星星的存在,确立了稳健性

                7.格式化: 每一个分区在被使用之前,都必须提前先将部分文件系统的属性信息提前设置进对应的分区中,方便我们后续使用这个分区或者分组,所以格式化就是把前四个重新设置,后面两个清空

9.文件系统

        1.增删改查一个文件:在Linux 系统中,一个文件,一个 inode ,每个 inode 都有自己的编号(不能跨分区),文件名不属于 inode 内的文件属性!通过路径能确定 200G ,存到 10G 的块里面了,找组后,在 inode map 里面找空的块,把文件误删了,是把位图删了,删除=允许被覆盖

        2.步骤:系统会执行一系列底层操作来完成这些任务。下面是每个操作涉及的主要步骤

                1.新建文件:

                        1.存储属性:内核找到一个空闲的节点 (这里是 263466),内核把文件信息记录到其中       

                        2.存储数据:该文件需要存储在三个磁盘块,内核找到了三个空闲块,300,500,800。将内核缓冲区的第一块数据复制到 300,下一块复制到 500,最后复制到 800……

                        3.记录分配情况:文件内容按顺序 300,500,800 存放,内核在 inode 上的磁盘分布区记录了上述块列表

                        4.添加文件名到目录:新的文件名 abc。Linux 在当前目录中记录该文件,通过内核将入口 (263466, abc) 添加到目录文件,文件名和 inode 之间的对应关系将文件名和文件的内容及属性链接起来

                2.删除文件:

                        1.查找inode:通过文件名找到对应的 inode

                        2.释放inode引用:减少 inode 的链接计数

                        3.删除目录项:从父目录中删除指向该 inode 的条目

                        4.回收资源:如果 inode 的链接计数降为 0,则回收 inode 和其关联的数据块

                        5.更新文件系统元数据:更新文件系统的其他元数据,比如文件系统的块使用情况

                3.查找inode编号:ls-l可查看,but 使用者基本不关心 inode ,用的是文件名

10.目录

        1.目录也是文件,也有自己的 inode ,目录也要有自己的属性

        2.目录的内容:文件名和对应inode的映射关系(同一个目录下不能有同名文件:

查看时,先找到目录的 inode, 目录内容中存储了文件的 inode,找到对应文件的 inode,就可以访问文件内容啦,例如说删除文件实际上是删除文件名与 inode 的关联,也就是从目录项中移除该文件名。这个操作需要对目录进行写操作,因为目录项(包含文件名)存储在磁盘上,并且需要被修改。但是我们限制了这一操)

        3.目录下,没有 w ,我们无法删除文件,没有 r,我们无法查看文件是为什么?:因为想读取,目录不让读,无法查到 inode,还有没有 x 无法 cd,都是通过对目录中 对文件 inode 的访问设置来管理的

        4.目录的inode是递归管理,会一直向上访问到根目录

        5.dentry缓存

                1.目录项对象:dentry代表文件系统中的一个目录项,即一个文件或目录的名称与其inode(索引节点)之间的关联

                2.路径解析:当用户或程序请求访问一个文件或目录时,文件系统需要解析路径名,dentry缓存可以快速地定位到对应的inode,从而避免了每次都从磁盘读取目录信息

        6.有绝对路径为啥还要递归访问?

递归是我们从内部讲起的,就说要一路找上去,实际拿着文件路径从左到右解析就行,因为我们的任何一个文件,在进程内部都有路径,按照路径,应用层是知道文件和路径的

        

                

                               

                

                                        

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值