Linux 运维面试【口述版】

用户、权限与进程管理

1. Linux 权限 755、644 含义;SUID、SGID、SBIT 粘滞位

口述: 权限分属主、属组、其他用户,r=4 w=2 x=1。 755:属主 rwx (7),属组 rx (5),其他 rx (5),目录常用 755,目录必须有 x 才能进入浏览; 644:属主 rw (6),属组 r (4),其他 r (4),普通文件默认 644,一般不给执行权限。

特殊位: SUID(4xxx):二进制程序执行时,临时继承文件属主权限,最典型 passwd 命令;只对二进制可执行文件生效,目录无效。 SGID(2xxx):文件执行继承属组权限;目录上开启后,新建文件自动继承目录属组,多用于项目共享目录。 SBIT 粘滞位(1xxx):一般用于公共目录比如 /tmp,目录内文件只有文件所有者或 root 才能删除,别人删不了。

2. ps aux 和 ps -ef 区别;STAT Z D S 含义

口述: 两者都是查看进程,输出格式、来源不一样: ps aux 是 BSD 风格,USER、% CPU、% MEM,不带 PPID 父进程 ID; ps -ef 是标准 SystemV 风格,自带 PPID 父进程,排查父子进程、僵尸进程更方便。

STAT 状态: S:休眠,可中断睡眠,等待事件; D:不可中断睡眠,一般卡在 IO,磁盘阻塞,kill 杀不掉; Z:僵尸进程,子进程退出、父进程没回收它的退出状态。

3. 孤儿进程、僵尸进程;僵尸进程产生和清理

口述: 僵尸进程:子进程先退出,释放资源,但退出状态没被父进程 wait 回收,进程表条目保留,变成 Z 状态,本身不占 CPU 内存,但占用 PID 号,大量堆积会耗尽 PID。 孤儿进程:父进程提前退出,子进程还在运行,会被 systemd(init 进程)收养,自动变成它的子进程。

清理僵尸:优先重启父进程,或者杀掉父进程,让 init 自动回收;直接 kill 僵尸进程本身没用,杀不掉

4. 后台运行程序,SSH 断开不中断(nohup/screen/tmux/systemd)

口述:

  1. nohup + &:nohup 忽略 SIGHUP 信号,& 放到后台,输出默认 nohup.out;简单临时用,缺点不能重新 attach 回去看界面。
  2. screen:终端会话工具,创建会话后后台跑,就算 ssh 断了,重新登录 screen -r 恢复会话。
  3. tmux:增强版 screen,支持分窗、会话管理,现在运维更常用。
  4. systemd:生产首选,做成 service 单元托管,开机自启、崩溃自动重启、日志托管,最稳定。

5. kill -9 和 kill -15 区别;Linux 信号机制

口述: kill 默认是 – 15 SIGTERM,优雅终止,通知进程自行收尾、关闭句柄、保存数据、退出;进程可以捕获、忽略这个信号。 kill -9 是 SIGKILL,强制杀死,进程不能捕获、不能忽略,内核直接干掉进程,容易丢数据、损坏文件,尽量不用,只在进程卡死无响应时应急。

信号机制:内核给进程发送信号,进程收到后执行默认动作,也可以自定义捕获处理;SIGINT 就是 Ctrl+C。

磁盘、文件系统与存储

6. Linux 开机流程 BIOS/UEFI → systemd

口述: BIOS/UEFI 先硬件自检,找到启动磁盘; 读取 MBR/GPT 引导,加载 GRUB 引导程序; GRUB 加载内核 kernel 和 initramfs 到内存; 内核初始化,识别硬件、挂载根文件系统; 启动 PID=1 的 systemd,然后并行启动所有系统服务、挂载分区、启动网络,完成开机。

UEFI 区别:直接支持 GPT 分区,独立 ESP 分区放引导,不再依赖 MBR。

7. LVM 在线扩容,PV/VG/LV 关系

口述: PV 物理卷:把原始磁盘 / 分区做成 PV,交给 LVM 管理; VG 卷组:多个 PV 打包成一个大资源池; LV 逻辑卷:从 VG 里划分空间,就是我们 mount 使用的分区。

在线扩容步骤:

  1. 新增磁盘或扩容原有磁盘,创建 PV;
  2. vgextend 把 PV 加到 VG;
  3. lvextend 扩容 LV;
  4. resize2fs(ext4)/xfs_growfs(xfs)在线扩容文件系统,不用 umount

