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