4 文件系统的层次结构
文件系统是Ubuntu的核心内容之一。在Linux系统中,一切都是文件,而文件系统就是文件的组织和管理方式。可以这么说,在本书中除前3章外,其余的所有章节都会涉及文件系统。深入理解和掌握文件系统是每个Linux学习者都必须面对的问题。而掌握好文件系统,Linux系统中的许多难题都会迎刃而解。
本章将介绍什么是文件系统、文件系统的层次结构、Linux 文件系统的组织结构、Linux中常见的文件类型以及如何管理文件权限等。
本章主要涉及的知识点有:
- 文件系统的层次结构:主要介绍Linux的树形文件系统结构以及路径名等
- 文件类型:主要介绍Linux系统常见的文件类型,例如普通文件、目录文件、特殊文件、链接文件以及管道文件等
- 文件权限:主要介绍文件权限的管理,包括显示文件权限、修改文件权限、设置文件权限以及其他的文件权限管理等
4.1 文件系统的层次结构
在Linux系统中,最小的数据存储单位为文件。"一切都是文件"是Linux和UNIX一致贯彻的原则。也就是说,在Linux中,所有的数据都是以文件的形式存在的,包括设备。为了便于访问文件,Linux按照一定的层次结构来组织文件系统。本节对Linux的文件系统的层次结构进行介绍。
4.1.1 树形层次结构
在Windows系统中,存储空间首先分为不同的硬的,在各个硬盘上再划分分区,在每个分区上创建文件系统,在文件系统中创建不同的目录,在目录下再创建一个或者多个子目录。所以。尽管Windows 的文件组织也是树形的层次结构,但是这个树形结构的根却不是唯一的,基本上每个分区都是一个相对独立的树形结构,且树与树之间并没有什么必然的联系,如图4-1所示。

图4-1 Windows 文件系统结构
但是在Linux系统中,所有的存储空间和设备共享一个根目录,不同的磁盘块、不同的分区再挂载上成为某个子目录的子目录,甚至设备也挂载成某个子目录下的一个文件,如图4-2所示。与Windows 相比,观念上有比较大的区别,因此,在理解和使用Linux 文件系统时一定要注意。

