其他
文件系统:隐匿在 Linux 背后的机制
文件系统(file system)
。下面我们就来一起探讨一下关于 Linux 中国的文件系统,系统调用以及文件系统实现背后的原理和思想。这些思想中有一些来源于 MULTICS,现在已经被 Windows 等其他操作系统使用。Linux 的设计理念就是 小的就是好的(Small is Beautiful)
。虽然 Linux 只是使用了最简单的机制和少量的系统调用,但是 Linux 却提供了强大而优雅的文件系统。VFS
曾支持多种文件系统。在 Linux 链接时,用户可以动态的将不同的文件系统挂载倒 VFS 上。/
,它通常包含了多个子目录。字符 /
还用于对目录名进行区分,例如 /usr/cxuan表示的就是根目录下面的 usr 目录,其中有一个叫做 cxuan 的子目录。/bin
,它是重要的二进制应用程序,包含二进制文件,系统的所有用户使用的命令都在这里/boot
,启动包含引导加载程序的相关文件/dev
,包含设备文件,终端文件,USB 或者连接到系统的任何设备/etc
,配置文件,启动脚本等,包含所有程序所需要的配置文件,也包含了启动/停止单个应用程序的启动和关闭 shell 脚本/home
,本地主要路径,所有用户用 home 目录存储个人信息/lib
,系统库文件,包含支持位于 /bin 和 /sbin 下的二进制库文件/lost+found
,在根目录下提供一个遗失+查找系统,必须在 root 用户下才能查看当前目录下的内容/media
,挂载可移动介质/mnt
,挂载文件系统/opt
,提供一个可选的应用程序安装目录/proc
,特殊的动态目录,用于维护系统信息和状态,包括当前运行中进程信息/root
,root 用户的主要目录文件夹/sbin
,重要的二进制系统文件/tmp
, 系统和用户创建的临时文件,系统重启时,这个目录下的文件都会被删除/usr
,包含绝大多数用户都能访问的应用程序和文件/var
,经常变化的文件,诸如日志文件或数据库等
绝对路径(absolute path)
,绝对路径告诉你从根目录下查找文件,绝对路径的缺点是太长而且不太方便。还有一种是 相对路径(relative path)
,相对路径所在的目录也叫做工作目录(working directory)
。/usr/local/books
是工作目录,那么 shell 命令链接(link)
机制。/usr/cxuan/A
,这是一种未使用链接之后的图。.
和 ..
,前者代表工作目录自身,后者代表该目录的父目录,也就是该目录所在的目录。这样一来,在 /usr/jianshe 中访问 cxuan 中的目录就是 ../cxuan/xxx
挂载
的,它允许一个磁盘挂在到另外一个磁盘上,那么上面的关系会变成下面这样加锁(locking)
。在一些应用中会出现两个或者更多的进程同时使用同一个文件的情况,这样很可能会导致竞争条件(race condition)
。一种解决方法是对其进行加不同粒度的锁,就是为了防止某一个进程只修改某一行记录从而导致整个文件都不能使用的情况。creat
方法,注意没有 e
。这里说一个小插曲,曾经有人问 UNIX 创始人 Ken Thompson,如果有机会重新写 UNIX ,你会怎么办,他回答自己要把 creat 改成 create ,哈哈哈哈。
非负整数
, 这个就叫做 文件描述符(file descriptor)
,也就是上面的 fd。open
系统调用也能够创建文件。close
系统调用进行关闭。close 和 open 返回的 fd 总是未被使用的最小数量。什么是文件描述符?文件描述符就是一个数字,这个数字标示了计算机操作系统中打开的文件。它描述了数据资源,以及访问资源的方式。
授予访问权限 在 全局文件表(global file table)
中创建一个条目(entry)
向软件提供条目的位置
STDIN(标准输入)
、STDOUT(标准输出)
、STDERR(标准错误)
。文件描述符
:告诉需要对哪一个打开文件进行读取和写入缓冲区地址
:告诉数据需要从哪里读取和写入哪里统计
:告诉需要传输多少字节
Lseek
系统调用会更改指针位置的值,以便后续对 read 或 write 的调用可以在文件中的任何位置开始,甚至可以超出文件末尾。lseek = Lseek ,段首大写。
Lseek
有三个参数:第一个是文件的文件描述符,第二个是文件的位置;第三个告诉文件位置是相对于文件的开头,当前位置还是文件的结尾stat
系统调用看到这些信息。第一个参数就是文件名,第二个是指向要放置请求信息结构的指针。这些结构的属性如下图所示。fstat
调用和 stat
相同,只有一点区别,fstat 可以对打开文件进行操作,而 stat 只能对路径进行操作。pipe
文件系统调用被用来创建 shell 管道。它会创建一系列的伪文件
,来缓冲和管道组件之间的数据,并且返回读取或者写入缓冲区的文件描述符。在管道中,像是如下操作fcntl
,它用来锁定和解锁文件,应用共享锁和互斥锁,或者是执行一些文件相关的其他操作。目录项(directory entry)
。系统调用 link 来创建链接,oldpath 代表已有的路径,newpath 代表需要链接的路径,使用 unlink
可以删除目录项。当文件的最后一个链接被删除时,这个文件会被自动删除。chdir
系统调用可以改变工作目录。readdir
都会以固定的格式返回一个目录项。用户不能对目录执行写操作,但是可以使用 creat 或者 link 在文件夹中创建一个目录,或使用 unlink 删除一个目录。用户不能在目录中查找某个特定文件,但是可以使用 rewindir
作用于一个打开的目录,使他能在此从头开始读取。推荐阅读:
每日打卡赢积分兑换书籍入口
👇🏻👇🏻👇🏻