ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux目录结构深度解析:FHS、/bin、/etc与挂载点

2026/10/1 16:55:40 拓冰建站 浏览量
Linux目录结构深度解析:FHS、/bin、/etc与挂载点 1. 先搞清楚从根目录出发的整套逻辑FHS与Linux的目录设计哲学刚接触Linux的人十有八九会被这一堆目录吓到。/bin、/etc、/lib、/media、/mnt、/sbin、/sys、/usr/bin、/usr/sbin、/usr/src光看名字根本猜不出它们是干什么的更搞不清为啥同样带个bin有的在根目录有的藏在/usr底下。你要是在Windows上习惯了C盘、D盘那种盘符逻辑初看这套东西确实头晕。这里有个背景得先交代Linux沿用的是FHSFilesystem Hierarchy Standard文件系统层级标准。这个标准的初衷很简单——让所有Linux发行版长一个样不管你是Ubuntu、CentOS还是Debian系统关键目录的位置和用途尽可能统一。这样你做运维也好、开发也好换台机器不至于抓瞎。虽然各家发行版会在细节上做些微调但大骨架是一致的。理解了这一点再看那堆目录其实就有规律可循了。整个Linux文件系统是一棵倒挂的树/就是树根所有目录都是从根上分叉出来的。每个目录在创建的时候都被赋予了明确的职责有的放程序、有的放配置、有的放设备、有的放临时数据。这种职责划分比起Windows那种什么东西都堆在C盘的思路要严谨得多。我不建议死记硬背目录列表更靠谱的学习方式是理解这个设计逻辑然后配合实际操作一点点熟悉。这篇文章会把这几个目录掰开揉碎讲清楚顺带着把命令行前面那串字符是什么意思也一并解决了。2. /bin、/sbin、/usr/bin、/usr/sbin四个二进制目录的恩恩怨怨先说最让人头大的——为什么有四个bin/bin和/sbin在根目录/usr/bin和/usr/sbin藏在/usr下面到底有什么区别2.1 /bin系统启动和单用户模式下必须的命令/bin是binary的缩写里面放的是最基本的用户命令。ls、cp、mv、cat、grep这些日常高频命令基本都在这里。更重要的是这些命令是系统启动过程中、进入正常多用户模式之前就要用的哪怕系统挂了、只能进单用户模式或者紧急修复模式这些命令也必须能用。打个比方/bin就像你家里的应急工具箱里面放着螺丝刀、扳手、锤子这些最基础的工具。不管房子出了什么状况哪怕其他工具都拿不到这个工具箱里的东西得随时能用。说句实在话对普通用户来说/bin和/usr/bin在现代主流发行版上已经不用太纠结区别了。CentOS 7、Fedora这类发行版搞了一个叫usr-merge的调整/bin直接做成/usr/bin的软链接。不信你可以敲一下ls -ld /bin输出会告诉你它指向哪里。但传统Unix的语义仍然值得了解因为很多老系统、嵌入式Linux、或者一些精简发行版依然是老式布局。2.2 /sbin系统管理员专属命令动不动就要root/sbin里放的是系统管理类命令比如fdisk磁盘分区、mkfs格式化文件系统、iptables防火墙规则这些。s开头的system暗示了它的属性这些命令通常涉及系统底层操作普通用户敲了也没权限得配合sudo或者干脆切到root用户。实际使用中需要注意一点有些发行版对普通用户来说/sbin可能不在PATH环境变量里。什么意思你敲fdisk系统提示command not found但/sbin/fdisk明明存在。这时候你以为是命令没装其实只是PATH里没包含这个目录。排查这种问题时可以用which、type这些命令确认一下命令的真实位置再决定是补全路径执行还是检查环境变量配置。2.3 /usr/bin现代Linux上真正的主战场/usr不是user用户的缩写别记错——它是Unix System Resources的缩写。/usr/bin才是你现在装的绝大多数软件、命令的真实存放位置。你apt install或者yum install装来的软件如果是编译好的二进制包可执行文件九成会落在这里。像是python3、git、vim、nginx统统归/usr/bin管。再加上usr-merge之后/bin本身也是指向这里的所以现代发行版上/usr/bin基本就是命令的大杂烩中心。如果你自己下载了绿色版软件、或者编译安装了自定义程序那就未必放/usr/bin了更多时候会放在/usr/local/bin。这是另一条约定/usr/local是给系统管理员手动安装的软件用的包管理器装的东西归/usr管手动编译装的东西归/usr/local管两拨软件互不打扰。2.4 /usr/sbin又一个系统管理命令仓库看名字就知道这是/usr底下管系统管理命令的地方。好多网络服务相关的守护进程管理命令在这里比如sshd、httpdApache、crond。说白了/sbin和/usr/sbin的分工逻辑和/bin与/usr/bin的分工逻辑是一模一样的前者管启动阶段和救援模式必须的后者管正常运行时需要的。只是现代发行版同样把它们合并了/sbin也做成软链接指向/usr/sbin。我要提醒一个实操细节因为/bin、/sbin是指向/usr/bin、/usr/sbin的软链接所以在写脚本或者配置定时任务的时候尽量用绝对路径而且要考虑到不同发行版路径的差异。一个脚本在CentOS上写/bin/bash没问题换到Arch Linux上也没问题但如果你给一个老派的Solaris机器写脚本那/bin/bash可能就不存在了。跨平台脚本里把解释器路径写成#!/usr/bin/env bash会稳妥不少env命令会去PATH里找bash的真实位置。3. /etc配置文件的大本营也是小白最容易误操作的地方/etc大概是Linux里除了/bin之外第二个会被频繁提到的目录。它的名字来源于et cetera等等其他历史上就是放杂项配置文件的。但现在它已经成了系统配置的核心地带。3.1 系统全局配置都堆在这里/etc下面有什么/etc/passwd存用户账户信息、/etc/shadow存密码哈希、/etc/group存用户组信息、/etc/fstab控制系统开机自动挂载哪个分区、/etc/resolv.conf配置DNS服务器、/etc/hosts做主机名静态解析、/etc/hostname设置主机名。你要改什么系统级参数基本就是进/etc改对应的文件。举个例子你说我机器DNS解析不了了第一反应别急着重启网络先看一下/etc/resolv.conf里有没有正确的nameserver配置。要是啥都没有填上nameserver 8.8.8.8或者其他你网络环境可用的DNS再说。这种排查思路如果你不知道/etc是干嘛的根本无从下手。3.2 修改配置的格式和注意事项/etc下的配置格式五花八门因为每个软件都有自己的语法。有的是keyvalue格式比如/etc/systemd/system.conf有的是块状配置比如/etc/nginx/nginx.conf还有的是一行一条记录比如/etc/fstab。我踩过的坑是改配置前一定先备份改完后一定要让服务重新读取配置重启服务或者用相关命令reload否则白改。比如改了系统环境变量.bashrc里的变更要source ~/.bashrc才生效改了网络配置要systemctl restart NetworkManager这类操作。提示改任何配置文件之前先复制一份备份命名习惯是加.bak后缀或者带日期。例子cp /etc/fstab /etc/fstab.bak。这套习惯花不了几秒但能救你无数次崩溃。3.3 /etc下最容易搞错的权限问题/etc里的文件大部分是root所有的普通用户只读。但有些文件内容涉及敏感信息比如/etc/shadow默认权限是000或者640普通用户连看都看不到。有些新手用chmod 777 /etc去解决权限问题这是极度危险的操作——等于把系统所有配置文件的门锁全卸了。正确的做法是具体问题具体分析哪个文件权限不对就调哪个别对目录整个动手。4. /media与/mnt两种挂载方式的真实用途差异这两个目录经常让人一头雾水。/media和/mnt都是干挂载这事的那到底有什么区别4.1 /media可移动设备的自动挂载点/media是给可移动设备准备的。你把U盘插上去把SD卡插上去把移动硬盘插上去桌面环境比如GNOME的nautilus文件管理器会自动帮你把设备挂载到/media/用户名/设备名这样的路径下。你不用管任何命令插上去就能在文件管理器里看到底层就是这个目录在工作。这个自动挂载意味着什么意味着对于绝大多数桌面Linux用户来说平时真的很少需要手动敲mount命令往/media写东西。它就像操作系统帮你安排好的接驳口插上即用拔掉即走。但要注意的是弹出U盘之前最好先在文件管理器里点安全移除否则写入缓存没落盘就拔数据可能会丢。4.2 /mnt手动挂载的临时工地/mnt在传统语义里是用来手动挂载临时文件系统的地方。比如你有个ISO镜像文件要查看内容你可能会把它挂载到/mnt/iso下面临时用一下或者你想访问另一块硬盘的分区手动mount /dev/sdb1 /mnt/data这样挂上去用。对比一下/media是系统替你做/mnt是你自己动手做。这种区别在新一代Linux里没那么严格了很多发行版不在/mnt下预建特定子目录各位按需自建就行。我的习惯是在/mnt下创建具体的挂载点名比如/mnt/data、/mnt/backup而不要直接把设备挂到/mnt本身上——不然卸载的时候如果目录被占用很容易出错。提示挂载操作要root权限卸载用的是umount命令拼写里没有字母n。umount /mnt/data不是unmount。这个拼写坑我见无数人踩过包括我自己一开始也写错。4.3 挂载的实操示例挂载ISO镜像的典型流程不用刻盘也不用解压创建挂载点目录mkdir -p /mnt/iso挂载镜像mount -o loop /path/to/image.iso /mnt/iso查看内容ls /mnt/iso用完卸载umount /mnt/iso-o loop参数的意义是告诉内核把这个普通文件当块设备来处理。这段示例虽然简单但背后涉及回环设备的概念——用文件模拟磁盘。日常场景里安装VMware Tools、检查安装包内容、离线安装软件包时这个操作很常用。5. 容易被忽略的/lib、/sys、/usr/src系统运行时的背后功臣有的人用Linux几年/lib、/sys、/usr/src这三个目录一次都没进过。这很正常因为它们不像/etc那样需要频繁改动也不像/bin那样每天打交道。但了解它们对理解系统工作原理有实打实的帮助。5.1 /lib可执行程序的零件仓库/lib是共享库目录相当于Windows上的DLL所在目录。Linux上可执行文件很多依赖以.so结尾的共享库文件这些库就是程序的零件装在哪里、叫什么名字都有讲究。系统启动时/bin和/sbin里那些命令要用到的核心库就放在/lib下后来usr-merge也把/lib并到/usr/lib里去了。你可能会遇到一种情况装个软件提示缺库文件比如经典的error while loading shared libraries: libxcb-keysyms.so.1。这时你得先确认这个库属于哪个软件包再用系统的包管理器去装而不是从网上随便找个.so文件丢进去——那等于从路边捡了个来路不明的零件往发动机舱里塞出问题都不知道找谁。可以用ldd /usr/bin/某个程序查看程序依赖哪些库用ldconfig -p | grep 库名查系统目前有哪些库。这两个命令是解决缺库问题的利器。5.2 /sys内核暴露的设备仪表盘/sys是一个伪文件系统看起来像目录实际是内核运行时信息导出的虚拟视图。它主要暴露的是设备、驱动、内核模块相关的信息。举个实际例子你用cat /sys/class/net/eth0/address能直接看到网卡的MAC地址用cat /sys/class/power_supply/BAT0/capacity可以看到笔记本电脑电池当前电量百分比。在脚本里读取这些虚拟文件做监控是很常见的运维操作。要注意的是/sys里的内容是动态的、内存中的重启之后一切重置。不要指望往里面写什么配置能持久化写进去的值往往立即影响内核行为但一重启就没了。想要持久化还是得用配置文件的方案比如sysctl.conf这种。5.3 /usr/src内核源码与头文件的栖身地/usr/src用来放内核源码树和内核头文件。如果你要编译内核模块、安装NVIDIA驱动、或者做内核相关开发就得关心这个目录。发行版通常会装一个内核头文件包路径类似于/usr/src/kernels/$(uname -r)里面是编译内核模块所需的接口头文件。自己下载Linux内核源码解开的话也可以放这里。但要注意源码版本必须和当前运行的内核版本匹配不然编译模块时头文件对不上编出来的.ko模块根本加载不了。查当前内核版本用uname -r这个命令我几乎天天用。装开发工具链之前先确认内核版本和CPU架构uname -m能避免很多低级错误。6. 命令行提示符“[userhost 目录]$”逐字符拆解用户目录与权限的可视化入口标题里说的命令行前面的字符解释指的就是终端里每行命令开头那串字符比如[sunriselocalhost ~]$。这串东西虽然不起眼信息量却很大理解它等于拿到了理解整个用户目录体系的钥匙。6.1 提示符里藏着用户名、主机名和当前目录用具体例子说明[demomyserver ~]$demo当前登录的用户名。myserver主机名hostname。~当前所在目录波浪号代表当前用户的家目录。$普通用户的标识符。这套提示符叫PS1Prompt String 1是Shell比如Bash提供的环境变量。每次命令执行完Shell都会根据PS1的设定渲染出新的提示符告诉我是谁、我在哪。~这个符号要重点理解。它不是一个真实的目录名而是一个快捷方式指向当前用户的home目录。普通用户太阳底下跑家目录一般是/home/用户名root用户的家目录特殊是/root。所以你登录进去看到~说明你现在正待在自己的家目录里。在家目录里敲ls -a看到的那些隐藏文件比如.bashrc、.profile、.config目录就是每个用户的个性化配置所在。了解当前目录最直接的命令是pwdprint working directory看到这串输出你就知道自己在哪了。刚登录时在~想切到别的目录用cd比如cd /etc再敲pwd确认已经跑到了/etc底下这时候提示符也会从~变成/etc。6.2 普通用户与root的分界$和#的区别提示符的最后一个字符是权限状态的指示器$普通用户。#root用户也就是超级管理员。很多新手教程里会让你在命令前加sudo实际上sudo是临时提升权限的工具用完之后你还是普通用户提示符依然是$。如果你用su -切换到了root用户注意su和su -的区别后者会加载root的环境变量提示符会变成#这之后敲的所有命令都将以管理员权限运行我建议尽量少用这种方式因为手滑执行个rm -rf很可能造成毁灭性后果。提示网上复制命令的时候看到提示符是#开头的通常意味着该命令需要root权限来执行。如果你在普通用户终端直接复制运行会报权限不足。正确做法是检查命令内容之后加sudo或者切到root再执行千万别盲敲。6.3 路径表示绝对路径与相对路径的直觉在命令行提示符里看到的路径分两种理解方式绝对路径从根目录/开始写全的路径比如/home/demo/project/src/main.py任何时候都能唯一确定文件。相对路径从当前目录开始计算的路径比如你在/home/demo下输入cd project和cd /home/demo/project效果一样。路径里还有两个特殊符号.代表当前目录..代表上一级目录。cd ..是返回上一级cd ../..是上两级。~也可以组合使用~/project表示当前用户家目录下的project目录不管你现在在哪敲cd ~/project都能直接回到家目录下的project。这种写法比绝对路径灵活得多脚本里也常用。6.4 自定义PS1让提示符更符合你的习惯这串提示符是可以按自己喜好改的。比如你想让提示符永远显示完整路径不只是一个波浪号可以在~/.bashrc里设置export PS1\u\h:\w$ 这里\u是用户名、\h是主机名、\w是当前完整路径。改完之后执行source ~/.bashrc生效。我自己的习惯是还加个\t显示时间因为有时候长命令编译时间久回来看一眼提示符能确认命令是多久前结束的。不过提示符也别搞太花哨每次回车渲染一堆东西终端响应会变慢多少影响效率。7. 目录没搞懂时最容易踩的坑与排查方法学Linux这一路谁没踩过几个坑。这里挑几个和目录理解直接相关的经典问题按现象→原因→解决的链路梳理一遍帮你提前避开。7.1 “/bin/bash^M: bad interpreter”其实是换行符作怪很多人在Windows上写完脚本传到Linux上执行报错bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory这个^M是Windows的\r\n换行符在作怪。Windows文本换行是回车换行CRLFLinux只需要换行LF。脚本第一行的#!/bin/bash后面被Windows塞了一个\r字符Linux把/bin/bash\r整个当成了解释器路径当然找不到。解决办法不只一种sed -i s/\r$// test.sh或者用dos2unix test.sh如果装了dos2unix工具。执行完之后再看一眼脚本就能正常跑了。这个坑的本质其实就是对文件系统编辑方式和文本格式的认识不足。在Windows上编辑Linux脚本编辑器一定要选保存为LF换行的选项VS Code右下角可以切省得每次都得额外处理。7.2 /usr/bin/xauth报错.Xauthority文件权限异常这个报错场景常见于SSH登录服务器或者切换用户时/usr/bin/xauth: error in locking authority file /home/sunrise/.Xauthority原因很简单.Xauthority文件的所有者或者权限不对导致xauth无法对它加锁。可能是你用了sudo操作过家目录把整个目录的属主改成了root也可能是多个用户共用了同一个家目录。排查思路ls -la ~/.Xauthority看看这个文件的属主和权限。如果是root而你当前是普通用户改回来sudo chown sunrise:sunrise ~/.Xauthority还有一种情况是家目录对应的磁盘满了也会导致锁文件创建失败。用df -h看看分区使用率排除一下。这类问题的共性教训是不要随意用chown -R、chmod -R去递归改家目录权限改完容易留下一堆莫名其妙的问题。7.3 找不到命令先确认命令目录是否在PATH里你明明装了某个软件敲命令却提示command not found。这时候先别急着重装用下面的命令组合排查which 命令名 command -v 命令名 type 命令名which能找到命令在PATH里的位置找不到的话试试用find搜索find /usr -name 命令名 2/dev/null如果命令确实存在但不在PATH里你至少有两个选择用完整路径执行命令。把命令所在目录加入PATH。改~/.bashrc或者/etc/profile比如export PATH$PATH:/usr/local/bin然后source ~/.bashrc。PATH这个环境变量的本质就是告诉Shell我去哪些目录里找可执行文件。理解了这个很多命令明明装了却用不了的困惑都会迎刃而解。7.4 误删/etc后的恢复思路最后说一个比较沉重的场景误删了/etc下的东西。如果只是删了某个无关紧要的配置文件重新生成或者从包管理器里重装就行。但要是整个/etc趴窝情况就严重了——系统的用户信息、服务配置、网络设置全在里面恢复起来非常折磨。遇到这种情况如果系统里还留着备份或快照优先用备份恢复。如果备份也没有那就得看自己还记不记得机器上原来配了哪些服务和用户逐一手动重建。这个过程完全符合一句话Linux不怕你折腾怕的是你瞎折腾完了还留不下记录。所以对/etc的每一次改动请务必走备份→修改→验证→记录的流程别嫌麻烦。顺带一提现在一些云服务器厂商提供了自定义镜像和快照功能改系统关键配置之前打一个快照成本极低。本地虚拟机用户也可以用LVM快照、Timeshift这类工具做定期系统备份。这些操作只要花几分钟配好关键时刻能省下几天。