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

上一篇 系统目录结构

相关推荐