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(二进制)的缩写,存放的是系统最基础、最核心的可执行命令,比如我们天天用的 ls、cp、mv、rm、cat、ping 这些命令,本质都是编译好的二进制程序,它们大部分都放在 /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 的时候,最搞不懂哪个目录?欢迎在评论区留言交流。