刚接触 Linux 的人,最容易懵掉的是什么?不是命令记不住,而是不知道什么文件该放在哪里,出了问题也不知道去哪里翻。比如,你改了 Nginx 的配置,明明保存了,重启后却怎么都不生效;你怀疑是磁盘空间的问题,df -h一看根分区确实满了,但想找出到底是哪个大文件在作怪,却毫无头绪。这些场景看着是命令不熟,根子上其实是对 Linux 目录结构没有一个整体的认识。
市面上讲 Linux 目录的文章不少,但大多是给你甩一张目录树,标一句“系统配置文件存放目录”“用户家目录”就完事了。看完记住了,过两天又忘。这篇不一样,我会从实际干活的角度,把 Linux 里最常用、最容易踩坑的目录逐个拆开,讲清楚它们是干什么的、什么情况下你需要动它们、动了以后可能出什么问题,以及排查问题的时候该去哪里找线索。配合命令实操和一点个人经验,保证你看完能直接用上。
1. 先搞懂 Linux 目录的底层逻辑
1.1 一切从根目录开始:挂载点的理解是关键
Windows 用盘符来区分存储位置,C 盘、D 盘各管各的。Linux 不一样,它所有的文件都挂在一棵倒挂的树下面,树根就是/,也就是根目录。你的系统盘、数据盘、U 盘、光驱,统统要通过“挂载”这个动作,接到这棵树的某个目录下面,这个目录就是挂载点。
举个例子。你的系统装在硬盘 A 上,根分区挂在/;数据盘硬盘 B 不想混在一起,你可以把它挂到/data。那么/data这个目录的内容,实际上就是硬盘 B 的内容。你在/data里新建文件,写的是硬盘 B;你卸载掉这块盘,/data目录就空了。这种“目录只是入口”的设计,才是理解 Linux 文件系统的基础。
挂载点这个概念不是纯理论,排查问题的时候特别有用。你df -h看磁盘占有率,它显示的是每一个挂载点的使用情况。如果根分区/满了,但/data还空着很多,那说明大文件都堆在根分区那边了。如果所有挂载点都满了,那就得全局清理。反过来,如果/home是独立分区,那/home满了但/没满,说明是普通用户的数据占满了家目录,系统本身还没到危险线——这种区分能帮你快速缩小排查范围。
1.2 FHS 标准:为什么“猜”路径也能猜对八成
Linux 目录不是随便定的,国际上有个文件系统层次标准,也就是 FHS(Filesystem Hierarchy Standard),专门定义了哪些目录放什么内容。虽然不同发行版会有自己的细微差别,但大框架基本一致。理解了 FHS 的核心思路——静态与动态分离、可共享与不可共享分离、按功能而非按设备划分,你就能理解为什么/usr和/home经常被建议单独分区。
所谓静态与动态分离,指的是系统运行需要的基础程序和系统数据是相对静态的,而日志、缓存、用户数据这些是持续变化的。所谓可共享与不可共享,指的是某些目录的内容可以在多台机器之间共享(比如/usr里的公共程序),而/etc这样的机器相关配置不能共享。理解这两个原则,你就能明白一个常识:日常备份和监控重点盯着/etc、/home、/var这几个目录,而系统升级主要动/usr、/lib等目录,两者互不干扰。
还有一个实用价值:当你看到一个陌生的路径,比如/var/log/nginx/access.log,你能根据路径结构大致猜出它是“动态数据目录里的日志子目录里的 Nginx 访问日志”。这个能力比记住几千条命令更有用,因为到了新环境、新发行版,目录结构大同小异,你依然能快速找到想要的配置和日志文件。
2. 高频目录逐个拆解:它们到底是干什么的
2.1 家目录与用户空间:/home、/root
普通用户的个人文件都存在/home下面,每个用户对应一个子目录。这个目录的设计初衷是存放用户的个人配置文件、文档、代码、下载的内容。比如用户名为zhang,那他的家目录就是/home/zhang,登录系统后自动进入这个目录,环境变量$HOME就指向这里。
家目录里的隐藏文件(名字以点开头)要注意,像.bashrc、.profile、.bash_history这些,分别管着 shell 的环境配置、登录时执行的初始化命令、历史命令记录。不少新手改环境变量满世界找文件,最后发现其实就躺在自己家目录下的.bashrc里。在家目录里装软件、跑服务之前,先确认一下磁盘空间够不够,因为独立分区场景下/home往往是单独挂载的,空间和根分区互不相干。
/root是超级管理员 root 用户的家目录,因为 root 权限太高,普通用户进不去。不在 root 下乱删文件,不把 root 家目录当成临时下载目录,这是基本的系统管理素养。个人经验:我习惯在/root下面建一个scripts目录,把自己写的运维脚本都扔进去,再把scripts加到 PATH 里。时间长了,这个目录就成了我自己的“命令仓库”,换机器第一件事就是把它搬过去。
2.2 系统配置中枢:/etc
如果说 Linux 系统有“大脑”,那/etc就是大脑里的“记忆区”。几乎所有全局配置文件都放在这里。网络配置、用户信息、服务启动参数、软件认证信息,全部集中在/etc下。看几个最常见的:/etc/passwd和/etc/group是用户和用户组的基本信息库;/etc/fstab描述了文件系统的挂载规则,开机自动挂载全靠它;/etc/ssh/sshd_config管着 SSH 服务的行为;/etc/nginx/nginx.conf、/etc/mysql/my.cnf之类的应用配置文件也都在这里扎堆。
修改/etc下的文件需要格外小心。一个低级错误就能让服务起不来,甚至系统开不了机。我的经验是:改任何/etc下的配置之前,先复制一份备份。比如要改/etc/nginx/nginx.conf,就先执行cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak。别嫌麻烦,等你改坏了一个几百行的配置文件,想凭记忆恢复的时候,就会无比感谢当初这秒钟的备份。
另外,/etc里的配置改动大部分不会立即生效。有的服务需要重启(systemctl restart xxx),有的只需要重新加载(systemctl reload xxx)。两者的区别在于:reload 是平滑重载配置,不中断服务;restart 是彻底停掉再启动,会断开连接。线上环境能用 reload 就别用 restart,这是很多老运维挂在嘴边的话。
2.3 动态数据与临时文件:/var、/tmp
/var是“会变的”数据的大本营。系统日志、缓存、临时生成的文件、打印任务、邮件队列都在这里。其中最常见的,也是排查问题时最先要去的,就是/var/log。举几个真实的例子:想要看 SSH 登录记录,去/var/log/auth.log或/var/log/secure(取决于发行版);系统启动报错,去看/var/log/boot.log;Nginx 或 Apache 的访问日志和错误日志,默认也会写到/var/log下。
日志看着不起眼,关键时刻能救你命。某次线上服务器 CPU 飙升,排查无果,最后是打开/var/log/syslog发现某个服务在疯狂报错,几百行重复的错误信息直接指向了根因。所以不要为了省空间随手清空/var/log,有些日志是系统排障的唯一线索。
/tmp是临时目录,任何用户都能往里面写文件,但有两个特点得记住:第一,很多系统会定期清理/tmp目录下的旧文件;第二,重启后/tmp里的内容通常会被清空。所以,别把重要的文件放/tmp,临时下载个安装包还好,放了重要脚本又不备份,重启之后只能傻眼。另外/tmp有一个特殊权限叫 sticky bit,表现为目录权限里的t,它保证用户在/tmp里只能删自己的文件,防止互相乱删别人的临时文件。这算是一个容易被忽略但值得了解的安全机制。
2.4 程序文件分布:/usr、/opt、/bin 与 /sbin
很多新手看到/usr这个名字,以为它是“用户目录”,其实它是 Unix System Resources(Unix 系统资源)的缩写,和“用户”没有关系。/usr里装的是系统自带的应用程序、库文件、文档等。比如/usr/bin存的是大部分用户可执行的命令,/usr/lib存的是各种动态库,/usr/share存的是与应用无关的共享数据,比如图标、桌面主题、时区数据。
/usr/local值得单独说一下。用源码方式编译安装的软件,默认会装到这里。它的目录结构和/usr类似,也有bin、lib、etc、share这些子目录。为什么独立一个目录?因为系统自带的软件归系统的包管理器管,你自己编译的软件归你管,分开放更整洁,升级系统时也不会被覆盖掉。个人习惯是:手工编译的软件一律装到/usr/local,并在.bashrc里把/usr/local/bin放在 PATH 的最前面,这样即使系统里有同名旧版本,也能保证用上我自己编译的新版本。
/opt则是第三方商业软件、独立分发的大型软件包的安装位置。比如某些数据库、企业级软件、IDE 的默认安装路径就是/opt/xxx。/usr和/opt的区别在于:前者是系统包管理器管辖的范围,后者是独立软件自包含的安装目录。遇到那种解压就能用的绿色版软件,扔到/opt下再配个软链接到/usr/local/bin,是最干净的操作方式。
/bin和/sbin也是新手容易困惑的。/bin存的是基本用户命令,如ls、cp、mv;/sbin存的是系统管理命令,如fdisk、mkfs、iptables。现代发行版里,它们很多时候是软链接指向/usr/bin和/usr/sbin,但目录分立的传统还在。对于普通用户来说,只需要知道:sbin里的命令大多需要 root 权限才能执行。
2.5 内核与设备的抽象入口:/dev、/proc、/sys、/run
这四个目录属于“看着存在但其实不是普通文件”的类型。/dev是设备文件目录,它把硬件抽象成了文件。/dev/sda代表第一块 SATA 硬盘,/dev/nvme0n1代表 NVMe 固态硬盘,/dev/tty代表终端。Linux 的设计哲学就是“一切皆文件”,对设备的操作就变成了对文件的操作。所以普通用户不需要了解底层的硬件接口细节,只要知道访问/dev/xxx就是访问对应的设备。
/proc和/sys是虚拟文件系统,它们的内容不在磁盘上,而是由内核动态生成的,反映的是系统运行时的状态。查 CPU 信息就去/proc/cpuinfo,查内存信息去/proc/meminfo,查内核版本去/proc/version。某些/proc下的文件甚至可以写,用来动态调整内核参数,比如/proc/sys/net/ipv4/ip_forward控制 IP 转发。/sys则更多用于暴露内核设备和驱动的属性,树莓派、嵌入式设备上控制 GPIO 也会用到/sys/class/gpio。这类目录不要在没把握的情况下乱动里面的文件,因为写错参数比写错配置文件的影响更直接。
/run是较新的一个目录,用来存放系统启动以来产生的运行时数据,比如进程的 PID 文件、socket 文件、系统级的临时挂载点。它最明显的特点是:系统重启后内容会清空重建。所以你如果有那种“临时脚本状态文件”,放/run是不合适的,放/tmp或/var/run更稳妥。很多老教程里没有/run,因为它是后来才加入 FHS 标准的,新系统上你会看到/var/run通常是指向/run的软链接,很多服务现在都往/run里写 PID 文件。
3. 几个必须会用的实战排查场景
3.1 磁盘空间满了?按挂载点逐层揪出大文件
磁盘满是最常见的故障,也是最能体现目录知识价值的问题。先执行df -h,看各挂载点的使用率,找出哪个分区满了。然后进入对应的挂载点,用du -sh *看当前目录下每一级的占用情况,再加上du -sh .[!.]*把隐藏文件也算进来。一般一两层就能定位到出问题的目录。
以/满了为例,排查顺序通常是:
df -h,确认哪个挂载点满了。- 进入该挂载点,
du -sh *和du -sh .[!.]*并排看,找到最大的目录。 - 继续往下钻,直到定位到具体的文件或目录。
- 确认文件是否可以删除或清理,再动手。
一个常见的隐蔽问题是/var/log下的日志没人轮转,越积越大,最终把磁盘塞满。看到/var/log占了几十 G,先看里面是不是有某个应用疯狂刷错误日志。定位到具体日志文件后,除了清理当前的日志,还要检查一下日志轮转配置是否正确,否则清了还会再涨。另一个高频问题是journalctl累积的系统日志,它存储在/var/log/journal,时间久了也能吃掉几个 G。用journalctl --vacuum-size=200M把日志总大小限制在 200M,是比较干净的处理方式。
3.2 软件装了却找不到?从 PATH 和安装路径双线排查
装完软件找不到可执行文件,大概率是 PATH 环境变量没有覆盖程序所在目录。先执行which 软件名,看看 shell 究竟找到了什么。如果没有任何输出,说明 PATH 里没有这个目录。这时候查一下软件到底装在哪,来源不同,位置也不同:
- 发行版包管理器(如
apt、yum、dnf)安装的软件,可执行文件通常在/usr/bin。 - 源码编译的软件,默认前缀是
/usr/local,可执行文件在/usr/local/bin。 - 解压的绿色版软件,可能在任何目录,常见的是
/opt或用户自定义目录。
找到位置后,把目录加到 PATH 里。临时生效:export PATH=/opt/xxx/bin:$PATH。永久生效:编辑~/.bashrc,在文件末尾加一行export PATH=/opt/xxx/bin:$PATH,然后source ~/.bashrc或重新登录。这里有个细节:export PATH=/opt/xxx/bin:$PATH是把自己要加的路径放在前面,保证优先级高于系统原有路径。如果你把$PATH写在前面,那系统原有目录里的同名命令会优先于你装的软件,这一点容易搞反。
实在找不到的时候,用find / -name "软件名*" 2>/dev/null全盘搜,或者locate 软件名用数据库快速定位。但locate依赖updatedb的定时更新,刚装完的文件可能搜不到,所以更靠谱的还是find。
3.3 改了配置没生效?服务重启与 shell 刷新要分清
改了/etc下的配置文件没生效,90% 的情况是没让服务重新读取配置。不同程序有不同的生效方式,最忌讳的就是改了配置觉得“应该生效了吧”,结果根本没动静,最后还是同事提醒才知道要重启服务。常用的几招:
- 服务类程序(Nginx、Apache、MySQL 等):用
systemctl reload或systemctl restart让配置生效。reload 平滑重载,不踢掉现有连接;restart 断崖式重启,会有短暂的不可用。 - shell 配置文件(如
.bashrc):改完后执行source ~/.bashrc,或者直接重新登录终端,就能让环境变量和别名设置生效。source是在当前 shell 里重新执行一遍配置文件,相当于“重新读一遍”。 - 内核参数(如
/proc/sys下的内容):要么立即写入/proc/sys/xxx,要么用sysctl -p从配置文件加载全部参数。
另外一个常见误解是认为修改了全局配置(如/etc/profile)其他用户马上生效,其实你改了/etc/profile,已经登录的用户不会自动拿到新配置,需要重新登录。这种情况在团队共享服务器的时候特别容易引发困惑。我的习惯是改了任何配置,都在终端里主动验证一遍,比如nginx -t先测试配置语法,nginx -s reload再重载,而不是直接 restart,这个习惯帮我规避了无数次线上事故。
4. 常见误区与排查技巧速查
4.1 几个经典误区,新手最容易栽在里面
第一个误区是以为/usr是用户目录,甚至是“user”目录。很多人第一次看到/usr/home或/usr/local就懵了,以为这是放用户数据的地方。记住前面说的,/usr是 Unix System Resources,系统资源,和用户家目录没有关系。用户数据一律在/home下,这是原则。
第二个误区是把/tmp当存储目录用。放进/tmp的文件会在系统重启后或达到清理周期后消失。我见过有人把数据库备份脚本放在/tmp,还每天往/tmp里写备份文件,某次重启后备份目录空了,直接导致恢复演练失败。临时文件就让它保持“临时”,重要数据必须放家目录或数据盘。
第三个误区是随意chmod 777。权限设置不是给目录“解锁”,更像是给文件“上锁”,777 表示所有人可读可写可执行,把家目录设为 777 等于把家门钥匙复制给整栋楼的人。日常使用chmod 755或chmod 644就足够了,需要多人协作的场景,优先考虑chmod 750加用户组管理,而不是一刀切 777。
第四个误区是不看目录用途就往根目录乱放文件。把个人脚本放到/根目录下,或把各种下载的安装包堆在/root里,这不是“方便”,而是给系统维护添乱。根目录文件越少越清晰,任何自定义的东西都应该放在明确的位置,要么/home、/usr/local、/opt,要么/srv。
4.2 一张速查表理清关键目录
| 目录 | 核心用途 | 典型问题与注意点 |
|---|---|---|
/ | 根目录,整个文件系统的起点 | 根分区满了,系统可能无法正常运行,优先排查大文件来源 |
/home | 普通用户家目录 | 常独立分区,用户数据都在这里;备份和迁移的重点对象 |
/root | root 用户家目录 | 不放置临时文件,不存放安全敏感性弱的内容 |
/etc | 系统与应用的全局配置文件 | 修改前先备份;改动后服务重启或 reload 才会生效 |
/var | 动态数据:日志、缓存、队列 | /var/log容易占满磁盘,注意日志轮转和清理 |
/tmp | 临时目录,重启通常清空 | 不放重要文件,不长期存活 |
/usr | 系统资源、自带软件 | 与用户无关,管的事是软件和库文件 |
/opt | 第三方独立软件、商业软件 | 绿色版软件解压在此,配合软链接使用更顺手 |
/dev | 设备文件抽象口 | 不要随意读写设备文件,操作失误就是硬件级事故 |
/proc | 内核运行时进程与状态信息 | 虚拟文件系统,只读为主,写操作要谨慎 |
/run | 系统启动以来的运行时数据 | 重启清空,存放 PID 和 socket 文件 |
/mnt与/media | 手动挂载、可移动媒体挂载 | 挂载外部设备的标准位置,新硬盘挂载先建目录再挂 |
4.3 长期维护的几个好习惯
最后说几个我自己长期用下来的心得。
第一个坏习惯是光备份不测试。有人定期备份/etc,但从不拿备份还原过。真到了要还原的那天,发现备份脚本漏了目录,或者备份文件损坏,那才是最惨的。每季度抽空做一次还原演练,把/etc、/home、数据库目录完整还原到一台测试机上,不费多少时间,但能避免灾难。
第二个习惯是给重要目录做“地图”。把/etc下常用配置文件、/var/log下的各日志路径、/usr/local下的自装软件清单,整理成一个 README 文件,维护笔记上墙。换人接手时,这份目录地图就是救命文档。这个做法听着土,但比任何自动化工具都更能帮你快速了解一台机器。
第三个习惯是数据盘独立挂载。生产环境强烈建议把用户数据和数据库放在独立分区或独立硬盘上,和系统盘分离。这样系统崩了需要重装,数据盘拔下来挂到新机器就能恢复,不用先从满了的根分区里往外挪数据。/home独立、/var独立、数据库目录独立,这是云服务器初始化的经典配置思路。每次拿到新机器,第一件事就是规划好目录挂载方案,而不是急着装软件。目录结构这东西,前期花十分钟规划好,后面能省下上百分钟的排查时间,这个账怎么算都划算。