1. Linux 常见的文件系统
-
EXT(Extended File System)
- EXT2:Linux 的第一个设计为一个商业级文件系统,沿用 BSD 的 Berkeley 文件系统的设计原理。提供了 GB 级别的最大文件和 TB 级别的文件系统。但是如果在将数据写入到磁盘的时候,系统发生崩溃或断电,则容易发生灾难性的数据损坏。
- EXT3:使用 32 位内部寻址,引入日志事务解决了 EXT2 数据损坏问题。三个级别的日志记录方式日记 (journal)、顺序(ordered) 和 回写(writeback)。
- EXT4:使用 48 位的内部寻址,可以存储最大 16TB 的单一文件,支持最大 1EB 的分区容量。EXT -> EXT2 -> EXT3 -> EXT4
- XFS(Extents File System)
它是一个 64 位的日志文件系统,自 2001 年以来内置于 Linux 内核中,为大型文件系统和高度并发性提供了高性能(即大量的进程都会立即写入文件系统)。从 RHEL 7 开始,XFS 成为 Red Hat Enterprise Linux 的默认文件系统。 - ZFS(Zettabyte File System)
Sun Microsystems 开发,以 zettabyte 命名 —— 相当于 1 万亿 GB —— 因为它理论上可以解决大型存储系统。 - Btrfs(B-Tree Filesystem)
Chris Mason 于 2007 年在 Oracle 任职期间发布。Btrfs 旨在跟 ZFS 有大部分相同的目标,提供多种设备管理、每块校验、异步复制、直列压缩等等。SUSE Enterprise Linux 在 2015 年采用它作为默认文件系统,而 Red Hat 于 2017 年宣布它从 RHEL 7.4 开始不再支持 Btrfs。
2. Linux 系统的层次
=======================================================
| Application | User space
=======================================================
| SCI (System Call Interface) | K
|-----------------------------------------------------| e
| VFS (Virtual File System) | r
|-----------------------------------------------------| n
| Ext3 | Ext4 | XFS | ZFS | Btrfs | ... | e
|-----------------------------------------------------| l
| General Block Device Layer |
|-----------------------------------------------------| Kernel space
| Device Driver |
=======================================================
| Physical Disk | Hardware
=======================================================
清单 2 -1
Kernel Space
Device Driver
常见的硬盘类型有 PATA、SATA 以及 AHCI 等。
General Block Device Layer
为文件系统提供统一抽象的硬盘驱动接口,屏蔽不同硬盘驱动带来的 IO 接口的多样性和复杂性。
File System
管理文件的实际系统。常用的如 Ext4 等。
VFS
向 SCI 层提供统一抽象的文件系统接口。
SCI
为用户程序提供系统调用的接口。
3. 文件存储结构
Linux 中,文件 = inode + 数据块
- inode:又称文件索引节点,存放文件的元信息
- 数据块:存放文件内容的区域
有些介绍文件存储结构的文章说
一个文件包含了目录项、inode 和数据块
这个说法是 不准确 的。目录项并不是文件存储结构的组成部分,目录项只是数据块的数据而已。在 Linux 中,目录也是一种文件,即目录文件(文件类型为目录)。对于目录文件而言,其数据块存放的是目录项,即目录下所有的文件名和文件的 inode 编号。
通常我们在使用 ls -al
命令查看目录结构时,返回结果的前两个的目录名分别时 .
和..
:
[root@localhost /]# ls -al
total 16
dr-xr-xr-x. 17 root root 224 Aug 7 00:25 .
dr-xr-xr-x. 17 root root 224 Aug 7 00:25 ..
清单 3 -1
清单 3 - 1 种,.
指向的是当前目录 inode,..
指向的是上一级目录的 inode。
inode 的元信息通常包括:
- 文件类型(regular file, directory, symbolic link etc.)
- 文件的字节数
- 分配给文件的 block 数量
- Inode 编号
- 文件的硬链接数量(详见 5. 文件链接,hard link)
- 文件的访问权限(详见 4. 文件权限控制)
- 文件的时间戳(atime:access time, mtime:modify time, ctime:inode change time)
- 文件数据块的地址数组
使用 state <path>
命令可以查看指定目录或文件的 inode 信息。以 /dev 目录文件为例:
[root@localhost ~]# stat /etc
File:‘/etc’Size: 8192 Blocks: 24 IO Block: 4096 directory
Device: fd00h/64768d Inode: 67160161 Links: 79
Access: (0755/drwxr-xr-x) Uid: (0/ root) Gid: (0/ root)
Context: system_u:object_r:etc_t:s0
Access: 2019-09-05 23:42:58.818662000 +0800
Modify: 2019-09-05 11:29:26.972884600 +0800
Change: 2019-09-05 11:29:26.972884600 +0800
清单 3 -2
4. 文件权限控制
4.1. 文件的属性
使用 ls -l <path>
命令可以查看到指定 path 下的文件相关的属性信息。以 /bin/
目录为例:
[root@localhost efrey]# ls -l /bin/
total 68012
-rwxr-xr-x. 1 root root 41544 Oct 31 2018 [
-rwxr-xr-x. 1 root root 107904 Jan 22 2019 a2p
-rwxr-xr-x. 1 root root 52720 Jul 30 01:20 ab
-rwxr-xr-x. 1 root root 29200 Oct 30 2018 addr2line
-rwxr-xr-x. 1 root root 29 Oct 31 2018 alias
lrwxrwxrwx. 1 root root 6 Aug 7 00:22 apropos -> whatis
......
[1] [2] [3] [4] [5] [6] [7]
清单 4 -1
清单 4 - 1 的返回信息分为 7 列:
[1]:文件的权限
[2]:文件的 hard link 数量
[3]:文件的拥有者(owner)
[4]:文件的组(group)
[5]:文件的字节数
[6]:文件的 mtime(modify time,文件最后被修改的时间)
[7]:文件名
4.2. 文件的权限分配
4.2.1. 权限类型
Linux 文件系统的权限类型有 3 种:
- r(Read)
文件的 r 权限意味着可以读取文件的内容;
目录的 r 权限意味着可以读取目录的内容(子目录与文件名清单)。 - w(Write)
文件的 w 权限意味着可以修改文件的内容;
目录的 w 权限意味着可以新建子目录、文件,也可以对其子目录、文件名进行修改、删除、移动。 -
x(eXecute)
文件的 x 权限意味着该文件可以被执行;目录的 x 权限比较特殊,rw 权限都依赖与 x 权限。如果只为用户分配了某个目录的 rw 权限但是没有 x 权限,该用户仍然无法访问这个目录的。
我们做个验证,首先在登陆用户的 home 目录内新建一个目录 fldr,系统默认的 owner 权限为 rwx。此时将目录 fldr 的 owner 权限修改为 rw,然后再试着访问 fldr:[efrey@localhost ~]$ mkdir fldr [efrey@localhost ~]$ ls -l total 0 drwxrwxr-x. 2 efrey efrey 6 Sep 6 22:53 fldr [efrey@localhost ~]$ touch fldr/test.txt [efrey@localhost ~]$ ls -l fldr total 0 -rw-rw-r--. 1 efrey efrey 0 Sep 6 22:54 test.txt [efrey@localhost ~]$ sudo chmod u=rw,g=rw,o=r fldr [efrey@localhost ~]$ ls -l fldr ls: cannot access fldr/test.txt: Permission denied total 0 -????????? ? ? ? ? ? test.txt
清单 4 -2
4.2.2. 文件权限的涵义
从清单 4 - 1 中可以看到第 [1] 栏的文件权限,总共有 10 个字符。以第一行的文件权限 -rwxr-xr-x
为例,这 10 位字符的权限涵义可以划分为 1 +3+3+3 总计 4 个段落(-
+ rwx
+ r-x
+ r-x
):
段落 1:左起第 1 位字符。这 1 个字符代表文件的类型。文件的类型比较常见的有,-
表示为普通的文件;d
表示是目录;l
表示是 symbolic link(soft Link)等。
段落 2:第 2~4 位字符。这 3 个字符代表文件所有者的权限。第 2 位字符表示 r
权限,第 3 位表示 w
权限,第 4 位表示 x
权限。如果权限位字符为 -
则表示没有该权限。
段落 3:第 5~7 位字符。这 3 个字符代表用户组的权限。权限位的字符涵义同上。
段落 4:第 8~10 位字符。这 3 个字符代表其他用户的权限(非所有者和该用户组的用户)。权限位的字符涵义同上。
4.2.3. 修改文件的权限
-
chmod
命令:改变文件的权限设置, 还可以设置 SUID, SGID, SBIT 等特殊性质的权限。
例如为文件 test 设置权限:所有者为 rwx,用户组为 rx,其他用户为 rx,则执行的命令为 chmod u=rwx, g=rx, o=rx test
上面的命令又可以简化为chmod 755 test
。即所有者、用户组、其他用户这三组权限分别用一个数值表示。
具体的转换规则如下:每一组权限有 3 个权限位字符,每个字符对应一个八进制的数字:- 第 1 位:r=4, -=0
- 第 2 位:w=2,-=0
- 第 3 位:x=1,-=0
最后将这 3 位的数值相加的和就是这一组权限的数值。例如 `-rwxr-xr-x`,对应的权限值为 `755`。计算过程如下,三组权限分别为:- rwx = 4 + 2 + 1 = 7
- r-x = 4 + 0 + 1 = 5
- r-x = 4 + 0 + 1 = 5
5. 文件的链接
Linux 中文件有两种链接方式:Hard link 和 soft link。
hard link
第 3 节我们提到了文件的存储结构,一个文件是由 inode 和数据块两部分组成的。目录下的文件名本质就是指向该文件 inode 的一个 hard link(文件名比 inode 编号更容易记忆和使用),一个文件至少有一个 hard link 文件名。
使用 ln filename newfilename
可以为一个文件创建多个 hard link 文件名。
我们用一个例子来演示,首先创建一个 demo.txt 文件,然后用这个文件创建一个 hard link 文件hdemo.txt,最后查看文件及其 inode 编号:
[root@localhost efrey]# echo 'file link demo' > demo.txt
[root@localhost efrey]# ln demo.txt hdemo.txt
[root@localhost efrey]# ls -il
total 8
110 -rw-r--r--. 2 root root 15 Sep 6 17:05 demo.txt
110 -rw-r--r--. 2 root root 15 Sep 6 17:05 hdemo.txt
从上面的例子可以看到,在当前目录中,demo.txt文件 (inode id = 110) 及其 hard link 文件名都指向同一个 inode 编号。文件的 link 数是 2(第 3 列)
即使原文件被删除,仍然可以通过 hard link 文件访问文件内容。
- soft link:
soft link 就是指向某个 path 的一个快捷方式,path 可为目录文件或普通文件。soft link 并不会增加文件的 link 数。一旦原文件名被删除,则 soft link 文件就无法找到文件的 inode。
使用 ln -s filename newfilename
可以创建 soft link。
[root@localhost efrey]# ln -s demo.txt sdemo.txt
[root@localhost efrey]# ls -il
total 8
110 -rw-r--r--. 2 root root 15 Sep 6 17:05 demo.txt
110 -rw-r--r--. 2 root root 15 Sep 6 17:05 hdemo.txt
111 lrwxrwxrwx. 1 root root 8 Sep 6 17:19 sdemo.txt -> demo.txt
可以看到,为文件 demo.txt 增加 soft link 之后,文件的 link 数量并未增加。而 ls
命令返回结果的第二列,权限信息中的第一个字母变成了 l
(symbolic link)。此时如果用rm -f demo.txt
命令删除 demo.txt,再用cat sdemo.txt
命令访问 sdemo.txt 就会收到 No such file or directory
的提示,因为虽然文件本身仍然在,但是快捷方式指向的 demo.txt 文件名被删除了。
[root@localhost efrey]# echo "I am new demo" > demo.txt
[root@localhost efrey]# ls -il
total 8
112 -rw-r--r--. 1 root root 1 Sep 6 17:25 demo.txt
110 -rw-r--r--. 1 root root 15 Sep 6 17:05 hdemo.txt
111 lrwxrwxrwx. 1 root root 8 Sep 6 17:19 sdemo.txt -> demo.txt
[root@localhost efrey]# cat sdemo.txt
I am new demo
此时再用 echo '' > demo.txt
新建文件,此时这个 demo.txt 文件的 inode 编号已经改变为 112 了,和原来的 demo.txt 已经不是同一个文件了;而我们查看 sdemo.txt 的内容已经是 112 这个 demo.txt 文件的了。
上一篇 系统目录结构