文件系统

一、基本文件系统

1.1 ext文件系统

  1. 使用虚拟目录来操作硬件设备,在物理设备上按定长的块来存储数据。
  2. 使用“索引节点”来存放虚拟目录中所存储文件的信息。
  3. 每个物理设备都有一个索引节点表,存储在虚拟目录中的每一个文件在索引节点表中都有一个条目。
  4. 通过索引节点号,就可以在索引节点表中找到具体的索引节点。文件系统通过索引节点号来标识文件。
  5. 索引节点是文件系统中用来存储文件元数据(Metadata)的数据结构。每个文件和目录都对应一个唯一的 Inode,它记录了文件的属性和存储位置,但不包含文件名和实际数据内容
    • 文件名存储在目录结构中,目录条目将文件名与对应的 Inode 号关联起来。
      • 目录结构就是以根目录为起点的树形目录结构。目录本质上也是一种文件,与普通文件不同,目录存储的是目录条目。
      • 目录条目的具体内容:文件名(文件+目录)+inode号码
    • 文件的实际数据存储在数据块中,Inode 仅通过指针指向数据块。

1.2 etx2文件系统

  1. 是etx的扩展,etx文件大小不能超过2GB,ext2增加到了2TB。
  2. ext按块存储系统,容易分散在整个设备,这就是碎片化,查找时,需要更长的时间。ext2按组分配磁盘块,文件系统在读取文件时就不需要查找整个物理设备了。
  3. 更新文件后,要同步更新inode,假如断电了,inode没有及时更新,那就完蛋,找不到文件,或者文件信息不正确了。

二、日志文件系统

  1. 之前的做法是,先写数据到存储设备,再更新索引节点。如今是,先将文件写入到临时文件,数据成功写到存储设备和索引节点后,再删除对应的临时文件。如果更新时断电了,下次再读取日志文件,并处理上次未处理的文件即可。
  2. 有三种不同的方式
    • 数据模式:索引节点和文件都会被写入日志,风险低,性能差
    • 有序模式:只有索引节点数据会被写入日志,只有数据成功写入后才删除。
    • 回写模式:只有索引节点数据会被写入日志,但不控制文件数据何时写入,风险高。
  3. ext3文件系统,引入了日志。默认是有序模式。仍有缺点:无法恢复误删的文件,没有任何内建的数据压缩功能,也不支持加密文件。
  4. ext4:支持数据压缩和加密;支持区段:区段是连续的空间,如果数据少,那么区段也少,可以直接放inode中,如果区段太多了就会用B+树来存储,区段长度可以不一致;

三、写时复制文件系统

  1. 写时复制:如果修改数据,使用快照,修改过的数据并不会直接覆盖当前数据,而是放入文件系统另一个位置。即使是数据修改完成,之前的旧数据也不会被重写。举个例子:文件内容有a数据块和b数据块,如果现在只修改了a数据块,就会新建一个a'数据块,然后文件指针指向a'数据块和b数据块,可以看到,原来的a数据块是没有修改的。

四、操作文件系统

4.1 创建分区

  1. 一开始,必须在存储设备上创建分区来容纳文件系统。分区可以是整个硬盘,也可以是部分硬盘,用来容纳虚拟目录的一部分。
    • 我插入一个U盘,需要分区吗?
      • U 盘是空的或已格式化,但没有分区,这个时候需要
      • U 盘已经有分区且文件系统已设置,可以不分区
      • U 盘已有分区,但文件系统格式不合适,需要分区
  2. fdisk是用来管理安装在系统上的任何存储设备上的分区。例如fdisk /dev/sdb后者是设备名,然后会进入交互模式。
  3. p:将存储设备的详细信息显示出来。
  4. n:在该存储设备上创建新的分区。
  5. 然后会询问你,是创建主分区p,还是扩展分区e
    • 主分区:在传统的分区表中,一个存储设备最多只能有4个主分区。可以用了与存储数据,也可用于安装操作系统。
    • 扩展分区:扩展分区本身不能存储数据,是用来创建逻辑分区的。逻辑分区功能和主分区类似。扩展分区只能有一个。
  6. 然后询问分区号,然后询问分配大小。
  7. 不同的分区,操作系统会认为是不同的设备,假设一个U盘有4个分区,那么操作系统会认为有四个设备。
  8. 创建完成之后w将更改保存到存储设备中。
  9. 只创建分区后,是不能直接进行读写操作的
    • 分区只是划定了空间:分区表中记录了分区的起始和结束地址,但分区本身还没有文件系统。
    • 没有文件系统,无法管理数据:文件系统负责将数据组织成文件和目录的形式。如果没有文件系统,分区中的空间是“原始”状态,操作系统无法识别或管理数据。
  10. 创建分区的本质是修改分区表(分区表一直都存在),分区表作用:
    • 记录每个分区的起始位置、结束位置、大小、类型等元信息。
    • 操作系统通过解析分区表来找到分区,从而加载对应的文件系统。

