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这些内存文件系统,没有对应的磁盘设备,因此挂载的时候"
- 查看挂载文件系统状态
1)通过/proc/mounts
文件
https://www.cnblogs.com/zhouhbing/p/4285353.html
https://bbs.huaweicloud.com/blogs/419451
2)通过mount指令
-
查看当前系统支持哪些文件系统
cat /proc/filesystems
-
查看存在哪些文件系统(findmnt)
https://blog.csdn.net/fuluoyide312/article/details/106850562/
https://zhuanlan.zhihu.com/p/410445739 -
查看一个目录或者文件是不是挂载点 (mountpoint)
-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
-
shared subtree(共享子树)
https://blog.csdn.net/weixin_37867857/article/details/90512191
https://cloud.tencent.com/developer/article/1532014 -
绑定挂载与mnt命名空间
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" 这样的信息;如果不是稀疏文件,则没有相关的特定标识。
0 条评论