面试

Linux 面试题:24 道问题及参考答案

更新于: · Skillaria.Top

Linux 面试中最常问的是文件系统结构和 inode、硬链接与符号链接、权限与 sudo、进程与信号、系统启动,以及网络:如何检查开放端口、DNS 解析的工作方式,以及服务器无法访问时该怎么办。

Linux 问题常出现在 DevOps 工程师、系统管理员、SRE 和后端开发的面试中。面试官很少要求背诵命令的参数,他们更关心你是否理解系统如何运作,以及能否找到问题的原因。下面整理了最常见的 Linux 面试题,从基础到故障排查,附带答案和命令。

建议:回答时说出你会用哪个命令来验证自己的说法。“我会用 ss -tlnp 查看”比泛泛而谈更有说服力。

文件系统

1. 什么是 FHS,各个主要目录里有什么?

FHS(Filesystem Hierarchy Standard,文件系统层次结构标准)规定了目录的位置。整棵目录树从根 / 开始,没有带字母的独立磁盘,其他文件系统都挂载到这棵树的目录中。

  • /etc:系统和服务的配置;
  • /var:可变数据,例如日志(/var/log)、缓存、队列、数据库;
  • /home:用户的主目录,/root 是 root 的主目录;
  • /usr:程序和库,在现代发行版中 /bin 和 /sbin 通常是指向 /usr/bin 和 /usr/sbin 的链接;
  • /tmp:临时文件,/boot:内核和引导程序;
  • /proc 和 /sys:包含进程和内核信息的虚拟文件系统,/dev:设备文件。

2. 什么是 inode?

inode 是文件系统中保存文件元数据的结构,包括类型、权限、所有者、大小、时间戳、硬链接数,以及指向数据块的指针。inode 中不保存文件名:名称存放在目录中,形式为“名称 → inode 编号”。

用 ls -i 可以查看 inode 编号,用 stat file 查看详细信息。文件系统中 inode 的数量是有限的,df -i 显示已用的数量。由此产生了一种经典情况:“磁盘还有很多空间,却无法创建文件”,原因是大量小文件耗尽了 inode。

3. 硬链接和符号链接有什么区别?

硬链接(ln file link)是同一个 inode 的另一个名字。两个名字地位平等,只有当链接计数降为零时,数据才会被删除。限制是:不能对目录创建硬链接,也不能跨越文件系统。

符号链接(ln -s target link)是一个独立文件,有自己的 inode,内容是目标的路径。它可以指向目录,也可以指向另一个文件系统,但如果目标被删除或移动,它就会“断开”。

4. 磁盘空间已满,但 du 显示的比 df 少,为什么?

最常见的原因是文件被删除了,但仍有进程保持它打开,例如删除了一个正在被服务使用的大日志文件。文件名已经不存在,因此 du 看不到它,但它占用的块仍然被占用,df 会把它计算在内。

查找这类文件可以使用 lsof +L1 或 lsof | grep deleted。解决方法是重启相关进程,或通过文件描述符截断文件:: > /proc/PID/fd/N。以后清理日志时,应该用 truncate 或 logrotate 轮转,而不是 rm。

5. Linux 是如何启动的?

固件(BIOS 或 UEFI)初始化硬件,然后把控制权交给引导程序,通常是 GRUB。引导程序读取配置,把内核和 initramfs 加载到内存中。initramfs 是一个临时根文件系统,包含访问真正根文件系统所需的驱动。

内核初始化设备,挂载根文件系统,并启动 PID 1,也就是大多数发行版中的 systemd。systemd 启动服务,直到默认目标,例如 multi-user.target。各阶段的耗时可以用 systemd-analyze 查看。

6. mount 命令是做什么的?自动挂载在哪里配置?

mount 把设备上的文件系统连接到一个目录(挂载点)上,例如 mount /dev/sdb1 /mnt/data。当前的挂载情况可以用 findmnt 或不带参数的 mount 查看。

开机时自动挂载在 /etc/fstab 中配置。最好在 fstab 中使用 UUID(可以用 blkid 查看)而不是 /dev/sdb1 这样的设备名,因为设备名可能会变化。重启前可以用 mount -a 检查修改:fstab 中的错误可能导致系统无法启动。

用户和权限

7. Linux 的权限是如何设计的?

每个文件都有所有者、所属组,以及三组权限:所有者、所属组和其他人。每组包括 r(读)、w(写)、x(执行)。数字形式中 r=4、w=2、x=1,因此 chmod 640 file 的含义是:所有者可读写,组可读,其他人无权限。

$ ls -l app.conf
-rw-r----- 1 deploy www-data 512 Oct 12 10:03 app.conf

所有者用 chown user:group file 修改,权限用 chmod 修改。

