文件系统
一、基本文件系统
1.1 ext文件系统
- 使用虚拟目录来操作硬件设备,在物理设备上按定长的块来存储数据。
- 使用“索引节点”来存放虚拟目录中所存储文件的信息。
- 每个物理设备都有一个索引节点表,存储在虚拟目录中的每一个文件在索引节点表中都有一个条目。
- 通过索引节点号,就可以在索引节点表中找到具体的索引节点。文件系统通过索引节点号来标识文件。
- 索引节点是文件系统中用来存储文件元数据(Metadata)的数据结构。每个文件和目录都对应一个唯一的 Inode,它记录了文件的属性和存储位置,但不包含文件名和实际数据内容。
- 文件名存储在目录结构中,目录条目将文件名与对应的 Inode 号关联起来。
- 目录结构就是以根目录为起点的树形目录结构。目录本质上也是一种文件,与普通文件不同,目录存储的是目录条目。
- 目录条目的具体内容:文件名(文件+目录)+inode号码
- 文件的实际数据存储在数据块中,Inode 仅通过指针指向数据块。
- 文件名存储在目录结构中,目录条目将文件名与对应的 Inode 号关联起来。
1.2 etx2文件系统
- 是etx的扩展,etx文件大小不能超过2GB,ext2增加到了2TB。
- ext按块存储系统,容易分散在整个设备,这就是碎片化,查找时,需要更长的时间。ext2按组分配磁盘块,文件系统在读取文件时就不需要查找整个物理设备了。
- 更新文件后,要同步更新inode,假如断电了,inode没有及时更新,那就完蛋,找不到文件,或者文件信息不正确了。
二、日志文件系统
- 之前的做法是,先写数据到存储设备,再更新索引节点。如今是,先将文件写入到临时文件,数据成功写到存储设备和索引节点后,再删除对应的临时文件。如果更新时断电了,下次再读取日志文件,并处理上次未处理的文件即可。
- 有三种不同的方式
- 数据模式:索引节点和文件都会被写入日志,风险低,性能差
- 有序模式:只有索引节点数据会被写入日志,只有数据成功写入后才删除。
- 回写模式:只有索引节点数据会被写入日志,但不控制文件数据何时写入,风险高。
- ext3文件系统,引入了日志。默认是有序模式。仍有缺点:无法恢复误删的文件,没有任何内建的数据压缩功能,也不支持加密文件。
- ext4:支持数据压缩和加密;支持区段:区段是连续的空间,如果数据少,那么区段也少,可以直接放inode中,如果区段太多了就会用B+树来存储,区段长度可以不一致;
三、写时复制文件系统
- 写时复制:如果修改数据,使用快照,修改过的数据并不会直接覆盖当前数据,而是放入文件系统另一个位置。即使是数据修改完成,之前的旧数据也不会被重写。举个例子:文件内容有a数据块和b数据块,如果现在只修改了a数据块,就会新建一个a'数据块,然后文件指针指向a'数据块和b数据块,可以看到,原来的a数据块是没有修改的。
四、操作文件系统
4.1 创建分区
- 一开始,必须在存储设备上创建分区来容纳文件系统。分区可以是整个硬盘,也可以是部分硬盘,用来容纳虚拟目录的一部分。
- 我插入一个U盘,需要分区吗?
- U 盘是空的或已格式化,但没有分区,这个时候需要
- U 盘已经有分区且文件系统已设置,可以不分区
- U 盘已有分区,但文件系统格式不合适,需要分区
- 我插入一个U盘,需要分区吗?
fdisk
是用来管理安装在系统上的任何存储设备上的分区。例如fdisk /dev/sdb
后者是设备名,然后会进入交互模式。p
:将存储设备的详细信息显示出来。n
:在该存储设备上创建新的分区。- 然后会询问你,是创建主分区
p
,还是扩展分区e
- 主分区:在传统的分区表中,一个存储设备最多只能有4个主分区。可以用了与存储数据,也可用于安装操作系统。
- 扩展分区:扩展分区本身不能存储数据,是用来创建逻辑分区的。逻辑分区功能和主分区类似。扩展分区只能有一个。
- 然后询问分区号,然后询问分配大小。
- 不同的分区,操作系统会认为是不同的设备,假设一个U盘有4个分区,那么操作系统会认为有四个设备。
- 创建完成之后
w
将更改保存到存储设备中。 - 只创建分区后,是不能直接进行读写操作的
- 分区只是划定了空间:分区表中记录了分区的起始和结束地址,但分区本身还没有文件系统。
- 没有文件系统,无法管理数据:文件系统负责将数据组织成文件和目录的形式。如果没有文件系统,分区中的空间是“原始”状态,操作系统无法识别或管理数据。
- 创建分区的本质是修改分区表(分区表一直都存在),分区表作用:
- 记录每个分区的起始位置、结束位置、大小、类型等元信息。
- 操作系统通过解析分区表来找到分区,从而加载对应的文件系统。
4.2 创建文件系统
- 在将数据存储到分区之前,必须用某种文件系统对其进行格式化,这样Linux才能使用它。
mkefs
创建一个ext文件系统mke2fs
创建一个ext2文件系统mkfs.ext3
创建一个ext3文件系统mkfs.ext4
创建一个ext4文件系统mkreiserfs
创建一个ReiserFS文件系统jfs_mkfs
创建一个JFS文件系统mkfs.xfs
创建一个XFS文件系统mkfs.zfs
创建一个ZFS文件系统mkfs.btrfs
创建一个Btrfs文件系统- 为分区创建了文件系统之后,下一步是将它挂载到虚拟目录下的某个挂载点,这样就可以将数据存储在新文件系统中了。
4.3 实践
- 首先一个U盘,要想使用,必须先创建分区
- 假设设备是
/dev/sda
,大小4G,然后创建了一个主分区1G,此时就会多一个/dev/sda1
- 为啥要创建主分区?为啥不创建扩展分区?扩展分区,你可以理解为“槽位”不够了,所以需要扩展分区。“槽位”一共只有4个,如果你需要5个主分区,这个时候,你可以将前三个“槽位”创建主分区,然后最后一个“槽位”创建扩展分区,然后再在扩展分区中,创建两个逻辑分区,也就是说,现在可以用的就是主分区1,主分区2,主分区3,逻辑分区1,逻辑分区2,五个分区了。注意,实际上逻辑分区1,编号是4,逻辑分区2,编号是5。使用起来,逻辑分区和主分区没有区别。
- 假设设备是
- 创建完分区,就可以在分区上创建文件系统了。每个分区可以理解为是独立的。
- 创建完文件系统,就可以直接挂载了。注意挂载的是
/dev/sdb1
,是带编号的这种。
五、逻辑卷管理
5.1 逻辑卷管理布局
- 逻辑卷是啥?
- 逻辑卷就是多个物理卷组合起来,然后形成的一个整体。
- 为什么需要逻辑卷?逻辑卷更加灵活,假设一个设备分区太小了,并且磁盘已经用完了,此时只能换磁盘,并且将数据迁移到新磁盘。但是逻辑卷可以动态加物理卷,注意,这里的物理卷,可以来自不同的磁盘。
- 物理卷又是啥?
- 物理卷可以是一个分区,也可以是整个设备。例如一个物理卷可以是
/dev/sdb1
,也可以是/dev/sdc
- 物理卷可以是一个分区,也可以是整个设备。例如一个物理卷可以是
5.2 使用LVM
-
创建物理卷
-
假设现在有五个分区,分别是
/dev/sdb1
、/dev/sdb2
、/dev/sdb3
、/dev/sdc1
、/dev/sdc2
,,使用pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdc1 /dev/sdc2
创建物理卷- 这里有个问题,这些分区,要修改其类型,
fdisk
后,使用t
修改类型为8e
,标识这是LVM系统的一部分,而不是一个直接的文件系统。
- 这里有个问题,这些分区,要修改其类型,
-
使用
pvs
查看物理卷- 使用
pvdisplay 设备
,查看物理设备的具体信息
- 使用
-
-
创建卷组
vgcreate vg1 /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdc1
,这三个为一个卷组vgcreate vg2 /dev/sdc2
,这一个单独为一个卷组- 使用
vgs
查看卷组- 使用
vgdisplay 卷组名
,查看卷组细节
- 使用
-
创建逻辑卷
lvcreate -l 100%FREE -n lv1 vg1
-l 100%FREE
使用物理卷全部空间-n lv1
指定逻辑卷的名称
lvcreate -l 100%FREE -n lv2 vg2
- 查看逻辑卷信息
lvdisplay 卷组名
,注意,这里是卷组名,查看该卷组下所有逻辑卷信息。 sudo lvdisplay /dev/vg1/lv1
查看某一个逻辑卷
-
格式化逻辑卷
mkfs.ext4 /dev/vg1/lv1
格式化逻辑卷1mkfs.ext4 /dev/vg2/lv2
格式化逻辑卷2
-
然后就可以挂载
/dev/vg1/lv1
和/dev/vg2/lv2
-
一些常用的其他命令
vgchange
激活和禁用卷组vgremove
删除卷组vgextend
将物理卷加到卷组中vgreduce
从卷组中删除物理卷lvextend
增加逻辑卷的大小lvreduce
减小逻辑卷的大小
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理