Linux 系统基础

知识点 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

⚠️ 易错点:

装完软件找不到可执行文件 ?用 whichfind / -name <name>。生产环境优先用发行版自带源(稳定性+安全更新),慎用第三方源。


相关推荐
笨笨饿1 小时前
#138_解决Codex要五次回复的问题
linux·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
fb_123451 小时前
Docker入门-第3章-容器镜像深度解析
运维·docker·容器
吴声子夜歌1 小时前
Shell编程——数组
linux·运维·shell
2401_891957312 小时前
简单了解多路转接select
运维·服务器
2302_1112 小时前
java依赖小结
java·运维·数据库
blueSatchel2 小时前
ros-humble仿真-建图-导航
linux·ros2
Lucis__2 小时前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc
程序员-Benothing2 小时前
Shell 脚本条件判断与流程控制:if for while case 详解
linux·运维·服务器
captain3762 小时前
网络原理(3)-TCP核心机制连接管理▲▲▲
java·服务器·网络·ide·网络协议·tcp/ip·java-ee