5321 字
27 分钟
Linux 八股

1. 基础命令#

Linux常用文件操作命令? ls、cd、pwd、mkdir、touch、cp、mv、rm、cat、vi/vim。

如何查看系统版本? uname -a

如何查找文件?

Terminal window
# 按名称查找
find [路径] [匹配条件] [动作]
find / -name "filename"
# 基于数据库快速查找(-i 忽略大小写; -n x 显示前x条)
locate -i "filename"

如何查看文件内容 / 如何查看大文件? cat(全部)、less/more(分页)、head/tail(头尾)、grep(过滤)。

less/more 区别?

  • more 只能向前翻页,加载大文件慢,无交互搜索;
  • less 支持双向滚动,按需加载性能优,内置搜索功能强,且在管道中可回溯,更适合大型文件和复杂操作。

如何查看当前目录? pwd (Print Working Directory)

如何管理用户?

Terminal window
useradd 选项 用户名
userdel 选项 用户名
usermod 选项 用户名
passwd 选项 用户名

如何管理权限?

  • chmod 改变文件/目录权限,三个数字owner/group/others,八进制表示法(读4 写2 执行1)
  • chown 改变所有者,chgrp 改变所在组

目录权限含义?

  • 读(r):允许列出目录中的文件和子目录名称(ls)。
  • 写(w):允许在目录中创建、删除、重命名文件或子目录(会改变目录的文件列表)。
  • 执行(x):允许进入目录(cd)并访问其中的文件或子目录。
  • 注意:
    • 只有 x 权限而无 r 权限,可以进入目录但无法列出文件名。
    • 只有 r 权限而无 x 权限,可以看到文件列表但无法进入目录或访问文件内容。

子目录有写权限但父目录没有,能修改子目录吗?

操作需要父目录权限需要子目录权限
修改子目录内文件x(穿过)w + x
在子目录内创建/删除文件xw + x
进入子目录 cdxx
删除/重命名子目录本身w + x
列出父目录内容r

如何设置定时任务? crontab -e 编辑当前用户 crontab 文件,* * * * * command 分/时/日/月/星期

硬链接与软链接(符号链接)的底层区别? 硬链接是同一inode的多个入口,不能跨文件系统,不能指向目录,删除源不影响;软链接是新inode存储路径字符串,指向源文件路径,源删除则失效(高亮闪烁)。

硬链接为什么不能跨文件系统?

  • 硬链接指向的是 inode,而 inode 号只在当前文件系统内有意义。每个文件系统都有自己的 inode 表,另一个文件系统里的同一个 inode 号不代表同一个文件。
  • 软链接保存的是路径字符串,解析时按路径重新查找目标文件,所以可以跨文件系统

如何查看文件被哪个进程占用? lsof filename

Linux系统结构,主要目录作用?

分层的树形结构,主要目录作用:

  • /bin 存放常用的用户命令,如ls、cp等,普通用户和管理员均可使用。
  • /sbin 存放系统管理员使用的管理命令,如ifconfig、reboot等。
  • /etc 存放系统配置文件和子目录,例如网络配置文件/etc/hosts和DNS配置文件/etc/resolv.conf。
  • /home 用户的主目录,每个用户都有一个以用户名命名的子目录。
  • /root 超级用户(root)的主目录,仅供系统管理员使用。
  • /lib和/lib64 存放系统的共享库文件,类似于Windows的DLL文件,几乎所有程序都依赖这些库。
  • /usr 存放用户应用程序和文件,包括/usr/bin(用户命令)、/usr/sbin(管理员命令)和/usr/local(本地安装的软件)。
  • /var 存放动态数据,如日志文件(/var/log)、邮件(/var/mail)和临时文件(/var/tmp)。
  • /tmp 存放临时文件,系统重启后会清空。
  • /dev 存放设备文件,例如硬盘(/dev/sda)和终端(/dev/tty)。
  • /proc 虚拟文件系统,存储内核和进程信息,例如CPU信息(/proc/cpuinfo)和内存信息(/proc/meminfo)。
  • /sys 类似于/proc,用于存储设备和内核模块的信息。
  • /boot 存放启动相关文件,包括内核和引导加载器配置文件。
  • /media和/mnt 用于挂载外部设备,如U盘和光驱。
  • /opt 存放第三方软件或可选应用程序。
  • /run 存储系统运行时的信息,系统重启后会清空。

如何查看文件类型?

