尧图精选

Linux入门:从FHS文件系统到Shell,理解系统骨架与灵魂

🕒 发布时间:2026/9/10 19:48:22 📁 来源:尧图网络
1. 先想明白为什么你敲了那么多命令还是觉得自己不会 Linux我带过不少新人也看过太多人学 Linux 的方式出了问题。最常见的一种状态是手边放着一张“Linux 常用命令大全”遇到要做什么事就上网搜一下复制粘贴能跑通就觉得自己会了跑不通就换一条命令再试。折腾几个月好像也积累了不少命令但一旦脱离教程、换一台陌生的服务器立刻就懵了。问题出在哪儿出在把 Linux 当成了“命令的堆砌”。你背了ls、cd、grep、awk就像背了一堆零散的单词却没有语法没有体系没有“语感”。真正让你能举一反三、面对陌生环境也能从容应对的是先把 Linux 的底层结构搞清楚它由什么组成各部件之间怎么协作目录为什么长这样Shell 到底在中间扮演什么角色。这一篇我们就来解决这个问题。我不会给你罗列一堆命令让你背而是带你从两个层面重新认识 Linux——骨架和灵魂。骨架是文件系统也就是 FHS 标准下的目录结构灵魂是 Shell也就是你与内核交互的那一层“翻译官”。把这两条线串起来你会发现很多命令不再是孤立的它们之间是有逻辑关系的。先说结论Linux 的一切设计都围绕“一切皆文件”和“进程协作”这两个核心思想展开。目录结构是为了把不同类型的文件安顿在合理的位置Shell 是为了让你能高效地操控这些文件和进程。理解了这两个思想你再看任何命令看到的就不再是一个孤立的小工具而是整个系统里的一环。2. 骨架FHS 目录标准到底在讲什么2.1 从根目录开始的“城市地图”FHS 的全称是 Filesystem Hierarchy Standard文件系统层次结构标准。它规定了一个 Linux 系统里各个目录应该放什么内容、承担什么职责。你可以把它理解成一张城市的规划图商业区、住宅区、工业区、政府机构各有各的位置。如果没有规划所有东西乱堆在一起城市就没法运转。Linux 的所有目录都从/根目录开始。你执行ls /看到的是一批顶层目录。很多初学者看到这些目录名第一反应是“记不住”“分不清”。但如果你把它们按“职责”分类就非常好记了。我习惯把 FHS 里的目录分成三大类系统运行所需/bin、/sbin、/lib、/etc、/var、/tmp、/dev、/proc、/sys用户相关/home、/root、/usr可挂载/可变存储/mnt、/media、/opt、/srv这三大类的边界并不是绝对的但这样的分类能帮你建立第一层认知哪些是系统自己用的哪些是给用户用的哪些是可以随时插拔的。2.2 重点目录逐个拆解别再用“文件名”思维去理解它们很多教程会给你一张表把每个目录的名字、用途列一遍。但看了就忘原因是它们没有解释“为什么”。我挑几个最容易让人困惑的目录逐个讲透。/bin与/sbin千万别小看这两个目录/bin存放的是基本命令的可执行文件比如ls、cp、mv、cat。/sbin存放的是系统管理类命令比如fdisk、mkfs、iptables。在很多现代发行版里/bin其实是指向/usr/bin的软链接/sbin指向/usr/sbin。这是为了把系统文件统一管理起来。这里有一个关键点为什么要把“基本命令”单独拎出来因为系统在启动早期、或者在修复模式下需要依赖这些最基础的命令。没有它们你连系统都进不去。所以/bin和/sbin里的东西不能被随意替换或删除。我曾经见过有人在清理磁盘时把/bin里的东西当“垃圾”删掉了一部分结果系统直接起不来。这就是不了解 FHS 的代价。/etc系统的“控制面板”/etc是 Linux 里最重要的目录之一没有夸张。它存放的是几乎所有系统级配置文件和启动脚本。从网络配置、用户信息、到服务启动参数都在这里。/etc/passwd是用户账户信息/etc/shadow是密码的加密存储/etc/fstab是开机自动挂载文件系统的表/etc/hosts是主机名与 IP 的静态映射/etc/nginx/是 Nginx 的配置目录。你可以把/etc理解成系统的“控制面板”——它记录了这台机器“长什么样”“怎么启动”“连什么网络”。这里有个实操建议改动/etc下任何文件之前先备份。我自己的习惯是复制一份带日期的副本比如cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.20250101。这样出了问题可以马上回滚不至于连系统都进不去。/var一直在变的“草稿箱”/var的全称是 variable可变数据。它存放的是系统运行过程中不断产生的文件。日志文件在/var/log邮件在/var/mail缓存在/var/cache打印任务队列在/var/spool。为什么把日志单独放到这里因为日志是不断增长的文件如果和系统程序放一起磁盘满的时候会把整个系统拖垮。把“易变数据”集中到/var方便统一管理、清理和备份。运维排查问题时第一站永远是/var/log。比如要看系统启动日志看/var/log/boot.log看系统消息看/var/log/messages或按发行版不同叫syslog看登录记录看/var/log/auth.log。/tmp与/dev临时与设备的世界/tmp顾名思义是临时文件目录任何用户都能往里写文件系统重启后内容会被清理有些发行版会用 tmpfs 把它挂载在内存里。所以重要数据千万不要放/tmp。/dev是设备文件目录在 Linux 里硬件设备也是文件。你插入的 U 盘对应/dev/sdb1你的硬盘是/dev/sda你的终端是/dev/tty。这正体现了“一切皆文件”的思想操作设备就是读写文件。比如格式化 U 盘本质上就是在/dev/sdb1这个文件上执行mkfs命令。/home、/root、/usr用户空间与系统程序的分界/home下每个用户都有一个以自己的用户名命名的目录比如/home/zhangsan。普通用户默认只能在自己家目录里有写权限这是 Linux 多用户安全模型的基础。/root是系统管理员root 用户的家目录和/home/root不一样它是独立的。/usr是另一个容易让人误解的目录。很多人以为它是“用户目录”其实不是。它存放的是系统级的应用程序和库文件。/usr/bin存放大多数用户可执行的程序/usr/lib存放程序运行所需的库文件/usr/local是你自己编译安装软件时默认的安装前缀。注意普通用户对/usr没有写权限安装软件需要有 root 权限。2.3 FHS 的边界哪些目录能碰哪些绝不能碰搞清楚 FHS不仅是为了“看懂”更是为了“不犯错”。我整理了几个常见误区不要把脚本或程序随便丢在/根目录根目录是文件系统的起点可以有一些文件但太多垃圾文件会让系统显得混乱也会影响开机的目录扫描速度。不要随意修改/dev和/proc下的文件这两个目录是动态生成的/dev 是设备文件/proc 是内核和进程信息的虚拟文件系统。你改/proc/sys/kernel/hostname可以临时改主机名但改错了可能影响系统运行。需要调整内核参数时应该用sysctl工具而不是直接echo进去。不要以为删了/tmp下的东西没有后果有些程序会把运行时的 socket 文件或锁文件放在/tmp下比如 MySQL 的 socket 文件。如果你正在跑数据库把/tmp下的相关文件删了可能导致数据库连接中断。一句话总结FHS 是规则规则是为了让系统有序协作。你越早熟悉这套规则越能在排错时精准定位。3. 灵魂Shell 不是命令而是“和内核对话的方式”3.1 Shell 到底是什么一层翻译官目录结构是骨架那 Shell 就是灵魂。很多初学者把 Shell 理解成“命令行窗口”这不够准确。Shell 本质上是一个程序它负责接收你输入的命令解析、执行并把结果返回给你。它是用户与 Linux 内核之间的“翻译官”。你输入lsShell 会去 PATH 环境变量指定的目录里找ls这个可执行文件找到后创建一个新进程去执行它然后把输出打印到屏幕上。这一整套流程都发生在 Shell 这个程序的管理之下。为什么说 Shell 是 Linux 的灵魂因为没有 Shell你就只能对着内核的 API 发呆。内核负责管理硬件资源、进程调度、文件系统等底层工作而 Shell 把这些能力包装成了一个个可执行的命令让人类可以用相对自然的方式去操控系统。Shell 有很多种常见的有 Bash、Zsh、Fish 等。Bash 是绝大多数 Linux 发行版默认的 Shell也是你写脚本最常用的。Zsh 在交互体验上更强Fish 更“友好”但脚本兼容性差一些。入门阶段我建议你用 Bash因为它的兼容性最好你学会的东西拿到任何一台 Linux 机器上都能用。3.2 环境变量与 PATH命令为什么能“被找到”Shell 里有个非常重要的概念叫环境变量。环境变量就是一些键值对它们描述了进程的运行环境。比如HOME指向当前用户的家目录USER是当前用户名SHELL是当前 Shell 的路径。其中最重要的一个环境变量是PATH。它是一组目录路径用冒号分隔。当你敲一个命令时Shell 会按照 PATH 里列出的目录顺序逐个查找有没有对应的可执行文件。找到了就执行找不到就报command not found。这就解释了一个常见困惑为什么我下载了一个程序直接输文件名却提示找不到命令因为那个文件不在 PATH 指定的目录里。你还需要给它加执行权限chmod x并且把它的路径加入 PATH或者用./文件名来明确指定当前目录下的文件。实操一下看看你自己的 PATHecho $PATH输出可能是这样/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin这里有个细节当前目录.通常不在 PATH 里。这是出于安全考虑——防止恶意程序通过重名命令“劫持”你的操作。比如在某个目录下放一个名为ls的恶意脚本如果你当前目录在 PATH 中且排在最前面你敲ls时执行的可能就是恶意脚本。所以 Linux 默认不会把当前目录加入 PATH。想临时把某个目录加入 PATH可以这样export PATH/opt/mybin:$PATH这样/opt/mybin就排在前面了。但要注意这个设置只对当前 Shell 会话有效关掉终端就没了。想永久生效需要写进~/.bashrc或~/.profile等配置文件。3.3 管道、重定向组合出无限可能Shell 的灵魂不只在于“执行命令”更在于“组合命令”。管道|和重定向、、是 Shell 最强大的武器。管道的含义非常直观把前一个命令的输出作为后一个命令的输入。比如你想看当前目录下有哪些文件但文件太多一屏显示不完ls -l | less这个命令把ls -l的输出交给less分页显示。再比如你想统计当前目录下有多少个普通文件ls -l | grep ^- | wc -l这里ls -l输出详细信息grep ^-过滤出以-开头的行普通文件wc -l统计行数。三个命令通过管道串联完成了一个单独命令做不了的事情。这就是“组合思维”。重定向则是把输出写到文件而不是屏幕。比如echo hello world test.txt这会把hello world写入test.txt如果文件已存在会覆盖它。用则是追加不会覆盖。这个在日常运维中非常常用——你要记录脚本输出、保存日志、生成配置文件都靠重定向。重定向还能用来快速清空文件 test.txt这行命令会把test.txt截断为空文件比rm再touch更快。管道和重定向组合起来能实现很多“骚操作”。比如把一条命令的输出保存成文件同时又要在屏幕上实时查看command 21 | tee output.log21是把标准错误也合并到标准输出这样错误信息也能被tee捕获。tee的作用是“一边输出到屏幕一边写入文件”。这个组合写脚本时经常用。3.4 Shell 脚本把“对话”变成“剧本”当你需要一次性执行多条命令或者需要根据条件判断执行不同操作时就该写 Shell 脚本了。Shell 脚本本质上就是把你在命令行敲的命令按顺序写进一个文件然后让 Shell 去执行。但它不只是“命令的堆积”它还支持变量、条件判断、循环、函数等编程结构。比如一个简单的备份脚本把网站目录打包并清理旧备份#!/bin/bash # 定义变量 BACKUP_DIR/data/backups SOURCE_DIR/var/www/html DATE$(date %Y%m%d) # 打包 tar -zcf $BACKUP_DIR/site_$DATE.tar.gz $SOURCE_DIR # 删除7天前的备份 find $BACKUP_DIR -name *.tar.gz -mtime 7 -exec rm {} \; echo Backup completed: site_$DATE.tar.gz这个脚本涉及了几个 Shell 编程的核心概念变量BACKUP_DIR、命令替换$(date ...)、条件执行/||可以在这个脚本里扩展、以及find的-exec参数。写脚本能让你从“手工敲命令”升级为“自动化处理”。我的建议是不要一开始就追求把脚本写得多复杂。先把单条命令学好再学组合再学变量和循环。Shell 脚本非常灵活同样的功能有十种写法但关键是你要理解每一步在做什么。4. 实操用“骨架与灵魂”的视角去“读”一台 Linux4.1 第一次登录后的“体检”很多人拿到一台新的 Linux 服务器不知道从哪里开始看。其实用 FHS 和 Shell 的视角可以很快做一套“体检”。第一步看系统基本信息uname -a cat /etc/os-releaseuname -a显示内核版本和系统架构/etc/os-release显示发行版信息。这两条命令能让你快速知道自己在什么系统上。第二步看磁盘和内存df -h free -hdf -h显示文件系统挂载情况free -h显示内存使用。这里你会看到/dev/sda1、/dev/mapper/...这些设备名结合前面讲的/dev目录你就能理解“磁盘也是文件”的含义。第三步看运行中的进程ps aux topps aux一次性列出所有进程top动态刷新。你会看到每个进程的 PID、CPU 使用率、内存占用等信息。Shell 也可以管理进程——比如用kill PID结束进程用jobs、fg、bg管理后台任务。这套“体检”做完你对这台机器的硬件、系统、运行状态就有了整体感知。以后排查问题时思路也是这四步看系统、看磁盘、看内存、看进程。4.2 跟着文件系统的“线索”排查问题FHS 最大的价值在于出问题时你知道该去哪里找答案。比如突然发现网站访问不了了我的排查顺序是先看进程是否还在ps aux | grep nginx如果进程在看日志tail -f /var/log/nginx/error.log如果日志提示磁盘满看磁盘df -h如果磁盘满了找大文件du -sh /var/log/*或者find /var/log -type f -size 100M每一步都对应 FHS 的具体目录。没有这套“地图”你可能会像无头苍蝇一样到处试。我见过很多新手遇到问题第一个动作就是重启服务重启不行就重启机器。其实大部分问题都能在日志里找到答案而日志就在/var/log下。再看一个例子用户无法登录。你可能需要看/var/log/auth.logDebian/Ubuntu或/var/log/secureCentOS/RHEL查找Failed password或Authentication failure的记录。如果是密码错误会留下明文线索。如果是 SSH 配置问题则需要检查/etc/ssh/sshd_config。这些路径如果你熟悉 FHS闭着眼都能找到。4.3 用 Shell 思维串起常用命令告别“背命令”很多人觉得命令难记其实是因为没有理解命令之间的“语法共性”。绝大多 Linux 命令都有相似的规则命令 选项 参数。比如ls -l /etcls是命令名-l是选项/etc是参数。选项通常以-短选项或--长选项开头作用是改变命令的默认行为。比如-l表示长格式输出-a表示显示隐藏文件。参数则是命令操作的对象可以是文件、目录、用户、服务名等。理解了这个结构你遇到一个新命令时第一反应应该是命令名 --help或man 命令名而不是去搜索引擎查。因为任何命令的选项和参数它自己都会告诉你。还有一个实用思维绝大多数命令都支持“从标准输入读取数据”因此可以放在管道后面。比如grep可以从管道接收数据sort、uniq、wc、awk、sed也都支持管道输入。这意味着你可以把一串命令像流水线一样接起来每个环节各干一件事最终得到你要的结果。举一个经典例子统计日志里访问量最高的 IP 前 10 名。cat /var/log/nginx/access.log | awk {print $1} | sort | uniq -c | sort -rn | head -10拆解开看cat读文件awk {print $1}提取第一列IPsort排序让相同 IP 相邻uniq -c统计去重并显示计数sort -rn按计数降序排列head -10取前 10 条。六条命令用管道串起来各司其职完美组合。这种“组合思维”就是 Shell 的灵魂所在。它不是让你背命令而是让你理解每个小工具的定位然后用管道和重定向把它们拼起来。5. 常见问题与排查技巧实录5.1 新手最容易踩的坑命令找不到、权限不够、改错配置我总结了三个新手最容易踩的坑每个都对应一个明确的解决方法。坑一命令找不到command not found原因通常是两种情况一是命令没有安装二是命令不在 PATH 里。比如在最小化的 CentOS 上ifconfig可能没有安装但ip命令一定有。这时候不要执着于某一个命令去看看同类的替代品。判断命令是否已安装可以用which 命令名如果返回路径说明已安装。坑二Permission denied这个太常见了。解决方案无非两种要么用sudo提升权限执行要么修改文件属主或权限。这里有个建议不要动不动就用sudo。普通用户能解决的就先以普通用户身份做。频繁使用sudo会掩盖你对自己操作的后果和权限边界的认知。更不要随意chmod 777这等于把文件的门全部打开在服务器上这样做很危险。坑三改错了/etc下的配置导致服务起不来比如你改了/etc/nginx/nginx.conf之后nginx -t测试配置时报错。这时候不要慌先备份恢复或者用nginx -t -c /path/to/backup.conf来测试备份配置是否能通过。养成“先备份再修改”的习惯能帮你避免绝大多数配置事故。5.2 实用排查命令组合遇到问题不要慌按套路来我把自己常用的排查套路整理成了一张速查表遇到问题时对照着用效率很高。场景排查命令说明系统负载高top/htop查看 CPU、内存占用最高的进程磁盘空间不足df -h查看各挂载点剩余空间磁盘 inode 满df -i查看 inode 使用情况小文件多时会先满端口被占用netstat -tlnp/ss -tlnp查看端口监听和对应进程网络不通ping、traceroute、ss -tlnp分段排查连通性进程卡死kill -9 PID强制结束进程慎用日志实时查看tail -f /var/log/xxx.log动态跟踪日志输出其中有一个细节值得强调df -h显示磁盘还有空间但创建文件时却提示No space left on device这大概率是 inode 用满了。df -i看 inode 使用率如果 100%说明文件系统下小文件太多需要清理。这种问题如果不理解文件系统的概念会卡很久。端口排查是另一个高频场景。比如启动 Nginx 时报错address already in use这时候执行ss -tlnp | grep 80就能看到是哪个进程占了 80 端口。如果看到的是别的服务就要决定是停掉它还是让 Nginx 换端口。如果看不到进程名可能就是权限不够需要加sudo。这里有个隐藏技巧用ss而不是netstat。新一代的 Linux 系统中ss是 iproute2 包提供的效率更高信息更全。netstat其实已经不在很多新系统的默认安装里了。5.3 关于命令记忆的“独家心法”最后分享一个我自己的学习心法——不要背命令要“翻译”命令。每个命令其实都是英文单词或短语的缩写ls是 listcp是 copymv是 moverm是 removecat是 concatenate连接但常用来查看文件grep是 global regular expression print全局正则表达式打印awk是三位作者姓氏的首字母Aho, Weinberger, Kernighansed是 stream editor流编辑器当你理解了命令的“词源”你就能猜出它大概的用途。遇到陌生命令先man或--help比任何命令大全都管用。我在实际带人的过程中发现一个规律能把man用起来的人进步速度是纯靠搜索的人的十倍。因为man告诉你的是命令的完整逻辑而搜索告诉你的是别人的做法。前者让你理解后者让你照搬。入门阶段慢一点、理解深一点后面反而快。我个人在实际操作中的体会是Linux 学习最难的阶段不是那些高级概念而是从一开始就建立起“系统思维”。很多人学了很久还在“敲命令”是因为一直在孤立的点里打转没有把文件系统、Shell、权限、进程这四根柱子串联起来。这篇文章里讲的 FHS 和 Shell就是我带人入门时最先强调的两个模块。它们一个回答“东西放在哪里”一个回答“怎么和系统对话”。把这两件事想透了你再看进程管理、用户权限、网络配置、服务部署都会顺很多。下一篇我会接着讲权限模型和进程管理这两个主题是 Linux 进阶路上绕不开的“硬骨头”到时候我们继续用这种“拆骨架”的方式来聊。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →