乐趣区

Linux快速入门1一一-文件系统简介

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 文件的了。

上一篇 系统目录结构

退出移动版