ls -l 看第一列

  • -:普通文件
  • d:目录文件
  • b:块设备文件(一般位于/dev,以块为单位进行读写的特殊设备文件,通常用于硬盘、光盘和U盘等存储设备)
  • c:字符设备文件(一般位于/dev,允许用户按字节顺序与设备交互,例子包括键盘、鼠标、串口和终端设备)
  • s:套接字文件
  • p:管道文件
  • l:链接文件(软链接)

su命令作用、参数?

作用:切换用户。主要参数:

  • - / -l / --login 模拟完整登录,加载目标用户环境
  • -c "cmd" 以目标用户执行一条命令后退出
  • -s shell 指定使用的 shell
  • -m / -p 保留当前环境变量(不重置)
  • -g group 指定主组
  • -G group 指定附加组

su user和su - user区别?

su usersu - user
环境变量保留当前用户环境重新加载目标用户环境
工作目录不变(当前目录)切换到目标用户 home
PATH沿用原用户重置为目标用户的 PATH
shell 类型非登录 shell登录 shell
读取配置不读 .bash_profile / .profile读取 .bash_profile / .profile / .bashrc
本质只切换身份完整登录模拟

su user 跑脚本可能因 PATH 不对找不到命令;生产脚本建议用 su - user -c "cmd"

2. 进程管理#

进程排查#

如何查看所有运行中的进程? ps auxps -ef

如何实时监控进程和系统资源? top(实时刷新),关注%CPU、%MEM、load average。

top命令顶部输出含义?

  • Tasks(进程任务)total 总进程数;running 正在运行;sleeping 睡眠;stopped 暂停;zombie 僵尸进程(重点警戒值,不为0需关注)。
  • %Cpu(s)us 用户态占用;sy 内核态占用;id 空闲;wa I/O等待;hi/si 硬/软中断。
  • MiB Mem(物理内存)total 总内存;free 完全空闲;used 已分配(含缓存);buff/cache 缓冲区+页缓存(Linux会把空闲内存拿来当缓存,所以看可用内存应看 available 列)。

数值异常 & 常见原因

现象可能原因
us应用死循环、计算密集、代码 bug、QPS 突增
sy系统调用频繁、上下文切换多、锁竞争、网络/磁盘驱动问题
wa磁盘 I/O 瓶颈、NFS 慢(Network FileSystem)、数据库慢查询、swap 抖动
si网络软中断集中、单核跑满、网卡多队列未配置、DDoS
hi硬件中断频繁、网卡/磁盘中断风暴
st虚拟机被宿主机超卖、邻居抢占资源(云主机常见)
ni有人用 nice 跑后台任务
id 低但负载不高可能是 stwa 吃掉了,需结合 vmstat / iostat

排查套路

us 高 → top 看进程 → perf/火焰图
sy 高 → vmstat 看 cs/in → strace
wa 高 → iostat -x 1 → 看 %util / await
si 高 → mpstat -P ALL 1 → 看是否单核 → 调 RPS/RSS/多队列
st 高 → 找云厂商 / 换宿主机

ps aux / top命令各个关键字段含义?

  • PID:进程ID
  • USER:所属用户
  • PR/NI:优先级与 nice 值
  • VIRT/RES/SHR:虚拟内存、常驻内存、共享内存
  • %CPU/%MEM:CPU/内存占用率
  • TIME+:累计 CPU 时间
  • COMMAND:命令名或完整命令行

CPU硬中断和软中断区别? 硬中断由外部硬件触发,软中断由软件指令触发,它们在操作系统中分别处理实时事件和系统调用任务。

进程清理#

kill与kill -9的区别? kill默认发SIGTERM(可捕获、可清理);kill -9发SIGKILL(强制终止,不可捕获)。

kill 命令中信号编号 1、2、3、9、15、18、19 的具体区别?

  • 1 (SIGHUP):终端挂起,常用于让进程重读配置(如Nginx -s reload本质发此信号)。
  • 2 (SIGINT):键盘中断(Ctrl+C),进程可捕获清理。
  • 3 (SIGQUIT):键盘退出(Ctrl+\),会产生core dump用于调试。
  • 9 (SIGKILL):强制终止,不可捕获/忽略,直接由内核回收,可能造成资源泄漏或脏数据。
  • 15 (SIGTERM):默认终止信号,可捕获,优雅停机首选(超时后补9)。
  • 18 (SIGCONT):继续运行被暂停的进程。
  • 19 (SIGSTOP):暂停进程(Ctrl+z,不可捕获,类似外部挂起)。
  • 补充:Ctrl+d 表示输入结束,不发送信号,若输入为空,则返回0,类似EOF