8. 目录的 r、w、x 权限是什么意思?

对目录来说,含义不同:r 表示可以获取文件名列表,w 表示可以在目录中创建、删除和重命名文件,x 表示可以进入目录并按名称访问其中的文件。

由此得出一个重要结论:只要对目录有写权限,就可以删除其中的文件,即使文件并不属于你。如果目录没有 x 权限,即使有 r 也没用:可以看到文件名,但无法打开文件。

9. 什么是 SUID、SGID 和 sticky bit?

可执行文件上的 SUID 位使程序以其所有者的身份运行,而不是以执行者的身份。典型例子是 /usr/bin/passwd:它属于 root,因此可以修改 /etc/shadow。文件上的 SGID 对组起同样的作用;目录上的 SGID 使新建文件继承目录所属的组,适合共享目录。

目录上的 sticky bit 只允许文件的所有者删除其中的文件,即使目录对所有人可写。/tmp 就是这样设置的:ls -ld /tmp 会显示 drwxrwxrwt。要审计系统中所有的 SUID 文件,可以使用 find / -perm -4000 -type f 2>/dev/null。

10. 什么是 umask?

umask 是一个掩码,用于去掉新建文件和目录的某些权限。文件的基础权限是 666,目录是 777,umask 会从中减去相应的位。典型的 umask 022 会让文件以 644 创建,目录以 755 创建。当前值可以用 umask 命令查看。

11. 用户和密码保存在哪里?

账户信息保存在 /etc/passwd 中:用户名、UID、主组的 GID、主目录和 shell。密码哈希单独保存在 /etc/shadow 中,只有 root 可以读取,因此普通用户无法获取哈希进行暴力破解。组信息保存在 /etc/group 中。

查看用户信息可以使用 id user 和 getent passwd user,后者也会查询 LDAP 等外部数据源。

12. sudo 是如何工作的?它为什么比直接以 root 登录更好?

sudo 按照 /etc/sudoers 和 /etc/sudoers.d/ 中的规则,以其他用户(默认是 root)的身份执行命令。用户输入的是自己的密码,而不是 root 的密码;每个操作都会写入日志,记录是谁执行的。

规则可以允许全部操作(alena ALL=(ALL:ALL) ALL),也可以只允许特定命令。编辑 sudoers 必须使用 visudo:它会在保存前检查语法,错误不会让你失去 sudo 权限。在 Ubuntu 中,管理员权限通过加入 sudo 组获得;在 RHEL 系列系统中,通过加入 wheel 组获得。

13. 怎样把用户加入组?为什么修改没有生效?

命令 usermod -aG docker alena 会把用户加入附加组。选项 -a 必不可少:没有它,-G 会替换整个组列表。

修改在重新登录后才生效:当前会话保存的是旧的组列表。可以重新登录,或者用 newgrp docker 打开一个带有新组的 shell。用 id 检查。

进程

14. 什么是进程和 PID?怎样查看进程?

进程是正在运行的程序,拥有自己的地址空间、打开的文件和 PID 标识符。每个进程都有父进程(PPID),所有进程的共同祖先是 PID 为 1 的进程。使用 ps aux 和 ps -ef 列出进程,pstree 或 ps -ef --forest 显示进程树,top 和 htop 实时查看。

15. SIGTERM 和 SIGKILL 有什么区别?

kill PID 默认发送 SIGTERM(15),这是一个礼貌的结束请求。进程可以捕获它,关闭连接,保存数据后退出。SIGKILL(9,即 kill -9)无法被捕获:内核会立即结束进程,不做任何清理。

正确的顺序是:先发送 SIGTERM,只有进程没有响应时才使用 SIGKILL。另一个常见信号是 SIGHUP:许多守护进程收到它后会重新读取配置。

16. 什么是僵尸进程?

僵尸进程是已经结束、但父进程还没有通过 wait() 读取其退出码的进程。它几乎不占用资源,但仍保留在进程表中。在 ps 中,它的状态是 Z。

无法直接杀死僵尸进程,因为它已经死亡。需要让父进程回收它:修复父程序,或者结束父进程,此时僵尸进程会被 PID 1 收养,并由它清理。

17. load average 表示什么?

uptime 和 top 中的三个数字,分别是最近 1、5、15 分钟内处于可运行队列中的平均进程数。在 Linux 中,这里也包括处于不可中断等待状态(状态 D)的进程,通常是在等待磁盘。

要与 CPU 核心数(nproc)比较:在 4 核机器上负载为 4 表示满载,在 16 核机器上则只占四分之一。CPU 使用率低而负载高,通常说明 I/O 有问题,可以用 iostat 或 top 中的 wa 字段来确认。

网络

18. 怎样查看 IP 地址、路由和开放端口?

