张立冬

张立冬

Linux 每个目录到底是干什么的

2026-05-10
Linux 每个目录到底是干什么的

一、Linux 和 Windows 最大的区别之一

我们先从最基础的认知差异说起:Windows 是「盘符思维」,你电脑上的存储是按照硬盘分区划分的,C盘、D盘、E盘每个分区都是独立的根,各自存自己的内容。

而 Linux 完全不一样,它没有盘符的概念。在 Linux 的世界里:一切都从 / 开始。

这个 / 叫做根目录(Root),注意这里的 root 不是指 root 管理员用户,而是整个文件系统的起点——你后面看到的所有 /etc/home/var/usr,其实都是从 / 这个根延伸出来的子目录,整个文件系统是一棵完整的树,而不是多个独立分区。

很多初学者刚接触 Linux 时会搞混这个逻辑:为什么我插了一个 U 盘,不是多出一个 F: 盘,而是要挂载到某个 existing 目录下面?本质就是因为这个设计差异——所有资源都要整合到这一棵从 / 开始的文件树里,不存在独立的盘符。


二、Linux 为什么要这样设计目录?

Linux 有一个非常经典的设计理念:一切皆文件

这句话很多人都听过,但未必理解对设计的影响:Linux 会把硬件、进程、日志、终端、网络这些几乎所有系统资源,都尽量抽象成“文件”,然后通过目录做统一的分类管理。

所以 Linux 的目录结构,更像一个经过精密规划的现代化仓库:每个区域都有明确的职责,不同类型的东西放在固定的位置,不管是人工查找还是自动化管理,都能按规则快速找到,不会乱套。

反观 Windows 的设计思路更偏向个人用户:每个软件可以自己选择安装路径,很多软件会把自己的一堆东西放在自己的目录里,时间长了整个系统就容易变得杂乱。而 Linux 从设计之初就约定好了所有类型文件的存放位置,整个系统的文件组织从根目录开始就有严格的规范。

这种设计不是为了为难初学者,而是源于 Linux 作为多用户服务器操作系统的定位——清晰的职责划分,更利于长期维护和多人协作。


三、最重要的 Linux 目录(运维必须掌握)

我们一个个来看,最核心的这些目录到底是做什么的,名字有什么由来。

1、/etc:系统配置文件的大本营

这是 Linux 最核心的目录之一,名字来源于 etcetera(等等、附加物),早期 Unix 设计时就约定这里存放所有系统级的配置文件,这个约定一直延续到了今天。

简单说:你做 Linux 运维,大部分时间改配置,都是在改 /etc 里的文件。

举几个最常见的例子:

  • 网络和域名配置:/etc/hosts(域名IP映射)、/etc/resolv.conf(DNS 配置)

  • 用户权限信息:/etc/passwd(所有用户信息)、/etc/shadow(加密后的用户密码)

  • 服务配置:/etc/ssh/(SSH 服务的所有配置)、/etc/nginx/(Nginx 的配置目录)、/etc/docker/(Docker 的配置目录)

可以说,大部分日常运维工作,本质就是修改 /etc 目录里的配置文件——这个目录的重要性怎么强调都不为过,生产环境修改前一定要做好备份。

2、/var:存放动态变化的数据

/var 的名字来自 variable,意思就是“可变的”,专门存放系统运行过程中经常变化的数据,这也是服务器出问题时排查的核心目录。

最常见的内容有几类:

  • 日志/var/log 是 Linux 系统和所有服务的日志默认存放位置,服务器出问题第一步就是看这里。比如系统核心日志放在 /var/log/messages,Nginx 访问日志一般放在 /var/log/nginx/,Apache 日志放在 /var/log/httpd/

  • 数据库数据:默认情况下 MySQL 的数据就存在 /var/lib/mysql,PostgreSQL 数据一般放在 /var/lib/postgresql/

  • 缓存和临时数据:应用的缓存一般会放在 /var/cache 目录下。

很多人遇到过服务器磁盘突然爆满的问题,十有八九是 /var 分区满了——尤其是日志没有做轮转清理,日积月累直接把磁盘占满 100%,这是企业运维中非常常见的故障场景。

3、/home:普通用户的家目录

这个其实很好理解,类似 Windows 里的 C:\Users\用户名 目录,每个普通用户登录系统后,默认都会有一个自己的家目录,路径是 /home/用户名

比如用户名叫 zhangsan,那他的家目录就是 /home/zhangsan,默认只有他自己和 root 能读写这个目录里面的内容,用来存放用户自己的文件、脚本、个人配置。

4、/root:root 管理员的家目录