僵尸进程是什么?如何清理? 子进程退出后父进程未调用wait()回收,进程描述符残留在进程表中。无法kill僵尸本身,需kill父进程(PPID),父进程死后僵尸被init收养并清理。

孤儿进程是什么? 父进程先退出,子进程被init(PID 1)收养,由init负责回收,通常无害。

进程间七种通信方式#

  1. 管道(Pipe):父子进程间单向传输,数据无格式。
  2. 命名管道(FIFO):通过文件节点,允许无亲缘关系进程通信。
  3. 信号(Signal):异步通知机制(如 kill -9)。
  4. 消息队列(Message Queue):内核维护的消息链表,有格式。
  5. 共享内存(Shared Memory)最快的方式,映射同一块物理内存,需配合信号量使用。
  6. 信号量(Semaphore):本质上是一个计数器,用于进程/线程间的同步与互斥,而非传输数据。
  7. 套接字(Socket):用于跨网络或本机不同进程间的通信(TCP/UDP)。

3. 内存与存储#

基础#

Buffer和Cache的区别? Buffer(Buffers):块设备元数据缓存(inode、分区信息)。Cache(Page Cache):文件内容缓存,读写都经过它。

手动drop_caches有什么风险? echo 3 > /proc/sys/vm/drop_caches会清空Page Cache,导致CPU飙升重建索引、磁盘I/O风暴(Cache Miss),生产环境慎用。

如何查看内存使用情况? free -hvmstat 查看虚拟内存统计。

虚拟地址#

缺页中断与内存映射

  • 内存映射(mmap):将磁盘文件或设备数据直接映射到进程的虚拟地址空间,使程序可以像访问内存一样访问文件数据,由内核在后台同步。
  • 懒加载(Lazy Loading):数据只有在首次访问时才会触发缺页异常,由内核将对应文件页加载到物理内存。
  • 缺页异常(Page Fault):当进程试图访问一个尚未加载到物理内存的虚拟页面时。
    • 次要异常/软缺页:数据已在 page cache,只需建立页表映射即可,很快。
    • 主要异常/硬缺页:数据不在 page cache,必须触发磁盘I/O将其读入内存(很慢,影响性能)。

虚拟内存#

什么是Swap?什么时候会用到?

  • 定义:Swap(交换分区)是硬盘上划出的一块空间。当物理内存(RAM)不足时,内核会将暂时不用的内存数据换出到Swap中,从而释放物理内存给当前活跃的进程。
  • 触发时机
    • 物理内存耗尽(剩余可用内存低于阈值)。
    • 内存回收压力大(内核的 kswapd0 线程被频繁唤醒)。
    • 主动冷数据迁移(即使内存还有余量,内核也会根据 vm.swappiness 参数决定是否把不活跃的页换出去,默认值通常是60)。

OOM#

什么是OOM?什么会导致OOM?

  • 定义Out Of Memory,即内存溢出。当系统物理内存和Swap全部耗尽,内核无法再为任何进程分配内存时,会触发 OOM Killer 机制,它会根据评分(oom_score)挑选一个进程强制杀掉(发送 SIGKILL 信号)以释放内存,保障操作系统存活。
  • 常见诱因
    • 内存泄漏(程序申请的内存没有释放,积少成多耗尽资源)。
    • 不合理的大对象/大查询(如数据库一次性加载上亿行数据到内存)。
    • 流量突增(并发请求数暴增,导致创建大量线程或缓存对象)。
    • 内存分配速度超过GC/回收速度(特别是在 Java 或 Python 应用中)。

Linux 下 OOM Killer 的运作机制? 系统内存耗尽时触发,根据 oom_score(受 /proc/[pid]/oom_adj 调节)打分,分数最高者被杀。可通过 echo -17 > /proc/[pid]/oom_adj 禁止被杀(仅对特定关键进程)。

ulimit#

ulimit 什么作用? ulimit 是 Linux 系统中用于控制 Shell 程序资源限制的内建命令。允许用户查看或设置当前会话的资源限制,包括文件大小、内存使用、CPU 时间等。

Linux 下 ulimit 的 soft limit 和 hard limit 区别? soft 当前生效值(进程可主动修改,最多涨到hard),hard 系统硬上限(只有 root 能改)。生产常见坑:nofile(最大文件句柄数)未调大导致”Too many open files”。

LVM#

LVM是什么?基本概念? Logical Volume Manager,在线调整分区大小无需停机。三层:PV(物理卷)→ VG(卷组)→ LV(逻辑卷)。