接口地址用 ip a 查看,路由表用 ip r 查看。旧的 ifconfig 和 net-tools 包中的 netstat 在许多发行版中默认未安装。

监听端口及其进程用 ss -tlnp 查看:t 表示 TCP,l 表示只显示监听中的套接字,n 表示不解析名称,p 表示显示进程。UDP 使用 ss -ulnp。

$ sudo ss -tlnp
State  Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0      511          0.0.0.0:80        0.0.0.0:*     users:(("nginx",pid=812,fd=6))
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*     users:(("sshd",pid=640,fd=3))

19. 服务监听 127.0.0.1:8080,外部能连接吗?

不能。地址 127.0.0.1 是回环接口,只能从本机访问。要接受外部连接,服务必须监听外部网卡的地址,或者 0.0.0.0(所有 IPv4 地址)。这是“端口开着,外部却访问不了”的常见原因,另一个原因是防火墙。

20. Linux 如何把主机名解析为 IP 地址?

解析顺序由 /etc/nsswitch.conf 中的 hosts: 行决定,通常先查 /etc/hosts,再查 DNS。DNS 服务器地址取自 /etc/resolv.conf;在使用 systemd-resolved 的系统中,这里是本地地址 127.0.0.53,真正的服务器可以用 resolvectl status 查看。

检查可以使用 dig example.com,或 dig @1.1.1.1 example.com(直接查询指定服务器)。需要注意:dig 和 nslookup 直接访问 DNS,不读取 /etc/hosts;而 getent hosts example.com 使用的路径与应用程序相同。

21. TCP 与 UDP 有什么区别?

TCP 先建立连接(三次握手:SYN、SYN-ACK、ACK),保证数据的可靠传输和顺序,并重传丢失的数据包。HTTP、SSH 以及大多数数据库都使用 TCP。UDP 发送无连接的数据报,没有可靠性保证,但延迟更低,DNS 查询、视频通话和游戏通常使用 UDP。

22. 网站打不开,你会怎样查找原因?

按层次从名称到应用逐层排查:

  1. 域名能否解析:dig site.example,地址是否与预期一致。
  2. 主机是否可达:ping(可能被禁用),traceroute 或 mtr。
  3. 端口是否开放:nc -zv host 443 或 curl -v https://site.example。
  4. 服务器端:服务是否在运行(systemctl status nginx),端口是否在监听(ss -tlnp),防火墙是否阻断(sudo nft list ruleset,sudo ufw status)。
  5. 应用的日志以及服务的 journalctl -u。

面试官看重的是系统化的排查顺序,而不是记住某个特定的工具组合。

23. 什么是 TIME_WAIT 状态?

TCP 连接关闭后,首先关闭连接的一方会在 TIME_WAIT 状态下保持套接字一段时间,以防旧连接中迟到的数据包被误认为是使用相同地址和端口的新连接的数据。对于负载较高、或频繁进行短连接的服务器或客户端,大量 TIME_WAIT 是正常现象。统计它们的数量可以使用 ss -tan state time-wait | wc -l。

24. /etc/hosts 与 DNS 有什么区别?什么时候需要用 /etc/hosts?

/etc/hosts 是某台机器上的静态“地址—名称”表。在默认的 nsswitch 配置下,它的优先级高于 DNS,适合测试:例如,在修改 DNS 记录之前,先把域名指向新服务器。DNS 是分布式系统,所有客户端看到的应答相同。/etc/hosts 中的错误也是“我这里网站能打开,别人那里打不开”的常见原因。

总结

Linux 面试题主要考察三件事:你是否理解系统模型(inode、权限、进程、启动过程),是否知道诊断工具(ss、dig、journalctl、lsof),以及能否按步骤查找原因。回答时结合命令和实际经验。文件系统、权限和网络的内容,都在 Linux 课程中结合实践详细讲解。

常见问题

初级 DevOps 面试通常问哪些 Linux 知识?

通常是基础内容:导航和权限,进程和 systemctl,查看日志,网络命令 ip、ss、dig 和 curl,以及 Bash 脚本基础。也常给出实际任务,例如“找出是什么占满了磁盘”。

需要记住命令的所有参数吗?

不需要。可以说明要用 man 查看具体参数。更重要的是理解用哪个工具解决问题,以及如何解读它的输出。

准备面试应该学习哪个发行版?

任何常见的服务器发行版都可以:Ubuntu、Debian,或者兼容 RHEL 的 Rocky Linux。基础知识是通用的,主要区别在包管理器和部分服务名称上。

怎样准备面试中的实际操作部分?

启动一台虚拟机,动手完成真实任务:把 Web 服务器配置为 systemd 服务,设置 SSH 密钥登录,配置防火墙,通过端口找到进程。边操作边讲出自己的思路,也是准备的一部分。