Linux的文件目录结构我研究这么多年系统始终觉得它是最值得花时间搞清楚的底层知识之一。很多人刚上手的时候第一反应是背目录名/etc放配置、/var放日志、/home放用户数据背完就算学完了。可真到出问题时磁盘莫名其妙爆了、服务起不来、配置文件改了没生效往往都是因为对目录的理解停留在“背名字”这一步没搞懂每个目录背后代表的职责边界和数据性质。这篇我就把Linux目录结构从头到尾拆一遍每个目录放什么、为什么这样放、哪些地方是新人最容易踩坑的尽量用实际场景说清楚。适合所有刚开始接触Linux以及用过一段时间但感觉自己对目录理解还比较模糊的朋友参考。1. 先搞懂Linux目录结构的顶层设计思路1.1 FHS规范目录不是随便命名的早在Unix时代系统的开发者们就意识到如果每台机器、每个发行版的目录都随心所欲管理员换一台机器就得重新学一遍。于是就有了文件系统层次结构标准也就是常说的FHS规范。它规定了根目录下必须有哪些目录每个目录承担什么职责。只要遵守这个标准你不管换到哪个Linux系统上/etc始终是配置目录/var/log始终是日志目录/usr/bin始终是可执行程序目录。这大大降低了学习成本和维护成本。有人觉得这纯靠记忆其实不是。FHS的划分有很强的逻辑它把数据按两个维度切分一是静态与可变二是是否与特定主机相关。静态数据比如可执行文件、库文件系统安装完基本不变可变数据比如日志、缓存、临时文件运行时一直在涨。与主机相关的比如启动配置、设备节点可共享的如/usr、/opt多台机器可以共享同一份资源。理解了这两个维度再去看每个目录就会顺畅很多。这背后的实用价值也很直接。备份的时候可以只备份可变目录分区的时候可以给可变目录留大空间排查系统异常时知道该去哪类目录找数据。目录结构不是考试题它是运维和开发每天都要依靠的地图。1.2 与Windows目录结构的核心差异Windows的目录结构大家很熟C盘、D盘盘符代表一块物理或逻辑磁盘软件的安装路径往往由用户决定可以装到D盘甚至E盘。Linux完全不同它没有盘符整个文件系统是一棵从根目录/开始的树。硬盘的分区通过挂载点挂到某个目录上比如把数据盘挂到/data那/data下的所有文件其实都存放在独立的分区上。这个差异带来的第一个好处是统一性不管你有几块硬盘、几个分区从任何路径访问目录都无需关心物理设备是什么。第二个好处是灵活性一个目录下的内容可以“插拔式”地替换。工作中最常见的例子是扩容根分区快满了把一块新盘挂到某个目录再把数据迁过去应用无感知因为访问路径没变变的只是背后的物理存储。副作用也真实存在。很多新手会困惑“为什么df显示的磁盘使用量和我的文件大小对不上”因为df看的是挂载点du看的是目录数据量两者口径不同。这个后面实操部分细说。1.3 目录角色的两个核心判断维度我习惯把Linux目录结构里的角色分成四个象限静态私有、静态共享、动态私有、动态共享。静态私有比如/etc本机配置安装后基本不变不需要共享静态共享如/usr装着系统程序多台机器可以共同挂载动态私有如/var、/home运行期数据属于本机且持续变化动态共享则类似某些服务对外发布的数据适合放在独立挂载点方便管理。这个四象限不是理论模型它直接对应实际决策。比如很多人问“软件到底装/opt还是/usr/local”我会看这个软件的更新周期和是否要版本切换。又比如“日志该放哪儿”标准回答是/var/log但如果日志量巨大且需要单独分盘那就给/var挂一块独立分区。目录结构不是死的标准给出的是一套默认地图而判断维度帮你在默认地图之外做出合理调整。我说的“调整”前提是理解每个目录默认的边界在哪里而不是随心情乱放。2. 根目录下每个目录的职责、常见文件与禁放清单2.1 启动与基础命令区/bin、/sbin、/boot、/lib/bin是系统最基本的可执行命令所在比如ls、cp、mv这些在单用户模式下也必须能用的命令。早期系统里/bin和/usr/bin有严格区分现在很多系统把/bin软链接到/usr/bin但对使用者来说逻辑不变这里存放所有普通用户都会用到的常用程序。/sbin里的命令主要是给管理员用的系统管理工具像mount、fdisk这类普通用户一般用不到但它们在系统早期启动阶段也需要可用。/boot放的是内核、引导加载程序等启动必需文件这个目录一般不要乱动磁盘关键时还会把它设成独立小分区。/lib和/lib64存放动态库文件比如C运行库、内核模块依赖的库。很多命令能正常运行是因为能在这里找到对应的库文件。这几个目录的共同特点是“系统启动和基础运行不可缺少”。日常使用中很少有人直接操作可一旦它们出问题比如误删了/boot下的内核或者库文件权限被破坏系统大概率起不来。所以我对它们的建议是认识、了解非必要不动。有一次我在测试环境清理空间一顺手删了/boot下旧的vmlinuz文件重启直接起不来后来用系统应急模式才恢复属实是血泪教训。2.2 /etc整个系统的配置中枢/etc可能是系统管理员打交道最多的目录。几乎所有服务配置都在这里用户账号信息、网络设置、开机启动项甚至各种软件的配置子目录。它的名字来源于早期Unix时代把所有杂七杂八的配置都放这里后来约定俗成变成了配置目录。值得重点了解的文件包括/etc/passwd保存用户账户信息/etc/shadow保存密码哈希/etc/fstab记录开机自动挂载的分区/etc/hostname设置主机名/etc/hosts做本地域名解析/etc/group管理用户组。很多软件在安装时会向/etc下建立自己的子目录来存放配置所以这里也是排查“为什么配置没生效”时的第一站。核心规则是修改前先备份。我吃过一次亏改/etc/fstab挂载参数时少写了一个选项重启后进不去系统最后用单用户模式修复。配置文件是文本文件理论上可以任意改但改错影响的是整个系统。另一个实用习惯是学习用目录型配置很多软件支持把单独的条目文件放到/etc下的子目录里比直接改主配置文件更清晰也方便统一管理。2.3 /home、/root普通用户和管理员的私人空间/home是普通用户家目录所在。每个用户一个子目录存放个人配置、文档、代码、缓存等。它的核心价值是多用户隔离A用户改自己的环境变量、配置自己的脚本完全不影响B用户。系统里的程序、服务通常也各自有自己的账号和家目录但数据更多放在/var/lib或者专门的业务目录下。/root是超级管理员root用户的家目录。它不是/目录也不是系统的根目录只是一个普通目录只是它的主人有最大权限。新人容易把两者混淆需要特别注意。有时候看到有人cd /root说“去根目录了”实际去的是root用户的家目录不是/这个差别搞混会导致误删文件。/home在服务器上值得认真规划。如果你在服务器上跑业务最好把业务数据和/home分开甚至不要给/home太大空间。我见过不少机器根分区都快满了/home还空着一大半就是因为默认安装把空间平均分给了每个目录。合理的做法是先想清楚这台机器是做什么的跑数据库的给数据目录划大空间跑Web的给站点目录划大空间/home反而不是重点。2.4 /var数据持续增长的区域/var存放的是会不断变化的数据日志、缓存、临时邮件、数据库文件、锁文件等。访问量大的服务日志一晚上就能涨好几个G所以这里是磁盘空间告警的头号来源。核心子目录有/var/log日志/var/lib存程序状态和数据库文件/var/cache缓存/var/tmp临时文件/var/spool打印和邮件队列。/var/log下常见的有系统日志、认证日志、应用日志排查问题基本从这入手。对/var的把握重点在于“增长管理”。如果空间紧张优先清理/var/log下的旧日志和/var/cache下的缓存。生产环境建议把/var独立挂载到空间更充裕的分区或独立磁盘上避免日志把根分区写满导致整个系统不可用。另外/var/log/journal目录要特别留意日志系统默认会把很长时间的日志都记下来磁盘压力大时这里往往是第一个要处理的。2.5 /usr系统程序和共享资源的所在/usr是全系统最大的目录之一。名字有点误导性以为它是用户数据目录其实它装的是系统级别的程序、库、文档等共享资源。早期/usr挂载在只读分区上今天虽然大多可写但“共享、静态”的属性没有变。/usr下常见的有/usr/bin程序/usr/lib库文件/usr/share架构无关的共享数据比如帮助文档、图标、模板文件/usr/local是管理员手动编译安装软件的默认位置和系统包管理安装的位置区分开。为什么要分/usr和/usr/local主要是防止包管理器覆盖你手动装的软件也方便区分软件来源。我个人的习惯是手动编译安装的软件尽量放在/usr/local下并且优先用/usr/local/bin下软链接来管理命令。这样系统升级、包管理器更新时不会误删你的手工构建。注意/usr/share的英文名容易让人误以为是可以随意写入的共享区实际上它更适合放只读的共享数据临时文件别往这塞。2.6 /proc、/sys、/dev、/run不占磁盘的虚拟世界这几个目录和前面所有目录的性质都不一样。它们并不真正对应磁盘上的数据而是由内核在内存中动态生成的虚拟文件系统。/proc下每个进程一个编号目录里面的文件实时反映进程的内存、打开的文件、CPU状态等信息/sys暴露内核设备模型和硬件属性/dev下的文件是设备节点磁盘、终端、随机数生成器都以文件形式暴露给程序/run保存系统运行时产生的临时数据比如进程的PID文件和套接字文件。有些人第一次看到/proc里的文件会去vi编辑或者尝试删除结果是报错或者根本不生效因为这只是内核的“视图”不是磁盘文件。正确姿势是用cat查看信息用echo向特定文件写入控制参数并且要非常清楚自己在做什么。它们占的空间在df里显示也比较特殊有些虚拟文件系统的大小会显示为0或来自内存。遇到磁盘空间突然显示100%但du又查不出大文件时先确认是不是这些虚拟目录被误填了再考虑是不是普通文件系统的问题。2.7 /tmp、/opt、/srv、/mnt、/media各司其职的辅助目录/tmp是临时文件目录程序运行时的临时文件都往这放重启后很多会被清掉。它适合放一次性数据不适合放重要业务文件。性能要求高的系统还会把/tmp挂到内存文件系统上让临时文件常驻内存速度更快。/opt是可选应用软件包目录很多第三方商业软件安装到这里和/usr/local定位类似但更偏向独立发布的软件包。/srv是服务数据目录主要放网络服务对外提供的文件。/mnt是临时的挂载点比如手动挂载一个ISO镜像或一块测试盘/media则是可移动设备的自动挂载点插上U盘、移动硬盘一般就出现在这里。这些目录的典型误用包括把重要数据扔在/tmp里结果重启丢失把业务文件随手放在/opt导致备份遗漏或者把网络服务的数据放在服务目录之外导致路径配置混乱。每个目录的“边界感”很重要该放哪就放哪别因为暂时能用就随意放置。目录结构就像是仓库的货架货架分类越清晰出问题时找货越快。3. 实操篇把目录结构真正用起来3.1 快速摸清一个系统目录结构的常用命令拿到一台新机器我一般先用下面几条命令快速了解目录布局# 查看根目录下的顶层目录 ls -l / # 递归查看某个目录的树形结构-L限制深度避免输出爆炸 tree -L 2 /etc # 查看挂载点与分区使用率 df -h # 统计某个目录占用空间的大小 du -sh /var/* # 查找超过100M的文件-xdev避免跨出当前文件系统 find / -xdev -type f -size 100M这里有个常见误区df -h查看的是每个挂载点的总容量和使用率du -sh统计的是目录下所有文件的真实大小。同一个分区下用du统计出某个目录占10Gdf却显示分区已用100G那是因为这个分区里可能还有被删除但未释放的文件也可能是其他目录占用了空间。这种时候不要急着怀疑命令错了顺着分区挂载点逐层du下去谁占的空间一目了然。3.2 服务器目录规划实战思路给一台新服务器做目录规划我通常按这个顺序思考先明确这台机器要跑什么业务数据增长趋势如何。把根分区和业务数据分区、日志分区分开避免一个服务的日志拖垮整个系统。/home不需要给额外空间普通用户默认放根分区就行。独立分区要给/var、/data或/srv等可变数据目录预留。规划好再安装系统如果用默认全盘安装后面扩容会非常被动。一个常见的参考方案是根分区50G/var分区100G/data分区剩余空间全部分配。/data用于业务数据/var用于日志根分区只放系统自身。这样做的好处是日志写满/var时系统一样能启动业务数据写在/data里也方便单独做快照备份。调整目录分区的常用工具是逻辑卷管理工具、mount命令和/etc/fstab配置。操作顺序是先给逻辑卷扩容再同步文件系统大小最后更新/etc/fstab保证重启后挂载不丢失。这块建议在测试环境演练一遍再上生产因为fstab的挂载配置一旦写错系统可能启动失败。我处理过一次fstab里写错UUID的机器开机直接进入紧急模式光排查就花了不少时间。3.3 软链接与硬链接在目录管理中的巧用软链接是解决目录规划问题的一把利器。比如某些服务想固定写/var/lib/app但业务数据想放在独立大分区/data/app下最简单的方案就是把/var/lib/app做成指向/data/app的软链接服务不感知数据却实实在在写到了大分区上。# 把数据目录迁移到/data/app并创建软链接 mv /var/lib/app /data/app ln -s /data/app /var/lib/app软链接可以跨文件系统删除软链接本身不影响目标目录。硬链接则不行它不能跨文件系统也不能用于目录。硬链接更常用于文件比如日志轮转时保留同一份文件的两个名称确保日志服务持续向同一个inode写入。使用软链接有一个容易忽略的坑很多命令默认不跟随软链接操作比如du -sh配合-L参数才会统计目标目录的大小备份工具的默认策略也各不相同。迁移数据并创建软链接之后第一步就是检查服务能否正常读写第二步是确认df、du的统计没有误导你的判断。实际工作中我还习惯顺手把这个软链接写进运维文档不然后面接手的同事看到/var/lib/app指向别处会以为数据丢了。3.4 目录权限目录结构的隐形边界目录权限对目录的影响和普通文件不一样。读权限r决定能否列出目录内容写权限w决定能否在目录里新建或删除文件执行权限x决定能否进入目录、能否访问目录内文件的属性。关键的一点是用户对目录有写权限但对该目录下的文件没有写权限时仍然可以删除或改名这个文件因为删除文件的操作权来自目录权限不是文件权限。很多被权限坑到的情况其实是目录缺少x权限。比如用户对/home/user有r权限能ls到文件名但没x权限进不去结果是“Permission denied”。排查权限问题时我会一层层从根目录走到目标目录检查每一级的权限尤其要注意中间路径上某个不起眼的目录权限过窄。这个问题在多层嵌套的部署目录里特别常见。特殊权限里/tmp上的粘滞位值得特别关注粘滞位让目录允许多用户写但只有文件所有者或目录所有者可以删除别人的文件。/tmp保留了粘滞位这是系统安全的默认防线。如果哪天发现临时目录被改成了普通权限要立刻改回来否则任何用户都能删别人的临时文件会引发严重问题。4. 目录结构问题排查与避坑记录4.1 磁盘爆满时先查这几个目录磁盘空间告警是运维生涯里最常见的故障之一我的排查顺序固定先看分区再找大目录最后找大文件。# 第一步看哪个挂载点满了 df -h # 第二步从最可能的目录开始统计 du -sh /var/* /tmp /opt /home /data/* 2/dev/null | sort -rh | head # 第三步定位可疑大文件排除掉已被删除的嫌疑 find /var/log -type f -size 100M 2/dev/null这里最隐蔽的情况是“文件被删除但进程仍持有”表现为du统计不到但分区使用率依然很高。用lsof -nP | grep deleted查看被删除但仍被进程占用的文件确认后重启相应进程空间才会真正释放。这个故障我遇到过不止一次尤其是数据库或日志服务长期运行时手动删除log文件后服务还在继续写空间一点都不会少。4.2 日志目录的日常维护技巧日志疯长是最常见的根分区撑爆原因。有的日志服务会无限保留历史日志长期不清理迟早出问题。我维护的机器都会做两件事一是限制日志占用大小二是定期清理过期日志这两件事都可以通过对应配置文件完成。手动清理时不要直接rm日志文件更不要在服务运行时删除它正写入的文件那样会导致句柄指向已删除文件空间照样不释放服务还会报错。正确做法是通过日志轮转机制完成或者先停服再清理再启动。清理完日志之后最好检查一下对应服务的输出通道是否还正常。很多服务在日志文件被删后不会自动重新创建需要重启进程才能恢复日志采集。4.3 权限报错与目录归属的排查思路“Permission denied”是最常见的目录问题表象。排查的第一步是看目标目录是否存在然后从根路径一级级走确认每一级目录的x权限都够。很多时候文件本身权限是对的问题出在中间路径某个目录权限太小这种场景在共享目录、容器挂载目录里尤其普遍。团队协作环境里还会遇到目录归属混乱的情况一批文件归属某个账号但后来账号被删或变更文件变成了无主状态新账号访问受限。此时可以批量修正归属但要先评估影响别把系统目录的归属一并改了。我见过有人图省事对根目录直接递归chown结果系统状态残缺得不偿失。4.4 目录规划快速参考表整理一份常用目录速查和坑位对照方便收藏参考。目录职责常见坑对策/etc系统配置改错文件导致系统无法启动修改前备份用软链接做版本切换/var日志、缓存、状态日志增长把磁盘写满单独分区配置日志轮转/tmp临时文件重启时丢数据不存重要业务文件/opt第三方软件软件残留长期占空间清理时确认版本目录后再删除/home用户数据根分区满而home闲置按业务重新规划空间分配/proc内核运行时信息误写入导致内核参数变更以只读理解为主谨慎echo/usr/local手动安装软件包管理器误覆盖独立编译路径用软链接管理命令/srv服务公开数据路径配置混乱导致访问异常固定目录规划配合站点配置使用/run运行期进程文件误删PID文件导致服务异常不手动清理交给系统管理做Linux维护这些年我对目录结构的理解经历了三个阶段一开始是死记硬背后来是崩溃排查中被逼着搞清楚再后来是从规划设计阶段就主动用这套逻辑。最后说一个我自己的习惯每次给新机器做初始化我会先画一张目录规划表写明哪个目录在哪个分区、预计增长量、备份策略然后贴在运维文档里。目录结构看起来简单但它是判断一个系统是否“健康”的底层框架花半小时想清楚后面能省好几天的事。