很多初学者刚学 Linux 最容易搞错这个目录:/root 并不是根目录,真正的根目录是单独的 //root 只是 root 管理员用户专属的家目录。

为什么不把 root 的家目录放在 /home/root 呢?主要是设计习惯,另外 /home 有时候会作为单独分区挂载,甚至是网络挂载,系统单用户维护的时候,保证 root 目录在根分区上更可靠。

5、/tmp:临时文件目录

/tmp 是 temporary 的缩写,专门存放程序运行产生的临时文件。这个目录的特点是:系统会自动定期清理里面的文件,大部分发行版重启后都会清空 /tmp,所以千万不要把重要文件放在 /tmp 下面,说没就没了

很多程序编译、断点续传、临时交换都会用到这个目录,我们自己写脚本产生临时文件,一般也会约定放在 /tmp 下面。

6、/bin:存放基础核心命令

bin 是 binary(二进制)的缩写,存放的是系统最基础、最核心的可执行命令,比如我们天天用的 lscpmvrmcatping 这些命令,本质都是编译好的二进制程序,它们大部分都放在 /bin 下面。

因为这个目录默认已经加到系统的 PATH 环境变量里了,所以你输入命令就能直接执行,不用写全路径。

7、/sbin:存放系统管理级命令

sbin 是 system binary 的缩写,存放的是偏系统管理的命令,一般需要 root 权限才能执行,比如 reboot(重启)、shutdown(关机)、fdisk(磁盘分区)、ifconfig(网络配置)这些。

普通用户一般默认也能用这些命令,但如果没权限执行,会直接报错,这也是 /sbin 和 /bin 的核心区分:一个给普通用户用基础命令,一个给管理员用系统级命令。

8、/usr:用户安装的软件和资源

/usr 这个名字早期是 user 的缩写,本意是存放用户文件的目录,发展到现在,它已经是 Linux 里最大的目录之一,几乎所有用户安装的软件、工具、资源都放在这里面,所以也有人调侃它是 Unix System Resources 的缩写,其实是后人附会,但理解起来也对。

/usr 下面也有几个固定的子目录,约定存放不同类型的内容:

  • /usr/bin

    :存放用户安装的普通命令,和根目录的 /bin 对应,很多发行版现在已经把 /bin 链接到 /usr/bin 了,区分越来越模糊。

  • /usr/sbin

    :存放用户安装的系统管理命令,对应根目录的 /sbin

  • /usr/lib

    :存放软件依赖的库文件。

  • /usr/share

    :存放共享的资源,比如文档、图标、静态文件这些。

  • /usr/local

    :这是给用户手动编译安装第三方软件的默认目录,比如你手动编译安装 Nginx,默认就会装到 /usr/local/nginx 下面,不会和系统自带的软件混在一起。

9、/dev:把硬件抽象成文件

这是 Linux 非常有特色的一个目录,名字是 device(设备)的缩写,里面存放的都是设备文件——我们前面说过 Linux“一切皆文件”,硬件设备也会被抽象成文件放在这里,你操作这个文件就是操作硬件。

举几个常见的例子:

  • 硬盘:第一块 SATA 硬盘的设备文件是 /dev/sda,上面的第一个分区就是 /dev/sda1,非常好记。

  • 终端:当前你用的终端设备就是 /dev/tty

  • 空设备:/dev/null 这个大家肯定见过,它是一个特殊的空设备,你往里面写任何东西都会被直接丢掉,所以很多脚本里会看到 >/dev/null 2>&1 这种写法,意思就是把命令的标准输出和错误输出都丢掉,不显示出来。

  • 随机数:/dev/random 和 /dev/urandom 是内核提供的随机数设备,程序需要随机数的时候直接读这个文件就行。

这个设计非常巧妙:不管你是什么硬件,我都用文件的方式给你暴露接口,操作硬件和操作普通文件用同一套 API,大大简化了开发和使用。

10、/proc:内核暴露的系统信息窗口

这是 Linux 最神奇的目录之一,里面的内容都不是真实存在于硬盘上的文件,而是内核在内存中实时生成的虚拟文件系统,专门给用户暴露系统运行时的信息。

简单说:你想知道系统现在的 CPU、内存、进程状态,读这个目录下面的文件就行了,不需要自己写程序去内核拿数据。

常见的用法有这些:

  • 看 CPU 信息:cat /proc/cpuinfo,能看到有几个核、主频多少、是什么型号。

  • 看内存信息:cat /proc/meminfo,能看到总内存多少、用了多少、剩余多少。

  • 看进程信息:每个进程都会在 /proc/ 下面有一个以进程 PID 命名的目录,里面放了这个进程的所有运行信息,比如进程打开了哪些文件、加载了哪些库,你想看 PID 1234 的进程信息,直接去 /proc/1234 下面读就行。

  • 看系统挂载信息:cat /proc/mounts 能看到现在系统挂载了哪些文件系统。

