知识点 1:Inode --- 文件系统的「身份证」
一句话: Linux 中每个文件都有一个 inode(索引节点),存储文件的元数据(权限、大小、时间戳等),而文件名只是指向 inode 的链接。
bash
# 查看 inode 使用情况
df -i
# 查看文件的 inode 号
ls -i /etc/passwd
# 查看 inode 详细元数据
stat /etc/passwd
⚠️ 易错点:
磁盘空间没满,但无法创建新文件?很可能是 inode 耗尽了(小文件过多的场景常见,如海量日志、缓存目录)。
知识点 2:文件描述符(FD)与 ulimit
一句话: Linux 一切皆文件,进程通过**文件描述符(File Descriptor)**管理打开的资源(文件、socket、管道等),默认每个进程最多打开 1024 个。
bash
# 查看当前 shell 的文件描述符限制
ulimit -n
# 查看某个进程打开了哪些文件
lsof -p <PID>
# 查看系统级总限制
cat /proc/sys/fs/file-max
# 临时调大(仅当前 session)
ulimit -n 65535
⚠️ 易错点:
高并发服务(Nginx、Redis、MySQL)频繁报
Too many open files,直接调大ulimit -n只是治标,还要确认:
系统级
fs.file-max是否足够
/etc/security/limits.conf是否已持久化配置服务是否以 systemd 启动(需改
LimitNOFILE)
知识点 3:Systemd 服务管理
一句话: Systemd 是现代 Linux 的初始化系统,负责开机启动、服务管理和日志聚合,替代了传统的 SysV init。
bash
# 查看服务状态
systemctl status nginx
# 启动 / 停止 / 重启
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
# 开机自启(enable)≠ 立即启动(start)
systemctl enable nginx # 设置开机启动
systemctl start nginx # 立即启动
# 查看服务日志
journalctl -u nginx -f # 实时跟踪
journalctl -u nginx --since "1 hour ago"
⚠️ 易错点 :
systemctl enable只是创建符号链接到/etc/systemd/system/multi-user.target.wants/,不会立即启动服务。很多人配置完 enable 就直接访问服务,结果发现端口没通。
知识点 4:Load Average --- 负载 ≠ CPU 使用率
一句话: load average(1/5/15 分钟)表示系统中处于可运行状态和不可中断睡眠状态的进程平均数,高负载不一定是 CPU 高。
bash
# 查看负载
uptime
# 更详细的信息
cat /proc/loadavg
# 结合 CPU 和 I/O 一起看
top # 看 %wa(iowait)
iostat -x 1 # 看磁盘 I/O 等待
⚠️ 易错点:
CPU 密集型:load ≈ CPU 核心数 是合理的
I/O 密集型 :load 很高但 CPU 很低,说明大量进程卡在磁盘/网络 I/O(
D状态),此时瓶颈不在 CPU,而在 I/O 子系统判断标准:load / CPU核心数 > 1.5 持续一段时间,需要排查
知识点 5:进程状态(Process State)
一句话: Linux 进程有 5 个核心状态------R(运行)、S(睡眠)、D(不可中断睡眠)、Z(僵尸)、T(停止/跟踪)。
# 查看进程状态
ps -eo pid,stat,cmd
# 实时查看(含状态列)
top # 按 Shift+H 可看线程
# 统计各状态进程数
ps -e -o stat= | sort | uniq -c | sort -rn
⚠️ 易错点 :
大量
D状态进程 → 几乎一定是 I/O 子系统问题(磁盘坏、NAS 挂了)。D不可中断,kill -9 都杀不掉,只能等 I/O 恢复或重启。
知识点 6:内存管理与 OOM Killer
一句话: Linux 会"超额分配"内存(buff/cache 可被回收),当物理内存+swap 都耗尽时,内核会触发 OOM Killer 按 oom_score 杀进程。
# 查看内存整体使用
free -h
# 查看 OOM 日志
dmesg | grep -i "out of memory"
journalctl -k | grep -i "killed process"
# 调整某个进程的 OOM 倾向(值越大越容易被杀)
echo -100 > /proc/<PID>/oom_score_adj
⚠️ 易错点 :
容器化场景(K8s)必须设置
resources.limits.memory,否则 OOM 时内核会随机挑节点上"最胖"的进程杀掉,可能误杀核心组件。
知识点 7:CPU 上下文切换(Context Switch)
一句话: 进程/线程切换时,CPU 要保存/恢复寄存器和栈,称为上下文切换。cs(context switch)过高往往是性能瓶颈信号。
# 查看系统级上下文切换
vmstat 1
# 关键列:
# cs - 每秒上下文切换次数
# in - 中断次数
# us/sy/wa/id - CPU 各状态占比
# 查看进程级
pidstat -w -p <PID> 1
⚠️ 易错点 :
cs > 100000通常说明有锁竞争或线程过多。盲目加 CPU 核心数没用,要先看sy(系统态)占比是否也高------可能是内核态瓶颈。
知识点 8:僵尸进程(Zombie Process)
一句话: 进程已结束但父进程没回收它的 PCB(进程描述符),变成僵尸(Z 状态)。少量无害,大量堆积会耗尽 PID。
# 找出僵尸进程
ps -eo pid,ppid,stat,cmd | awk '$3=="Z" {print}'
# 找到它的父进程
ps -o ppid= -p <僵尸PID>
# 杀父进程让 init 收养并回收
kill -9 <父PID>
⚠️ 易错点 :
杀僵尸进程本身无效 (它已经死了),必须杀父进程让
init(PID 1)收养并wait()回收。如果父进程是常驻服务,需要修复父进程的代码 (调用waitpid)。
知识点 9:日志管理(rsyslog + logrotate)
一句话: rsyslog 负责写日志到指定位置,logrotate 负责日志切割、压缩、清理,两者配合保证磁盘不被日志撑爆。
# 查看 rsyslog 配置
cat /etc/rsyslog.conf
cat /etc/rsyslog.d/*.conf
# 手动触发日志切割
logrotate -f /etc/logrotate.d/nginx
# 典型 logrotate 配置示例(/etc/logrotate.d/myapp)
/var/log/myapp/*.log {
daily # 每天切割
rotate 7 # 保留 7 份
compress # gzip 压缩
delaycompress # 上一份才压缩
missingok # 文件不存在不报错
notifempty # 空文件不切割
create 0644 root root
postrotate # 切割后执行的脚本
systemctl reload myapp
endscript
}
⚠️ 易错点 / 面试考点:
生产事故重灾区: 没配 logrotate,磁盘 100% 后 MySQL/InnoDB 起不来、SSH 登录失败、很多服务写入失败。第一反应永远是
df -h。
知识点 10:Crontab 定时任务
一句话: cron 是 Linux 内置的定时任务调度器,按"分 时 日 月 周"5 个时间字段循环执行。
# 编辑当前用户的 crontab
crontab -e
# 列出当前用户的 crontab
crontab -l
# 经典时间字段示例
# ┌────────── 分钟 (0 - 59)
# │ ┌──────── 小时 (0 - 23)
# │ │ ┌────── 日 (1 - 31)
# │ │ │ ┌──── 月 (1 - 12)
# │ │ │ │ ┌── 周 (0 - 6, 0=周日)
# │ │ │ │ │
# * * * * * 命令
# 每天凌晨 3 点备份
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# 每 5 分钟执行一次
*/5 * * * * /usr/local/bin/check.sh
# 每周一到周五 9 点
0 9 * * 1-5 /usr/local/bin/work.sh
⚠️ 易错点:
- 环境变量问题: cron 的环境变量极少,
PATH经常找不到命令。必须用绝对路径 或在脚本头部export PATH。- 时间字段陷阱:
*/10在分钟字段是 0,10,20...30,40,50,不包含第 0 分(巧合重叠了)。- 输出黑洞: 没加
>> log 2>&1,出错了根本看不到。
知识点 11:用户与权限管理
一句话: Linux 权限基于"属主(u) + 属组(g) + 其他(o)"三维,每维 r/w/x 三种权限。特殊位 SUID/SGID/Sticky Bit 改变默认行为。
# 修改权限(符号法 / 数字法)
chmod u+x file.sh # 属主加执行权
chmod 755 file.sh # rwxr-xr-x
# 修改属主/属组
chown user:group file.txt
chown -R www:www /var/www/
# SUID(属主执行位变 s,进程以文件属主身份运行)
chmod u+s /usr/bin/passwd
# Sticky Bit(粘滞位,目录内文件只有属主能删)
chmod +t /tmp
# ACL 细粒度权限
setfacl -m u:zhangsan:rwx /project
getfacl /project
⚠️ 易错点:
chmod 777是新手最爱的危险操作------任何用户都能改/删。生产环境文件目录最多到 755/644,需要写权限才给 775。
知识点 12:SSH 安全加固
一句话: SSH 是远程管理入口,默认配置极度不安全(密码登录、22 端口、root 直接登录),必须加固。
# /etc/ssh/sshd_config 关键加固项
Port 2222 # 改端口
PermitRootLogin no # 禁止 root 登录
PasswordAuthentication no # 禁用密码,仅密钥
PubkeyAuthentication yes
AllowUsers ops zhangsan # 白名单用户
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
# 生成密钥对(在客户端)
ssh-keygen -t ed25519 -C "ops@company"
# 推送公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
# 重启 SSH 服务
systemctl restart sshd
⚠️ 易错点:
改完配置千万别直接 reload ------先开两个 SSH 连接保活,配置错就回不来了。推荐用
sshd -t测试配置语法。
知识点 13:网络路由表
一句话: 路由表决定数据包从哪个网卡、经过哪个网关发出去。0.0.0.0/0(默认路由)是"不知道往哪发就走这条"。
# 查看路由表(旧命令,兼容性好)
route -n
# 新命令(推荐)
ip route show
# 添加默认路由
ip route add default via 192.168.1.1 dev eth0
# 添加静态路由
ip route add 10.0.0.0/8 via 192.168.1.254 dev eth0
# 跟踪路径
mtr 8.8.8.8
# 抓包看真实流量
tcpdump -i eth0 -nn port 80
⚠️ 易错点 :
多网卡环境(特别是云上辅助网卡)出现"能 ping 通但服务不通"------大概率是路由表不对称 :回来的包走了别的网卡。
ip route get <目标IP>一查就明白。
知识点 14:包管理器速查
一句话: 不同 Linux 发行版用不同包管理器,命令差异大但思路一致------查、装、卸、查文件归属。
| 操作 | Debian/Ubuntu (apt) | RHEL/CentOS (yum/dnf) |
|---|---|---|
| 更新源 | apt update |
dnf check-update |
| 安装 | apt install nginx |
dnf install nginx |
| 卸载 | apt remove nginx |
dnf remove nginx |
| 搜索 | apt search nginx |
dnf search nginx |
| 查已装 | `dpkg -l | grep nginx` |
| 查文件归属 | dpkg -S /usr/bin/nginx |
rpm -qf /usr/bin/nginx |
⚠️ 易错点:
装完软件找不到可执行文件 ?用
which或find / -name <name>。生产环境优先用发行版自带源(稳定性+安全更新),慎用第三方源。