从零到SRE:马哥教育Linux基础实战全解析

📅 发布时间:2026/7/7 7:12:10 👁️ 浏览次数:
从零到SRE:马哥教育Linux基础实战全解析
1. 从零到SRE为什么Linux基础是绕不开的起点我见过很多想转型SRE站点可靠性工程师的朋友一上来就直奔Kubernetes、Prometheus、Terraform这些“酷炫”的工具。结果呢往往在第一个真正的线上故障面前就懵了。问题出在哪服务器磁盘满了他不知道怎么快速定位是哪个目录一个进程占满了CPU他连top命令都看不明白想写个脚本批量处理日志结果在Shell循环和正则表达式上卡了半天。这就是我想和你聊的第一个核心观点Linux基础是SRE这座摩天大楼的地基。地基不牢上面堆砌再多的“云原生”、“可观测性”概念都可能是空中楼阁。马哥教育的SRE课程体系之所以把Linux基础放在最前面并且花了大量篇幅原因就在于此。SRE的日常工作无论是故障排查、性能调优、自动化脚本编写还是服务部署、网络配置几乎每一步都踩在Linux操作系统之上。你不需要成为内核专家但你必须能熟练地在Linux这片土地上“行走”和“耕作”。很多新手会问学Linux是不是就是背命令绝对不是。我理解的Linux基础实战是**“肌肉记忆”“原理理解”“场景串联”** 的三位一体。比如你不仅要知道ps aux能看进程还要理解进程的父子关系、状态变迁更要能在服务器负载飙升时用ps配合grep、awk快速揪出元凶。这就像老司机开车手脚的动作是下意识的但脑子里对路况和车况的模型是清晰的。接下来我会结合马哥教育课程中的核心模块带你走一遍我认为最关键的Linux基础实战路径。这不是简单的命令罗列而是我踩过无数坑后总结出的“怎么学”和“怎么用”的心得。我们的目标不是记住几百个命令而是构建一套属于自己的、能解决实际问题的工具箱和思维模型。2. Shell与命令执行你的第一把瑞士军刀2.1 Shell不只是个黑框框很多人觉得Shell就是个输入命令的黑窗口。这个理解太浅了。Shell是你与Linux内核对话的翻译官和指挥官。你敲下的每一条命令都由Shell进行解析、展开最终交给内核执行。常见的Bash、Zsh就是不同的“翻译风格”。怎么查看当前用的哪种Shell很简单echo $SHELL或者更详细一点cat /etc/shells # 查看系统所有可用Shell选择一款顺手的Shell并深入配置比如Oh My Zsh能极大提升效率。但在此之前你得先理解命令是怎么被这个“翻译官”处理的。2.2 命令执行的“暗箱操作”当你输入ls -l并回车后背后发生了一系列精妙的过程解析Shell先拆解你的输入ls是命令-l是参数。展开如果命令中包含*、?这样的通配符或者$HOME这样的变量Shell会先进行替换展开。比如ls *.log会先变成ls a.log b.log c.log。判定Shell判断ls是内部命令Shell自带还是外部命令磁盘上的一个程序。用type ls可以查看。寻址如果是外部命令Shell会沿着$PATH这个环境变量定义的路径像查电话簿一样逐个目录寻找名叫ls的可执行文件。执行找到后Shell会调用fork()创建一个子进程然后在这个子进程里通过exec()系统调用把ls程序加载进来运行。返回ls运行结束把结果文件列表和退出状态码0表示成功非0表示失败返回给ShellShell再显示给你看。理解这个过程有什么用当你遇到“command not found”错误时你就知道该去检查$PATH或者文件权限了。这也是理解后续管道、重定向、脚本执行的基础。2.3 内外命令与效率工具内部命令如cd,echo,pwd。它们是Shell身体的一部分执行快不创建新进程。可以用help命令查看帮助如help cd。外部命令如/bin/ls,/usr/bin/grep。它们是独立的程序文件。用man或命令 --help查看帮助。Tab补全和命令历史是你必须养成的两大习惯。按Tab键让Shell帮你补全命令、文件名、参数能避免拼写错误极大提升输入速度。而用上下箭头翻找历史命令或者用CtrlR反向搜索历史则是快速复用之前操作的秘诀。我个人的习惯是任何超过3个字符的命令都先按Tab试试。获取帮助的能力决定了你的技术天花板。别死记硬背要善用whatis command一句话简介。command --help最快速的用法参考。man command最权威的说明书。别怕英文看多了就熟了。重点看SYNOPSIS语法、DESCRIPTION描述、OPTIONS选项和EXAMPLES例子部分。3. 文件系统与IO重定向一切皆文件的哲学3.1 目录树与文件类型Linux信奉“一切皆文件”。不仅是文本、图片连硬件设备/dev/sda、进程信息/proc/pid、网络连接都被抽象成了文件。这种统一的接口让管理变得异常简洁。记住几个关键目录/根一切的起点。/home用户的家你的主战场。/etc配置文件的仓库。改配置前先备份这是血泪教训。/var变化的数据日志/var/log就在这里。/tmp临时文件重启可能消失。用ls -l看文件第一列的字符就是文件类型标识-普通文件。d目录。l软链接快捷方式。b和c块设备和字符设备如硬盘、终端。p管道文件。s套接字文件。3.2 文件操作核心命令实战命令不是背的是用出来的。我分享几个高频组合拳场景一批量查找并处理文件# 找到当前目录下所有 .log 文件并统计每个文件的行数 find . -name *.log -type f -exec wc -l {} \; # 或者用 xargs (处理大量文件时更高效) find . -name *.log -type f | xargs wc -l这里用到了find的-exec和管道|配合xargs。-exec每次处理一个文件xargs则尽量将多个文件合并成一次命令执行效率更高。场景二对比两个目录的差异# 比较 dir1 和 dir2 中文件的差异 diff -r dir1 dir2 # 如果只想知道哪些文件不同不关心内容细节 diff -rq dir1 dir2场景三文件权限管理深潜chmod 755 script.sh大家都知道。但你知道chmod ux,g-w,or file这种符号表示法吗它更直观给用户(u)增加执行(x)权限给组(g)去掉写(w)权限给其他人(o)设置读(r)权限。 特殊权限更关键SUIDchmod us /usr/bin/passwd。普通用户执行passwd时临时拥有文件所有者(root)的权限才能修改/etc/shadow。SGID用在目录上时chmod gs /shared_dir。任何人在此目录创建的文件所属组都自动继承目录的组便于团队协作。Sticky Bitchmod ot /tmp。确保每个人只能删除自己的文件不能动别人的。3.3 硬链接与软链接本质区别这是面试常考点也是容易混淆的点。硬链接ln source hardlink。本质是给同一个文件数据块起了个新名字。它们共享相同的inode号。删除源文件只要还有硬链接在数据就不会丢。不能跨文件系统不能链接目录。软链接ln -s source softlink。本质是一个独立的文件里面只存储了源文件的路径指针。像Windows的快捷方式。删除源文件软链接就“断链”了。可以跨文件系统可以链接目录。怎么记硬链接是“分身”软链接是“路标”。3.4 IO重定向与管道组合艺术的精髓这是Shell编程的灵魂。标准输入(stdin, 文件描述符0)、标准输出(stdout, 1)、标准错误(stderr, 2)。重定向command file输出重定向覆盖。command file输出追加重定向。command 2 error.log错误重定向。command all.log标准和错误一起重定向。command input.txt输入重定向。管道|把前一个命令的输出作为后一个命令的输入。# 经典组合查找包含“ERROR”的日志按时间排序取最后10个 grep ERROR app.log | sort -k 3 | tail -10tee命令是个神器它能“分流”既把结果存入文件又继续传递给管道。# 在升级系统软件包的同时将详细日志保存下来 sudo dnf upgrade -y | tee upgrade.log这样你既能实时看到进度事后又能查看完整的日志文件。4. 用户、权限与文本处理安全与效率的基石4.1 用户、组与ACL精细化的权限控制/etc/passwd存用户信息/etc/shadow存加密密码/etc/group存组信息。这是基础。但传统的rwx三组权限属主、属组、其他人在复杂场景下不够用。比如你想让开发组的zhang能读一个文件但不想给整个dev组写权限。这时就需要ACL访问控制列表。# 查看文件的ACL getfacl important.conf # 为用户zhang添加读写权限 setfacl -m u:zhang:rw important.conf # 为组testers添加读权限 setfacl -m g:testers:r important.conf # 移除某条ACL setfacl -x u:zhang important.confACL让你能针对特定用户或组设置权限实现更精细的控制。ls -l时如果权限位后面有个号就说明这个文件设置了ACL。4.2 Vim从抗拒到依赖的编辑器初学者可能觉得Vim反人类但一旦掌握你会离不开它。它完全键盘操作手不离键盘就能完成所有编辑效率远超鼠标流。我的建议是分三步走生存阶段记住i进入插入模式Esc退回命令模式:wq保存退出:q!不保存强制退出。够了。效率阶段掌握移动h/j/k/l,w跳词$行尾、删除dd删行dw删词、复制粘贴yy复制行p粘贴、查找替换/pattern查找:%s/old/new/g全局替换。高手阶段使用宏qa开始录制q结束a执行、分屏:sp水平分:vsp垂直分、插件管理Vundle/Pathogen。记住Vim的学习曲线是先陡后平。坚持一周每天用你会回来感谢我的。4.3 文本处理三剑客grep, sed, awk这是Linux文本处理的王牌组合。我的理解是grep负责“筛选”。在大量文本中快速找到目标行。sed负责“编辑”。对文本进行增删改查尤其擅长按行处理。awk负责“分析”。把文本看成有行有列的表格能进行复杂的计算和格式化输出。实战场景分析Nginx访问日志假设日志格式为$remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent# 1. 使用grep找出所有状态码为500的请求筛选 grep 500 access.log # 2. 使用sed提取出这些请求的时间戳和URL编辑 # 假设时间在[]内请求在引号内 grep 500 access.log | sed -n s/.*\[\(.*\)\].*\(.*\).*/\1 \2/p # 3. 使用awk统计每个URL出现500错误的次数并按次数排序分析 awk $9 500 {print $7} access.log | sort | uniq -c | sort -rnawk在这里大显神威$9代表第9列状态码$7代表第7列请求URL。sort | uniq -c是经典的统计组合sort -rn是按数字逆序排序。正则表达式是这三个工具的灵魂。基础正则BRE和扩展正则ERE的主要区别在于元字符是否需要转义。在grep默认用BRE、?、|、()需要转义用grep -E或egrep则使用ERE这些元字符可以直接使用。我个人的习惯是简单匹配用默认grep复杂模式直接用grep -E省去转义的麻烦。5. Shell脚本编程自动化的第一步5.1 脚本基础与调试一个合格的Shell脚本开头必须是#!/bin/bash # 作者你的名字 # 描述这个脚本是干嘛的 set -euo pipefailset -euo pipefail是一道强大的安全符-e任何命令失败返回非0就立即退出。-u遇到未定义的变量就报错退出。-o pipefail管道中任何一个命令失败整个管道就视为失败。调试脚本我推荐直接用bash -x your_script.sh。它会打印出脚本执行的每一行命令及其展开后的参数像慢镜头一样让你看清执行过程排查变量替换、逻辑错误非常有效。5.2 变量与条件测试变量赋值等号两边不能有空格。引用变量用$为了安全尤其是变量可能为空或包含空格时一定要加双引号$my_var。条件测试[ ]和[[ ]]我强烈推荐使用[[ ]]它是Bash的增强版更安全功能更强。比如字符串比较[[ $str1 $str2 ]]即使变量包含空格也不会出错。它还支持正则匹配[[ $file ~ \.txt$ ]]。5.3 函数与信号捕捉把重复的代码块封装成函数是脚本走向成熟的标志。log_info() { local now$(date %Y-%m-%d %H:%M:%S) # local声明局部变量 echo [INFO] $now - $1 } log_info 脚本开始执行local关键字确保变量只在函数内生效避免污染全局空间。信号捕捉trap是编写健壮脚本的进阶技能。比如你想在脚本被CtrlC中断时清理临时文件cleanup() { echo 正在清理临时文件... rm -rf /tmp/myscript_* exit 1 } trap cleanup SIGINT SIGTERM # 捕捉中断和终止信号这样无论脚本是正常结束还是被强制终止都能保证临时资源被清理。5.4 实战一个简单的服务监控脚本让我们写一个监控Nginx服务是否存活并尝试重启的脚本#!/bin/bash set -euo pipefail SERVICEnginx LOG_FILE/var/log/nginx_monitor.log log() { echo $(date %Y-%m-%d %H:%M:%S) - $1 $LOG_FILE } check_and_restart() { if ! systemctl is-active --quiet $SERVICE; then log 服务 $SERVICE 已停止正在尝试重启... if systemctl restart $SERVICE; then log 服务 $SERVICE 重启成功。 # 可以在这里添加邮件或钉钉告警通知重启成功 else log 错误服务 $SERVICE 重启失败 # 这里可以触发更高级的告警 exit 1 fi else log 服务 $SERVICE 运行正常。 fi } # 主循环每60秒检查一次 while true; do check_and_restart sleep 60 done这个脚本虽然简单但涵盖了函数、条件判断、日志记录、服务管理等实用概念。你可以把它放到cron里定时执行或者用systemd托管为一个后台服务。6. 系统管理核心存储、网络与进程6.1 磁盘与LVM灵活应对空间变化传统分区(fdisk/gdisk)的缺点是大小固定。生产环境中LVM逻辑卷管理几乎是标配。它提供了存储的“池化”管理。核心概念三步走物理卷(PV)把一块硬盘或一个分区(/dev/sdb1)初始化成LVM可管理的物理卷pvcreate /dev/sdb1。卷组(VG)把多个PV合成一个大池子vgcreate my_vg /dev/sdb1 /dev/sdc1。逻辑卷(LV)从VG里划出一块空间来用就像分区一样lvcreate -L 50G -n my_lv my_vg。然后格式化(mkfs.ext4)、挂载(mount)即可。LVM最大的好处是空间可以动态调整扩展LVlvextend -L 10G /dev/my_vg/my_lv然后resize2fs调整文件系统大小。扩展VG新加一块硬盘pvcreate后vgextend my_vg /dev/sdd1。再也不怕某个分区空间不足了。6.2 软件包管理YUM/DNF与APT的哲学RPM系CentOS/RHEL/Fedora和DEB系Ubuntu/Debian的包管理工具不同但思想相通。yum或dnf(RPM系)sudo dnf install nginxsudo dnf update。apt(DEB系)sudo apt install nginxsudo apt update sudo apt upgrade。关键是要配置好国内镜像源速度能快上几十倍。对于CentOS替换/etc/yum.repos.d/下的文件对于Ubuntu修改/etc/apt/sources.list。源码编译安装是最后的选择通常是为了特定版本或自定义功能。步骤是./configure检查环境并生成Makefile、make编译、sudo make install安装。记得先装好gcc、make和开发库devel包。6.3 网络配置与排查ifconfig已经逐渐被功能更强大的ip命令取代。记几个最常用的ip addr show或ip a查看所有IP地址。ip route show或ip r查看路由表。ip link set eth0 up/down启停网卡。网络排查三板斧ping检查基础连通性。ping -c 4 8.8.8.8。traceroute(或tracepath、mtr)追踪数据包路径看卡在哪一跳。dig(或nslookup)检查DNS解析。dig www.example.com比nslookup输出信息更丰富。ss命令是netstat的现代替代品速度更快。ss -tulnp可以列出所有监听端口以及对应的进程PID在排查“端口被谁占用”时极其有用。6.4 进程与性能管理ps aux和top是看进程的基本功。但top是交互式的在脚本里不方便。ps aux --sort-%cpu | head -5可以快速找出CPU消耗前5的进程。对于持续监控htop界面更友好pidstat则能输出更规整的进程资源报告pidstat -urd 1可以每1秒输出一次CPU、内存、磁盘IO数据。系统负载uptime或top第一行显示的load average。这个值如果长期高于CPU核心数说明系统过载。但要注意它包含的是处于可运行状态和不可中断睡眠状态通常是在等IO的进程平均数。所以高负载不一定代表CPU忙也可能是IO瓶颈。7. 服务管理与安全入门7.1 systemd现代Linux的管家Systemd不仅仅是初始化系统它管着几乎所有东西服务(.service)、挂载点(.mount)、定时器(.timer)。最常用的是服务管理。核心命令systemctlsystemctl start/stop/restart/reload nginx启停重启重载服务。systemctl enable/disable nginx设置是否开机自启。systemctl status nginx查看服务详细状态和最新日志。journalctl -u nginx -f实时追踪某个服务的日志-f类似tail -f。理解服务状态很重要active (running)是运行中failed是启动失败inactive是未运行。7.2 SSH安全加固告别密码登录基于密码的SSH登录有暴力破解风险。基于密钥的认证是必备安全实践。本地生成密钥对ssh-keygen -t ed25519 -C your_emailexample.comEd25519算法比RSA更安全更快。将公钥上传到服务器ssh-copy-id userserver_ip。这条命令会自动把~/.ssh/id_ed25519.pub内容追加到服务器的~/.ssh/authorized_keys文件里。测试无密码登录ssh userserver_ip。关键一步在服务器上修改/etc/ssh/sshd_config设置PasswordAuthentication no然后systemctl restart sshd。从此只允许密钥登录安全性大增。7.3 sudo最小权限原则不要整天用root用户操作。用普通用户登录需要特权时加sudo。 配置sudo在/etc/sudoers文件但永远不要直接用vim编辑请用visudo命令它有语法检查。一个常见的配置是给运维组wheel或sudo组所有权限%wheel ALL(ALL) ALL或者更精细地只允许某个用户重启特定服务your_user ALL(ALL) NOPASSWD: /bin/systemctl restart nginx, /bin/systemctl reload nginxNOPASSWD表示执行这些命令时不需要输密码在自动化脚本中很有用。7.4 防火墙系统的门卫CentOS 7/8 和新的发行版主要用firewalld底层是nftables但iptables的原理必须懂它是理解防火墙规则的基础。一个简单的iptables思路是“默认拒绝按需开放”# 1. 清空所有现有规则 iptables -F # 2. 设置默认策略INPUT链丢弃OUTPUT和FORWARD接受 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # 3. 允许本地回环流量 iptables -A INPUT -i lo -j ACCEPT # 4. 允许已建立的连接和相关的连接保证响应能回来 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 5. 按需开放端口比如SSH的22HTTP的80HTTPS的443 iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 6. 保存规则不同发行版命令不同如 iptables-save /etc/sysconfig/iptablesfirewalld用zone和service的概念更直观sudo firewall-cmd --permanent --add-servicehttp # 永久开放http服务80端口 sudo firewall-cmd --permanent --add-servicehttps sudo firewall-cmd --permanent --add-port8080/tcp # 开放特定端口 sudo firewall-cmd --reload # 重载配置8. 结语从基础到SRE的跃迁走完这一大圈你会发现马哥教育SRE课程的基础篇实际上是在为你搭建一个完整的、自底向上的知识体系。从最底层的Shell交互、文件操作到中层的用户权限、脚本编程再到上层的网络、服务、安全。每一层都不是孤立的它们相互支撑。我自己的体会是Linux基础的学习“知道”和“会用”之间隔着一道鸿沟而“熟练”和“精通”之间又隔着一座高山。看视频、记笔记只是第一步。真正的提升来自于反复练习在自己的虚拟机或云服务器上把每一个命令、每一个配置都敲一遍看看输出是什么改改参数又会怎样。场景驱动给自己设定小任务。比如“搭建一个WordPress博客”、“写一个每天备份数据库的脚本”、“排查一个模拟的高CPU故障”。在解决问题的过程中知识才会内化。阅读日志/var/log/下的各种日志文件是你的最佳老师。系统出问题了第一时间去看日志。从看不懂到能抓住关键错误信息这是一个SRE的必修课。善用社区遇到问题man、--help是第一道防线然后去Stack Overflow、官方文档、技术博客寻找答案。但最终要理解为什么而不是仅仅复制命令。Linux的世界浩如烟海没有人能掌握全部。但只要你牢牢掌握了这些基础你就拥有了学习和探索任何上层工具Docker, K8s, CI/CD, 监控告警的底气。当你在复杂的分布式系统中遇到一个底层问题时你能清晰地知道该从哪个日志文件查起该用哪个命令去定位该调整哪个内核参数。这种从原理到实战的贯通感正是SRE工作的魅力和价值所在。这条路没有捷径但每一步都算数。