Linux运维实战笔记:命令、权限、网络与故障排查全攻略 从零开始啃Linux运维我花了一周把上半部分笔记重新整理了一遍。黑马这套课的节奏其实挺紧凑前几章全是命令基础后面才开始进入账户、权限、网络和存储这些真正的运维日常。如果你正准备走运维方向或者刚入职做桌面运维想往服务器运维转这份笔记应该是你能直接拿来用的那类东西。我尽量把当时没想明白的地方、老师一句话带过的坑、以及我踩过之后才懂的点都补进去不整虚的。1. 内容整体设计与学习思路拆解1.1 上半部分到底在讲什么黑马Linux运维课程的上半部分核心就是解决一件事让你能在Linux系统上独立完成日常操作。它不像培训机构宣传得那么玄乎前几章本质就是把高频命令按使用场景重新串了一遍。我这套笔记走下来的体验可以用一条线概括文件操作 - 权限管理 - 用户与组 - 网络配置 - 进程与系统状态 - 软件包管理。这条线并不是随意排的它对应的是服务器运维最常碰到的几类问题文件在哪、谁能动、谁在用、网络通不通、系统撑不撑得住、软件怎么装。换句话说上半部分就是帮你把Linux系统的骨架搭起来。你自己在服务器上要做的绝大多数操作都不会脱离这条主线的范围只是在不同应用场景下把这些基础命令组合成更复杂的操作流程。1.2 为什么课程选择从命令入手很多初学者会问现在都有图形界面了甚至Web面板也能管理服务器了为什么要死磕命令行这个问题我在实际运维中也思考过结论很现实生产环境里绝大多数Linux服务器都是最小化安装没有图形界面远程只能通过SSH连接你面对的就是一个黑框框。面板可以帮你做80%的常规操作但那20%的异常情况比如面板坏了、内核参数要调、系统进不去要救援都必须靠命令行手工完成。课程这样设计我后来实际用下来也觉得是合理的先通过高频命令建立对系统的直观感知再深入到配置文件、权限机制、进程模型这些抽象概念。命令是入口理解机制才是目的。只背命令不理解原理换个发行版或换个场景就懵了这在面试和实际排障里都特别明显。1.3 你该用什么样的心态来跟这套笔记如果你是完全零基础我的建议是不要追求把所有命令一次记住。Linux命队伍太多背不完也没必要背完关键是掌握在什么场景查什么命令的思路。当你理解了系统的基本结构哪里是配置、哪里是日志、哪里是设备很多东西是可以举一反三的。笔记里我会把命令的分类逻辑、常用参数、以及最容易犯错的细节标出来你看的时候不用硬记跟着敲一遍然后想一想这个命令解决了什么问题比你重复抄十遍有效得多。上半部分建立的就是这个系统地图有了地图随用随查完全没问题。2. 核心命令体系与实操要点2.1 文件与目录操作一切操作的基本盘Linux的文件系统结构是个树形结构从根目录/出发所有东西都是文件。这条思路是理解后续一切命令的基础。比如/etc是配置文件的家/var/log是日志的聚集地/proc是内核状态的窗口知道文件在哪比记住命令在哪更重要。基础操作中真正的高频命令其实不超过十个ls、cd、pwd、cp、mv、rm、mkdir、touch、ln、find。每个命令都有几个必须吃透的参数我挑几个容易翻车的地方说。先说说ls千万不要只记ls本身。ls -l显示详细信息输出里的第一列就是权限位第五列是文件大小倒数第二列是修改时间。ls -a显示隐藏文件ls -h把大小转为易读格式ls -t按修改时间排序。排查日志目录时ls -lt基本是肌肉记忆最新文件一眼就能看到。然后是我个人踩过最多坑的rm。rm -rf威力太大生产环境里误删是重特大事故级别的问题。我给所有人的建议都一样能用mv把文件移到临时目录就先移走确认没问题再删rm前先ls确认路径。如果你在脚本里使用rm路径变量一定做空值校验rm -rf $VAR少写引号变量为空时变成rm -rf /的情况我见过不止一起。cp的坑在于它默认不复制目录要加-r。覆盖文件时默认直接覆盖不提示可以加-i让它在覆盖前询问。cp -a常用来保留所有属性做归档cp -p保留权限和时间戳备份配置文件时这个很实用。find算得上文件操作里最有含金量的命令。基础用法是find 路径 -name *.log按文件名找-type f或-type d限定类型-mtime 7找七天前改过的文件。生产环境里我最多的是配合-exec或管道做批量处理比如清理七天前的过期日志find /var/log/ -name *.log -mtime 7 -exec rm {} \;2.2 内容查看与处理cat、tail、grep的组合拳排查问题的时候你多半在跟文本打交道。cat适合查看短文件cat -n带行号输出more和less用来分页查看大文件less的交互体验比more好得多支持方向键翻页和/搜索日志分析我基本只用less。日志跟踪要重点说tail。tail -f可以实时跟踪文件追加内容排查服务异常时开一个终端挂在日志上看另一终端复现操作比排错完再看日志高效得多。tail -n 100指定看最后一百行常见的Nginx、MySQL日志定位问题都用得上。grep是文本处理的元老级工具最常用的组合是这样grep -i error /var/log/nginx/access.log # 忽略大小写 grep -v # /etc/nginx/nginx.conf # 反选过滤掉注释行 grep -rn timeout /etc/nginx/ # 递归搜目录显示行号 grep -E error|warning app.log # 扩展正则多条件匹配排查问题时往往是管道组合grep先过滤关键字缩小范围然后用awk或cut取出特定列再用sort和uniq统计排序用head或tail取前后几条。这一套组合拳在分析访问日志、异常报错时的效率提升非常明显。2.3 vim躲不掉又必须会的编辑器服务器上最常见的编辑器就是vim你不会用vim基本等于没法在Linux上改配置。我见过有人不会用vim改配置只能在Windows下改完再传上去这在生产环境是完全不可接受的效率。vim的核心是三种模式切换命令模式、编辑模式、末行模式。默认进入命令模式按i进入编辑模式修改按Esc回命令模式输入冒号进入末行模式执行保存退出等指令。新手最常犯的错误就是不知道当前在哪个模式一顿输入全是命令最后崩溃。必会的操作就几个i插入、dd删除整行、yy复制行、p粘贴、u撤销、末行模式:wq保存退出、:q!不保存强制退出。光标移动可以用方向键效率高一些的用gg跳首行、G跳末行、/关键字搜索。会这些就能应付日常了。当你需要用翻页、缩进多行、批量替换时再按需查不迟。2.4 管道与重定向命令组合的粘合剂Linux的哲学是小命令做大事情。管道|把前一个命令的输出交给后一个命令处理重定向把命令的输出写到文件里或者从文件读取输入。这两样东西把单个命令的能力放大了一个量级。重定向的具体用法是覆盖写是追加写2重定向错误输出21把标准错误也并到标准输出里。排查问题时经常需要把错误日志保存下来比如bash start.sh startup.log 21这样脚本的输出和报错信息全部落盘不会因为SSH断开而丢失。管道配合tee可以边输出边保存ls -l | tee filelist.txt既能在屏幕看到结果又把结果存到了文件里。管道符前面的输出、后面的输入这个数据流思想是理解Linux命令行的关键。很多复杂操作可以拆解成一连串管道每个管道只做一件事最后组合出完整能力。2.5 文件查找与打包压缩备份与迁移的技能生产环境日常运维里备份和迁移基本离不开打包压缩。tar是Linux上最常用的归档工具配合gzip就是最常见的打包压缩方式。常用形式固定两套你直接背下来就行tar -czvf backup.tar.gz /var/www/html # 打包并压缩 tar -xzvf backup.tar.gz -C /opt # 解包解压到指定目录参数组合的含义c创建归档、x提取归档、z调用gzip压缩、v显示过程、f指定文件名。注意f必须放最后因为它的后面必须跟文件名。解压到指定目录要用-C防止文件散落到当前目录。我在文档里特别标注了一个大坑千万不要在解压前不查看内容就直接解压。先tar -tzvf backup.tar.gz查看归档里有哪些文件、路径是怎样的再决定怎么解压能避免压缩包里带着绝对路径导致覆盖错文件的严重失误。网络上下载的包、同事传的包解压前多看这一步能救你很多次。3. 用户权限与安全管理3.1 Linux多用户模型的底层逻辑Linux天然就是多用户操作系统它的权限模型基于三个主体用户、组、其他人和三类权限读、写、执行。理解这几个概念是理解权限管理的前提。每个文件都有属主user和属组group分别对应一个用户ID和组ID。ls -l第一列的权限位格式如-rwxr-xr--第一个字符是文件类型-普通文件、d目录、l软链接后面每三个字符为一组依次是属主权限、属组权限、其他用户权限。目录的执行权限的含义和文件不一样对目录来说w权限代表能否在该目录下创建或删除文件x权限代表能否进入该目录。这个区别是很多人容易出问题的地方两个用户在同一目录下协作时如果目录没有x权限即使文件有权限也根本无法访问。3.2 用户与组的管理命令实战创建用户的基本操作是三步走useradd -m -s /bin/bash zhangsan # 创建用户并创建家目录、指定shell passwd zhangsan # 设置或修改密码 useradd -G docker zhangsan # 把用户加入附加组用户信息存在/etc/passwd密码哈希存在/etc/shadow组信息在/etc/group。这三个文件建议抽时间认真读一遍很多权限问题的答案都在里面。比如用户主组和附加组的区别一个用户只能有一个主组但可以加入多个附加组权限判定时会综合所有组建的权限。修改用户密码时passwd有两条注意点生产环境默认的ulimit限制是65535但echo password | passwd --stdin zhangsan这种非交互改密码方式在自动化脚本里常用注意这条命令Red Hat系和Debian系的可用性不一样用chage可以设置密码有效期和过期策略这在等保测评时是必查项。3.3 权限修改与特殊权限位chmod修改权限有两种方式数字法和符号法。数字法把权限转成二进制位r4,w2,x1比如chmod 755 file代表属主rwx、属组rx、其他人x。符号法比如chmod ux file、chmod o-w file更直观适合只改某个角色的某个权限。chown用来改属主和属组chown zhangsan:developers file同时改用户和组递归给目录及内容一起改要加-R。注意chown在权限迁移时比chmod危险得多改之前先确认当前属主是谁避免把系统文件的属主改掉导致服务起不来。特殊权限位是新手容易忽略但是生产环境很有用的部分。setuid数字4000让普通用户临时以属主身份运行程序典型例子是/usr/bin/passwd它需要以root身份改密码但普通用户能执行setgid数字2000对目录设置后用户在目录下新建的文件会继承目录的属组这个常用于团队共享目录sticky bit数字1000只对目录生效设置后只有文件属主、目录属主或root能删除目录里的文件典型就是/tmp目录。这三个特殊位一旦误设会带来严重安全问题。设置方法是chmod 4755 file查看用ls -l对应位置的x会变成s或t。排查恶意文件时值得特别注意出现了s权限位的可执行文件那基本是个后门特征。3.4 sudo机制与提权安全边界sudo是最常用的提权方式它的配置在/etc/sudoers。强烈建议用visudo命令编辑而不是直接改文件因为visudo会在保存时做语法检查语法错误直接不让保存防止你改完把sudo搞废。最基本的配置是为用户添加sudo权限zhangsan ALL(ALL) ALL实际面试和生产里更常见的是给用户组授权%developers ALL(ALL) NOPASSWD:ALLNOPASSWD的含义是执行sudo时不用输密码适合脚本里使用但不适合安全要求较高的环境。更细粒度的用法是只允许特定用户以root执行特定命令zhangsan ALL(root) /usr/bin/systemctl restart nginx这样可以做到最小化授权避免直接给人全部root权限。sudo -l # 查看当前用户可执行的sudo命令 sudo su # 切换到root用户3.5 SELinux/AppArmor权限体系外的安全层Red Hat系默认开启SELinuxUbuntu默认使用AppArmor。SELinux是强制访问控制MAC即使文件权限和用户权限都正确SELinux不放行服务照样无法访问资源。我排查过很多次明明权限对了服务还是起不来的问题最后都落在SELinux上。遇到类似情况可以先临时把SELinux设为permissive模式只记录不拦截测试setenforce 0如果确认是SELinux导致的问题正确解法不是关掉SELinux而是按需修改策略用chcon修改文件的安全上下文或者用semanage调整服务对应的布尔值开关。生产环境不推荐长期关闭SELinux等保测评这块也是重点检查项。Ubuntu系的AppArmor逻辑类似配置文件在/etc/apparmor.d/用aa-status查看加载状态。4. 网络配置与远程管理4.1 网卡配置与IP地址管理服务器要对外服务第一步就是网络配置。不同发行版的网络管理方式不同但原理一致改配置文件后用工具生效。Red Hat系CentOS/RHEL的网卡配置文件在/etc/sysconfig/network-scripts/ifcfg-eth0。核心项目BOOTPROTOnone # 静态IP填 noneDHCP填 dhcp ONBOOTyes # 开机自动启用必须设为 yes IPADDR192.168.1.100 NETMASK255.255.255.0 GATEWAY192.168.1.1 DNS18.8.8.8改完配置用systemctl restart network或nmcli connection reload生效。新版系统推荐用nmcli命令管理网络可以在不改文件的情况下完成全部配置。Ubuntu系现在的配置方式在/etc/netplan/目录下一个*.yaml文件搞定network: version: 2 ethernets: eth0: addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 114.114.114.114]我用过的经验是改网络配置前一定先确认自己跟服务器的连接方式如果只有IP能连改错配置等于把自己锁在门外。稳妥做法是改之前写好恢复脚本或准备带外管理如IPMI/iDRAC改完立即测试连通性不通马上回滚。4.2 网络排查命令全家桶网络不通是最常见的线上问题排查网络有固定的从底层往上层的路径这套思路值得背下来顺序执行就可以定位绝大多数网络故障。第一步查看网卡和IP状态ip addr。看网卡有没有UP、IP地址是否正确。注意ip命令取代了老旧的ifconfig新系统上命令可能没有ifconfig但一定有ip。第二步确认路由ip route看默认网关有没有配错。很多上不了网的问题就是默认路由丢了或网关错了。第三步检查DNS解析nslookup或dig查域名是否解析到正确IP。DNS出问题是最迷惑人的故障你的电脑显示网络连接正常但就是打不开域名多半是DNS的问题。第四步测连通性ping测IPtelnet ip 端口测TCP端口通不通。这里有个经验ping通只能说明ICMP通不能说明业务端口通。排查Web服务要用curl -v看HTTP响应过程排数据库服务用telnet IP 3306。第五步看监听端口ss -lntp看服务器上有哪些端口在监听。结合netstat -lntp老命令确认服务启动状态和监听地址是0.0.0.0还是127.0.0.1。4.3 SSH远程管理与密钥认证SSH是运维的生命线每天百分之九十的操作都通过它完成。默认端口22强烈建议修改成不常见端口这样可以过滤大量自动化脚本的扫描攻击。修改位置在/etc/ssh/sshd_config里改Port改完重启sshd服务后新端口生效注意先确认防火墙放行了新端口再断掉旧连接。密码登录虽然方便但安全性弱生产环境强烈建议改成密钥认证。生成与部署过程ssh-keygen -t rsa -b 4096 # 生成密钥对一路回车即可 ssh-copy-id userserver # 公钥拷贝到服务器认证原理说一下私钥留在本地默认在~/.ssh/id_rsa公钥放到目标服务器的~/.ssh/authorized_keys文件里。登录时服务器用公钥验证你的身份私钥是你的通行证所以私钥文件一定要配置600权限不要泄露不要上传网盘。做好密钥认证后把/etc/ssh/sshd_config里的PasswordAuthentication改成no彻底关闭密码登录。改之前先开一个新终端验证密钥登录没问题否则风险极大。我在这里栽过一次直接改了配置并且顺手把sshd重启了结果新密钥没生效IP还在防火墙黑名单整个人被锁在外面最后只能去机房用带外控制台把配置改回来。SSH本身可以做非常多增强操作包括但不限于-L本地端口转发把远程端口映射到本地、-R远程转发、-J跳板机连接、ControlMaster保持长连接加速重复登录。上半部分课程里只提到基础的端口转发我觉得这块对实际工作价值极大你可以按需拓展。4.4 防火墙与端口管控防火墙是服务器的门禁很多网络问题的根源就是防火墙拦截。不同Linux系列的防火墙管理工具不一样Red Hat系是firewalld老版本是iptablesUbuntu有时用ufw。firewalld的常用操作systemctl start firewalld systemctl enable firewalld firewall-cmd --permanent --add-port8080/tcp # 放行8080端口 firewall-cmd --permanent --remove-port8080/tcp # 移除放行 firewall-cmd --reload # 重载配置 firewall-cmd --list-all # 查看当前规则注意--permanent参数表示持久化到配置文件不加它只对当前会话生效重启后规则丢失。改完规则记得--reload重新加载。排查服务起不来时先确认服务本身监听了ss -lntp再看防火墙是否拦截firewall-cmd --list-all然后测试本机和外部连通性这样三步可以快速定位是服务问题、防火墙问题还是网络问题。5. 服务进程与系统状态监控5.1 systemd现代Linux的服务管家现在的Linux发行版基本都用systemd管理服务理解systemd的运作方式是运维的基本功。systemctl是它的管理命令常用组合systemctl start nginx # 启动服务 systemctl stop nginx # 停止服务 systemctl restart nginx # 重启服务 systemctl enable nginx # 开机自启 systemctl disable nginx # 禁止开机自启 systemctl status nginx # 查看服务状态排查服务日志也是systemd的重要能力journalctl -u nginx可以查看指定服务由systemd捕获的标准输出和错误日志很多时候服务的报错信息就在这里。journalctl -f实时跟踪日志排查问题时配合服务启停效率很高。服务配置文件在/etc/systemd/system/目录下以.service结尾。手动创建服务单元的格式很简单[Unit] DescriptionMy custom service Afternetwork.target [Service] Typesimple ExecStart/usr/local/bin/myapp --config /etc/myapp.conf Restarton-failure [Install] WantedBymulti-user.target改完配置后必须执行systemctl daemon-reload让systemd重新读取配置。新建服务文件时这个经常忘导致改了配置不生效白折腾半天。5.2 进程查看与资源监控进程管理是排查系统性能问题的入口。ps是最基础的进程查看命令组合参数ps -ef和ps aux差不多都能看到进程的PID、PPID、CPU、内存使用率、启动命令。ps aux --sort-%cpu按CPU占用排序找最吃CPU的进程ps aux --sort-%mem按内存排序这两条在生产环境排障时几乎天天用。top是动态监控工具默认每三秒刷新一次按P按CPU排序按M按内存排序按q退出。第一行的负载平均值能反映系统压力如果三个数字持续大于CPU核心数系统基本处于过载状态。htop是top的增强版交互更友好支持鼠标操作但新系统可能需要手动安装。kill命令用于结束进程基本用法是kill PID发送TERM信号让进程自己处理退出kill -9 PID直接强杀。刚接触Linux的人容易一上来就用-9这是坏习惯强杀会产生残留在临时文件、数据库事务中断等问题应该先给进程机会优雅退出实在没反应再强杀。5.3 系统资源瓶颈排查思路系统卡顿的排查要分维度看。CPU满、内存不足、磁盘IO过载、网络带宽打满每个维度的表现和排查方法不同。一个常用的排查路径top # 看整体负载按P和M分别看CPU和内存占用top free -h # 看内存总量、已用、缓存 df -h # 看磁盘剩余空间 iostat -x 1 # 看磁盘IO的繁忙程度 sar -n DEV 1 # 查看网络流量systat包提供有一个容易忽略的点free -h里的内存已用看起来很高不代表内存不足。Linux会用剩余内存做页缓存buff/cache这是正常现象不是内存泄漏。要看真正的内存压力看available列这一列才会反映还有多少可用内存。磁盘空间耗尽是最常见的运维事故会导致服务写不出日志、数据库无法写入事务表现是服务挂了但进程还活着。排查命令是df -h看分区du -sh /var/log/*找大文件。我处理过几次生产事故最后都发现是日志文件太大把磁盘塞满。所以配置日志轮转logrotate在部署服务时必须做不要等磁盘满了再后悔。5.4 计划任务与日志轮转crontab是Linux下配置定时任务的标准方式。crontab -e编辑当前用户的计划任务crontab -l查看已配置的任务。时间格式五个字段依次是分、时、日、月、周。几个常用写法0 2 * * * /usr/local/bin/backup.sh # 每天凌晨2点执行备份脚本 */5 * * * * /usr/local/bin/check.sh # 每5分钟执行一次检查脚本 30 3 * * 1 /usr/local/bin/cleanup.sh # 每周一凌晨3点30执行清理脚本日志轮转由logrotate管理配置在/etc/logrotate.d/目录下。一个典型的Nginx日志轮转配置/var/log/nginx/*.log { daily # 按天轮转 rotate 30 # 保留30份 compress # 轮转后压缩 missingok # 日志不存在时不报错 notifempty # 日志为空时不轮转 sharedscripts # 一组日志只执行一次postrotate脚本 postrotate /bin/kill -USR1 cat /run/nginx.pid 2/dev/null 2/dev/null || true endscript }postrotate里的kill -USR1是让Nginx重新打开日志文件如果不做这步Nginx会继续往旧已轮转文件里写日志磁盘空间照样会被塞爆。这个细节我在课程笔记里特意标注过是很多日志轮转不生效问题的真正原因。6. 软件包管理与环境部署6.1 Red Hat系yum/dnf与Debian系aptLinux的软件安装和Windows点exe完全不同它是基于包管理器的。Red Hat系用yum新版本用dnfDebian系用apt。两个体系的命令几乎一一对应但软件包格式不同rpm包和deb包不能混用。yum/dnf的常用操作yum install -y nginx # 安装软件包 yum remove nginx # 卸载 yum list installed | grep nginx # 查已安装的包 yum provides */nginx # 查文件属于哪个包 yum update -y # 更新全部软件包apt的对应操作apt update # 刷新软件源索引这步必做 apt install -y nginx apt remove nginx apt list --installed | grep nginxapt update和apt install是两步很多新手忘了先update导致找不到软件包或装的不是最新版。Debian系包管理还有apt upgrade和apt dist-upgrade的区别日常用apt upgrade就够了。6.2 源码编译安装的完整步骤包管理器不是万能的有些软件版本太老、官方源里没有或者需要自定义编译参数时就得走源码编译。源码编译安装的标准四步# 1. 下载并解压源码 wget https://example.com/software-1.2.3.tar.gz tar -xzf software-1.2.3.tar.gz cd software-1.2.3 # 2. 配置编译选项 ./configure --prefix/usr/local/software --with-ssl # 3. 编译 make # 4. 安装 make install--prefix指定安装路径这个最好自定义不指定的情况下可能散落到系统目录后期卸载非常麻烦。make -j$(nproc)可以用多核并行编译加快速度Nginx、PHP这类大项目能明显感受到提速。源码安装最大的问题是缺依赖常见的报错是configure: error: xxx not found这时候需要装对应的开发包Red Hat系是*-devel包Debian系是*-dev包。比如编译Nginx需要gcc、make、pcre-devel、zlib-devel、openssl-devel。我的经验是先装齐基础编译工具和常用依赖库再开始编译能少走很多弯路yum install -y gcc make pcre-devel zlib-devel openssl-devel6.3 环境变量与PATH机制命令能执行靠的是环境变量PATH。输入命令时系统会按PATH里列出的目录依次查找同名可执行文件找不到就报command not found。echo $PATH不同用户和执行不同程序时PATH可能不一样这就是为什么root能用某命令但普通用户不能的原因。设置环境变量的三种方式export MYVARhello # 临时生效重启终端后失效 echo export MYVARhello ~/.bashrc # 对当前用户永久生效 echo export MYVARhello /etc/profile # 对所有人永久生效source ~/.bashrc或source /etc/profile可以让配置立即生效不用重新登录。源码安装的软件如果想全局可用可以软链接到/usr/local/bin或者把安装路径加进PATH。我自己更习惯用软链接的方式因为多个版本切换时改链接很方便。6.4 压缩包软件的安装与目录规范除了包管理器和源码编译还有一种常见方式是拿到官方编译好的二进制压缩包解压就能用。比如Nginx官方、JDK的tar包都是这种形式。安装流程就是解压、配环境变量、写启动脚本。这类方式的关键是目录规划。我建议统一约定一个规范/opt/nginx-1.24.0/ # 软件本体 /opt/nginx # 软链接指向当前使用的版本 /etc/nginx/ # 配置文件从软件目录软链接出来 /var/log/nginx/ # 日志统一放这里用软链接管理的好处是可以快速回滚版本新版本有问题改一下软链接指回旧版本重启服务就完成回滚比卸载重装快得多。这个习惯救过我很多次。7. 常见问题与故障排查实录7.1 命令找不到或PATH异常command not found是最常见的错误提示。遇到这个先别慌按顺序排查第一命令是否真的安装了第二命令所在目录是否在PATH里第三当前用户是否有执行权限。比如你刚编译安装了软件但输入命令报找不到多半是没做软链接或PATH没配。用which 命令名查看系统实际执行的是哪个文件用find / -name 命令名 2/dev/null全盘查找。修复PATH的方式上面已经讲了把对应目录加进/etc/profile再source即可。另一种情况是本来能用的命令突然找不到了多半是PATH变量被脚本覆盖了。排查脚本时注意有没有写export PATH/something这种覆盖式赋值正确写法应该是export PATH/something:$PATH保留原有路径。这个问题经常在写部署脚本、CI脚本时踩到很隐蔽。7.2 Permission denied的排查路径Permission denied在Linux下基本能说明问题方向但具体原因有四五种。我用一套固定流程排查ls -l 文件 # 看文件权限位和属主属组 id 用户名 # 看当前用户身份和组信息 getenforce # 看SELinux是否开启Red Hat系 mount | grep 挂载点 # 看是否涉及共享目录挂载NFS场景文件普通权限没问题但还报权限错误优先怀疑SELinux。临时测试方法上面讲过setenforce 0。如果是NFS共享目录权限问题可能是NFS的root_squash选项导致root被映射为nobody。交互式终端和脚本执行环境对权限的判定基本一致但脚本里执行命令的用户身份需要注意检查crontab环境时尤其明显crontab里的环境变量可能不完整导致脚本里命令都执行不了。7.3 磁盘满但df又显示有空间这个问题很坑df -h显示磁盘没满服务却一直报No space left on device。常见原因是inode耗尽了。inode是存储文件元数据的索引节点文件非常多但单个都比较小比如大量缓存小文件时inode可能先满。用df -i查看inode使用率使用率达到100%同样会造成无法创建文件。另一个可能是有文件被进程占用但已删除。rm删除文件后如果进程还在持有该文件的句柄空间不会真正释放。用lsof | grep deleted找出占用文件的进程重启该进程或用 文件清空内容才能释放空间。顺带说一个清理技巧查找大文件用du -h --max-depth1 / | sort -h逐层定位或者用find / -size 500M -exec ls -lh {} \;一步到位。清理大文件前确认是否能删最好先移动到临时目录观察两天再彻底删除。7.4 SSH连不上或连接太慢SSH连不上按这个顺序排查第一网络通不通ping IP第二端口通不通telnet IP 22第三服务是否在监听ss -lntp | grep sshd第四防火墙是否拦截firewall-cmd --list-all检查22端口是否放行。SSH连接慢输密码前卡很久的原因通常是DNS反向解析。sshd默认会解析客户端IP的域名如果解析超时会卡很久。解决办法是/etc/ssh/sshd_config里设置UseDNS no重启sshd后连接速度会大幅提升。这个优化几乎每台服务器都应该做不用犹豫。如果SSH彻底断了且带外管理IPMI/iDRAC等也没有只能通过物理终端解决时提醒一句平时把改动记录好恢复时能少很多盲目操作。真实的服务器事故里手忙脚乱的恢复操作经常让问题变得更严重冷静按文档执行才是最快的。7.5 端口被占用服务起不来启动服务时报Address already in use或端口被占用先找谁占了端口ss -lntp | grep 8080输出里有PID和进程名然后ps -ef | grep PID看进程详情。如果确定这个进程占用的端口必须让出来的可以优雅停掉进程或用kill结束。另一种情况是端口被监听但看不到进程名可能是权限限制用root身份再查一次。生产环境最常见的端口被占用其实是重启服务时旧进程没停止干净。Nginx、Tomcat这类服务重启前先确认旧进程已经退出避免起了新进程后发现端口被旧进程占着新旧进程同时存在的混乱局面。我给自己定的规矩是每次重启服务先ss -lntp看干净再启动启动后再看一次监听状态确认无误才继续操作。8. 学习小结与进阶方向黑马Linux课程的上半部分就像一张运维地图的正面从命令到系统概念从文件到权限从网络到服务把你需要知道的系统骨架问题都覆盖了一遍。我在整理笔记时最大的感受是这些东西看似零散但它们之间是有逻辑链条的一环扣一环。文件的权限需要用户和组的概念支撑用户的登录需要网络和SSH支撑服务的运行需要进程和systemd支撑。所以不建议跳着学顺序跟下来构建的体系最稳固。下半部分我还没整理完目前学到的方向大概包括Shell脚本编程的进阶用法、sed和awk文本处理三剑客、磁盘管理LVM逻辑卷、NFS共享存储、Nginx/Tomcat等常见服务搭建、MySQL数据库运维基础以及监控系统的搭建。这些内容是从单机管理走向服务部署的重要一步学完后你会发现自己具备了独立搭建一套小型业务环境的能力。最后说点实在的心得。Linux运维这个岗位面试看的是基础扎实不扎实工作看的是会不会有序排查问题。命令背得再多不如把一条完整的排查思路走通一次。黑马这套课程的价值在于把零散的知识点串成了体系但真正的内化还得靠你在自己的虚拟机里反复敲、反复踩坑。我整理笔记时专门用一台CentOS虚机和一台Ubuntu虚机交替做实验因为两个体系有些命令不一样交替使用能帮你更全面地理解Linux的共性和差异。另外一个建议是给自己搭一套最小实验环境一台虚机、一个快照、一段可以反复折腾的坏境。快照是你最好的后悔药实验随便做坏了就回滚成本为零。我见过太多人怕把系统弄坏而不敢实际操作其实恰恰相反虚拟机里弄坏的次数越多生产环境里出问题的概率越低。踩坑从来不是坏事关键是踩完之后认真记下来这样每一次犯错都在让你变成更靠谱的运维。