Linux所有文件都建立在虚拟文件系统(Virtual File System VFS)之上。Linux支持每个目录用不同的文件系统,而文件也可能是指磁盘,内存,网卡,输入输出设备等 。
Linux : 一切皆文件
将一个文件系统映射到某个目录的过程叫做挂载(Mount),可以使用mount -l
查看已经挂载的文件系统。
sysfs``proc``devtmpfs``tmpfs``ext4
都是不同的文件系统
sysfs
让用户通过文件访问和设置设备驱动信息。proc
是一个虚拟文件系统,让用户可以通过文件访问内核中的进程信息。devtmpfs
在内存中创造设备文件节点。tmpfs
用内存模拟磁盘文件。ext4
是一个通常意义上我们认为的文件系统,也是管理磁盘上文件用的系统。
目录结构
/bin : 包含很多用户可以访问的可执行文件,如ls,cp,cd等
/dev : 通常挂载在devtmpfs文件系统上,存放设备文件节点
/etc : 配置文件
/proc : 进程和内核文件
/sbin: 系统二进制文件,系统启动必须的指令
/tmp :临时文件,通常使用tmpfs文件系统,系统重启时会清除/tmp
/var : 可变数据文件, 比如日志通常会放在/var/log
下,/var
下的文件会长期保存
/boot : 存放Linux内核文件和启动镜像。
/opt : 可选软件,通常第三方软件安装在这个目录
/root : 用户家目录
/home: 用户个人数据
/media :自动挂载的设备,比如插入U盘
/svr :服务数据
/usr:(Unix System Resource), vim
编辑器的可执行文件通常放在/usr/bin
下,/usr/lib
目录存放系统的库文件,比如一些重要对象的动态链接库文件,/usr/share
目录下存放文档,比如man的文档
硬盘分块
为了提高性能,会把磁盘分为一个个小块(Block e.g. 4 kb)
文件描述
FAT File Allocate Table
一个类似链表的结构,文件1从块5开始,5->2->9->14->15->-1,-1代表结束,这就是文件1在磁盘块的位置。FAT通过一个链表就解决了文件和物理磁盘块的映射,简单实用。FAT的缺点是非常占有内存,1 T的硬盘,如果块大小是1 K, 需要1 G个FAT条目,占用2-3 G内存空间。
索引节点 incode
为每个文件增加一个索引节点,索引节点保存文件的全部信息,包括文件属性和映射到磁盘块的位置。FAT需要把所有块信息都导入内存,但是incode只需要把用到的文件形成数据结构,可以使用虚拟内存分配空间。
文件系统的基本组成
目录的实现
目录是一种特殊的文件,该文件的incode需要含有其下其他文件的incode指针。文件名不要放到incode中而是放到文件夹中,这样可以实现同一个文件同时存在于多个目录下。
如图,b.txt, c.txt是同一个文件,但拥有不同名称,这种形式称为“硬链接”,就是多个文件共享incode。如果为文件a创建硬链接b,即时删除文件a,b也可以正常工作。
与此对应的是“软链接”
图中c.txt
是b.txt
的一个软链接,软链接拥有自己的inode
,但是文件内容就是一个快捷方式。因此,如果我们删除了b.txt
,那么b.txt
对应的 inode 也就被删除了。但是c.txt
依然存在,只不过指向了一个空地址(访问不到)。如果删除了c.txt
,那么不会对b.txt
造成任何影响。