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.有绝对路径为啥还要递归访问?
递归是我们从内部讲起的,就说要一路找上去,实际拿着文件路径从左到右解析就行,因为我们的任何一个文件,在进程内部都有路径,按照路径,应用层是知道文件和路径的