https://blog.csdn.net/ganfanren00001/article/details/126090694
https://baijiahao.baidu.com/s?id=1675156968488871921&wfr=spider&for=pc (**)
https://www.zhihu.com/question/26076795/answer/2251108325?utm_id=0
1)文件系统与虚拟文件系统
2)文件存储的原理
3)文件I/O

一、文件系统与磁盘的关系

https://zhuanlan.zhihu.com/p/556224472?utm_id=0
什么是文件系统:介于磁盘上层的一个读写数据系统,让应用层不需要知道磁盘复杂结构,就可以快速寻址并解析原始数据,返回文件对应格式数据。

二、重要概念

磁盘块与inode的理解
[https://www.cnblogs.com/whych/p/9315723.html](https://www.cnblogs.com/whych/p/9315723.html)
https://blog.csdn.net/weixin_46199479/article/details/123602750

块、页都是软件层面的虚拟单位

1.磁盘块

https://blog.csdn.net/m0_37535642/article/details/72356737
磁盘块是操作系统的概念,不是物理概念。

查看块的大小:tune2fs -l /dev/sda2|grep Block
查看块与inode的的大小:dumpe2fs -h /dev/sda5

1)为什么linux目录(包括空目录)的大小一般都是4096个字节?https://www.cnblogs.com/yunzhongjunlang/p/14461866.html
2)为什么linux空文件大小是0?为什么linux空文件随便写入一个字节块就变8了?
https://blog.csdn.net/Rong_Toa/article/details/111241945

2.inode(索引节点)

https://www.sohu.com/a/119746385_355123
https://www.cnblogs.com/ToTigerMountain/articles/17568487.html
https://blog.csdn.net/qq_55712347/article/details/128717642 (磁盘|inode|动静态库)

  • 查看每个硬盘分区的inode总数和已经使用的数量
    df -i

  • 文件名对应的inode号码
    ls -i example.txt

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

使用ls -i命令,可以看到文件名对应的inode号码:

1.目录文件

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

2.硬连接与软连接

https://blog.csdn.net/modi000/article/details/119010226

软硬连接的区别:硬链接实际是一条文件名与i结点的记录,软链接是建立了另一个新的独立的文件,它指向源文件。

  • 硬连接

一般情况下,文件名和inode号码是”一一对应”关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码

这意味着,可以用不同的文件名访问同样的内容对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为”硬链接”。

创建硬连接命令:ln 源文件 目标文件

运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。

反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的”链接数”。创建目录时,默认会生成两个目录项:”.”和”..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录)。

  • 软连接

1)概念
文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。

ln -s命令可以创建软链接。

ln -s 源文文件或目录 目标文件或目录
2)关于软连接的大小
https://blog.csdn.net/modi000/article/details/119010226 这篇文章介绍的很清楚,软连接的大小其实是指向的源文件的路径的大小,但是软连接占用的块大小是0.

三、文件系统制作(mkfs)

https://www.cnblogs.com/joshua317/p/15412269.html

三、文件系统挂载(mount)

https://www.linuxidc.com/Linux/2017-11/148277p3.htm

挂载的概念

https://www.zhihu.com/question/266907637
https://www.zhihu.com/question/512414198/answer/2318166297
https://zhuanlan.zhihu.com/p/67686817
https://baijiahao.baidu.com/s?id=1728958831699145125&wfr=spider&for=pc
https://www.python100.com/html/48AF6462GMPS.html

重点:

挂载是“虚拟文件系统”独有的概念,将外部文件系统挂载到现有文件系统树中。

mount命令详解

https://www.cnblogs.com/sparkdev/p/9015312.html
https://blog.csdn.net/wisdom_futrue/article/details/129236013
https://www.sohu.com/a/242952813_495675

开机自动挂载(配置/etc/fstab文件):https://blog.csdn.net/2301_77606661/article/details/134381147
https://zhuanlan.zhihu.com/p/250658106
https://www.cnblogs.com/niushuaiblog/p/4338095.html
blkid查看分区的uuid

mount参数说明

命令格式:mount -t <type> <device> <mount point>
https://www.jianshu.com/p/49046698a344

-t参数

指定挂载类型

-o参数
  • -o uid=user1,gid=group1
    改变挂载目录下文件的所属用户和组

实例