LVM常用操作命令? pvcreate创建物理卷,vgcreate创建卷组,lvcreate创建逻辑卷,vgextend扩展卷组,lvextend扩展逻辑卷。

LVM 在线扩容完整流程?(以虚拟机扩容为例)

最佳实践:生产环境一般不动现有磁盘/分区,而是作为新磁盘加入。 流程:虚拟层扩盘 → OS层执行rescan → 确认lsblk → PV/VG/LV操作 → xfs_growfs/resize2fs → df验证

  • 虚拟化层操作:在虚拟机管理平台(如VMware/vCenter)中加新磁盘。
  • OS层发现新设备:扫描SCSI总线 echo "- - -" > /sys/class/scsi_host/host0/scan 或重启(生产慎用)
  • 确认识别新容量:用 lsblk (list block)确认新容量已识别。
  • PV阶段pvcreate /dev/sdb
  • VG阶段vgextend vg_data /dev/sdb
  • LV阶段lvextend -l +100%FREE /dev/vg_data/lv_data
  • 文件系统层resize2fs(ext4)或 xfs_growfs(xfs)。
  • 确认扩容df -h 验证扩容完成
  • 注意:缩减(reduce)极其危险且需离线,生产禁用。

**传统扩容方法 / 给机器加一块磁盘,如何识别?**OS 层执行 rescan → 确认 lsblk → PV/VG/LV 操作 → mkfs → mount → df 验证 → fstab 永久挂载 → mount -a 验证。详细说明可参考 一文讲通 LVM 与传统扩容的异同

磁盘与I/O#

如何查看磁盘空间? df -h 查看分区使用;du -sh * 查看目录大小。

如何排查磁盘I/O瓶颈? iostat -x 1 查看I/O负载;iotop 查看进程I/O。

4. 网络#

如何查看网络连接和监听端口? netstat -tunlpss -tunlp(ss更快)。

netstat 常用参数 / -tunlp 分别代表什么

  • -a (—all): 显示所有的网络连接和监听端口。
  • -t (—tcp): 仅显示TCP连接。
  • -u (—udp): 仅显示UDP连接。
  • -n (—numeric): 显示IP地址和端口号,而不是尝试解析域名和服务名。
  • -l (—listen): 显示监听中的端口
  • -p (—programs): 显示哪个进程正在使用哪个套接字或网络端口。
  • -x (—unix): 仅显示Unix域套接字连接。
  • -r (—route): 显示路由表。
  • -i (—interfaces): 显示网络接口信息。
  • -s (—statistics): 显示网络协议的统计数据。

如何抓包/监听80端口数据?

tcpdump -i eth0 port 80 -w capture.pcap

  • -i:指定接口
  • -w:保存到文件

如何测试网络连通性? ping 测试连通性;telnet/nc 测试端口。

如何追踪数据包? tracert 追踪数据包经过的路由路径,一层层显示路径。

常见的TCP内核参数调优(sysctl)? net.ipv4.tcp_tw_reuse=1(允许复用TIME_WAIT)、net.ipv4.tcp_fin_timeout=30(缩短FIN超时)、net.core.somaxconn=65535(监听队列最大长度,Nginx配合backlog)。

如何配置IP?

Terminal window
# 持久化配置
# Ubuntu 系统,可以调整 /etc/network/interface
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
# 然后重启网络服务
sudo systemctl restart networking

如何配置DNS?

Terminal window
sudo sh -c 'echo "nameserver 8.8.8.8" >> /etc/resolv.conf'

如何查看IP/DNS?

  • IP 看 ip addr 的 eth0,DNS 看 cat /etc/resolv.conf 下的 nameserver
  • DNS 常规为8.8.8.8,阿里云ECS默认100.100.2.136或138

5. 系统管理与启动#

Linux系统从开机到登录的启动流程? 上电复位 → BIOS/UEFI自检 → 引导加载程序(GRUB,GNU GRand Unified Bootloader)→ 内核加载 → 挂载根文件系统 → init进程(Systemd)→ 运行级别(SysV)/目标(systemd) → 用户登录。

Load Average是什么?怎么看? 系统平均负载,表示单位时间内处于运行或不可中断状态的进程数。topuptime查看三个时间点(1/5/15分钟)。

如何排查服务器性能瓶颈? top看整体负载 → vmstat看CPU/内存/swap → iostat看磁盘I/O → netstat/iftop看网络。

什么是服务?服务和进程区别?

进程是操作系统资源调度的单位;服务是”被托管、可启停、可自愈、有生命周期管理”的长期运行进程,在后台持续运行、独立于用户会话,通常称为“守护进程”(Daemon)。