8. df 看磁盘还有空间,但提示 No space left

口述: 大概率两个原因:

  1. inode 耗尽:df -i 看 inode,大量小文件把 inode 用完,就算磁盘块还有空间也无法新建文件,排查大量日志、缓存小文件;
  2. 还有一种:进程占用已删除大文件,rm 后句柄没释放,lsof |grep deleted 可以查到,重启对应进程释放空间。

排查顺序:df -h → df -i → lsof |grep deleted。

9. ext4 和 xfs 区别;文件系统查看、修复

口述: ext4:老牌稳定,日志文件系统,支持 resize、碎片整理,适合小分区、传统业务; XFS:RHEL7 + 默认,大磁盘、大文件性能更好,并发 IO 强;但缩小文件系统不支持,只能扩容。

查看文件系统:lsblk、df -T; 修复:ext4 用 fsck,xfs 用 xfs_repair;修复必须卸载分区,不能在线修复,否则损坏数据

10. RAID0/1/5/10 区别、利用率、最小盘数

口述: RAID0:条带化,读写最快,无冗余,坏一块全盘丢;利用率 100%;最少 2 块。 RAID1:镜像,两块盘互备,读快写慢;利用率 50%;最少 2 块。 RAID5:奇偶校验,校验位分散在所有盘;允许坏 1 块;利用率 (n-1)/n;最少 3 块。 RAID10(1+0):先镜像再条带;允许每组镜像最多坏 1 块;利用率 50%;最少 4 块;兼顾性能和冗余,生产数据库首选。

网络协议与排错

11. TCP 三次握手、四次挥手;TIME_WAIT、CLOSE_WAIT

口述: 三次握手:

  1. 客户端发 SYN,同步序列号;
  2. 服务端回 SYN+ACK,同步 + 确认;
  3. 客户端回 ACK,连接建立。

四次挥手(TCP 全双工,两边独立关闭):

  1. 客户端发 FIN,我这边不再发数据;
  2. 服务端回 ACK,收到关闭请求;
  3. 服务端发 FIN,服务端数据发完,关闭自己方向;
  4. 客户端回 ACK,连接释放。

状态: TIME_WAIT:主动关闭方最后 ACK 之后的状态,默认等 2MSL,保证对方收到 ACK、防止旧报文残留; CLOSE_WAIT:被动关闭方收到 FIN、回完 ACK 之后,应用程序一直不调用 close,卡在这,代码问题居多。

12. 大量 TIME_WAIT / CLOSE_WAIT 原因 + 调优

口述: 大量 TIME_WAIT:短连接高频创建销毁,一般是客户端、负载均衡频繁建连。 内核优化:调小 tcp_tw_reuse、tcp_fin_timeout,快速回收复用 TIME_WAIT 端口。

大量 CLOSE_WAIT:业务代码问题!对方已经发 FIN 关闭连接,但服务端程序没 close 套接字,一直持有句柄;改代码,或者重启对应服务才能释放。内核参数解决不了 CLOSE_WAIT

13. 网络排错工具,排查不通、丢包、延迟

口述: ping:基础连通性、丢包、延迟,ICMP; mtr(推荐替代 traceroute):路径 + 每一跳丢包率,定位在哪一跳丢包; ss/netstat:查看端口、连接状态,ss 性能更好; tcpdump:抓包,分析报文、握手挥手、请求内容,定位应用层问题。

排查思路:先 ping 基础连通,mtr 定位丢包节点,ss 看连接状态,tcpdump 抓包深入分析。

14. 浏览器输入 URL 到页面展示全过程

口述:

  1. DNS 解析域名,拿到目标 IP;
  2. TCP 三次握手建立连接(HTTPS 还要 TLS 握手);
  3. 发送 HTTP 请求;
  4. 服务端处理、返回响应、静态资源 / 接口数据;
  5. 浏览器解析 HTML、CSS 渲染 DOM、加载 JS、图片等资源;
  6. TCP 四次挥手关闭连接(短连接),页面渲染完成。

15. DNS 解析;/etc/hosts 和 resolv.conf 优先级

