Linux 文件系统目录功能详解
在 Linux 操作系统中,文件系统采用统一的目录树结构,所有的文件和目录都以根目录 (
/) 为起点。为了保持系统的一致性、可维护性和互操作性,Linux 社区制定了文件系统层级标准 (Filesystem Hierarchy Standard, FHS)。FHS 规定了系统中所有主要目录的用途和内容,使得不同的发行版能够遵循相同的约定,方便用户和开发者理解文件布局。本文将详细解读 Linux 系统中各个重要目录的功能。
核心思想:遵循 FHS,将文件和目录组织成逻辑结构,区分系统核心、用户数据、临时文件等,以提高系统的健壮性、安全性和可管理性。
一、文件系统层级标准 (FHS)
FHS 定义了 Linux 文件系统根目录下各个子目录应包含的内容。它旨在确保 Linux 和其他类 Unix 系统之间的互操作性,让用户和管理员能够更容易地找到文件,并保证软件能够正确地安装在期望的位置。
FHS 将目录分为两类:
- 静态 (Static) 与 可变 (Variable):
- 静态文件:在系统重启或服务停止后保持不变,不随系统运行而改变(例如,
/bin中的程序二进制文件)。 - 可变文件:在系统运行过程中会不断变化(例如,
/var/log中的日志文件)。
- 静态文件:在系统重启或服务停止后保持不变,不随系统运行而改变(例如,
- 可共享 (Shareable) 与 不可共享 (Unshareable):
- 可共享文件:可以在多台主机之间共享的文件(例如,
/usr中的大部分内容)。 - 不可共享文件:特定于某台主机的文件(例如,
/etc中的配置文件)。
- 可共享文件:可以在多台主机之间共享的文件(例如,
二、根目录 (/)
根目录是 Linux 文件系统层次结构的起点,所有其他目录都直接或间接的挂载在根目录下。
三、主要目录功能详解
以下是根据 FHS 标准,Linux 系统中常见的顶级目录及其主要功能:
3.1 /bin (Binary)
- 功能:存放所有用户(包括
root用户)都可以使用的基本命令,这些命令在系统启动和修复模式下也是必需的。 - 特性:
- 不可共享 (Unshareable)
- 静态 (Static)
- 包含单用户模式下所需的工具。
- 常见内容:
ls,cp,mv,rm,cat,mkdir,echo,bash等。
3.2 /sbin (System Binary)
- 功能:存放只有系统管理员 (root) 或需要特殊权限才能执行的基本系统管理命令。这些命令同样在系统启动和修复模式下是必需的。
- 特性:
- 不可共享 (Unshareable)
- 静态 (Static)
- 包含单用户模式下所需的工具。
- 常见内容:
fdisk,reboot,shutdown,mount,fsck,ifconfig(在某些系统上已被ip取代) 等。
3.3 /etc (Editable Text Configuration)
- 功能:存放所有系统级别的配置文件。这些文件控制着整个系统的行为,以及各种服务和应用程序的配置。
- 特性:
- 不可共享 (Unshareable)
- 静态 (Static)
- 通常是 ASCII 文本文件,可以直接编辑。
- 常见内容:
passwd,shadow,fstab,resolv.conf,hosts,nginx.conf, Apache/Nginx 配置目录 (/etc/apache2/,/etc/nginx/),systemd配置文件 (/etc/systemd/) 等。
3.4 /dev (Device)
- 功能:存放所有的设备文件。在 Unix/Linux 系统中,设备被抽象为文件,通过读写这些文件来与硬件设备进行交互。
- 特性:
- 不可共享 (Unshareable)
- 动态 (Variable) (由内核和
udev动态维护)
- 常见内容:
- 块设备:
sda,sdb(硬盘),sdb1(硬盘分区) - 字符设备:
tty(终端),lp0(打印机),null,zero,random等。
- 块设备:
3.5 /proc (Process Information)
- 功能:这是一个虚拟文件系统,不存储在磁盘上,而是由内核动态生成,用于提供进程信息以及内核和系统参数。
- 特性:
- 不可共享 (Unshareable)
- 动态 (Variable)
- 每次访问时都会实时生成。
- 常见内容:
- 每个正在运行的进程都有一个以其 PID 命名的目录 (
/proc/1234),包含cmdline,status,fd等信息。 cpuinfo,meminfo(CPU 和内存信息)filesystems(当前支持的文件系统)sys(通过修改/proc/sys下的文件可以实时调整内核参数)。
- 每个正在运行的进程都有一个以其 PID 命名的目录 (
3.6 /sys (System Information)
- 功能:这也是一个虚拟文件系统,由内核动态生成,用于暴露内核对象 (kernel objects) 的属性,如设备、驱动、文件系统等,提供一个统一的接口来访问和修改内核的内部状态。
- 特性:
- 不可共享 (Unshareable)
- 动态 (Variable)
- 常见内容:
class,bus,devices等,用于管理硬件设备和驱动。
3.7 /var (Variable)
- 功能:存放可变数据,即在系统正常运行期间内容会不断变化的文件。它包含了日志文件、邮件队列、打印队列、运行时数据等。
- 特性:
- 不可共享 (Unshareable)
- 可变 (Variable)
- 通常建议单独挂载一个分区,以防止日志文件填满根分区。
- 常见子目录:
/var/log:系统和应用程序日志文件(如syslog,auth.log, Web 服务器访问日志)。/var/mail:用户邮箱。/var/spool:打印队列、crontab 任务队列等。/var/tmp:比/tmp更持久的临时文件,通常不会在系统重启时删除。/var/lib:服务或应用运行时需要修改的状态数据(如数据库数据)。/var/www:Web 服务器的默认根目录(特定发行版和配置)。/var/run:自FHS 2.3后已被/run取代。
3.8 /tmp (Temporary)
- 功能:存放系统和用户创建的临时文件。
- 特性:
- 不可共享 (Unshareable)
- 可变 (Variable)
- 通常在系统每次重启时都会被清空,或由系统定期清理。
- 常见内容:各种应用程序运行时的临时文件。
3.9 /usr (Unix System Resources)
- 功能:存放绝大多数用户级应用程序和文件,包括非必要的二进制文件、库、文档和源代码。
- 特性:
- 可共享 (Shareable)
- 只读 (Read-only) (在正常运行期间,内容不应被编辑,因此可以被多台主机挂载为只读)
- 常见子目录:
/usr/bin:非必要的用户命令(不属于/bin中的基本命令)。/usr/sbin:非必要的系统管理命令(不属于/sbin中的基本命令)。/usr/local:本地安装软件的目录,用于存放那些不通过发行版包管理器安装的软件。通常包含bin,sbin,lib,etc等子目录。/usr/lib:非必要的共享库。/usr/share:与架构无关的共享数据,如文档、man 页、字体、图标等。/usr/include:C/C++ 头文件。/usr/src:内核源代码。
3.10 /opt (Optional)
- 功能:存放可选的第三方应用程序软件包。这些软件包通常独立于系统,并安装在自己的子目录下。
- 特性:
- 可共享 (Shareable)
- 只读 (Read-only)
- 通常用于商业软件或自行编译的大型应用。
- 常见内容:
/opt/google/chrome,/opt/spotify等。
3.11 /home (Home)
- 功能:存放普通用户的家目录。每个用户通常都有一个独立的子目录,用于存储用户的个人配置文件、文档、图片、下载等数据。
- 特性:
- 不可共享 (Unshareable) (用户数据通常特定于主机)
- 可变 (Variable)
- 常见内容:
/home/username/包含.bashrc,.profile,.config,Documents,Downloads等。
3.12 /root (Root’s Home)
- 功能:Root 用户的家目录。与普通用户的目录
/home/username不同,root用户的家目录直接位于根目录下。 - 特性:
- 不可共享 (Unshareable)
- 可变 (Variable)
- 当
/home分区不可用时,root用户仍然能够正常登录和工作。
3.13 /lib 和 /lib64 (Library)
- 功能:存放基本共享库,这些库是
/bin和/sbin中的二进制程序所必需的。 - 特性:
- 不可共享 (Unshareable)
- 静态 (Static)
/lib64用于 64 位系统中的 64 位库。
- 常见内容:
ld-linux.so,libc.so.6等。
3.14 /media
- 功能:用作可移动媒体 (如 USB 驱动器、CD/DVD-ROM) 的挂载点。
- 特性:
- 不可共享 (Unshareable)
- 动态 (Variable)
- 通常由桌面环境或
udev自动管理。
3.15 /mnt (Mount)
- 功能:传统的临时文件系统挂载点。通常用于手动临时挂载其他文件系统(例如,临时挂载另一个硬盘分区或网络共享)。
- 特性:
- 不可共享 (Unshareable)
- 动态 (Variable)
3.16 /boot (Boot)
- 功能:存放引导加载程序 (boot loader) 所需的文件,如内核 (
vmlinuz)、初始化内存盘 (initramfs或initrd) 以及引导加载程序配置文件 (grub.cfg)。 - 特性:
- 不可共享 (Unshareable)
- 静态 (Static)
- 独立于其他文件系统分区,通常很小,只包含启动相关数据。
- 常见内容:
/boot/vmlinuz-*,/boot/initramfs-*,/boot/grub/。
3.17 /srv (Service Data)
- 功能:存放服务相关的数据。例如,如果运行一个 FTP 服务器,其数据可能存放在
/srv/ftp;如果运行一个 Web 服务器,其数据可能存放在/srv/www。 - 特性:
- 不可共享 (Unshareable)
- 可变 (Variable)
- 通常用于特定于站点提供的数据。
- 常见内容:
/srv/www(Web 服务数据),/srv/ftp(FTP 服务数据)。
3.18 /run (Runtime Variable Data)
- 功能:存放系统启动以来生成的运行时可变数据。这是现代 Linux 系统用来取代
/var/run的目录。它是一个内存文件系统 (tmpfs),因此在系统重启时会被清空。 - 特性:
- 不可共享 (Unshareable)
- 可变 (Variable)
- 临时性 (重启清空)
- 常见内容:进程 ID 文件 (
.pid文件)、套接字 (.sock文件)、锁文件等。
四、理解和记忆目录结构的技巧
bin和sbin家族:记住它们是“二进制文件” (Binary) 和“系统二进制文件” (System Binary),分别对应用户和管理员的基本命令。前面不带usr的 (/bin,/sbin) 是系统启动和修复所“必须”的。带有usr的 (/usr/bin,/usr/sbin) 是系统正常运行时“非必须”的。/etc:发音像 “et cetera” (等等,及其他),但实际是 “editable text configuration” (可编辑的文本配置)。/var:Var-iable,可变的数据。/usr:过去曾代表 “User’s programs” (用户程序),现在更像是 “Unix System Resources” (Unix 系统资源),存放大部分应用程序和共享数据。/proc和/sys:它们是虚拟文件系统,由内核动态生成,用于进程和系统信息。/tmp和/var/tmp:都是临时文件,但/tmp重启清空,/var/tmp则更持久。/lib和/usr/lib与/lib64:lib是 Library (库文件),用于存放二进制程序所需的共享库。
五、总结
Linux 的文件系统目录结构通过遵循 FHS 标准,提供了一个清晰、逻辑化的文件组织方式。这不仅有助于系统管理员进行维护和故障排除,也为应用程序的安装和运行提供了统一的环境。理解和掌握这些目录的功能是有效管理 Linux 系统,以及进行系统编程和自动化运维的基础。通过这些约定,Linux 系统能够维持其强大的灵活性和稳定性。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 1024 维度!
