Linux 系统架构详解

Linux 是 Linus Torvalds 于 1991 年发起的开源操作系统内核,遵循 GPLv2 协议。经过三十余年发展,已成为服务器、嵌入式、移动(Android 基于 Linux 内核)和超级计算领域的主流内核。本文从行为图与结构图两个维度梳理 Linux 系统的核心架构。

Linux 内核当前版本:7.2.0-rc4(截至 2026 年 7 月)。内核源码位于 git.kernel.org,主仓库由 Linus Torvalds 维护。
文档约定:本文中"Linux 系统"指以 Linux 内核为核心、配合 GNU 工具链和用户空间程序的完整操作系统(即 GNU/Linux)。"Linux 内核"专指 kernel 本身。

1. 概述

Linux 系统采用宏内核架构:整个内核运行在单一地址空间,内核直接管理 CPU、内存、设备、文件系统和网络。与微内核不同,Linux 通过内核模块(LKM)实现动态扩展能力。

核心职责

  • 进程管理:创建/销毁进程、调度、同步
  • 内存管理:虚拟内存、分页、内存映射
  • 文件系统:VFS 抽象层、支持 ext4/XFS/Btrfs 等
  • 网络栈:TCP/IP 协议栈、socket 接口
  • 设备驱动:字符/块/网络设备抽象

关键特性

  • 多任务抢占式调度(CFS / EEVDF)
  • SMP 多核支持(对称多处理)
  • 虚拟内存与写时复制(COW)
  • 内核模块热加载(LKM)
  • cgroup/namespace(容器基础)
  • eBPF(内核可编程扩展)
关于系统调用路径:传统 C 程序通过 glibc/musl 封装发起系统调用,但这不是唯一路径。Go、Rust 等语言的运行时可直接执行 syscall 指令陷入内核,完全绕开 libc。本文图中的 "glibc 封装" 仅为最常见路径的示意。

2. 行为图(系统"做什么")

行为图描述 Linux 系统在运行时的动态行为和交互流程。

2.1 用例图 — 用户视角

从三类典型用户角色看 Linux 系统提供的功能:系统管理员、开发者、普通用户。

Linux Use Case Diagram
图 2.1:Linux 系统用例图

2.2 活动图 — 系统启动流程

从按下电源键到登录提示符的完整启动链,涉及固件、引导程序、内核初始化与 init 进程。

Linux Boot Process Activity Diagram
图 2.2:Linux 系统启动流程活动图

2.3 活动图 — 系统调用流程

用户态程序通过系统调用陷入内核,内核验证参数、执行操作后返回结果。以 open() → read() → close() 为例。

System Call Flow Activity Diagram
图 2.3:系统调用执行流程活动图

2.4 序列图 — read() 系统调用全过程

以 read(fd, buf, count) 为例,展示从用户态到内核态、经 VFS → 文件系统 → 块层 → 磁盘驱动的完整调用链。

read() System Call Sequence Diagram
图 2.4:read() 系统调用序列图

2.5 状态机图 — 进程生命周期

Linux 中进程在创建、运行、等待、终止之间切换,由调度器、信号和系统调用驱动。

Process States State Machine
图 2.5:Linux 进程状态机图

2.6 序列图 — PTY/TTY 数据流(SSH 终端为例)

PTY(Pseudo Terminal)是 Linux 终端体系的核心抽象。在 SSH 会话、图形终端模拟器、tmux/screen 等场景中,数据通过PTY 主从对(master/slave pair)在用户进程与终端程序之间双向传输。以下以 SSH 远程登录后键入 ls 为例,展示字符的完整流向——尤其关注echo 回显和线路规程缓冲机制。

PTY/TTY Sequence Diagram
图 2.6:PTY/TTY 终端数据流序列图(SSH 远程会话)

3. 结构图(系统"由什么组成")

结构图描述 Linux 系统的静态组成,从内核子系统、源码组织、核心数据结构到部署层次。

3.1 组件图 — 内核子系统架构

Linux 内核的五大核心子系统及其相互关系:进程调度器、内存管理、VFS 文件系统、网络栈、设备驱动。

Linux Kernel Subsystems Component Diagram
图 3.1:Linux 内核子系统组件图

3.2 包图 — 内核源码目录结构

