简介:运维工程师面试题PDF,围绕Linux、Shell、Python、MySQL、Docker、Kubernetes与网络等运维核心领域整理高频考点,适合正在准备运维岗位面试的求职者,也便于在职人员随时查漏补缺。资源为单个PDF文件,890KB左右,内容精炼,便于打印或离线学习。目前已有674人学习下载。PDF内按模块展开:Linux部分覆盖进程查看、nginx进程统计、du与df区别、根分区满排查、find命令及日志打包;Shell部分包括变量含义、批量创建用户、IP在线检测、URL可用性检查等脚本问题;Python部分总结特点、数据类型、深浅拷贝、内置函数、常用模块和生成器迭代器;MySQL部分梳理删除语句区别、char与varchar、主从原理、引擎对比、事务隔离级别及优化备份;Docker和Kubernetes部分涉及基础命令、Dockerfile指令、组件角色、Pod健康监测和数据持久化方式;网络部分则包含OSI七层模型、TCP/UDP对比、三次握手四次挥手、HTTP状态码与请求方法。整体覆盖面广、问题典型,可帮助读者构建运维知识框架,快速定位薄弱环节。
1. 运维面试题不是背答案:这份 Linux/SQL/容器/Docker/K8s 题库,把现场答题思路也讲透了
运维岗位的面试和开发岗不一样,面试官很少问「你做过什么项目」,更多是丢给你一个真实场景:根分区满了怎么排查、nginx 并发上不去怎么定位、主从延迟了先看哪条命令。这份运维面试题资源覆盖 Linux、Shell、Python、MySQL、Docker、K8s、网络七个方向,几乎每个题都带答案和命令实例,适合准备一至三年经验运维岗位的求职者,也适合刚带团队的运维负责人拿来做内部摸底。我拆完这份题库最大的感受是:它不只是在列考点,而是把「这道题现场该怎么答、答到什么深度算过关」也一起写清楚了,比刷 LeetCode 式的零散题目实用得多。
2. Linux 与 Shell 现场题:先会看进程和磁盘,再谈写脚本
2.1 进程查看与 nginx 进程统计:ps 组合拳怎么打
题库里第一道题就是查看进程、统计 nginx 进程数、如果是 root 用户打印第一列和最后一列。这题看着基础,但能区分出是背过命令还是真处理过问题。常见做法是分三步拆解,先看进程再过滤再统计:
ps -ef | grep nginx ps -ef | grep nginx | grep -v grep | wc -l ps -ef | grep nginx | grep -v grep | awk '{if($1 == "root") print $1","$NF}'第一行是常规操作,把 nginx 相关进程列出来;第二行用grep -v grep把 grep 自身进程去掉,再用wc -l统计数量,这一步是为了避免把执行命令的进程也算进去;第三行用awk做条件判断,当第一列是 root 时打印用户名和最后一列。这里的$NF是 awk 内置变量,表示当前行的最后一个字段,对 ps 输出来说就是进程对应的命令路径或参数,能直观看出 master 和 worker 进程分别在哪。
面试时这题有个容易被追问的细节:统计 nginx 进程数为什么要过滤 grep?因为ps -ef | grep nginx这条命令执行时,grep 本身也会作为一个进程出现在结果里,不过滤会把结果多算一个。同样的坑在 crontab 脚本里也会遇到,很多人写巡检脚本统计进程数量时忘了过滤,导致告警阈值永远差一个数。
2.2 du 与 df 的区别及根分区满排查:先 df 定位再 du 收缩
这道题是运维面试的高频题,也是实际故障处理的标准流程。我一般建议按「先整体后局部」的思路答:df 看的是文件系统整体使用情况,du 看的是目录实际占用大小。根分区满了先 df -h 确认是哪个分区满了,再 du -sh 逐层往下找大目录,顺序是du -sh /*看根下哪个目录占用最多,然后继续深入du -sh /var/*,一层层定位到具体文件。
df -h du -sh /* 2>/dev/null | sort -hr | head -20 du -sh /var/* 2>/dev/null | sort -hr | head -20 du -sh /var/log 2>/dev/null这里有个实操细节:du 在大目录上跑得很慢,尤其是 /proc、/sys 这类虚拟文件系统目录,所以加上2>/dev/null把权限报错和不可访问目录的报错丢掉,再用sort -hr按人类可读大小排序取前 20 行,能快速锁定目标。还有一层隐含考点是:du 和 df 结果不一致是正常的,因为 df 统计的是文件系统块分配情况,已删除但未释放空间的文件、日志文件被进程持续写入的情况,都会导致 df 显示的占用大于 du 统计的目录大小。这题能答到这一层,面试官基本就会点头了。
2.3 查找文件与定时归档:find 加 xargs 的边界在哪
查找 /var/log 下以 .log 结尾的文件,再找 7 天前的文件打包移动到 /tmp,这道题考的是 find 条件组合和 xargs 传参。题库里给的标准答案是一行命令,但实战中 xargs 有坑。
find /var/log -name "*.log" -type f find /var/log -type f -mtime +7 | xargs tar -zcvf log_$(date +%F).tar.gz && mv log_$(date +%F).tar.gz /tmp第一条命令不复杂,-name指定文件名匹配,-type f限定普通文件,避免匹配到目录名。第二条命令里,-mtime +7表示修改时间在 7 天前的文件,xargs把 find 输出逐批传给 tar。这里最容易翻车的是文件名含空格的情况,xargs 默认按空格切分,文件名一含空格就拆成多个参数,tar 会提示文件不存在或漏打包。稳妥的做法是用find ... -print0 | xargs -0 tar ...,或者直接用 tar 的-T参数配合find ... > filelist读文件列表。如果面试官追问,把这两种方案说清楚,说明你真的处理过带空格的文件名。
2.4 Shell 特殊变量与批量创建用户:$* 和 $@ 的区别是拿分点
Shell 部分第一题直接列出$# $@ $$ $* $? $0六个变量问含义,$* 和 $@ 在双引号包裹下的区别是重点:"$*"会把所有参数当成一个整体字符串,"$@"会把参数逐个展开。这题能答出来不难,但批量创建用户的脚本更需要思路:
for i in $(seq 1 10) do useradd user$i echo "123456" | passwd --stdin user$i done这个脚本用seq 1 10生成序号,循环创建 user1 到 user10,密码统一设成 123456。passwd --stdin是从标准输入读取密码,适合脚本里批量设置。生产环境里一般不建议这么干,密码策略和复杂度校验会被绕过,但作为面试题,重点是把循环、变量拼接、管道传参这几个点讲清楚。追问通常是:如果用户已存在怎么办?加个判断id user$i检查用户是否存在,存在就跳过或改密码,不存在才创建。
#!/bin/bash for ip in $(seq 1 255) do ping -c 1 -W 1 192.168.1.$ip > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "192.168.1.$ip UP" else echo "192.168.1.$ip DOWN" fi done这是判断某个网段在线 IP 的脚本,ping 加了-W 1把超时时间设成 1 秒,避免每个 IP 等太久。$?拿上一条命令的退出码,0 表示 ping 通。这个脚本在大网段下效率不高,逐个 ping 255 个 IP 要几分钟,进阶方案是并发 ping 或使用 fping,但面试阶段把串行版本讲清楚就够了,能在答案最后提一句「生产环境我会用 fping 或 xargs -P 并发」,基本是加分项。
3. Python 面试题:数据类型、拷贝与生成器的回答层次
3.1 数据类型与常用方法:别只背方法名,要说出场景
Python 部分的第一类题是数据类型及特性。题库列了数字、字符串、列表、元组、字典、集合六类,区分的核心是可变与不可变:数字、字符串、元组是不可变类型,列表、字典、集合是可变类型。面试时这道题的回答节奏一般是:先分类,再各举两三个常用方法,最后落到「因为不可变所以可以哈希、可作字典键」这类推导上。
字符串的 replace、strip、split、upper、lower,列表的 append、pop、insert、count,字典的 keys、values、items、update,这些方法名不难记,难的是说清楚它们返回新对象还是原地修改。字符串方法基本都返回新字符串,原字符串不变;列表的 append、pop 是原地操作;字典的 update 也是原地合并。有一个区分技巧:可变类型的方法大多是原地修改,不可变类型的方法大多返回新对象,记住这个原则,即使遇到不熟的方法也能推断行为。
3.2 深拷贝与浅拷贝:从嵌套列表讲起,比背定义有用
深拷贝和浅拷贝的区别,几乎每次面试都会问。单纯背「浅拷贝复制引用、深拷贝复制对象本身」很容易在追问下沉掉,我建议用一个嵌套列表的实例来讲:
import copy a = [[1, 2], [3, 4]] b = copy.copy(a) # 浅拷贝,外层是新列表,内层仍是同一批子列表 c = copy.deepcopy(a) # 深拷贝,内外层全部复制 b[0].append(99) print(a) # [[1, 2, 99], [3, 4]] print(c) # [[1, 2], [3, 4]]浅拷贝只复制最外层容器,内层元素还是原对象的引用,所以改 b 的子列表,a 跟着变;深拷贝递归复制所有层级,c 和 a 完全独立。回答时把这个例子演示一遍,比干巴巴说定义效果好得多。容易被继续追问的是:切片是什么拷贝?列表的a[:]是浅拷贝,只复制外层,内层嵌套列表仍是共享的。字典的.copy()方法同理。
3.3 生成器、迭代器与可迭代对象:应用场景比概念更重要
这题的标准答案是:可迭代对象是实现了__iter__方法的对象,迭代器是同时实现了__iter__和__next__方法的对象,生成器是含 yield 的函数或生成器表达式。但面试官更想听到的是应用场景:生成器为什么能省内存,因为它是边循环边计算,不一次性把所有元素载入内存,适合处理大文件、大数据集。题库里提到的两种生成器写法都要能讲:
# 生成器表达式:把列表推导式的 [] 换成 () gen = (x * x for x in range(10)) # yield 关键字定义的生成器函数 def countdown(n): while n > 0: yield n n -= 1 for num in countdown(5): print(num)用生成器处理日志文件的常见场景是:一个几个 GB 的 access.log,用普通列表读取会占满内存,用生成器逐行 yield,内存占用恒定。这个场景几乎是送分题,答出来基本能证明你写过大文件处理脚本。九九乘法表、阶乘这类编程题,考的是基础语法熟练度,没什么技巧,多练两层嵌套循环和递归写法即可。
4. MySQL 高频题:事务、隔离级别与主从复制一次讲透
4.1 delete、drop、truncate 的区别:从语系和可回滚性切入
MySQL 的第一道高频题就是三者区别。删数据是运维日常操作,但很多人没想过三者在「能不能回滚、要不要 commit、释放不释放空间」上的差异。我习惯按三个维度列:语言类型、删除内容和速度。
delete 属于 DML 语言,只删除数据不删除表结构,需要事务管理,commit 之后才能生效,可以配合 where 条件删部分记录,删错了没 commit 还能 rollback 后悔。truncate 和 drop 属于 DDL 语言,操作立刻生效,不可回滚。truncate 删除所有记录但保留表结构,自增 ID 会重置;drop 直接把表结构和数据一起删掉,释放空间。删除速度上,drop 大于 truncate 大于 delete。使用场合也要说:彻底不要这张表用 drop;要保留表结构但清空数据用 truncate;只想删部分数据用 delete 加 where。面试时能把「delete 是逐行删、truncate 是重建表」这一点说出来,会显得理解更深。
4.2 varchar 和 char 的区别:长度存储和查询效率的权衡
char 列长度固定,范围 0 到 255,不足长度会用空格补齐;varchar 列长度可变,范围 0 到 65535,按实际内容存储,额外记录长度信息。实际业务中,性别、状态、手机号这类长度固定的字段适合 char,因为存储结构固定、查询更快;描述、备注、URL 这类长度不定的字段用 varchar。面试追问点通常是:varchar(50) 里的 50 是字符还是字节?MySQL 中 varchar 的单位是字符,但要注意 utf8mb4 字符集下,一个中文占 3 到 4 个字节,如果字段要存中文,长度规划要根据最大字符数来设,而不是按字节数。
4.3 事务与隔离级别:ACID 四问连招怎么破
事务这题的范围可以很大,面试官可能从「什么是事务」一路追问到「MVCC 原理」。题库里的考察点是 ACID 特性和四种隔离级别,先把这两层吃透。
事务是一组 SQL 语句的逻辑单元,要么全部执行成功,要么全部回滚。ACID 四个特性:原子性是不可分割,一致性是事务让数据库从一种正确状态到另一种正确状态,隔离性是事务提交前不把改动暴露给其他事务,持久性是提交后改动永久保存。
四种隔离级别由低到高是:读未提交允许脏读,读已提交只能读到已提交数据但不可重复读,可重复读保证事务内多次读结果一致,串行化完全隔离但性能最差。MySQL InnoDB 默认是可重复读,Oracle 默认是读已提交。回答时加一句「可重复读通过 MVCC 多版本并发控制实现,读不加锁,写加行锁」,如果能顺着说出隔离级别解决的问题——脏读、不可重复读、幻读,整个回答就完整了。
4.4 主从复制原理与延迟排查:把 binlog 到 relay log 的链路说清
主从复制是 MySQL 面试必问题,题里给了清晰的知识点:主库开 binlog,从库 IO 线程拉取主库 binlog 写入自己的 relay log,SQL 线程再读 relay log 回放到本地。查看主从状态用show slave status,重点看Slave_IO_Running和Slave_SQL_Running是否都是 Yes。
主从延迟的主因要能列出来:慢 SQL 太多、从库硬件差、从库数量过多、网络延迟、大事务。每种原因对应的排查思路也要能说:慢 SQL 用show processlist看当前执行语句,从库硬件差升级配置,从库太多考虑级联复制架构,网络延迟用ping或tcping验证 RTT。回答时如果能举一个实际场景,比如「某次大表 DDL 导致从库延迟几分钟,我通过show slave status看到Seconds_Behind_Master飙高,查 processlist 发现是 ALTER TABLE 重建表导致的」,说服力会强很多。MySQL 优化类题如 explain、慢查询日志、索引设计,题库里已经列了方法和方向,面试时按「开启慢查询日志定位 -> explain 分析执行计划 -> 针对性加索引或改写 SQL」三步答。
5. 容器与编排高频考点:Docker 命令和 K8s 组件的回答框架
5.1 Docker 镜像、容器与基础命令:从抽象概念落到具体命令
Docker 部分的考察分两层:概念层是镜像和容器的关系、容器与虚拟机的区别;命令层是常用命令、端口映射和挂载。镜像可以理解成容器的模板或源代码,Dockerfile 构建出镜像,镜像 run 成容器。容器是镜像的运行实例,包含应用程序和全部依赖,共享宿主内核。
有个容易混淆的点是容器状态。题库列的四种状态是运行、已暂停、重新启动、已退出,对应命令分别是 start、pause、restart、stop。docker ps 只能看到运行中的容器,加 -a 才能看到所有容器。面试时把状态与命令的对应关系说清楚,比背 ps 输出更有说服力。常用命令的范围,我在每次面试模拟时会按「镜像管理、容器生命周期、网络、数据卷、日志」五类来枚举关键命令,run、exec、ps、images、inspect、logs、build、commit、push、pull、save、load、export、import、cp、rm、rmi 都在覆盖范围内。
启动 nginx 容器并随机端口映射加挂载目录这道题,命令本身不复杂,但每个参数都要能解释:
docker run -d -P --name nginx-test \ -v /home/nginx/html:/usr/share/nginx/html \ nginx-d后台运行,-P随机映射容器端口到宿主机端口,--name给容器命名,-v把宿主机 /home/nginx/html 挂载到容器内的 nginx 默认 HTML 目录。这里有个隐蔽考点:-P大写是随机映射,-p小写是手动指定端口映射,面试答错大小写很拉分。挂载目录的好处是改宿主机文件就能实时生效到容器内页面,不必进入容器改文件。
5.2 Dockerfile 常用指令与 COPY/ADD 区别:构建镜像的拿分点
Dockerfile 指令考察点相对固定,FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、WORKDIR、ENTRYPOINT 是出现频率最高的几个。每个指令要能说清执行时机:FROM 指定基础镜像,RUN 在构建镜像时执行命令,CMD 和 ENTRYPOINT 在容器启动时执行,EXPOSE 声明容器监听端口,ENV 设置环境变量。RUN 和 CMD 的区别经常被追问:RUN 是构建阶段执行的,CMD 是容器启动时执行的默认命令。
COPY 和 ADD 的区别是 Dockerfile 考察里最常追问的点。COPY 只能从构建上下文复制文件或目录到镜像里,ADD 除了复制功能,还支持从 URL 拉取文件、自动解压本地 tar 包。早期很多实践用 ADD 做解压,但官方推荐优先用 COPY,因为 ADD 的自动解压和远程拉取行为有时不可预期。我一般建议:单纯复制文件用 COPY,需要自动解压本地压缩包时才用 ADD。
5.3 K8s 组件与对象:master/node 分工、etcd 角色、健康检查机制
K8s 题目是这份题库里信息量最大的部分。先明确一个基础关系:Kubernetes 是容器编排平台,Docker 是容器运行时之一,K8s 负责容器的调度、编排、扩缩容和自愈,Docker 只负责单机容器运行。面试被问到「K8s 与 Docker 什么关系」,先划清这一层就不会跑偏。
master 跑 apiserver、controller-manager、scheduler 三个核心组件,node 跑 kubelet、kube-proxy,以及容器运行时。etcd 的作用是存储集群所有状态数据,包括节点信息、Pod 定义、配置等,是整个集群的元数据库。K8s 常见对象要能枚举:Pod、Deployment、StatefulSet、DaemonSet、Service、ConfigMap、Secret、Volume、Namespace。考察频率最高的是 Deployment、StatefulSet、DaemonSet 三者的适用场景对比。Deployment 适合无状态应用,滚动更新和扩缩容是它的强项;StatefulSet 适合有状态应用,比如 MySQL 主从、Redis 集群,它保证 Pod 的稳定标识和顺序启动;DaemonSet 适合每个节点必须跑一个的组件,比如日志收集器、监控 agent。
创建 Pod 的流程是 K8s 面试的经典流程图背诵题:用户通过 kubectl 或 API 提交 Pod 定义到 apiserver,apiserver 写入 etcd,scheduler 监听并调度到合适的 node,kubelet 通过容器运行时启动 Pod,kube-proxy 维护网络规则。整个链路能按 apiserver -> etcd -> scheduler -> kubelet 的顺序说下来,就算过关。健康检查机制这个考点回答起来要强调三个探针:livenessProbe 判断容器是否存活、readinessProbe 判断容器是否就绪可接收流量、startupProbe 处理启动慢的应用。数据持久化的方式包括 emptyDir、hostPath、PV/PVC、StorageClass、ConfigMap 和 Secret 挂载等,其中 PV/PVC 是生产环境用的主流方案。
5.4 避坑记录:容器与 K8s 面试和实操的七个翻车点
从多年面试和被面试的经验看,容器和 K8s 部分的坑最密集,几乎每个考点都有对应翻车案例,挑出现频率最高的几条:
现象1:docker run 挂载目录后浏览器 403 或 404。原因:挂载目录里没放 index.html,或宿主机目录权限不足,nginx 容器内 worker 进程读不了。解决:先在宿主机确认挂载目录存在且有 index.html,再docker exec进容器看 /usr/share/nginx/html 目录内容和权限。
现象2:docker exec 进容器执行命令报 "exec: executable file not found"。原因:容器内没有宿主机上安装的工具,比如宿主机有 vim,容器里是最小化镜像没有 vim。解决:用docker exec执行镜像内存在的命令,比如sh -c或cat,必要时先 apt/yum 安装。
现象3:docker save 保存的镜像 load 后没有了版本标签。原因:save 导出时只用容器 ID 没带版本 tag。解决:save 前先 docker tag 补全版本号,导出时写全镜像名:版本号。
现象4:kubectl get pods 看到 CrashLoopBackOff,反复重启。原因:应用启动时依赖的环境变量、配置文件或数据库连接没就绪。解决:看kubectl logs定位具体错误,用 readinessProbe 延后流量,配置 initContainer 做前置依赖检查。
现象5:Pod 一直 Pending 不调度。原因:资源不足或节点有 taint。解决:kubectl describe pod查看事件,看是 CPU/内存请求超了可用资源,还是有 node selector 不匹配或 taint 没容忍。
现象6:Service 创建后 Pod 间访问超时。原因:Service 的 selector 与 Pod 标签不匹配,或 kube-proxy 的 ipvs 模式有问题。解决:kubectl get svc -o yaml核对 selector,kubectl get endpoints看是否有对应 Pod,endpoints 存在才说明 Service 找到了目标。
现象7:K8s 面试被问 etcd 时只答「存配置」。原因:理解过于表面。解决:深一层说 etcd 用 Raft 保证一致性,存储集群的期望状态和实际状态,所有 apiserver 的读写都经过它,etcd 挂了集群就只读不可写了。
这几条经验我自己就踩过至少一半,尤其是第1条挂载目录权限问题,几乎所有新手都会遇到,面试时主动说出来反而会加分——面试官知道你是真做过,不是背的。
6. 网络题与答题方法论:OSI、TCP 状态和 HTTP 状态码的串联记忆法
网络部分是面试的必考调剂题,难度不大但覆盖面广。备考时要把握一个核心:网络题的重点不是概念本身,而是用协议、端口、状态码串联起故障排查的线索。比如线上服务变慢了,从 TCP 连接状态能看出是等待超时还是连接被拒;从 HTTP 状态码能判断是后端服务问题还是网关问题。这才是面试官想听到的。
先过一遍基础题的回答框架。OSI 七层模型按物理层、数据链路层、网络层、传输层、会话层、表示层、应用层来记,用一句话归纳各层职责:物理层传比特流、数据链路层传帧、网络层传包并路由寻址、传输层提供端到端通信、会话层管理连接、表示层做数据格式转换、应用层对用户提供服务。记忆口诀可以自己编一句顺口溜,比如「物数网传会表应」。TCP 和 UDP 的区别从连接性、可靠性、传输方式和应用场景四个维度答:TCP 面向连接、可靠、字节流,适合文件传输、网页访问、数据库连接;UDP 无连接、不可靠、数据报,适合直播、DNS 查询、游戏实时通信。TCP 三次握手答「SYN -> SYN+ACK -> ACK」,四次挥手答「FIN -> ACK -> FIN -> ACK」,我说的每步都要配合状态变化来讲,从 SYN_SENT 到 ESTABLISHED 到 FIN_WAIT 到 TIME_WAIT,能画出来最好。
HTTP 常见状态码用区间来记:2xx 成功,3xx 重定向,4xx 客户端错误,5xx 服务端错误。高频的具体码:200 成功、301 永久重定向、302 临时重定向、403 禁止访问、404 找不到资源、500 服务器内部错误、502 网关错误、503 服务不可用、504 网关超时。面试时结合场景说出「从状态码反推故障位置」比背数字强:404 是后端应用层问题,502 是后端服务挂了或未启动,504 是后端响应超时但服务还活着。HTTP 请求方法里 GET、POST、PUT、DELETE 是基础,HEAD、OPTIONS、PATCH 也要知道用途。
最后这个部分我通常会给面试者一条进阶建议:回答网络题时把「知识块」串成「排查链路」。比如状态码 502 可以从 nginx 日志查到 upstream 报错,然后查后端进程是否存活、端口是否监听、防火墙是否拦截,一条链路走下来,既展示了知识面,又体现了解决问题的思路。
从第一次准备运维面试到现在批量筛候选人,我复盘过几十份题库,这份是唯一把「背答案价值」降得比较低的:知识覆盖全、答案有真实命令、每个考点都能延伸出实操场景。从那以后,我每次模拟面试都用它出题,而且一定会从题库里挑两三道题让人现场写命令,而不是只让背概念——因为运维岗最终拼的是手指头和脑子之间的反应速度。希望这份题库能帮你把高频考点过一遍,也把你自己的实战经验补齐进去,面试时才有得讲、讲得深。
本文还有配套的精品资源,点击获取