口述: DNS 解析就是把域名翻译成 IP。 优先级:先读 /etc/hosts 本地静态解析,再去 resolv.conf 里配置的 DNS 服务器查询。 /etc/resolv.conf 定义上游 DNS 地址,nameserver 配置 DNS,search 是域名搜索后缀。

系统性能调优与故障排查

16. Load Average 含义;Load 高和 CPU 利用率高区别

口述: Load Average 是 1/5/15 分钟的运行队列平均任务数,代表等待运行的任务,不光等 CPU,还包含等磁盘 IO 的进程。 CPU 核数做参考:4 核 CPU,load 接近 4 代表打满;大于 4 说明任务排队。

区别:CPU 利用率高,是 CPU 很忙;Load 高,CPU 不一定高,很可能IO 阻塞(D 进程多),大量进程卡在等磁盘,load 上涨但 CPU 空闲。

17. OOM Killer;内核怎么选进程;防止进程被 OOM 杀死

口述: OOM Killer:内存不足的时候,内核主动杀掉进程释放内存。 内核通过 oom_score 打分,分数越高越优先被杀;oom_score 会参考内存占用、进程优先级、是否 root 等。 保护关键进程:修改 /proc/[pid]/oom_adj,调低分数甚至 – 17,让 OOM 不杀它;也可以合理限制容器内存、预留 swap。

18. 印象最深故障排查(通用口述模板,面试万能套用)

口述: 我之前遇到过一次业务响应缓慢,先看负载很高,但 CPU 利用率不高,判断大概率 IO 瓶颈。先用 iostat 看 % iowait 很高,再用 iotop 定位到日志刷盘进程大量写磁盘。 排查发现日志没有切割,单个日志持续膨胀,大量随机写拖慢磁盘。 临时方案先切割日志、清理旧日志;长期方案配置 logrotate 自动切割,并且调整日志级别减少无用打印,最后 iowait 回落,业务恢复。 复盘后续增加磁盘监控告警,提前识别 IO 压力。

你可以按需替换成 CPU100%/ 内存泄漏版本

19. sysctl.conf 常见 TCP 内核优化参数

口述: 常用几个: net.ipv4.tcp_syncookies 防 syn 洪水攻击; net.ipv4.tcp_tw_reuse 复用 timewait 端口; net.ipv4.tcp_fin_timeout 缩短 timewait 超时; net.core.somaxconn 调大监听队列; net.ipv4.tcp_keepalive_time tcp 保活; 还有文件句柄、内存相关的参数。改完 sysctl -p 生效。

20. Swap、swappiness;生产要不要关 Swap

口述: Swap 就是磁盘充当虚拟内存,物理内存不够时,把冷内存页换到磁盘,防止 OOM。 swappiness 控制内核多积极使用 swap,0 优先不用 swap,100 积极使用 swap。 生产建议:不直接关闭 swap,容易突发内存暴涨直接触发 OOM;调低 swappiness=10,尽量优先使用物理内存,只在极端情况才用 swap 兜底;容器环境另说,很多直接禁用 swap。

Shell 脚本与运维自动化

21. Shell 特殊变量 $0 $1 $# $? $$ $* $@

口述: $0:脚本本身名字; $1、 $2:第 1、2 个位置参数; $#:传入参数总个数; $?:上一条命令退出码,0 成功,非 0 失败; \(:当前脚本PID; $*:所有参数,当成**单个字符串**; $@:所有参数,**独立列表**,循环遍历推荐用$@。\)

22. Shell 错误捕获;set -e set -u set -o pipefail

口述: set -e:命令非 0 退出码时,脚本直接退出; set -u:使用未定义变量直接报错退出,防止空变量坑; set -o pipefail:管道里任意一段失败,整个管道返回失败码,默认只会取最后一段的返回值; 写运维脚本一般开头加上这三个,严格报错,方便捕获异常,避免脚本出错继续往下跑。

23. Shell 监控 Nginx,挂了自动重启 + 告警(口述思路,可现场写)

口述: 思路:先用 systemctl status 或者 pgrep 检测 nginx 进程是否存在; 不存在就执行 systemctl start nginx 重启; 重启失败或者检测异常,调用邮件 / 钉钉 / 企业微信接口发告警; 然后加入 crontab 定时执行,比如每 30 秒跑一次。 同时脚本开头加上 set 严格模式,记录日志,避免重复告警。

上一篇
下一篇