图4-2 Linux 文件系统层次结构
在创建 Linux 文件系统时,至少需要有一个根文件系统,作为整个文件系统树的根节点。然层用户可以根据自己的实际情况来创建其他的文件系统,例如 home、boot、var、opt、usr、swap等子目录。 当然,这些目录不一定都是以文件系统(分区)的形式存在的,也可能仅仅是根文件系统中的一个子目录。
Linux专门提供了一个名称为tree的命令,用来查看这种树形的层次结构,如下所示。
root@node1:~# tree /home/
/home/
└── bdqn
├── 公共的
├── 模板
├── 视频
├── 图片
├── 文档
├── 下载
├── 音乐
├── 桌面
└── snap
└── snapd-desktop-integration
├── 178
│ ├── 公共的
│ ├── 模板
│ ├── 视频
│ ├── 图片
│ ├── 文档
│ ├── 下载
│ ├── 音乐
│ └── 桌面
├── common
└── current -> 178
22 directories, 0 files
在上面的命令中,参数/home表示要列出其树形结构的路径。关于这个命令的详细使用方法,将在后面的章节中介绍。
在Linux系统中,分区和目录的关系如下:
- 任何一个分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。
- 目录是逻辑上的区分,分区是物理上的区分。
- 根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。
注意:创建不同分区(文件系统)的目的是可以把不同资料分别放入不同分区中管理,降低风险。另外,大硬盘搜索范围大,效率低,创建分区(文件系统)后可以提高效率。磁盘配频只能对分区进行设定。/home/var/usr/local经常是单独分区,因为经常会操作,容易产生碎片。
4.1.2 路径名
通过前面的介绍,可以得知在Linux文件系统中,每个子目录都是整个目录树中的一个中间节点。从根目录开始到达每个子目录都需要经过一条路线,这条路线在Linux中称为路径。因此,路径就是到达某个目录中间所有的子目录的组合。例如:
/home/bdqn
就是一个路径,该路径从根目录开始,中间经过了home目录,然后到达bdqn子目录。
在Linux中,路径分为绝对路径和相对路径,下面分别进行介绍。
1、绝对路径
所谓绝对路径,是指从根目录开始算起的路径,例如/var、/usr、/bin、/var/log等。也就是说,如果看到一个以/开始的路径,那么它一定是绝对路径。通过绝对路径可以非常清楚地表达目标文件在整个目录树中的位置。
那么用户如何判断当前所在的路径呢?Linux提供了一个名称为pwd的命令来显示用户当前所处的位置。pwd 是一个使用非常频繁的命令,其含义是打印当前工作目录,如下所示:
root@node1:/home/bdqn# pwd
/home/bdqn
2、绝对路径
顾名思义,相对路径是相对于当前的路径而言的。也就是说,如果一个路径从当前的路径算起,则一定是相对路径。
在Linux中,相对路径有4种表示方法,分别为.、..、~user以及~。其中,表示当前路径;表示父路径;~user表示某个用户的主目录,其中user表示用户账号;~则表示当前用户的主目录,例如,以下路径都是相对路径:
root@node1:/home/bdqn# cd .
root@node1:/home/bdqn# cd ..
root@node1:/home# cd
其中,/doc表示当前路径下的doc目录,../log表示父路径中的log目录,cd表示账号为root的用户的主目录。
使用相对路径的好处是可以不受绝对路径的限制。这在创建配置文件的时候非常有用。因为应用程序可能会根据实际需要迁移到不同的位置,如果用户使用相对路径来表示配置文件,则通常不需要修改配置;如果采用绝对路径表示,则必须根据新的路径进行修改。
另外,使用相对路径可以简化路径的输入。如果用户的当前位置的绝对路径比较长,在进行目录切换时,如果使用绝对路径,则必须每次都把从根目录开始算起的完整路径输入进去;如果使用相对路径,则会极大地简化路径。例如,如果想要切换到当前目录中的某个子目录,则只需要执行以下命令即可:
root@node1:/var/log#
或者
root@node1:/var# cd log/
如果使用绝对路径,则需要执行以下命令:
root@node1:~# cd /var/log/
4.1.3 Linux 目录结构
由于历史的原因,Linux的目录组织参考了UNIX的做法,而UNIX对于系统目录的组织和全名是有一定的规律可循的。下面通过tree命令列出当前系统中根目录下的所有目录:
root@node1:/var/log# tree / -L 1
/
├── bin -> usr/bin
├── boot
├── cdrom
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib32 -> usr/lib32
├── lib64 -> usr/lib64
├── libx32 -> usr/libx32
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── snap
├── srv
├── swapfile
├── sys
├── tmp
├── usr
└── var
24 directories, 1 file
表4-1 列出了部分常见的系统目录及其功能。
表4-1 常见的系统目录及其功能
|--------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 目 录 | 说 明 |
| /bin | 包含系统管理员、系统以及普通用户可以使用的各种可执行命令,例如cp、cat、ed以及tar等 |
| /boot | 该目录与系统引导有关,包括系统引导程序、Linux内核文件vmlinuz、磁盘内存映像文件initrd。img 以及 GRUB 引导程序和配置文件等 |
| /cdrom | 光盘挂载点,用户可以通过该挂载点访间光盘上的文件 |
| /dev | 该目录包含当前系统支持的所有的设备文件。例Console表示控制台,mem表示系统的 物理内存,sda表示连接到主控制器的第一个磁盘 |
| /etc | 该目录可以说是Linux的控制中心,包含与系统和应用程序有关的各种配置文件,例如passwd、rc、host。conf以及init等 |
| /home | 用户主目录的根目录。每创建一个新的用户,就会在该目录下创建一个新的子目录,子目录以用户账号命名 |
| /lib 和 lib64 | 该目录包含所有与系统和应用程序有关的可以共享的库文件。前者为32位,后者为64位 |
| /lost+found | 每个文件系统都会包含一个该目录,用来存放tsck命令在检测和修复文件系统时删除的目录或者文件 |
| /media | 该目录为移动介质的挂载点。例如,当用户插入U盘或者移动硬盘时,Linux系统会自动格该设备挂载到该目录下的一个子目录中 |
| /mnt | 文件系统的临时挂载点。用户可以临时将其他的文件系统挂载到该目录下使用 |
| /opt | 各可选应用程序的安装位置 |
| /proc | 各进程文件的存放位置。该目录比较特殊,是一个虚拟的文件系统,其中不包括任何物理文件,而是可以访问的当前系统的各种信息,例如CPU、内存、各进程对应的文件以及系统运行时间等。例如,通过/proc/cpuinfo 文件可以了解到当前系统的CPU信息,通过/proc/meminfo 可以了解到当前系统的内存信息等 |
| /root | root用户的主目录 |
| /sbin | 该目录包含与系统管理有关的可执行文件,普通用户不可以使用 |
| /sys | 该目录包含各种系统设备的配置信息,例如/sys/bus目录包含与系统总线有关的配置信息 |
| /tmp | 系统临时目录 |
| /usr | 该目录比较特殊,可以作为根目录下的一个子目录,也可以作为一个单独的文件系统。其中包含多种共享数据文件,例如命令、库函数、头文件以及各种应用程序的文档等 |
| /var | 该目录同样可以作为根目录的子目录,也可以单独作为一个文律系统,包含各种可变的数据文件,例如日志文件 |