在 Linux/Unix 操作系统中,一切都是文件,甚至目录也是文件,文件是文件,鼠标、键盘、打印机等设备也是文件。这篇文章,我们将一起学习 Linux 中的目录结构。
Linux 的文件类型 {#Linux-的文件类型}
Linux系统中的文件系统,一般分为 3种类型:
- 普通文件:也称为一般文件,可能是图像、视频、程序或简单的文本文件。这些类型的文件可以是 ASCII 或二进制格式。这是 Linux 系统中最常用的文件类型。
- 目录文件:这些类型的文件是其他文件类型的仓库,它可以是目录中的目录(子目录)。
- 设备文件:在类似 Windows 的操作系统中,设备如 CD-ROM 和硬盘驱动器用驱动器字母表示,如 F:、G:、H:,而在 Linux 系统中,设备表示为文件。例如,/dev/sda1、/dev/sda2 等。
我们知道,在类似 Windows 的操作系统中,文件存储在不同数据驱动器上的不同文件夹中,如 C:、D:、E:,而在 Linux/Unix 操作系统中,文件存储在一个类似树状结构中,以根目录开始,如下图所示。
目录结构 {#目录结构}
Linux/Unix 文件系统层次结构以根目录为基础,一切都从根目录开始,总起来说分为以下 2种:
- 顶级目录
- 其他目录
顶级目录 {#顶级目录}
| 目录 | 描述 | |-------|-------------------| | /bin | 二进制或可执行程序。 | | /etc | 系统配置文件。 | | /home | 用户的主目录。它是默认的当前目录。 | | /opt | 可选或第三方软件。 | | /tmp | 临时空间,通常在重启时清空。 | | /usr | 用户相关的程序。 | | /var | 日志文件。 |
其他目录 {#其他目录}
| 目录 | 描述 | |-------------|--------------------------------------------| | /boot | 包含所有启动相关的信息文件和文件夹,如 conf、grub 等。 | | /dev | 设备文件的位置,如 dev/sda1、dev/sda2 等。 | | /lib | 包含内核模块和共享库。 | | /lost+found | 用于查找恢复的损坏文件的碎片。 | | /media | 包含插入的可移动媒体设备的子目录。 | | /mnt | 包含用于挂载文件系统的临时挂载目录。 | | /proc | 一个虚拟和伪文件系统,包含有关运行进程的信息,特定的进程 ID 或 PID。 | | /run | 存储易失的运行时数据。 | | /sbin | 管理员的二进制可执行程序。 | | /srv | 包含特定于服务器的文件。 | | /sys | 一个用于现代 Linux 发行版的虚拟文件系统,用于存储和允许修改连接到系统的设备。 |
文件类型 {#文件类型}
Linux 是一个非常复杂的系统,需要一种高效的方式来启动、停止、维护和重启系统,在 Linux 系统中,每个进程都有一些定义良好的配置文件、二进制文件、手册页信息文件可用。
在 Linux系统中,文件系统可以分为以下几种:
- 内核文件
- 设备文件
- 系统配置文件
- 用户相关文件
- 虚拟和伪进程相关文件
- 版本信息文件
- 日志文件
各种文件的具体信息如下说明:
内核文件 {#内核文件}
- /boot/vmlinux:Linux 内核文件。
设备文件 {#设备文件}
- /dev/hda:第一个 IDE 硬盘的设备文件。
- /dev/hdc:一个伪设备,将垃圾输出重定向到 /dev/null。
系统配置文件 {#系统配置文件}
系统配置文件及其描述如下表:
| 配置文件 | 描述 | |-------------------|------------------------------| | /etc/bashrc | 由 bash shell 使用,包含系统默认设置和别名。 | | /etc/crontab | 一个 shell 脚本,在预定义时间间隔运行指定命令。 | | /etc/exports | 包含网络上可用的文件系统的信息。 | | /etc/fstab | 磁盘驱动器及其挂载点的信息。 | | /etc/group | 一个文本文件,定义安全组的信息。 | | /etc/grub.conf | grub 引导加载程序配置文件。 | | /etc/init.d | 服务启动脚本。 | | /etc/lilo.conf | lilo 引导加载程序配置文件。 | | /etc/hosts | IP 和相应主机名的信息。 | | /etc/hosts.allow | 允许访问本地机器上服务的主机列表。 | | /etc/host.deny | 拒绝访问本地机器上服务的主机列表。 | | /etc/inittab | INIT 进程及其在各个运行级别的交互。 | | /etc/issue | 允许编辑登录前消息。 | | /etc/modules.conf | 系统模块的配置文件。 | | /etc/motd | 包含当天的消息。 | | /etc/mtab | 当前挂载的块信息。 | | /etc/passwd | 包含系统用户的用户名、密码的影子文件。 | | /etc/printcap | 打印机信息。 | | /etc/profile | Bash shell 默认设置。 | | /etc/profile.d | 包含其他脚本,如应用程序脚本,登录后执行。 | | /etc/rc.d | 避免脚本重复。 | | /etc/rc.d/init.d | 运行级别初始化脚本。 | | /etc/resolv.conf | 系统使用的 DNS。 | | /etc/security | 包含允许 root 登录的终端名称。 | | /etc/skel | 初始化新用户主目录的脚本。 | | /etc/termcap | 一个 ASCII 文件,定义不同类型终端的行为。 | | /etc/X11 | 目录树,包含 X-window 系统的所有配置文件。 |
用户相关文件 {#用户相关文件}
用户相关文件及其描述如下表:
| 用户相关文件 | 描述 | |--------------|-------------------| | /usr/bin | 包含大多数可执行文件。 | | /usr/bin/X11 | /usr/bin 的符号链接。 | | /usr/include | 包含 C 程序使用的标准文件。 | | /usr/share | 包含架构无关的可共享文本文件。 | | /usr/lib | 包含目标文件和库。 | | /usr/sbin | 包含超级用户的命令,用于系统管理。 |
虚拟和伪进程相关文件 {#虚拟和伪进程相关文件}
虚拟和伪进程相关文件及其描述如下表:
| 虚拟和伪进程相关文件 | 描述 | |-------------------|----------------------| | /proc/cpuinfo | CPU 信息 | | /proc/filesystems | 保存当前运行的进程的有用信息。 | | /proc/interrupts | 保存每个 IRQ 中断次数的信息。 | | /proc/ioports | 包含服务器上设备使用的所有输入输出地址。 | | /proc/meminfo | 报告内存使用信息。 | | /proc/modules | 当前使用的内核模块。 | | /proc/mount | 挂载文件系统信息。 | | /proc/stat | 显示当前系统的详细统计信息。 | | /proc/swaps | 包含交换文件信息。 |
版本信息文件 {#版本信息文件}
- /version:显示 Linux 版本信息。
日志文件 {#日志文件}
日志文件及其描述如下表:
| 日志文件 | 描述 | |-------------------|-----------------| | /var/log/lastlog | 存储用户的最后登录信息。 | | /var/log/messages | 包含所有全局系统消息。 | | /var/log/wtmp | 保留登录和注销信息的历史记录。 |
要检查 Linux 目录,打开终端并执行 cd /
切换到根目录,列举根目录下所有可用目录的列表使用 ls
指令,如下所示。
到此为止,我们已经把 Linux中的目录和文件都系统性的总结完了,接下来,我们需要分析下,Linux中一切皆文件的设计思想。
Linux一切皆文件思想 {#Linux一切皆文件思想}
在 Linux 中"一切皆文件"这一理念是其设计哲学的核心之一,这个理念有助于简化系统的设计和使用,使得不同类型的资源可以通过统一的接口进行管理和访问。这种设计哲学有以下几个主要原因和优势:
统一接口 {#统一接口}
通过将所有资源(包括硬件设备、进程、网络接口等)都视为文件,Linux 提供了一个统一的接口来访问和管理这些资源。这样,用户和程序不需要为不同类型的资源编写不同的代码,只需使用标准的文件操作接口(如打开、读取、写入和关闭文件)即可。
简化编程 {#简化编程}
因为所有资源都被视为文件,程序员可以使用相同的系统调用来操作不同类型的资源。这大大简化了编程任务,使得代码更容易编写、阅读和维护。
灵活性 {#灵活性}
这种设计使得系统更具灵活性。例如,通过创建设备文件(如 /dev/sda1)可以轻松地访问硬件设备,而无需了解底层的硬件细节。也可以通过挂载网络文件系统来访问远程资源,就像访问本地文件一样。
模块化设计 {#模块化设计}
Linux 系统的模块化设计允许不同的文件系统、设备驱动和其他内核模块通过统一的文件接口进行集成和交互。这使得系统可以更容易地扩展和维护。
易于调试和监控 {#易于调试和监控}
因为所有资源都可以通过文件系统访问,系统管理员可以使用熟悉的文件操作工具(如 cat、ls、echo 等)来调试和监控系统。例如,可以通过访问 /proc 文件系统来查看和修改内核参数,或通过 /sys 文件系统来查看和控制硬件设备。
增强安全性 {#增强安全性}
通过将资源表示为文件,Linux 可以利用文件系统的权限机制来控制对这些资源的访问。这有助于增强系统的安全性,因为可以精确地控制哪些用户和进程可以访问哪些资源。
下面,我们将使用 Python 代码来读取一个普通文件、访问一个设备文件和读取 /proc 文件系统中的信息:
|------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import os def read_text_file(file_path): with open(file_path, 'r') as file: return file.read() def read_device_file(device_path): with open(device_path, 'rb') as file: return file.read(1024) # 读取前 1024 字节 def read_proc_file(proc_path): with open(proc_path, 'r') as file: return file.read() if __name__ == "__main__": # 读取普通文件 text_file_content = read_text_file('/etc/hostname') print("Content of /etc/hostname:") print(text_file_content) # 读取设备文件(需要超级用户权限) try: device_file_content = read_device_file('/dev/sda') print("\nContent of /dev/sda (first 1024 bytes):") print(device_file_content) except PermissionError: print("\nPermission denied: Unable to read /dev/sda. Please run as root.") # 读取 /proc 文件系统中的信息 proc_file_content = read_proc_file('/proc/cpuinfo') print("\nContent of /proc/cpuinfo:") print(proc_file_content)
|
代码解释
- 读取普通文件: 使用 read_text_file 函数读取 /etc/hostname 文件的内容,并将其打印出来。
- 读取设备文件: 使用 read_device_file 函数尝试读取 /dev/sda 设备文件的前 1024 字节内容。这需要超级用户权限,如果权限不足,会捕获 PermissionError 异常并打印提示信息。
- 读取 /proc 文件系统中的信息: 使用 read_proc_file 函数读取 /proc/cpuinfo 文件的内容,并将其打印出来。这个文件包含关于 CPU 的详细信息。
通过这个示例,我们可以看到如何在 Linux 中使用统一的文件接口来访问不同类型的资源,包括普通文件、设备文件和虚拟文件系统中的信息。
总结 {#总结}
本文,我们系统性的总结了 Linux的目录和文件以及 Linux系统中一切皆文件的设计思想,作为程序员,我们很多时候都需要和 Linux或者类 Linux系统打交道,因此,如果我们能正确理解 Linux 目录和文件结构,就可以快速的适应和掌握 Linux的相关知识。