4.2 创建文件系统

  1. 在将数据存储到分区之前,必须用某种文件系统对其进行格式化,这样Linux才能使用它。
  2. mkefs 创建一个ext文件系统
  3. mke2fs 创建一个ext2文件系统
  4. mkfs.ext3 创建一个ext3文件系统
  5. mkfs.ext4 创建一个ext4文件系统
  6. mkreiserfs 创建一个ReiserFS文件系统
  7. jfs_mkfs 创建一个JFS文件系统
  8. mkfs.xfs 创建一个XFS文件系统
  9. mkfs.zfs 创建一个ZFS文件系统
  10. mkfs.btrfs 创建一个Btrfs文件系统
  11. 为分区创建了文件系统之后,下一步是将它挂载到虚拟目录下的某个挂载点,这样就可以将数据存储在新文件系统中了。

4.3 实践

  1. 首先一个U盘,要想使用,必须先创建分区
    • 假设设备是/dev/sda,大小4G,然后创建了一个主分区1G,此时就会多一个/dev/sda1
      • 为啥要创建主分区?为啥不创建扩展分区?扩展分区,你可以理解为“槽位”不够了,所以需要扩展分区。“槽位”一共只有4个,如果你需要5个主分区,这个时候,你可以将前三个“槽位”创建主分区,然后最后一个“槽位”创建扩展分区,然后再在扩展分区中,创建两个逻辑分区,也就是说,现在可以用的就是主分区1,主分区2,主分区3,逻辑分区1,逻辑分区2,五个分区了。注意,实际上逻辑分区1,编号是4,逻辑分区2,编号是5。使用起来,逻辑分区和主分区没有区别。
  2. 创建完分区,就可以在分区上创建文件系统了。每个分区可以理解为是独立的。
  3. 创建完文件系统,就可以直接挂载了。注意挂载的是/dev/sdb1,是带编号的这种。

五、逻辑卷管理

5.1 逻辑卷管理布局

  1. 逻辑卷是啥?
    • 逻辑卷就是多个物理卷组合起来,然后形成的一个整体。
    • 为什么需要逻辑卷?逻辑卷更加灵活,假设一个设备分区太小了,并且磁盘已经用完了,此时只能换磁盘,并且将数据迁移到新磁盘。但是逻辑卷可以动态加物理卷,注意,这里的物理卷,可以来自不同的磁盘。
  2. 物理卷又是啥?
    • 物理卷可以是一个分区,也可以是整个设备。例如一个物理卷可以是/dev/sdb1,也可以是/dev/sdc

5.2 使用LVM

  1. 创建物理卷

    • 假设现在有五个分区,分别是/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 设备,查看物理设备的具体信息
  2. 创建卷组

    • vgcreate vg1 /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdc1,这三个为一个卷组
    • vgcreate vg2 /dev/sdc2,这一个单独为一个卷组
    • 使用vgs查看卷组
      • 使用vgdisplay 卷组名,查看卷组细节
  3. 创建逻辑卷

    • 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查看某一个逻辑卷
  4. 格式化逻辑卷

    • mkfs.ext4 /dev/vg1/lv1格式化逻辑卷1
    • mkfs.ext4 /dev/vg2/lv2格式化逻辑卷2
  5. 然后就可以挂载/dev/vg1/lv1/dev/vg2/lv2

  6. 一些常用的其他命令

    • vgchange 激活和禁用卷组
    • vgremove 删除卷组
    • vgextend 将物理卷加到卷组中
    • vgreduce 从卷组中删除物理卷
    • lvextend 增加逻辑卷的大小
    • lvreduce 减小逻辑卷的大小
posted @   ouyangxx  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示