
如果有人问我学习Linux最先要弄明白的是什么我的答案不是命令大全也不是某个编辑器而是目录结构。我刚开始接触Linux的时候最多的困惑就是为什么程序散落在/usr里配置文件为什么不统一放在某个地方临时文件又该丢到/tmp还是/var/tmp直到我把整个Linux文件系统想象成一座城市这些疑问才唰地一下全通了。这篇文章我就用像规划城市一样的思路带你一条街一条街地逛完Linux的目录结构。读完你会知道根目录为什么叫//etc、/usr、/var、/home这些目录各自承担什么职能遇到磁盘满、权限不够这类日常问题又该去哪里排查。无论你是刚转行做运维、准备Linux面试还是只是自己装了一台Linux服务器这套理解方式都能帮你省下大量瞎折腾的时间。1. 先看全局为什么说根目录是整座城市的中心1.1 一棵树一个根一切从/出发Unix和Linux的文件系统从第一天起就是树形结构最顶层就是根目录用一条斜杠/表示。所有内容无论是硬盘分区、U盘还是网络文件系统最终都会被挂载到/这个根之下的某个目录上。这里有一个和Windows非常不一样的地方Windows会给你分出C盘、D盘、E盘每个盘都是一棵独立的树而Linux无论你插多少块硬盘都会汇入同一棵树。如果非要类比Windows更像是城市周边的好几个独立小镇每个小镇都有自己的中心路网Linux则是把所有小镇都用高架桥和主干道接进了同一个市中心这个市中心就是/。这个设计的最大好处是路径统一。你在任何一台Linux机器上用户配置文件大致都在/home/用户名下系统日志基本都在/var/log下。不管底层用的是机械硬盘还是固态硬盘是单块盘还是RAID阵列对使用者来说目录视图始终是一致的。这也是Linux能成为服务器主流系统的重要原因之一——统一的布局带来了统一的管理方式。就像城市规划统一了路名和门牌号快递员才能高效送件。如果每个区都自己编一套门牌规则别说投递员疯掉连本地人都会迷路。1.2 FHS一张城市规划总规图目录不是随便划的Linux背后有一套被广泛遵守的文件系统层级结构标准英文叫Filesystem Hierarchy Standard简称FHS。它规定了一个Linux系统应该有哪些顶层目录、每个目录里放什么类型的内容。你可以把它看作城市的总规图纸哪里是行政办公区哪里是商业区哪里是工业仓储区哪里是住宅区在图纸上一目了然。这里要强调一个点FHS是标准不是强制法律。不同的发行版在实际实现上会有微调但大的框架完全一致。比如有的发行版把/bin和/usr/bin合并成软链接有的还保留着历史分离结构但顶层目录的名字和大致功能所有主流发行版都是统一的。正是因为它被各大发行版共同接受你在Debian上学会的目录知识到了CentOS、Ubuntu甚至国产操作系统上依然能用。这也是面试时经常考目录结构的原因——它体现的是你对系统底层规则的掌握而不只是会敲几个命令。1.3 挂载城市外围区如何接入市中心前面提到挂载这个词这是Linux目录结构里绕不开的核心概念。所谓挂载就是把一个文件系统关联到某个目录下。执行df -h你会看到类似这样的输出文件系统 容量 已用 可用 已用% 挂载点 /dev/sda1 50G 20G 28G 42% / /dev/sdb1 200G 100G 100G 50% /home这表示/dev/sda1这个分区被挂载到了根目录//dev/sdb1被挂载到了/home。你在/home里看到的内容实际上是第二块硬盘上的数据。用城市来比喻/dev/sda1是城市的中心城区/dev/sdb1则是新开发的外围住宅区它们通过一条主干道挂载点/home连进城市路网。你在市中心和住宅区之间走路根本不会感觉到自己跨越了行政边界。理解挂载之后很多问题就通了。比如服务器磁盘不够用不一定要扩容根分区可以加一块新硬盘把数据目录放到新硬盘上再挂载到/var/lib/mysql这类路径下。这种按目录拆分的能力正是目录树结构给运维带来的巨大弹性。你在/etc/fstab文件里看到的每一行记录都是在告诉系统哪块硬盘要接进城市的哪个位置。2. 城市功能区的逐一解剖主流目录到底在干什么先放一张概要表把Linux顶层目录和城市功能区对应起来后面再逐个细说。目录城市类比存放内容/市中心所有目录的入口/etc市政大厅系统和服务的配置文件/usr商业区系统软件、共享资源/var物资仓库日志、缓存、可变数据/home住宅区普通用户的家目录/root干部宿舍root用户的家目录/tmp临时堆放区临时文件/dev市政管线设备文件/proc、/sys传感器网络内核运行状态和可调参数2.1 /bin、/sbin、/usr/bin办事大厅与办公楼/bin曾经是系统启动阶段就需要用到的基础命令所在地比如ls、cp、mv、cat。/sbin里放的是系统管理员专用的管理命令比如fdisk、iptables、shutdown。而现在很多发行版把/bin、/sbin都做成了/usr/bin和/usr/sbin的软链接本质上就是同一栋办公楼开了两个门牌。你可以用ls -ld /bin命令看看它是否指向/usr/bin大部分现代系统都会给你一个箭头。这有点像城市里的便民服务中心普通居民办事去A窗口管理员办事去B窗口但楼其实是同一栋。理解了这层就不用再为一个命令到底在/bin还是/usr/bin里纠结。日常使用中你直接敲命令PATH环境变量会帮你在这些目录里找到对应的可执行文件。PATH本质上就是城市交通里的快递派送路线图系统会按顺序在这几条街道上寻找你要执行的命令。如果你自己编译了个软件放在不标准的目录又没改PATH直接敲命令就会提示command not found这个坑后面会专门讲。2.2 /etc市政大厅与政策档案室/etc大概是整个Linux系统里最需要熟悉的一个目录系统和服务的几乎所有配置文件都放在这里。主机名是/etc/hostname用户密码影子文件是/etc/shadowDNS解析是/etc/resolv.conf软件源在/etc/apt/sources.list或者/etc/yum.repos.d/下面。用城市规划来理解/etc就是市政大厅里的政策档案室每一项设备、服务、规则的标准规定都能在这里找到。修改配置之后大多数服务都需要重启或者重新加载才能生效这是因为配置是在进程启动时读取到内存里的。就好比城市交通规则换了新版本已经在路上跑的司机不会立刻知道自己要改道要等交警通知reload、甚至重新培训restart。运维里经常说的改了配置不生效先看看有没有reload背后就是这个道理。另外/etc下有些特殊子目录比如/etc/nginx、/etc/systemd/system它们把服务配置文件拆分到独立目录里方便按模块管理。这又好比为不同部门分设了独立档案柜找文件时不用翻遍整个档案室。2.3 /var物资仓库与日志档案馆/var是所有可变数据的聚集地英文variable的缩写最典型的就是日志文件。系统日志在/var/log/journal或者/var/log/syslognginx日志在/var/log/nginx/access.log邮件队列在/var/spool。除此之外/var/lib下还放着很多服务运行时的状态数据数据库文件、容器数据都可能在这里。可以说/var是唯一一个你会希望它能自动增长的目录因为日志、缓存、队列都在往前跑它必须留足弹性空间。这个目录最容易出现的问题就是日志把磁盘撑爆。尤其在生产环境慢查询日志、web访问日志如果不做轮转和清理一个月下来可能膨胀到几十GB。用 du -sh /var/log/* 就能一眼看出谁最占空间。城市逻辑也很清晰仓库和档案馆如果不定期清理废旧档案整个仓储区就会爆满新到的物资自然进不来。所以/var的容量监控和日志轮转策略是每一个系统管理员的基本功。装好一台新服务器后我第一件事就是检查logrotate配置确保日志不会在某天凌晨把磁盘写满。2.4 /home和/root住宅区与干部宿舍/home是普通用户的住宅区。如果你新建了一个用户zhang那么他的家目录就是/home/zhang。用户下载的文件、写的文档、个人配置文件都存放在这里。默认情况下用户对自己的家目录拥有全部权限其他普通用户通常进不去。这是城市规划里非常讲究的私密性每家每户有独立的门牌和钥匙你总不能随便跑到邻居家里翻东西。/root是系统管理员root用户的家目录。为什么单独放在根下面而不是/home/root因为root用户是系统级别账户如果/home分区出了问题导致挂载失败root一样要有地方存放自己的管理脚本、密钥、备份文件。把/root放在根分区相当于给城市最高管理者保留了一套不受外围区域故障影响的基础居所。这个细节平时不起眼但在系统救援场景下非常重要。如果你把所有管理工具都放在/home下一旦/home分区挂载失败连救命的工具都找不到了那就真的尴尬了。2.5 /tmp 和 /var/tmp临时堆放区里的门道/tmp是大家熟知的临时文件目录程序运行时的临时文件、安装包解压目录都可能丢在这里。/var/tmp同样是临时文件目录但两者有一个重要区别/tmp在系统重启后通常会被清空/var/tmp里的文件存活时间更久。按照FHS的建议/tmp里的东西可能会在启动时被删除而/var/tmp适合放那些重启后最好还在的临时文件。比如你正在下载一个大文件中断了想在重启后继续放/var/tmp就比/tmp稳妥。还有一个细节/tmp通常是个带粘滞位的世界可写目录权限显示为drwxrwxrwt。所谓粘滞位就是那个最后的t。它允许任何人创建文件但只有文件创建者、目录所有者或root用户才能删除别人的文件。这就像城市里的公共储物柜谁都可以往里面放东西但不能随手把别人放进去的东西拿走。如果没有这个机制用户A在/tmp里建了个文件用户B看不顺眼就能直接删掉那系统早乱套了。2.6 /dev、/proc、/sys城市的传感器与神经末梢这三个目录经常让新手困惑因为在里面看不到真实存在的文件。/dev是设备文件目录/dev/sda代表第一块SCSI磁盘/dev/null就是一个著名的黑洞设备。你往/dev/null里写数据数据直接消失你从它里面读数据读到的是空。它像一个城市里的焚化炉或者下水道专门用来丢弃无用数据。很多脚本里常见的/dev/null 21意思就是把标准输出和错误输出都扔进下水道不让它们打扰终端。/proc和/sys是虚拟文件系统它们不占磁盘空间内容由内核动态生成。/proc记录了进程和系统运行状态/proc/cpuinfo能看到CPU信息/proc/meminfo能看到内存信息。/sys则用于暴露内核对象和可调参数很多内核参数优化都要去修改/sys下的文件比如用echo 1 /proc/sys/vm/swapiness调整swap倾向。这类目录可以理解为城市里密布的各种传感器网络你看着像文件其实是读取实时运行数据的接口。对这些目录只要记住一点多读少改改错了系统会立刻受影响而且不会像普通配置文件那样给你还原的机会。3. 在城市里行走常用命令与日常操作套路3.1 路径就是地址命令就是出行方式在Linux里找一个目录靠的是路径。绝对路径从根开始比如/etc/nginx/nginx.conf相当于写省、市、街道、门牌号。相对路径从当前目录开始..表示上一层目录相当于你问路时人家告诉你往前走两个路口右转。刚开始学的时候我建议你强迫自己多打绝对路径等熟悉整棵目录树之后再用相对路径加快速度。pwd命令可以随时查看当前所在位置这就像出门在外掏出手机看一眼地图上的定位保持心里有数。路径操作最实用的三个技巧是命令补全、历史记录、快速回家。按Tab键可以自动补全目录名和文件名这个功能能帮你杜绝大部分拼写错误还能顺带确认目录到底存不存在。cd不加参数直接回车会回到当前用户的家目录相当于一键导航回住处。cd -则回到上一个目录方便你在两个路径之间反复横跳。这些都是效率基础但很多人用了很久Linux都没养成按Tab的习惯我很不建议这样补全能省下的时间真的比想象中多。3.2 目录操作命令把逛城效率拉满目录相关的常用命令其实不多但每个都有讲究。ls用来列目录ls -l看详细信息ls -a看隐藏文件ls -lh让文件大小更易读。把这三个参数合在一起就是ls -lah建议你把它设置成别名在shell配置文件里加上alias llls -lah几乎每次进服务器都会用到。find是查找文件的利器find /etc -name nginx.conf 能在指定目录范围里搜索。如果直接find / -name nginx.conf全局搜索会非常慢也会刷出一大堆Permission denied的报错。我通常会在搜索前先用locate或者限定一个范围比如未知文件在哪时先缩小到可能目录再find。du和df两个命令也很容易混淆df看的是文件系统的整体使用量du看的是当前目录累计占用空间。排查哪个目录把磁盘占满了时标准动作是先df -h看整体再du -sh /*看各顶层目录大小逐级深入。这套流程我几乎每天都会用属于运维基本功。如果你想更直观也可以装ncdu它会以交互式界面列出目录大小像走迷宫一样一层层看非常顺手。3.3 软件安装后住在哪里要有概念安装软件时大多数人只会执行apt install或者yum install装完就忘了文件去哪了。但一旦系统出问题你需要知道这些地址可执行文件大多在/usr/bin或/usr/local/bin配置文件大多在/etc很多服务自带独立配置目录日志文件在/var/log服务状态文件和数据在/var/lib或者/var/opt服务启动脚本在systemd时代由/usr/lib/systemd/system和/etc/systemd/system共同管理举个例子你安装nginx配置在/etc/nginx/nginx.conf日志在/var/log/nginx/站点默认目录在/usr/share/nginx/html。手工编译安装软件时我们习惯把程序放在/opt或者/usr/local下。/opt适合放第三方商业软件独占一块产业园区/usr/local则是本地特色商业街手工编译的默认前缀就是它。知道这些位置后卸载软件、迁移目录、备份配置才会心中有数。很多人卸载软件时只删了可执行文件留下配置文件在/etc日志在/var/log里继续攒着长期下来都是隐患。4. 交通规则Linux权限与安全的基础逻辑4.1 读、写、执行三类人的通行证Linux权限模型是目录树里最重要的安全边界。每个文件或目录都有三个权限位r读、w写、x执行分别对应三种身份文件所有者、所属组、其他用户。对普通文件r和w好理解x则表示是否可以把这个文件当作程序运行。对目录来说权限的含义和文件不一样这是一大坑目录的r权限决定了你能否列出目录内容w权限决定你能否在目录里创建和删除文件x权限决定你能否进入这个目录。也就是说即使你有某个文件的r权限但所在目录没有x权限照样进不去。用一个城市管理场景来记忆文件是房间里的物品目录是房间。你有房间的进入权限x才能进大门有查看权限r才能看见房间里有哪些东西有写权限w才能往房间里搬东西或扔东西。新手最容易踩的坑就是明明有文件的r权限却因为所在目录没有x权限而提示Permission denied。排查这类问题时先看目录权限再看文件权限顺序别搞反。4.2 数字权限和chmod别只会抄命令chmod修改权限表示方法有两种符号法和数字法。数字法三位从左到右依次是所有者、组、其他人每个权限位按二进制计分r4w2x1。所以7表示rwx6表示rw-5表示r-x。配置一个所有者可读写执行组可读执行其他人可读执行的目录就是chmod 755 /data相当于常说的755权限。而文件权限644是大多数配置文件的默认值因为绝大多数文件不需要可执行属性。我个人建议在服务器上先要搞清楚自己的用户身份再用sudo执行提权而不是动不动就su -切到root。最小权限原则可以这样理解城市里绝大部分工作人员都不需要市长钥匙只有处理特殊事务时才临时刷卡进入。日常用sudo命令既保留审计记录又把危险操作限制在最小范围。很多人图省事直接chmod 777现在VPS上被人当肉鸡挖矿的十有八九是权限开得太大再加上弱密码。权限不是越宽松越好它是一门够用就行的学问。4.3 多用户和目录安全创建用户、分组与隔离服务器上最常做的这类操作就是用户管理。useradd zhangsan创建用户默认就会在/home下生成一个家目录。usermod -aG docker zhangsan把用户加入某个组。chown -R zhangsan:zhangsan /data/zhangsan_data修改目录属主。这套操作背后的目录逻辑是/home下的每个目录天然就是一份隔离区普通用户互相访问不了除非有显式的权限开放。这就保证了城市里的居民可以各过各的日子不会因为共享空间而产生过多摩擦。初学者还要注意一个细节家目录默认权限一般是755这意味着其他人可以进入你的家目录看到文件名列表。如果比较在意隐私可以用chmod 700 /home/用户名把门彻底关上。有些发行版默认就是700。目录隔离加上权限控制才能保证一座城市里的居民不会互相干扰。尤其是跑着数据库、网站的服务器每个服务用一个独立用户目录归属按服务划分这种一服务一用户的做法能显著降低被攻击后的横向扩散。5. 常见问题与排查心得踩过的坑5.1 磁盘满了日志和/tmp先背锅排查磁盘满的标准动作df -h看整体du -sh /var/log/du -sh /tmp/找出最大的几个文件和目录。日志清理时别直接rm一个正在被进程占用的日志文件因为文件句柄还开着空间不会真正释放。正确做法是truncate -s 0 /var/log/nginx/access.log或者直接靠logrotate轮转。这就好比垃圾箱满了你把垃圾直接掏出来但收垃圾的工人车还没来垃圾又源源不断扔回去得让垃圾处理制度logrotate来定期平衡。5.2 命令提示command not found多为PATH问题安装在/usr/local/bin下的程序如果当前用户的PATH没包含这个目录直接敲命令就会提示找不到。解决办法是使用绝对路径/usr/local/bin/xxx或者修改shell配置文件把目录加进PATH。PATH是冒号分隔的目录列表系统按顺序逐个找命令就像快递派送有自己的路线表。很多人装完软件发现重启后命令就没了多半是PATH只在当前会话生效没有写进配置文件里重启后环境变量就丢了。5.3 明明有权限还是Permission denied常见原因有三种所在目录没有x权限SELinux或AppArmor安全模块拦截文件系统以只读方式挂载。前两个最好查最后一个用mount命令查看挂载参数看看是否包含ro。我在排查线上问题时发现SELinux导致的权限问题最隐蔽因为它和传统权限模型完全不同只看chmod看不出来。碰到这种情况先看/var/log/audit/audit.log里面会记录被拦截的具体操作。所以遇到诡异的权限拒绝把系统层安全模块也放进嫌疑名单。5.4 /boot目录的旧内核会让系统无法启动/boot目录存放内核和引导相关文件。很多发行版更新内核后不会自动清理旧版本时间一长/boot分区就会占满导致新内核写不进去系统甚至无法正常升级。排查方法是df -h /boot如果接近100%清理旧内核包。这个坑在服务器上很常见特别是那些长期不重启、很少管理的机器。定期清理陈旧内核是城市档案管理的必修课。别等到系统崩了才想起来那时候很多命令都执行不了了只能进救援模式。5.5 目录没删掉提示Device or resource busy想删除某个目录结果提示Device or resource busy说明有进程正在使用这个目录。常见于挂载点目录比如你把新硬盘挂载到了/mnt/data现在想卸载但还有进程停在/mnt/data里。解决方法是先切换到其他目录再执行umount /mnt/data如果还是提示忙用lsof D /mnt/data找到占用进程处理完再卸载。这就像城市里的某个区块正在施工你想封闭道路得先让所有车辆撤出一辆不剩才能拉警戒线。6. 画一张属于你自己的城市地图6.1 第一步打开终端试着把城市逛一遍别只死记硬背目录表。我建议你打开终端花十分钟执行ls -l /把根目录下的顶层目录都看一遍。然后逐个进入/usr、/var、/etc、/home这些大城市区域用ls -ld查看它们的权限和属主。再执行mount命令看看系统当前有哪些挂载点。执行cat /etc/fstab看看开机自动挂载的规则。这会让你对目录树有一个立体认识而不是停留在记忆表格的层面。边逛边记很快就能形成肌肉记忆遇到问题第一时间知道该去哪条街找答案。6.2 第二步建立个人操作记录养成好习惯把手工安装的软件、改过的配置、创建的用户和目录记录下来。很多服务的问题其实都源于当时装完忘了记。我个人习惯在/root/note或自己的笔记工具里保存一份目录变更记录。系统管理最难的不是操作而是复盘和追溯。目录结构是骨架你的记录就是给骨架标注的档案资料后续排障全靠它们。尤其是像手工编译安装的软件如果不记录版本、路径和编译参数半年后想升级你可能会对着一堆散落文件束手无策。6.3 最后分享一个小技巧在系统中遇到不认识的目录时别急着百度先看它的归属和权限再想想这个东西如果放在城市里应该归哪个部门管。比如/var/log是档案馆那日志轮转就是档案清理制度/etc是政策档案室改配置就要有变更审批/tmp是公共储物柜那就别在里面放重要资料。当你学会从城市设计者的角度看Linux目录不仅面试能加分处理实际故障时的思路也会清晰很多。希望这张城市地图能帮你少走一些当年我走过的弯路。