image.png

  • centos7:xfs
  • ubuntu默认:ext4

    linux文件系统

    文件系统 - 图2
    文件系统 - 图3
    文件系统 - 图4
  1. dentry的subdirs指向一个链表,里面都是自己的子目录和文件。
  2. 文件的目录项dentry放在上级的目录项中的链表中,所以删除文件=删除文件dentry=修改上级目录的链表。(所以目录w权限,才可以删除目录中的文件)
  3. 文件的dentry连接该文件的inode
  4. inode链表中有被引用的dentry
  • 超级块
    • 超级块是存储对应文件系统元数据的结构,存储的元数据包括包括文件系统大小,块大小,以及空闲及已使用的块的数量inode表的大学及位置等
  • 目录项:dentry
    • 目录项本身就是一个内存缓存内存缓存内存缓存
    • 文件名在dentry中
  • 索引节点:inode
    • 目录项和索引节点的关系:多对一(一个文件有多个别名)
    • 目录项本身就是一个内存缓存,而索引节点则是存储在磁盘中的数据
    • 硬连接:目录项不同,索引节点相同
    • 除了文件名都在inode中
  • 数据块(逻辑块)单位是4k,所以文件最小4k。(扇区是512B)
    • 文件系统最小4k,磁盘系统最小512B。

什么是Inode和Blcok_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

inode

  • vim会改变inode:因为编辑文件时会创建一个副本。然后替换原来的文件
  • ln不能跨越文件系统

    inode中的内容

  1. 文件的字节数
  2. 文件拥有者的User ID
  3. 文件的Group ID
  4. 文件的读、写、执行权限
  5. 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  6. 链接数,即有多少文件名指向这个inode
  7. 文件数据block的位置

    inode个数

    每个文件都只对应一个inode。
    每8KB分配一个inode不是对于单个文件而言的,是在文件系统初始化的时候,针对硬盘空间而言的。应该表述为“每8KB的硬盘空间分配一个inode”,它的本质是预先设置整个分区inode的数量。因为inode数量会限制这个空间所能存储的文件数。

查看inode数量:df -i
文件系统 - 图5

文件描述符fd和inode的关系

文件系统 - 图6
「文件描述符」就是指这个文件指针数组的索引
理解Linux的文件描述符FD与Inode - 知乎
深入理解文件系统inode

  • fd是表示进程打开的文件
  • inode是文件系统保存的

    • 文件类型(file type),可以是常规文件、目录、套接字或FIFO
    • 访问权限
    • 文件锁列表(file locks)
    • 文件大小

      硬连接&软连接

      文件系统 - 图7
      软连接的内容是fileName,硬连接是指向inode
      Linux 目录软链接 - willwuss - 博客园

      为什么删除文件权限需要目录权限

      删除文件=删除文件dentry=修改上级目录的链表。(所以目录w权限,才可以删除目录中的文件
  • x:cd进入

  • w:修改文件名删除文件
  • r:ls浏览目录

文件系统 - 图8

VFS:虚拟文件系统

VFS 定义了一组所有文件系统都支持的数据结构和标准接口
文件系统 - 图9

  • 磁盘文件系统:xfs、ext4
  • 虚拟文件系统:/proc

linux空间df -h和du -sh结果相差好多【df是磁盘,du是目录】

  • df -h
  • du -h —max-depth=1
    • du -s * | sort -nr :排序

df(disk free)与du(disk usage)
df 基于元数据(超级块?),包含删除但文件句柄仍被线程占用的文件分区超级块中的信息也就不会更改,df仍会统计这个被删除的文件。
du 基于文件计算大小
它们统计的方式有所区别,相差如此之大的一种可能性是因为删除了正在被使用的文件。
可以通过命令lsof|grep delete查看有哪些文件被删除但仍被程序占用。
需要将这些程序重启才能将所占用的空间释放掉。
df和du显示的磁盘空间使用情况不一致的原因及处理_操作系统_smstong的成长轨迹-CSDN博客

我实现过一个最最简单的文件系统,具体步骤就是,先创建一个一百兆大小的文件。然后将其分为三个部分,超级块区,iNode区和数据块区。其中超级块区就存了两张位图分别记录iNode和数据块的使用情况。iNode区则可以存放一定数目的iNode结构,iNode结构中比较重要的是对应文件的文件类型以及一个数组,数组中包含的是该文件占有的磁盘块编号。最后是磁盘块区,事实上磁盘块区是没有任何数据结构的,你只要能根据编号找到相应的位置就可以了。最后说说文件的创建,当创建一个普通文件时,只要查找超级块区,申请一个空余的iNode即可,当然还要在当前目录添加一个包含新创建的文件名和iNode编号的表项。当创建一个目录时,则需要先申请一个iNode,然后申请一个磁盘块,再往其中写入“.”和“..”两个表项。为了简单期间,一般读取文件或目录时我会将它的所有磁盘块块都读入内存,写回时再重新申请磁盘块写入。剩下的就是对iNode和磁盘块申请释放的操作了。 作者:姚灯灯 链接:https://www.zhihu.com/question/37550565/answer/72577893 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

cp & mv的过程是怎样的?

  • cp创建新的inode和数据块
  • mv,inode和数据库不变,只是改了目录项。【一个分区内mv,都很快】

rsyslog

image.png

命令

创建挂载文件系统

  • mke2fs:创建文件系统

    image.png
    image.png

  • dumpe2fs:查看文件系统【centos6】

    image.png

  • mount:查看文件系统的挂载

image.png

自动挂载配置/etc/fstab

image.png
image.png