Linux 内核源码树 (v7.x) 的顶层目录组织,展示各子系统的代码分布。

Linux Kernel Source Tree Package Diagram
图 3.2:Linux 内核源码树包图

3.3 类图 — 核心内核数据结构

Linux 内核中以 C 结构体实现的核心数据抽象:进程描述符、文件对象、inode、网络 socket 等。

Linux Kernel Core Data Structures
图 3.3:Linux 内核核心数据结构类图

3.4 部署图 — Linux 系统分层架构

从硬件到用户的纵向分层关系,展示用户空间与内核空间的边界及各层之间的通信方式。

Linux System Layer Deployment Diagram
图 3.4:Linux 系统分层部署图

3.5 组件图 — TTY/PTY 终端子系统

TTY(Teletypewriter)子系统是 Linux 最古老的子系统之一,负责管理所有"终端"——无论是物理串口控制台、内核虚拟控制台(/dev/tty1),还是软件模拟的伪终端(PTY)。现代 Linux 的终端交互(SSH、docker exec -it、图形终端模拟器)几乎全部依赖 PTY。

TTY/PTY Subsystem Component Diagram
图 3.5:Linux TTY/PTY 终端子系统组件图
核心概念速览:

4. 使用手册

4.1 编译内核

# 获取源码
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux

# 配置(基于当前运行内核的配置)
make localmodconfig

# 编译
make -j$(nproc)

# 安装模块与内核
sudo make modules_install
sudo make install

# 更新 GRUB 并重启
sudo update-grub
sudo reboot

4.2 内核模块管理

lsmod               # 列出已加载模块
sudo modprobe <name> # 加载模块(自动处理依赖)
sudo rmmod <name>    # 卸载模块
modinfo <name>       # 查看模块信息

4.3 进程与调度

ps aux              # 查看所有进程
top                 # 实时进程监控
nice -n 10 <cmd>    # 以低优先级启动
renice -5 <pid>     # 调整运行中进程的优先级
taskset -c 0,1 <cmd># 绑定进程到指定 CPU

4.4 内存查看

free -h             # 查看内存使用概况
cat /proc/meminfo   # 详细内存统计
vmstat 1            # 每秒内存与 CPU 统计
slabtop             # 内核 slab 缓存分析

4.5 文件系统操作

mount /dev/sda1 /mnt           # 挂载分区
mkfs.ext4 /dev/sda1             # 格式化 ext4
df -h                           # 查看挂载点使用量
lsblk                           # 列出块设备
cat /proc/filesystems           # 查看内核支持的文件系统

4.6 网络调试

ip addr show                    # 查看网络接口
ss -tlnp                        # 查看监听端口
tcpdump -i eth0 port 80         # 抓包
iptables -L -n -v               # 查看防火墙规则
sysctl net.ipv4.ip_forward=1    # 开启 IP 转发

4.7 内核日志与调试

dmesg -w                        # 实时查看内核日志
journalctl -k                   # 查看内核启动日志
cat /proc/version               # 内核版本信息
cat /proc/cmdline               # 启动参数
strace <cmd>                    # 跟踪系统调用
perf top                        # 性能分析

4.8 容器的内核基础

# namespace 操作
unshare --mount --uts --ipc --net --pid --fork /bin/bash

# cgroup v2 操作
ls /sys/fs/cgroup/
cat /sys/fs/cgroup/cgroup.controllers

4.9 TTY/PTY 终端相关

tty                        # 查看当前控制终端设备名
stty -a                    # 查看/设置终端属性(echo/icanon/行数等)
stty raw                   # 切换为原始模式(禁用行缓冲和 echo)
stty sane                  # 恢复终端为正常设置
resize                     # 告知终端当前窗口大小
script session.log         # 录制终端会话到文件
screen -S <name>           # 创建命名的 screen 会话
screen -ls                 # 列出所有 screen 会话
screen -r <name>           # 重新连接 screen 会话
tmux new -s <name>         # 创建命名的 tmux 会话
tmux ls                    # 列出所有 tmux 会话
tmux attach -t <name>      # 重新连接 tmux 会话

# 查看进程的控制终端
ps -eo pid,tty,cmd | grep pts

# 向指定终端发送消息
write <user> /dev/pts/N
echo "hello" > /dev/pts/N

# 查看谁登录了哪些终端
who
w