几乎所有的监控工具,比如 top、free、ps 这些,本质都是读取 /proc 下面的信息然后展示给你,没有 /proc,这些工具根本没法工作。

除了上面这十个最核心的目录,还有几个常见目录也补充一下:

  • /boot

    :存放系统启动相关的文件,比如内核镜像、Grub 引导配置,这个目录一般启动的时候就会用到,平时很少动。

  • /sys

    :和 /proc 类似,也是一个虚拟文件系统,用来暴露内核和硬件设备的信息,现在很多驱动的信息都放在 /sys 下面。

  • /lib

    :存放系统最核心的库文件,/bin 和 /sbin 下面的命令会用到这些库。

  • /mnt

    mount 的缩写,传统上用来临时挂载其他文件系统,比如你插了 U 盘,很多系统默认会挂载到 /mnt 或者 /mnt/usb 下面。

  • /opt

    :用来存放第三方大型软件,比如有些商业软件会安装在这里,现在用的不如 /usr/local 多。


四、为什么 Linux 运维一定要懂目录结构?

很多初学者会说:我用包管理器装软件,点鼠标就能装,为什么要知道每个目录放什么?

其实你做的越多就会发现:Linux 运维大部分工作,本质都是“找东西”

  • 配置改坏了,想回滚?去 /etc 找。

  • 服务启动失败,想排错?去 /var/log 看日志。

  • 用户说自己文件丢了?去他 /home 下面找。

  • 想知道服务器 CPU 够不够用?读 /proc/cpuinfo 和 /proc/meminfo

  • 软件装完不知道放哪了?默认在 /usr 或者 /usr/local

理解目录结构,本质不是让你背下来每个名字,而是让你理解Linux 是怎么组织整个系统的——当你知道什么类型的文件一定放在什么位置,排查问题、维护系统的效率会高很多,不会像无头苍蝇一样乱找。

更重要的是,这种规范是整个社区都遵守的,你写自动化脚本的时候,可以默认配置一定在 /etc,日志一定在 /var/log,不用处理各种乱七八糟的自定义路径,这就是约定大于配置的好处。


五、为什么 Linux 越来越适合服务器?

我们回过头来看,Linux 这种目录设计,为什么能在服务器领域成为绝对主流?

核心原因就是它的设计非常符合服务器场景的需求:清晰、规范、易维护、易自动化

从根目录开始,每个目录职责明确,所有软件都遵守同一个规范,不管哪个公司、哪个维护者,都能按同样的规则找到需要的东西。

反观 Windows 服务器,很多第三方软件的安装路径五花八门,有的装在 C:\Program Files,有的装在 D:\MySoftware,配置文件可能放在安装目录,也可能放在注册表,想做自动化统一管理成本很高。

而 Linux 从设计之初就把规则定好了,不管是人工维护还是自动化运维,成本都低很多。对于需要长期稳定运行的服务器来说,这种清晰的设计带来的优势是巨大的。


六、给 Linux 小白的学习建议

很多初学者刚接触的时候,会想着要死记硬背所有目录的作用,其实完全没必要。最好的学习方法,就是自己登录到 Linux 系统里,挨个进去看:

# 先进入根目录
cd /

# 看看根下面有哪些目录
ls

然后挨个 cd 进去看看里面有什么:

cd /etc
ls

# ../ 代表上级目录(父目录)
cd ../var
ls

cd ../proc
ls

你进去看看 /etc 里面都是 .conf 结尾的配置文件,/var/log 里面都是各种日志,/proc 里面的文件都很小而且是实时变化的,看多了你自然就记住了,比死背印象深刻得多。

Linux 学习最重要的从来不是背命令背目录,而是建立对整个系统的认知——理解它为什么这么设计,每个部分做什么,比会敲十个命令有用得多。


最后

我刚学 Linux 的时候,也觉得这些目录名字又短又奇怪,完全看不懂为什么要这么起名字,感觉一点都不直观。

但用的时间长了才发现:它其实是一套高度工程化的系统设计,每个目录背后都有明确的职责,经过了几十年 Unix/Linux 发展的验证,非常实用。

当你开始理解为什么 /etc 放配置,为什么 /var 放日志,为什么 /proc 能看到系统信息,你就已经不再是“只会敲命令的初学者”,而是真正开始理解 Linux 的设计哲学了。

最后留一个问题:你刚学 Linux 的时候,最搞不懂哪个目录?欢迎在评论区留言交流。