维度进程 Process服务 Service
定义正在运行的程序实例被 init/systemd/管理器托管的长期进程
管理方内核systemd / SysV / supervisor / k8s 等
生命周期手动起、手动死有 start/stop/restart/reload
开机自启不保证可 enabled
崩溃自愈不会可自动重启(Restart=always)
状态查询ps / pgrepsystemctl status / supervisorctl status
日志stdout / 文件journald / 统一日志
依赖管理After= / Requires=
典型例子bashvim、一个 python xx.pynginx.servicesshd.service

Systemd与Init的区别?

  • Systemd并行启动、按需启动、支持socket/DBus激活;
  • SysV init串行启动,依赖 /etc/init.d 目录下的脚本。

如何查看服务?

Systemd 服务:

Terminal window
systemctl --type=service
systemctl status xxx 看具体服务
systemctl start/restart/stop

SysV 服务:

Terminal window
service --status-all
service xxx status

6. 其他/操作系统#

进程/线程区别?

  • 内存分配
    • 进程:资源分配的基本单位,拥有独立的内存空间
    • 线程:CPU调度的基本单位,共享进程的资源
  • 切换开销
    • 进程:大,有独立代码和数据段
    • 线程:小,只维护独立的堆栈和程序计数器
  • 稳定性
    • 进程:隔离性更强,某个进程崩溃不会影响其他进程
    • 线程:弱,线程共享进程资源,崩溃可能导致整个进程异常
  • 安全性
    • 进程:有独立内存空间,安全性高
    • 线程:共享内存空间,存在数据竞争和线程安全问题,需要同步/互斥机制
  • 补充:MySQL 多线程,PostgreSQL/Oracle 多线程

并发/并行区别?

  • 并发(Concurrency)逻辑上的“同时”。单核CPU通过时间片轮转快速切换,看起来像是同时处理多个任务,本质是交替执行(强调结构,处理多件事)。
  • 并行(Parallelism)物理上的“同时”。多核CPU在同一时刻真正地执行多个任务(强调执行,同时做多件事)。

死锁的四个条件

条件含义对应到 Java 或数据库
互斥某个资源同一时刻只能被一个执行单元占用synchronized 锁对象、行级排他锁、独占文件锁
请求与保持(占有并等待)已经拿着一部分资源,同时继续等待其他资源线程持有 resource1 时继续申请 resource2
非抢占资源不能被外部强行拿走,只能由持有者释放Java 内置锁不能被另一个线程直接剥夺
循环等待等待关系形成闭环线程 1 等线程 2,线程 2 又等线程 1

用户态与内核态是什么?如何切换?

  • 用户态:用户态下的程序只能访问受限的内存,不能直接访问硬件设备。用户态程序的执行权限较低,不能执行特权指令。

  • 内核态:内核态下的程序可以访问所有的内存和硬件设备,具有最高的执行权限。内核态程序可以执行特权指令,如设置时钟、内存管理等。

用户态和内核态之间的切换是通过系统调用异常中断来实现的。

  • 系统调用:用户态程序通过系统调用请求操作系统提供的服务,从而切换到内核态。例如,内存分配函数*malloc()会调用sbrk()*系统调用,从而切换到内核态。
  • 异常:当CPU在执行用户态程序时发生异常(如缺页异常),会触发从用户态切换到内核态。
  • 中断:当外围设备完成用户请求的操作后,会向CPU发出中断信号,CPU会暂停当前用户态程序的执行,转而执行中断处理程序,从而切换到内核态。

听说过 CFS 吗? CFS(Completely Fair Scheduler,完全公平调度器)用于Linux系统中普通进程的调度。vruntime,红黑树结构,有利于交互式进程。听说过 CFS 吗?(Linux ) - 面试鸭 | 2026最新面试题+详细答案解析

ps 常用参数

  • -A:显示所有进程。
  • -e:与 -A 效果相同,显示所有进程。
  • -a:显示所有终端上的进程,包括其他用户的进程。
  • -x:显示没有控制终端的进程。
  • -u:以用户为主的格式显示进程信息。
  • -f:显示完整格式的进程信息,包括 UID、PPID 等。
  • -l:以长格式显示进程信息。
  • -o:自定义输出格式,例如 ps -o pid,cmd 仅显示进程 ID 和命令。
  • —sort:按指定字段排序,例如 —sort=-%cpu 按 CPU 使用率降序排列。
Linux 八股
https://blog-l7wd3.pages.dev/posts/interview/linux/
作者
L7WD3-Xiao
发布于
2026-08-02
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取