技术编程|低调的 Linux 文件系统家族( 二 )


/media, 挂载可移动介质
/mnt, 挂载文件系统
/opt, 提供一个可选的应用程序安装目录
/proc, 特殊的动态目录 , 用于维护系统信息和状态 , 包括当前运行中进程信息
/root, root 用户的主要目录文件夹
/sbin, 重要的二进制系统文件
/tmp,系统和用户创建的临时文件 , 系统重启时 , 这个目录下的文件都会被删除
/usr, 包含绝大多数用户都能访问的应用程序和文件
/var, 经常变化的文件 , 诸如日志文件或数据库等
在 Linux 中 , 有两种路径 , 一种是 绝对路径(absolute path), 绝对路径告诉你从根目录下查找文件 , 绝对路径的缺点是太长而且不太方便 。 还有一种是 相对路径(relative path), 相对路径所在的目录也叫做 工作目录(working directory)。
如果 /usr/local/books 是工作目录 , 那么 shell 命令
cp books books-replica
就表示的是相对路径 , 而
cp /usr/local/books/books /usr/local/books/books-replica
则表示的是绝对路径 。
在 Linux 中经常出现一个用户使用另一个用户的文件或者使用文件树结构中的文件 。 两个用户共享同一个文件 , 这个文件位于某个用户的目录结构中 , 另一个用户需要使用这个文件时 , 必须通过绝对路径才能引用到他 。 如果绝对路径很长 , 那么每次输入起来会变的非常麻烦 , 所以 Linux 提供了一种 链接(link) 机制 。
举个例子 , 下面是一个使用链接之前的图

技术编程|低调的 Linux 文件系统家族
本文插图

以上所示 , 比如有两个工作账户 jianshe 和 cxuan , jianshe 想要使用 cxuan 账户下的 A 目录 , 那么它可能会输入 /usr/cxuan/A, 这是一种未使用链接之后的图 。
使用链接后的示意如下

技术编程|低调的 Linux 文件系统家族
本文插图

现在 , jianshe 可以创建一个链接来使用 cxuan 下面的目录了 。 ‘
当一个目录被创建出来后 , 有两个目录项也同时被创建出来 , 它们就是 . 和 .., 前者代表工作目录自身 , 后者代表该目录的父目录 , 也就是该目录所在的目录 。 这样一来 , 在 /usr/jianshe 中访问 cxuan 中的目录就是 ../cxuan/xxx
Linux 文件系统不区分磁盘的 , 这是什么意思呢?一般来说 , 一个磁盘中的文件系统相互之间保持独立 , 如果一个文件系统目录想要访问另一个磁盘中的文件系统 , 在 Windows 中你可以像下面这样 。

技术编程|低调的 Linux 文件系统家族
本文插图

两个文件系统分别在不同的磁盘中 , 彼此保持独立 。
而在 Linux 中 , 是支持 挂载 的 , 它允许一个磁盘挂在到另外一个磁盘上 , 那么上面的关系会变成下面这样

技术编程|低调的 Linux 文件系统家族
本文插图

挂在之后 , 两个文件系统就不再需要关心文件系统在哪个磁盘上了 , 两个文件系统彼此可见 。
Linux 文件系统的另外一个特性是支持 加锁(locking)。 在一些应用中会出现两个或者更多的进程同时使用同一个文件的情况 , 这样很可能会导致 竞争条件(race condition)。 一种解决方法是对其进行加不同粒度的锁 , 就是为了防止某一个进程只修改某一行记录从而导致整个文件都不能使用的情况 。
POSIX 提供了一种灵活的、不同粒度级别的锁机制 , 允许一个进程使用一个不可分割的操作对一个字节或者整个文件进行加锁 。 加锁机制要求尝试加锁的进程指定其 「要加锁的文件 , 开始位置以及要加锁的字节」
Linux 系统提供了两种锁: 「共享锁和互斥锁」 。 如果文件的一部分已经加上了共享锁 , 那么再加排他锁是不会成功的;如果文件系统的一部分已经被加了互斥锁 , 那么在互斥锁解除之前的任何加锁都不会成功 。 为了成功加锁、请求加锁的部分的所有字节都必须是可用的 。


推荐阅读