1)虚拟文件系统:像debugfs, procfs, sysfs这些内存文件系统,没有对应的磁盘设备,因此挂载的时候""这一项可以填"none"或者"nodev",对应的函数实现是mount_nodev()。

  • 查看挂载文件系统状态

1)通过/proc/mounts文件
https://www.cnblogs.com/zhouhbing/p/4285353.html
https://bbs.huaweicloud.com/blogs/419451
2)通过mount指令

-d 打印挂载于指定目录上的设备的主次设备代码
-q 安静模式
-x 打印指定块设备的主次设备代码

绑定挂载

绑定挂载其实是一个inode替换的过程,有点“硬连接”的味道 。

https://www.cnblogs.com/R-bear/p/15027390.html
https://www.jianshu.com/p/7d9d6d565031
https://blog.csdn.net/allway2/article/details/122136813

mount命令的原理

https://juejin.cn/post/6844903938576105485
https://zhuanlan.zhihu.com/p/144893220
https://zhuanlan.zhihu.com/p/378013367

常见问题

  • 解决Read-only file system问题
    mount -o remount,rw /system,将有问题的目录重新以可读写的方式挂载。

四、文件系统卸载(umount)

https://www.cnblogs.com/wangbin2188/p/14647654.html

umount2

umount2()可对卸载操作施以更精密的控制

flags分类

这一标志位掩码参数由下列 0 个或多个值相或( OR)而成。

  • MNT_DETACH
    (始于 Linux 2.4.11) 执行 lazy 卸载。对挂载点加以标记,一方面允许已使用了挂载点的进程得以继续使用,同时禁止任何其他进程对该挂载点发起新的访问。当所有进程不再使用访问点时,系统会卸载相应的文件系统。

  • MNT_EXPIRE
    (始于 Linux 2.6.8) 将挂载点标记为到期( expired)。若首次调用 umount2()时指定了该标志,且挂载点处于空闲状态,则该调用将以失败告终,并返回 EAGAIN 错误,同时将挂载点标记为到期。(如果挂载点处于在用状态, 那么调用也将失败, 并返回 EBUSY 错误, 但不会将挂载点标记为到期。 ) 只要无任何后续进程发起对挂载点的访问,该挂载点便会一直保持到期状态。再度调用umount2()时,如指定 MNT_EXPIRE 标志,将卸载到期的挂载点。这就提供了一种机制,以卸载在某段时间内未用的文件系统。该标志不能与 MNT_DETACH 或 MNT_FORCE 标志一并使用。

  • MNT_FORCE
    即便文件系统(只对 NFS 挂载有效)处于在用状态,依然将其强行卸载。采用这一选项可能会造成数据丢失。

  • UMOUNT_NOFOLLOW
    (始于 Linux 2.6.34) 若 target 为符号链接,则不对其进行解引用。该标志专为某些 set-user-ID-root 程序而设计—此类程序允许非特权级用户执行卸载操作,意在避免安全性问题的发生(例如,若 target为符号链接,且被改变以指向另外的位置

五、文件系统类型

https://blog.csdn.net/qq_39341113/article/details/103521989

ext

扩展文件系统

SquashFS

只读文件系统
https://www.leixue.com/ask/what-is-squashfs

tmpfs与devtmpfs

http://www.mybatis.cn/archives/1639.html
https://blog.csdn.net/weixin_45030965/article/details/135293474
tmpfs是Linux/Unix系统上的一种基于内存的文件系统。tmpfs可以使用您的内存或swap分区来存储文件。

swap

https://www.dbs724.com/453703.html
Swap是Linux操作系统提供的一种虚拟内存技术,可以将硬盘空间虚拟为内存区域,用于缓存和存储暂时不需要的内存数据。它通过将内存中的不活动页面移到硬盘中,从而腾出空间,让新的内存数据得以加载。

fat32

https://blog.csdn.net/weixin_43839785/article/details/111057973

五、稀疏文件

https://blog.csdn.net/weixin_56711920/article/details/132610707
https://blog.51cto.com/u_9843231/4871402

如何判断文件是否为稀疏文件:file命令,如果该文件是稀疏文件,则会在结果中显示类似于 "Sparse" 或者 "Sparse File" 这样的信息;如果不是稀疏文件,则没有相关的特定标识。

分类: fs文件系统

0 条评论

发表回复

您的电子邮箱地址不会被公开。