今天来 总结一下 Linux 的文件系统,还有文件类型。
File System
FHS
Linux 主要采用的是树形结构,它是单一的一棵树,无论有多少分区,都包含在以 /
为根节点的树结构上。其中分区是物理上的区分,目录则是逻辑上的区分。Linux 中每个分区都要挂载到目录树中一个具体的目录下才能访问,其中根目录必须挂载一个分区 (挂载是 Linux 文件系统与一个存储设备关联起来的过程)。 因为 Linux 是一个多用户系统,一个规范的目录有助于对系统文件和不同的用户文件进行统一管理。
在 Linux 的目录结构中,用户的主目录通常是保存在一个单独的文件系统上,然后挂载到根目录下的一个目录。FHS (Filesystem Hierarchy Standard) 定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。
文件系统的组成
Namespace: 主要给事物对象命名,并按照一种层次结构来组织
API: 主要用于查询和操作对象的一种系统调用
安全模型: 主要用于保护、共享和隐藏对象
实现: 主要用于逻辑模型和硬件系统连接起来
File Types
7 Types
普通文件
-
- 文本文件、数据文件、可执行程序等等都可作为普通文件存储。
目录
d
- 目录中按照名字来对其他文件进行引用,用户通过
mkdir
创建目录,用rmdir
来删除空目录,用rm -r
来删除非空目录。
- 目录中按照名字来对其他文件进行引用,用户通过
字符设备文件
c
- 字符设备文件让相关的驱动程序作为输入输出的缓冲。
块设备文件
b
- 块设备文件有处理块数据的 I/O 的驱动程序使用,同时让内核提供缓冲。
本地域套接口
s
- 实现进程间通信的连接,本地域套接口由系统调用
socket
创建,用rm
或unlink
删除。
- 实现进程间通信的连接,本地域套接口由系统调用
有名管道(FIFO)
p
- 让运行在同一主机上的两个进程相互通信,和 socket 相似,用
mknod
创建,用rm
来删除。
- 让运行在同一主机上的两个进程相互通信,和 socket 相似,用
符号链接
l
- 也叫做软链接,通过名字指向文件。用
ln -s
创建,用rm
来删除。
- 也叫做软链接,通过名字指向文件。用
软链接 & 硬链接
在 Linux 中链接文件可以分为软链接和硬链接两种。创建方法:
- 软链接:
ln -s source target
- 硬链接:
ln source target
- 软链接(符号链接):
软链接文件类似于快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
- 硬链接(实体链接):
硬连接是通过索引节点(inode)来进行的连接,其作用是允许一个文件拥有多个有效路径名,能够达到误删除的作用。在 Linux 中,多个文件名指向同一索引节点是存在的。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
ln
命令:软链接(
ln -s
) 只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间硬链接
ln
没有参数-s
, 在选定的位置上生成一个和源文件大小相同的文件无论是软链接还是硬链接,文件都保持同步变化。
ln
会保持每一处链接文件的同步性。 不论改动哪一处,其它的文件都会发生相同的变化e.g.
1
2
3
4
5
6
7
8
9
10
11touch f
ln -s f f2 # Create softlink f2
rm f
cat f2
>>> No such file or directory
echo "hello"
>>> f2
ls
>>> f f1 f2 # Original file f reappears
区别:
硬链接缺点:
- 不允许给目录创建硬链接
- 只有在同一文件系统中的文件之间才能创建链接,而且只有 root 才有建立权限
软链接优点:
- 没有硬链接以上的两个限制,因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
软链接缺点:
- 因为软链接含有原文件的路径信息,所以当原文件被移到其他目录中,再访问链接文件,系统就找不到了。而硬链接就没有这个缺陷,想怎么移就怎么移。
- 要系统分配额外的空间用于建立新的索引节点和保存原文件的路径
一句话总结:
- 软链接可以跨分区,但源文件不能删除。
- 硬链接不能跨分区,但可以删除源文件。
补充:umask
umask 主要用来设置用户创建文件的默认权限,它与
chmod
的效果刚好相反。umask
设置的是权限“补码”,而chmod
设置的是文件权限码。一般在/etc/profile
、~/.bash_profile
或~/.profile
中设置 umask 值。
计算 umask 值相应的文件,和目录缺省创建权限的步骤如下:
- 先写下具有全部权限的模式,即 777 (所有用户都具有读、写和执行权限)。
- 在下面一行按照 umask 值写下相应的位。
- 在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。
- 对于文件来说,在创建时不能具有执行权限,只要拿掉相应的执行权限即可。
e.g. 假设 umask 值为 022:
文件的最大权限是: rwx rwx rwx (777)
umask 值为 022 (
--- -w- -w-
)目录权限就是 755 (
rwx r-x r-x
)(这就是目录创建缺省权限)文件权限 644 (
rw- r-- r--
) (这就是文件创建缺省权限)