ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Linux运维作业全复盘:从虚拟机搭建到nginx部署与故障排查

Linux运维作业全复盘:从虚拟机搭建到nginx部署与故障排查 最近把Linux课程那份作业1从头到尾完整做了一遍从下虚拟机、装系统开始一路折腾到换源、建用户、配权限、管理进程、写自动化脚本、部署nginx最后还处理了两个系统故障案例。做完之后最大的感受是这哪是什么课后作业分明就是一份浓缩版的上岗培训。从环境安装到日常运维的主干流程全被这一份作业串起来了。这篇文章就按我实际操作的先后顺序把整个过程、用到的命令、踩过的坑全部复盘一遍。正准备入门Linux的同学可以直接照着做已经入行的开发者也可以把它当作查漏补缺的参考面试前突击一下Linux常用命令和常见问题也够用。先说结论Linux学习确实没有捷径但如果你带着一份具体的作业目标去学效率会比单纯翻命令手册高出一大截。后面所有内容都是我这次实操的真实记录每一步都验证过可以直接抄。1. 作业任务拆解与环境准备1.1 拿到作业后我先把它拆成了六个任务linux作业1这个标题虽然朴素但里面的子任务一点都不少。作业原要求大概是搭建一套Linux运行环境完成基础的系统管理操作包括创建用户和配置权限、查看和管理进程、编写一个Shell脚本、部署nginx服务再处理一个指定的系统故障案例。考虑到很多人对作业这个词容易轻视我拆清单时故意把每一条都对应到真实工作场景里。你在公司接手一台新服务器要做的事情无非就是装系统、配网络、建账号、调权限、看进程、写脚本、起服务、查日志。这不就是作业里的内容吗我把它整理成了下面这张验收表整个过程都对照着它执行。任务编号任务内容核心知识点验收标准A虚拟机安装Linux并配置基础环境镜像选择、软件源、网络配置系统能联网、能正常更新B创建用户、密码策略、sudo权限useradd、chage、visudo新建用户能登录并能sudoC进程查看、信号操作、进程间通信ps、kill、管道、信号能查看进程并正常结束进程DShell脚本编写与定时执行脚本语法、crontab脚本能独立运行并定时触发E部署nginx并配置systemd自启apt、systemd、端口监听浏览器能访问默认页面F系统故障案例排查日志、磁盘、inode定位根因并输出排查记录计划很简单先搭好环境然后按任务顺序推。但实际做下来环境搭建这一步花的精力远超预期因为换源、配网卡、装工具这些环节全是坑。后面第5部分我会单独把这些坑集中出来讲。1.2 虚拟机、镜像选择和WSL的取舍做这种系统级作业第一件事就是选环境。我面前有三个候选VMware Workstation、VirtualBox、WSL2。WSL2启动快、占用低平时练命令、写脚本确实非常舒服但这份作业里有systemd服务管理、nginx部署和进程间通信实验完整虚拟机的环境更接近生产服务器折腾起来的真实感完全不一样。而且Windows下WSL安装偶尔会莫名其妙失败安装向导提前结束、提示升级内核组件或者检查虚拟化排查起来也费时间。综合考虑我选了VMware Workstation加完整发行版这条路。镜像选择上作业没有限定发行版我对比了Debian 12、Ubuntu 24.04和Rocky Linux 9。Debian胜在稳定、软件源丰富、入门资料多Ubuntu社区活跃但和Debian血缘很近差别不大Rocky是RHEL系如果以后想去用CentOS风格命令的企业这套也值得练。最后我选了Debian 12作为主线后面所有命令都是Debian系语法不过90%的内容在Ubuntu和Rocky上同样适用。有一点值得提醒装系统时分区选择使用整个磁盘并配置LVM会更省心。LVM逻辑卷的好处是后期磁盘不够可以在线扩容做作业不需要但工作里早晚会用到。Swap分区给1到2G足够学习环境不需要追求大页面交换。1.3 安装完成后的基础配置换源、更新、装工具系统装好第一件事永远是换软件源。默认源大多在国外apt update经常卡到怀疑人生。我直接换了清华的镜像源Debian 12的sources.list大致长这样。# /etc/apt/sources.list deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware替换完成后执行apt update再把系统升一次级把基础工具一起装上。sudo apt update sudo apt upgrade -y sudo apt install -y vim gvim net-tools htop tree curl lsof rsync nginx这里有个细节换源后如果提示签名失效别慌多数情况是缺证书组件先装ca-certificates和gnupg再重新update就能解决。新手最容易在这里卡住以为是源写错了实际上是证书链问题。网络配置我放在后面专门讲因为网卡配置这块我分别踩了Debian和Rocky两边的坑单独拉出来说会更清楚。装完这一轮基础配置后环境总算能用了可以开始真正的系统管理练习。2. 用户权限与常用命令的实操复盘2.1 高频命令别死记按任务场景来网上搜linux常用命令大全能搜出一大堆但说实话硬背列表没有意义。我的习惯是把命令按使用场景分类每类记住几个高频的先够用再慢慢扩展。这次作业里真正用到的高频命令我整理成了这张速查表你直接照着用就行。场景常用命令备注文件操作ls -lah、cp、mv、rm、find、du、dfls -lah是最常用的没有之一压缩备份tar -czvf、tar -xzvf参数记不住就记czvf打包、xzvf解包用户管理useradd、usermod、passwd、chage、id创建用户记住-m和-s参数权限管理chmod、chown、chgrp、umask权限位数字是4/2/1的组合进程管理ps aux、top、htop、pidof、kill、pkill排查进程先跑ps aux和top网络排查ip addr、ss -tlnp、ping、curl、lsof看端口用ss不用netstat日志查看journalctl、tail -f、grep、dmesgtail -f配合grep是神器磁盘存储df -h、free -h、mount、umount、blkid排查空间不足先df -h这只是个骨架。比如文件操作用find查大文件命令是find /var -type f -size 100M这种配合具体场景的命令才容易记住。今天需要删除一个目录你自然会想起rm -rf但光标敲到这个命令上的时候脑子要同时响起警报路径确认了吗有没有备份误删了能恢复吗2.2 新建用户与密码过期提醒作业B任务要求创建两个新用户分别加入不同组并且配置密码过期策略。我执行的过程如下。# 创建用户并指定家目录和登录shell sudo useradd -m -s /bin/bash stu01 sudo useradd -m -s /bin/bash stu02 # 设置密码 sudo passwd stu01 sudo passwd stu02 # 创建用户组并加入 sudo groupadd devgroup sudo usermod -aG devgroup stu01 sudo id stu01useradd的-m参数表示创建家目录-s指定默认shell。如果不加-m用户没有家目录登录后连环境变量都怪怪的。这些细节在面试里也常考比如问你useradd和adduser的区别。Debian系的adduser是交互式封装useradd是底层命令一个偏向人机交互一个偏向脚本调用搞清楚这个很容易加分。密码过期策略用的是chage命令。我要求密码30天后过期提前7天提醒执行后查看效果。sudo chage -M 30 -W 7 stu01 sudo chage -l stu01chage -l的输出里能看到最后一次修改密码时间、密码过期时间、两次修改的最小间隔等。实际工作中很多公司要求服务器密码定期更换这个命令几乎是必会项。我还顺手在/etc/profile.d/下加了一个提醒脚本用户登录时如果发现密码快到期限就输出提示。#!/bin/bash # /etc/profile.d/passwd-expire-warn.sh days$(chage -l $USER 2/dev/null | awk -F: /密码 expires/ {print $2} | xargs -I{} date -d {} %s 2/dev/null) current$(date %s) ...这里有个坑不同系统的locale不一样chage -l输出的中文或英文字段名不同用awk按英文password expires过滤有时匹配不到。更稳妥的办法是直接解析/etc/shadow文件的第5个字段那个字段就是密码剩余有效天数。实习的时候我因为这个中文环境问题折腾了半小时最后干脆改用shadow字段解析一行awk解决问题。2.3 sudo权限配置与提权边界的理解作业里说的提权是指普通用户通过sudo获得临时root权限这种受控操作别想歪。这里我理清了一个最容易混淆的点vim /etc/sudoers本身是个绝对危险的操作因为语法错误会让你所有sudo命令直接罢工。正确方式永远是visudo。visudo在保存时检查语法发现问题会阻止写入并提示。我的操作是把stu01加到sudo组然后验证。sudo usermod -aG sudo stu01 su - stu01 sudo -l sudo cat /etc/shadowsudo -l能查看当前用户被授权执行哪些命令。这里还有个容易被忽略的知识点sudo日志会记录每次提权操作记录在/var/log/auth.log里。出了安全事故第一件事就是翻这个日志查谁在什么时候执行了什么命令。这就是为什么正规做法是让普通用户通过sudo临时提权而不是直接su切到root乱转后者在日志审计上等于睁眼瞎。权限部分我还复习了chmod。权限位用数字表示r4、w2、x1目录常见755普通文件常见644。你要给脚本加执行权限就是chmod x要修改属主就是chown user:group file。特殊权限里SUID是比较隐蔽的存在一个文件如果设置了SUID普通用户执行它时会临时获得属主权限。面试问到如何查找系统里的SUID文件答案是一条find命令find / -perm -4000 -type f。这个命令在安全排查里真的会用到不要只当面试题背。说到踩坑权限这里我犯过两个低级错误。一次是手滑执行了chmod -R 777 /usr/bin结果系统里一堆命令权限错乱登录都开始出现异常。另一次是删除目录忘了加引号路径里有个空格结果直接拆成了两个参数。从那以后凡是rm -rf前面我都要加个echo先打印一遍确认路径完全正确才动手。这个习惯救过我很多次。3. 进程管理、服务部署与日志排查3.1 顺着作业任务看进程、发信号、改进程名进程这块作业要求能查看进程、能按信号结束进程还考察了进程间通信。这些点串起来其实就是你做运维排障时最常用的那套操作。查看进程我常用ps aux和top搭配。ps aux能看所有进程的快照top能看到实时的CPU和内存占用。如果机器卡到连top都开不了多半是内存或磁盘有问题先free -h和df -h走一轮。load average是面试里必问的指标它有三个数字分别代表1分钟、5分钟、15分钟的平均负载。误区是很多人以为load高就是CPU满其实它表示的是处于可运行和不可中断状态的进程数磁盘IO卡住也能拉高load。给进程发信号kill是最直接的。kill -l能看到全部信号列表常用的是TERM15正常终止、KILL9强制结束、HUP1重载配置、USR1/USR2自定义业务信号。作业里要求用kill结束一个指定进程我的完整脚本是# 先找到进程PID pidof sleep # 优雅终止 kill -15 12345 # 确认是否消失 ps aux | grep 12345 # 万一没死才用强制 kill -9 12345实际操作里优先用-15给进程一个处理收尾工作的机会。动辄-9容易留下半截状态的临时文件或脏数据。只有确认进程卡死无响应才轮到-9上场。改进程名这个技能看起来冷门实际排查时很有用。脚本里启动的后台任务一堆sleep和bash进程列表里全是重复名字根本分不清谁是谁。作业里我用了三种方式实现改名第一种启动时指定标题。bash和python都支持比如python3 -c之后用setproctitle库可以在进程运行中修改名字。# python3改进程名示例 import setproctitle setproctitle.setproctitle(my-daemon-worker)第二种通过exec -a参数。在bash里执行exec -a customname python3 script.py这样进程显示名就是customname这对脚本方式启动的场景尤其好用。第三种systemd部署。在Unit文件里设置ExecStart的启动命令service name本身就会显示在进程列表里。比如nginx.service里的进程就叫nginx看起来清清楚楚。进程间通信这块管道是最直观的。命令里那根竖线其实就是IPC比如ps aux | grep nginx左边进程输出直接流进右边进程。信号是另一种IPC方式一个进程可以用kill给另一个进程发信号。作业里我写了一个极简的生产者消费者演示生产者每秒写入管道消费者从管道读取整个过程不经过磁盘这就是管道通信的工作方式。提示排查进程存在但端口不监听这类问题先用ss -tlnp看端口再用lsof -i:8080看占用进程两个命令配合能解决90%的端口问题。3.2 systemd Unit文件与nginx部署现代Linux发行版基本都用systemd管理服务开机自启、崩溃重启、日志统一都由它负责。作业E任务要求部署nginx并配置自启我顺手写了个自定义服务的Unit文件理解了这个文件的语法nginx自启就是顺带的事。先看nginx部署。Debian系下安装太简单了sudo apt install nginx -y sudo systemctl enable --now nginx sudo systemctl status nginx curl http://127.0.0.1如果curl能返回一大段HTML默认页面就起来了。这一步里有一个很容易忽略的坑改完配置一定要执行systemctl reload nginx而不是restart。reload等于告诉nginx平滑重载配置不会中断现有连接restart是全部推倒重来在线上环境会造成连接闪断。作业里没要求但面试问到nginx重载和重启的区别这就是标准答案。我后来自己写了一个Unit文件内容是启动一个简单的Python HTTP服务。# /etc/systemd/system/myweb.service [Unit] DescriptionMy Simple HTTP Server Afternetwork.target [Service] ExecStart/usr/bin/python3 -m http.server 8080 Restarton-failure Userwww-data Groupwww-data [Install] WantedBymulti-user.target这个文件的语法逻辑很清晰。After表示这个服务在网络就绪之后再启动Restarton-failure表示进程异常退出时自动拉起这是生产环境服务高可用的基础User和Group指定服务以什么身份运行原则是最小化权限绝不轻易用root跑业务服务。写完后执行systemctl daemon-reload再start、enable一个自启服务就建好了。现在回过头看nginx的systemd配置文件它内部做的事情和我这个myweb.service一模一样只是多了更多参数。理解了Unit文件语法你对系统服务的掌控力会上一个台阶。3.3 日志分析与系统故障案例实录作业F要求排查系统故障这部分最能体现运维基本功。日志是排障的第一现场journald统一收集系统日志后常用的操作是# 查看nginx服务的实时日志 journalctl -u nginx -f # 只看本次开机后的错误级日志 journalctl -b -p err # 按时间范围捞日志 journalctl --since 1 hour ago传统日志文件在/var/log下系统日志看syslog登录日志看auth.log内核日志看dmesg。我这次处理的两个案例都非常典型。案例一磁盘满导致服务拒绝写入。现象是nginx突然返回500系统日志里出现No space left on device。我先执行df -h发现/dev/mapper根分区使用率100%然后用du -sh /var/log/*按目录找大文件结果发现一个访问日志文件涨到了80G。定位到是上一次日志轮转配置没启用导致日志无限增长。解决方式是清理日志并配置logrotate让系统按天轮转并保留7天历史。案例二inode耗尽。这个案例很隐蔽df -h显示磁盘还有空间但df -i显示inode使用率100%。什么叫inode简单类比磁盘空间像一栋楼的房间总面积inode就是门牌号。门牌号满了哪怕楼里还有很多空房间你也住不进去。无法创建新文件、新目录就是这个原因。最后定位到/var/spool/postfix/maildrop下堆了几十万个小文件全是未送达的邮件碎片清空之后一切恢复正常。服务起不来的通用排查顺序也总结一下先systemctl status看服务状态再journalctl -u 服务名看日志日志不够就tail -f业务日志文件最后检查配置文件的目录权限、属主属组是否正确。这套顺序能解决九成问题。很多人一上来就改配置结果方向都是错的排查效率极低。4. 自动化和面试高频点让作业带点求职视角4.1 从零写一个能用的Shell脚本作业D任务是写一个Shell脚本并用crontab定时执行。我把需求定得很实际每天凌晨清理/var/log下超过7天的.log文件同时把清理结果追加到操作日志里方便回溯。脚本我写成了下面这样。#!/bin/bash # /usr/local/bin/clean_old_logs.sh LOG_DIR/var/log DAYS7 CLEAN_LOG/var/log/clean_script.log # 先判断目录是否存在 if [ ! -d $LOG_DIR ]; then echo $(date %F %T) [ERROR] 目录 $LOG_DIR 不存在 $CLEAN_LOG exit 1 fi # 找出并删除超过7天的日志文件 count$(find $LOG_DIR -name *.log -mtime $DAYS | wc -l) find $LOG_DIR -name *.log -mtime $DAYS -delete echo $(date %F %T) [INFO] 清理完成共删除 $count 个文件 $CLEAN_LOG这个脚本有几个讲究。count变量先统计要删除的文件数量再把删除结果打印到日志保证每一步都有迹可查。find配合-delete比find加管道再xargs rm更安全因为xargs参数过长或者管道处理中文件名带空格都会出问题-delete是find内建操作效率和正确性都更好。脚本写完别忘了chmod x然后配置crontab定时任务。crontab -e # 添加一行每天凌晨2点执行 0 2 * * * /usr/local/bin/clean_old_logs.shcrontab格式五个字段依次是分、时、日、月、周。0 2 * * *就表示每天2点0分。实践里有个坑crontab环境变量非常精简脚本里最好使用绝对路径命令也要写全路径否则经常出现手动执行没问题、定时执行没反应的情况。另一个坑是crontab里执行的结果默认会发邮件到本机root邮箱邮箱文件堆积多了又变成一个磁盘故障源。所以脚本里最好自己重定向日志crontab行尾可以加/dev/null 21来屏蔽默认邮件。4.2 面试题高频考点顺手整理了一份答案做完作业后发现很多任务对应的知识点其实就是面试里常考的点。我直接把作业里的内容映射成了一份面试题清单每一问都能在实操中找到答案。面试常见问题一句话答案软链接和硬链接区别软链是快捷方式有独立inode可跨文件系统硬链是同一inode的别名不能跨文件系统chmod 755是什么意思属主rwx属组rx其他rx目录默认权限一般是755如何实时查看日志tail -f 日志文件或journalctl -f进程和线程区别进程是资源分配单位线程是CPU调度单位同一进程的线程共享内存查看端口占用命令ss -tlnp老命令netstat在部分新系统里默认没装内存和磁盘排查命令free -h看内存df -h看磁盘du -sh定位大目录Linux文件系统的inode是什么存储文件元数据的索引节点文件名通过inode指向实际数据awk和sed的区别awk适合按列处理文本sed适合按行做替换和编辑面试官考linux常用命令时很少让你背列表而是给你一个场景问线上CPU飙升你怎么排查。完整的思路是top定位高CPU进程ps aux查看进程详情top -Hp看线程级消耗strace跟踪系统调用最后分析是不是代码死循环。这套流程我在作业里虽然没有完全跑完但排查原理是一模一样的建议你提前练一遍。4.3 嵌入式Linux和国产化方向的一点延伸做完这份作业其实还能向两个方向延伸。一是嵌入式Linux方向。嵌入式开发不能只懂单片机很多时候需要在板子上跑完整Linux内核、写驱动、调设备树作业里学的用户管理、进程查看、systemd、脚本编译到板子上照样通用。区别只是交叉编译和内核裁剪但系统管理的基础是完全相同的。二是国产操作系统方向。现在很多企业做信创适配数据库、中间件、应用都要部署在基于Linux内核的发行版上。说到linux国产这个词不用觉得陌生它的命令体系和常见操作跟这次作业里学的没有本质区别多数只是包管理器、文件路径有细微差异。学好标准Linux再上手国产系统基本是无缝切换。这两个方向都不是作业硬性要求但却是我自己做完后觉得最有价值的延伸。作业只是起点后面的路还长。5. 实操过程记录与问题排查速查5.1 完整操作时间线从镜像下载到作业收尾为了让读者有整体体感我把这次作业的时间线列在下面中间每个环节我都做了标记。时间点操作结果与说明0:00下载Debian 12官方镜像约700M用了小半小时0:30创建VMware虚拟机分配2核4G内存60G磁盘0:40安装系统分区选整盘LVM创建普通用户1:50首次登录换清华源执行apt update成功2:10安装基础工具vim、htop、curl等一次装齐2:40配置静态IP修改interfaces文件后重启网络3:20创建用户、配置sudo验证stu01能sudo成功3:50进程查看与信号实验用kill -15结束测试进程4:30进程间通信小实验管道信号搞定生产者消费者5:00编写日志清理脚本手动执行验证通过5:20配置crontab定时任务crontab -l确认写入成功5:50部署nginxsystemctl enable --now成功6:20故障案例一磁盘满清理大日志启用logrotate7:00故障案例二inode耗尽清空maildrop目录恢复7:40撰写作业报告过程、命令、截图归档整个过程差不多8小时中途还穿插了一些网络配置和工具装的反复操作。第一次做可能会觉得慢但我建议别急着压缩时间因为中间卡壳排查的过程才是真正涨经验的地方。面试官问你遇到过哪些故障、怎么排查的答案全都藏在这些卡壳时刻里。5.2 高频问题速查表我踩过的坑你直接避开这里把这次作业和平时学员提问中出现频率最高的问题汇总成表每个问题都附排查思路。现象底层原因解决手段虚拟机安装Linux时蓝屏VT-x/AMD-V没启用进BIOS开启虚拟化技术关闭Hyper-V冲突WSL安装向导提前结束没开子系统和虚拟机平台功能勾选两项并重启再执行wsl --update虚拟机内无法共享上网虚拟机网卡模式选错用NAT模式宿主机有网虚拟机就能上网网卡没有IP地址NetworkManager没接管或没配置用nmtui或直接写interfaces/netplan配置换源后apt update报404源路径对应不了当前版本确认当前系统codename比如Debian 12是bookwormsudo提示不在sudoers中用户没被加入sudo组用root执行usermod -aG sudo 用户名密码过期后无法登录密码策略过严单用户模式重置密码或chage -M清除过期服务起不来但没报错配置文件权限或目录不存在先tail日志再用ls确认目录和属主crontab脚本不执行环境变量缺失或路径不对脚本内写绝对路径手动执行先验证这些问题的共同点就是看起来吓人实际上都是基础配置或权限问题。排查的时候最忌讳乱猜一定要沿着日志和状态一步步走。把这张表收藏起来能少走很多弯路。5.3 作业验收清单与复盘建议按老师的要求我把作业验收做成了一份自检清单。每一项都实际跑通过现在直接共享出来。# 1. 系统基础 cat /etc/os-release ping -c 3 mirrors.tuna.tsinghua.edu.cn # 2. 用户权限 id stu01 sudo -l -U stu01 chage -l stu01 # 3. 进程管理 ps aux | grep nginx ss -tlnp | grep :80 # 4. 脚本自动化 /usr/local/bin/clean_old_logs.sh crontab -l # 5. 服务部署 systemctl status nginx curl -I http://127.0.0.1 # 6. 故障排查 df -h df -i journalctl -p err -b一份作业做完回头看这些命令其实已经覆盖了Linux系统管理的半壁江山。如果还有余力我的建议是继续做三件事第一再人为制造两个故障案例比如塞满/tmp、故意改坏sudoers然后练习恢复这种破坏性练习最能建立信心第二认真读一遍man命令挑一个不熟的命令看完整帮助文档第三把awk和sed各找20道练习题做一遍这两个工具在日志分析和文本处理里是真正的生产力。我个人在这份作业里最深的体会是别把作业两个字看轻了。你什么时候能在虚拟机里把系统装坏再修好把服务跑起来再弄挂再救回来Linux的基础就真正扎实了。我踩过不少坑也查了很多资料最后发现最有用的学习方式还是亲手把环境搭起来把命令敲进去把日志翻出来看。下次如果再布置linux作业2我想我会更期待因为知道基础打牢之后能玩的东西会越来越多。
返回列表