Linux目录结构详解:从FHS到挂载,运维必会的基础
1. 先搞懂根目录与目录设计逻辑我第一次拿到一台云服务器登录进去之后敲了个ls /面对一屏目录名字其实是懵的bin、etc、var、usr这些到底是干什么的放Windows那边好歹有C盘D盘一目了然Linux这劈头盖脸一堆英文缩写确实劝退了不少新手。先说结论Linux 的目录结构不是随便定的背后有一套大家共同遵守的约定叫 FHS文件系统层次标准。它规定了什么类型的文件放哪个目录这套标准让 Linux 发行版之间保持高度一致——今天你在 Ubuntu 上学会了找配置文件明天切到 CentOS 或者 Debian路径基本不用重新学这就是 FHS 最大的价值。整个文件系统是一棵倒挂的树最顶层就叫根目录/没有任何盘符的概念。所有分区、U盘、光驱都是通过“挂载”的方式接到这棵树上的某个目录上而不是像 Windows 那样自带盘符。这就是 Linux 目录我最开始觉得抽象的一点——明明是一块独立的硬盘接到系统里之后看起来就像/data下的一堆普通文件夹在图形界面里甚至看不出区别。搞清楚这套逻辑之后再看具体目录就顺了。我们日常打交道最频繁的其实是其中一小部分家目录、/etc、/var、/usr、/tmp。其他目录虽然也重要但很多是系统自己用的普通人一年到头不会直接往里面写东西。2. 日常高频目录逐个拆解2.1 家目录你的私人空间每个用户都有一个家目录位置在/home/用户名。root 用户比较特殊在/root。你敲命令行的时候默认就在自己家目录里~这个符号就代表它。这是你在这个系统上唯一拥有完全控制权的地方。项目代码、脚本、下载的压缩包、配置文件备份都可以放这里。我自己习惯的做法是所有项目统一放~/projects下面按语言或业务再分子目录比如~/projects/golang、~/projects/python、~/projects/shell这样找东西方便打包备份也只需要打包一个大目录。家目录里默认藏着十来个隐藏文件用ls -a才能看到比如.bashrc、.profile、.ssh。这些点开头的是各个程序的配置文件属于“用户级配置”。我有个习惯新装系统第一件事就是把.bashrc里加上自己常用的别名把默认编辑器改成 vim把历史记录条数调大这些改动只看当前用户不影响其他人。提示云服务器上如果开了多个用户注意家目录的权限默认是 755其他人可以进入但看不到你的私有文件内容文件本身通常也是 644 可读。如果要放密钥类敏感信息建议chmod 700 ~/目录名收紧权限。2.2 /etc系统的配置中心如果只能让我挑一个最常访问的目录我选/etc。全系统几乎所有服务的配置文件都堆在这里网络配置、用户账号、软件源、各种服务的启动参数。举几个高频文件/etc/apt/sources.list或/etc/yum.repos.d/软件源配置换国内镜像源就改这里/etc/ssh/sshd_configSSH 服务配置改端口、禁密码登录都看它/etc/hostname主机名/etc/hosts本地静态域名解析/etc/crontab系统级定时任务/etc/sudoerssudo 权限白名单改这些文件是有讲究的。我自己踩过的坑是直接编辑系统关键配置改完没验证就重启服务结果服务起不来。现在我的原则是能复制备份就先复制一份比如cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak改完之后先用sshd -t这类自带的语法检查工具验证再重启服务。还有一个新手容易忽略的点/etc下的配置几乎都是普通文本文件没有数据库所以改配置编辑文本。这套设计虽然简陋但好处是好排查、好备份整个/etc目录打包带走基本就能在一台新机器上恢复原状。2.3 /var系统运行时的数据仓库/var是 variable data 的缩写存放系统运行过程中不断变化的数据。最著名的是/var/log所有系统日志都在那里。排查问题第一站/var/log/syslogDebian系或/var/log/messagesRHEL系还有/var/log/nginx/access.log这类按服务分目录的日志。我看日志有个习惯先从tail -f开始实时盯着输出复现问题的同时看日志反应。查老日志就grep关键字再配合awk提取字段。会看日志和不会看日志排查问题的速度差一个数量级。/var下面还有几个值得知道的/var/spool/cron/crontabs/各用户的定时任务队列和/etc/crontab系统级区分开/var/lib/各软件自己的数据文件比如 MySQL 数据目录默认就在这里/var/tmp重启后仍然保留的临时文件目录给服务器做磁盘告警时我一般重点盯/var所在分区的使用率。云主机常见故障之一就是/var被日志塞满尤其是访问量上来之后 access.log 一天吃掉几个 G 很常见。处理方案是配置 logrotate 按天切割、按大小保留比如只留 7 天超了就压缩归档。2.4 /usr系统软件的主体存放区/usr是最容易让新手误解的目录它和“用户”没有多大关系而是 Unix System Resources 的缩写存放系统自带的软件、库、文档。这不是用户自己装程序的地方——用户自己编译安装的软件通常放/usr/local或者/opt。具体来说/usr/bin绝大多数用户可执行的命令都在这ls、vim、curl都在此处/usr/sbin需要管理员权限才能运行的系统管理命令/usr/lib软件依赖的共享库文件类似 Windows 下的 DLL/usr/share程序自带的文档、图标、语言包/usr/local手动编译安装软件的默认前缀这里说一个实际使用心得区分/usr/bin和/usr/local/bin的先后顺序很重要。前者是系统包管理器装的软件后者是你手动make install装的。如果想让自己编译的版本优先于系统版本需要调整 PATH 环境变量顺序。我开始用的时候没搞懂结果which python看到的永远是系统自带版本自己编译的总是“失效”其实不是没装上而是 PATH 顺序没排对。2.5 /tmp 与磁盘空间/tmp是临时文件目录所有用户都能写。很多程序的中间文件、运行时的临时数据都会往这里扔。有个点要特别注意很多发行版把/tmp挂载成了 tmpfs基于内存的临时文件系统也就是说里面写的文件占用的是内存而不是磁盘。好处是存取速度快坏处是重启就清空。我以前写脚本抓数据图省事把中间结果扔/tmp结果机器一重启算了一整天的数据全没了。另外大文件千万别往/tmp放它就是给临时小文件用的。需要暂存大文件可以放家目录下的临时目录或者/var/tmp重启不清。3. 权限与路径实操3.1 看懂每一列权限信息使用 Linux权限是绕不开的坎。每次ls -l都会看到一串drwxr-xr-x这种东西新手到了这一关基本开始头疼。其实拆开看特别简单第一位是类型d代表目录-代表普通文件l代表符号链接。后面每三位一组分别对应所有者、所属组、其他人的权限。r是读w是写x是执行目录上是可进入的意思。举个例子drwxr-xr-x的意思就是这是一个目录所有者可以读写和进入组内和其他人都只能读和进入不能写。目录的写权限和文件的写权限含义不同这一点特别容易混淆。文件上的写权限决定你能不能修改文件内容目录上的写权限决定你能不能在这个目录下新建或删除文件。也就是说就算一个文件是只读的只要它所在的目录对你有写权限你照样能把它删了重来。反过来文件写权限是 644但目录权限是 755那别的用户可以读文件却不能在目录里动手脚。3.2 绝对路径与相对路径路径分成两种用多了自然就熟了。绝对路径是从根目录开始的完整路径比如/etc/nginx/nginx.conf无论在哪个目录下输入都一样。相对路径是从当前位置出发的路径靠.当前目录和..上一层目录定位。我个人的经验是写进脚本、配置文件里的路径一律用绝对路径。手动敲命令时能用相对路径就用相对路径省事。混合使用最坑——脚本里用了相对路径然后被 cron 调用工作目录压根不是你想象的那个最后文件找不着、脚本报错排查半天浪费时间。还有一个小技巧cd -可以在最近两个目录之间来回切换比cd ..然后再cd 目标快得多。这属于用多了自然就懒出来的习惯。3.3 查找目录的三种姿势记不住目录位置很正常Linux 本身就自带一些查找工具学会了就不用背路径。find最强大按名称、按时间、按大小、按权限都能查。我经常用find / -name *.conf或find . -name test.go。注意find的语法是 路径 条件 动作新手最容易把顺序搞反。which查命令的路径比如which python3返回/usr/bin/python3适合快速确认命令装在哪。du查目录占用空间最常用的是du -sh /var/log会输出这个目录的总大小。排查磁盘占用时先du -h --max-depth1 /从根目录一层层往内看哪个目录大再钻进去细看。说一个我用find踩过的坑直接在根目录跑find / -name 某个文件因为/proc、/sys这类特殊目录也在搜索范围内速度奇慢无比而且会刷出大量无意义的输出。规范做法是加排除项find / -path /proc -prune -o -name 文件名 -print或者用find / -name 文件名 2/dev/null把权限错误直接丢进黑洞输出瞬间干净很多。4. 从目录到生产挂载一个数据盘4.1 挂载这个概念到底怎么理解前面说了Linux 目录是一棵树新磁盘必须挂到某个目录下才能用。挂载这个概念可以类比为把一个新书架接到书房的某一面墙上——书架本身是独立的但装好之后你走到指定的那面墙前就能拿到书。Linux 里的“墙”就是一个空目录mount命令就是把磁盘接到这个目录上。我第二次实操是在一台云主机上扩数据盘流程可以完整走一遍查看磁盘是否被系统识别lsblk看到新硬盘设备名如/dev/vdb格式化mkfs.ext4 /dev/vdb创建挂载点目录mkdir -p /data临时挂载mount /dev/vdb /data验证df -h /data看到容量信息就说明挂载成功写入 fstab 实现开机自动挂载其中第 6 步最容易出错。/etc/fstab是开机自动挂载的配置文件格式是设备 UUID、挂载点、文件系统类型、挂载参数、是否备份、是否自检。这里强烈建议用 UUID 而不是设备名因为设备名重启后可能变化UUID 是固定的。获取 UUID 的命令是blkid /dev/vdb把结果填进 fstab然后mount -a测试再重启验证。如果 fstab 写错了系统启动会进入 emergency mode别慌输入 root 密码进命令行注释掉刚写的错误行重启就好。我确实干过这种事教训就是每次改 fstab 之前先备份。4.2 一次性挂载与持久挂载日常工作中mount命令挂载只在当前会话有效重启就失效。要持久化必须写入/etc/fstab。写 fstab 有几种参数组合我实际推荐默认参数行UUIDxxx /data ext4 defaults 0 2适合普通数据盘加 noatimeUUIDxxx /data ext4 defaults,noatime 0 2减少不必要的访问时间记录对 SSD 有一定性能帮助和寿命保护加 nodev,nosuidUUIDxxx /data ext4 defaults,nodev,nosuid 0 2挂载点不允许执行设备文件、不允许 suid 权限安全加固的常见做法这些参数可以直接叠加在 defaults 后面用逗号分隔。新手阶段不用全记住知道 defaults 是最通用的一组其他按需叠加就行。4.3 查看已挂载目录df -h是最常用命令查看磁盘占用率和挂载点注意观察每个挂载点的使用百分比。还有一个命令lsblk -f能查看磁盘的文件系统类型和 UUID。我之前帮别人排查过一个问题服务器磁盘快满了但df -h怎么看都显示某个大分区只有 30% 使用率而且确实找不出大文件。后来发现是有一个进程还在占用已删除的文件文件明明删了但空间就是没释放。处理方式lsof | grep deleted找到占用进程重启服务或杀掉进程空间自然释放出来。这类问题跟目录知识同样相关——文件系统的空间占用不等于目录里看得到的东西。5. 易混淆目录与实际运维速查5.1 盘点那些长得像但作用不同的目录下面这些目录是我见过新手最容易混淆的目录作用常见误区/bin和/sbin前者放用户基本命令、后者放系统管理命令很多需要 root 执行以为/sbin里的命令普通用户完全不能用。实际上能不能用取决于权限和 PATH只是大部分管理命令执行时需要 root 权限/usr/bin和/usr/local/bin前者系统包管理器管理后者手动编译安装的默认位置以为两者随便放。手动装软件混进usr/bin包管理器升级时可能被覆盖或冲突/home和/usr前者是用户数据后者是系统软件误以为/usr是用户目录。这个混淆率在没接触过 FHS 的人群中非常高/etc和/var前者静态配置、后者动态数据文件放错位置备份策略分不清导致配置文件和数据目录的容灾方案做反/tmp和/var/tmp前者重启即清后者重启保留把重要中间数据扔/tmp重启丢失找都找不回5.2 目录被删或占用异常怎么处理实操中会遇到目录被误删或者空间被异常占用的情况我整理一个排查清单目录找不到了先用ls -la看当前目录完整列表看看是不是只读到了部分内容再用find / -name 目录名 -type d全盘搜索空间突然变小先df -h把占用率高的分区找出再用du -sh /path/*逐层定位很快能找到吃空间的大户删了文件空间没释放用lsof | grep deleted找到占用进程目录无法删除可能是权限不够ls -ld 目录名查看目录权限确认自己是所有者还是需要 sudo目录明明存在却提示 No such file or directory看路径有没有写错特别要留意隐藏字符比如从网页复制路径时混入了不可见字符5.3 常用目录搭配命令速查表直接给一份我平时最常用的目录操作速查表按需取用操作命令查看目录下所有文件含隐藏ls -la 目录只看目录本身信息ls -ld 目录递归查看目录树find 目录 -type f无 tree 时查看目录总大小du -sh 目录查看磁盘挂载情况df -hT切换到上一级目录cd ..切换回上次所在目录cd -新建多级目录mkdir -p /a/b/c删除空目录rmdir 目录递归删除非空目录rm -rf 目录慎用复制整个目录cp -r 源目录 目标目录移动重命名目录mv 源目录 目标目录rm -rf一定是高危命令我在生产环境几乎只配合绝对路径使用而且先ls再次确认目录名再删。我见过有人把~/打成/*或者目录名多个空格导致删错这确实是新手乃至老手都会犯的惨痛教训。6. 我给新手的三个习惯建议目录知识背下来容易真正长在手上还得靠使用习惯。分享三个我自己坚持多年的习惯仅供参考。第一个习惯新服务器到手先花五分钟看目录结构。ls /、ls /etc、ls /var/log结合tree -L 2如果有装的话把关键目录扫一眼。这样做的好处是提前知道机器上有哪些服务、哪些日志会增长、配置文件在哪出问题时不至于整个系统乱翻。第二个习惯所有自建项目和数据都放显眼位置。代码放~/projects服务配置文件统一放/etc/服务名/数据目录单独挂盘到/data或/var/lib/服务名。别往根目录直接乱建文件夹也别把项目丢在/home/某用户/下载底下时间一长你自己都找不到更别提同事实习生接手。第三个习惯勤用man和/usr/share/doc。查目录或命令不清楚时第一反应不是搜网页而是man ls、man hier——后者专门讲 Linux 目录结构的标准文档而且版本和当前系统完全匹配。我之前很多目录相关的困惑最后都是靠man hier解开的比看二手资料准确得多。我在实际使用中发现Linux 目录知识不像框架或语言特性那样需要轮番更新它更像一门“巷子里的基本功”一旦建立了体系后面的成长会顺畅很多。现在遇到不熟悉的命令和文件位置我不会死记硬背而是先归类到/bin、/etc、/var、/usr这几个大框架里再根据文件类型决定放哪儿、去哪儿找。这套思路帮我少走了不少弯路希望能对刚开始接触 Linux 目录的你也有帮助。