☰
Linux运维实战笔记:命令、权限、网络与故障排查全攻略
2026/10/1 17:52:09 网站建设 项目流程

从零开始啃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>重定向错误输出,2>&1把标准错误也并到标准输出里。排查问题时经常需要把错误日志保存下来,比如:

bash start.sh > startup.log 2>&1

这样脚本的输出和报错信息全部落盘,不会因为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修改权限有两种方式:数字法和符号法。数字法把权限转成二进制位,r=4,w=2,x=1,比如chmod 755 file代表属主rwx、属组rx、其他人x。符号法比如chmod u+x 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:ALL

NOPASSWD的含义是执行sudo时不用输密码,适合脚本里使用但不适合安全要求较高的环境。更细粒度的用法是只允许特定用户以root执行特定命令:zhangsan ALL=(root) /usr/bin/systemctl restart nginx,这样可以做到最小化授权,避免直接给人全部root权限。

sudo -l # 查看当前用户可执行的sudo命令 sudo su # 切换到root用户

3.5 SELinux/AppArmor:权限体系外的安全层

Red Hat系默认开启SELinux,Ubuntu默认使用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。核心项目:

BOOTPROTO=none # 静态IP填 none,DHCP填 dhcp ONBOOT=yes # 开机自动启用,必须设为 yes IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.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测IP,telnet 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 user@server # 公钥拷贝到服务器

认证原理说一下:私钥留在本地(默认在~/.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,老版本是iptables,Ubuntu有时用ufw。

firewalld的常用操作:

systemctl start firewalld systemctl enable firewalld firewall-cmd --permanent --add-port=8080/tcp # 放行8080端口 firewall-cmd --permanent --remove-port=8080/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] Description=My custom service After=network.target [Service] Type=simple ExecStart=/usr/local/bin/myapp --config /etc/myapp.conf Restart=on-failure [Install] WantedBy=multi-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系(apt)

Linux的软件安装和Windows点exe完全不同,它是基于包管理器的。Red Hat系用yum(新版本用dnf),Debian系用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 nginx

apt 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-devel

6.3 环境变量与PATH机制

命令能执行,靠的是环境变量PATH。输入命令时,系统会按PATH里列出的目录依次查找同名可执行文件,找不到就报command not found。

echo $PATH

不同用户和执行不同程序时PATH可能不一样,这就是"为什么root能用某命令但普通用户不能"的原因。设置环境变量的三种方式:

export MYVAR=hello # 临时生效,重启终端后失效 echo 'export MYVAR=hello' >> ~/.bashrc # 对当前用户永久生效 echo 'export MYVAR=hello' >> /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-depth=1 / | 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的共性和差异。

另外一个建议是:给自己搭一套"最小实验环境",一台虚机、一个快照、一段可以反复折腾的坏境。快照是你最好的后悔药,实验随便做,坏了就回滚,成本为零。我见过太多人怕把系统弄坏而不敢实际操作,其实恰恰相反,虚拟机里弄坏的次数越多,生产环境里出问题的概率越低。踩坑从来不是坏事,关键是踩完之后认真记下来,这样每一次犯错都在让你变成更靠谱的运维。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询