Linux 的核心在于其设计哲学与抽象机制,这些决定了它与其它操作系统的根本差异。理解这些概念,能让后续学习命令、配置系统、调试问题时形成系统性思维,而不是零散记忆。
Linux 的本质:内核 vs 完整系统
Linux 严格来说指Linux 内核(由 Linus Torvalds 主导开发),它负责:
- 进程调度(scheduler,包括 CFS、EEVDF 等现代调度器)
- 内存管理(包括页面缓存、swap、huge pages、内存 cgroup)
- 设备驱动框架(统一设备模型)
- 虚拟文件系统(VFS)层
- 网络协议栈(TCP/IP、eBPF 扩展)
- 安全机制(capabilities、seccomp、namespaces、cgroups)
而日常使用的“Linux 系统”是内核 + 用户空间工具 + 包管理 + 初始化系统 + 配置的组合。这就是不同发行版(distributions)的差异来源。
发行版主要区别在于:
- 内核补丁与版本选择(有些发行版长期支持 LTS 内核,如 Ubuntu 24.04 用 6.8+,而 rolling release 如 Arch 跟随最新 6.12+ 或即将的 7.0)
- 默认初始化系统(几乎全 systemd,但 Alpine 用 OpenRC,Devuan 坚持 sysvinit)
- 包格式与管理器(deb vs rpm vs pkg.tar.zst)
- 软件源策略(稳定 vs testing vs rolling)
- 默认文件系统(ext4、Btrfs、XFS)和默认配置(如 SELinux/AppArmor 启用状态)
内核本身在所有主流发行版中高度一致,差异主要来自 config(编译选项)和少量发行版特定补丁。
核心哲学:一切皆文件(Everything is a file)
这是 Unix/Linux 最深刻的抽象原则:几乎所有资源通过文件接口暴露,即通过文件描述符(file descriptor)进行统一操作:open/read/write/close/seek/ioctl。
这包括:
- 常规文件
- 目录(本质是包含 dentry 的特殊文件)
- 块设备(如 /dev/sda)
- 字符设备(如 /dev/null、/dev/random、/dev/tty)
- 管道(pipe)、FIFO
- Unix domain socket
- /proc 中的进程信息(/proc/<pid>/fd/、/proc/<pid>/maps)
- /sys 中的 sysfs(设备树、内核参数)
- cgroupfs、tracefs、debugfs 等伪文件系统
这种统一带来的优势:
- 同一套工具(cat、echo、dd、grep)可操作设备、进程信息、内核参数
- 程序无需关心底层是磁盘、网络还是键盘,只需处理字节流
- 通过 VFS 层,内核统一管理权限、缓存、锁定
示例场景:
- 查看内核环形缓冲:dmesg | tail 或直接 cat /dev/kmsg
- 调整 swappiness:echo 10 > /proc/sys/vm/swappiness
- 监控网络:cat /proc/net/dev
- 设备热插拔事件:udev 通过 netlink 与 sysfs 交互
更精确的表述是“一切皆文件描述符”或“一切可表示为字节流”,因为 socket、pipe 等并非传统磁盘文件,但统一用 fd 操作。
文件系统层级结构(FHS)
Linux 遵循 Filesystem Hierarchy Standard,尽管部分现代系统有所调整(如 /usr 合并趋势)。
关键目录与用途:
- / — 根,一切起点
- /boot — 引导加载器、内核镜像、initramfs
- /etc — 主机特定配置(最常修改)
- /usr — 只读、共享数据(/usr/bin、/usr/lib、/usr/share)
- 现代趋势:/bin、/sbin、/lib → /usr 下符号链接(merged-/usr)
- /var — 运行时可变数据(/var/log、/var/cache、/var/lib/docker)
- /run — tmpfs,运行时临时数据(取代旧 /var/run)
- /home — 用户数据
- /root — root 用户家目录
- /tmp — 临时文件(很多发行版用 tmpfs,重启清空)
- /dev — 设备节点(由 udev 动态创建)
- /proc — 进程与内核信息(procfs,内存文件系统)
- /sys — 设备、驱动、电源信息(sysfs)
- /mnt、/media — 临时挂载点
/proc 和 /sys 是虚拟文件系统(ramfs/tmpfs 变种),内容由内核实时生成。
Shell 与命令行解析
Shell(bash/zsh/fish)是用户与内核的交互层,主要职责:
- 读取输入
- 词法分析与展开(glob、变量、算术、命令替换、引号去除)
- 构建命令行(管道、重定向、后台)
- fork + execve 执行
关键机制:
- 环境变量(export PATH=$PATH:/opt/bin)
- 内置 vs 外部命令(type -a ls)
- 管道(|)与重定向(> >> 2> < <<)
- 信号处理(trap、kill -l)
- 作业控制(jobs、fg、bg、nohup)
现代 Shell 增强(如 zsh 的补全、fish 的语法高亮)极大提升效率。
权限模型:用户、组、capabilities
Linux 是多用户系统,文件权限基于三元组:owner / group / others。
权限位:
- r (4) — read
- w (2) — write
- x (1) — execute / directory traverse
特殊位:
- setuid (4xxx) — 执行时以文件拥有者权限运行
- setgid (2xxx) — 执行时以文件所属组权限;目录下新建文件继承组
- sticky (1xxx) — 目录下只有文件拥有者可删除(/tmp 常用)
现代补充机制:
- capabilities(取代部分 setuid root 程序):如 cap_net_admin、cap_sys_ptrace
- namespaces(pid/net/mount/user/time) — 容器基础
- cgroups v2 — 资源控制
- seccomp — 系统调用过滤
查看:getfacl、lsattr、capsh --print
进程与服务管理(systemd 时代)
几乎所有主流发行版使用 systemd 作为 PID 1。
systemd 单元类型:
- .service — 守护进程
- .socket — 套接字激活
- .target — 同步点(如 multi-user.target)
- .timer — 定时任务
- .mount、.automount
- .path、.slice 等
核心命令:
- systemctl list-units --type=service
- systemctl status|start|stop|restart|enable|disable
- systemctl edit --full nginx.service(覆盖或 drop-in)
- journalctl -u nginx -f(结构化日志)
systemd 还管理:
- 登录会话(logind)
- 网络(networkd 或与 NetworkManager 共存)
- 设备(udev)
- 资源限制(systemd-cgtop)
包管理与软件分发
主流包管理器对比:
- Debian/Ubuntu:apt / apt-get / nala(前端)
- Fedora / RHEL 系:dnf(yum 已弃用)
- Arch:pacman + AUR(yay/paru)
- openSUSE:zypper
容器时代补充:podman / docker / containerd + OCI 镜像,绕过传统包管理。
总结:建立正确的思维模型
- 把问题转化为“文件操作”或“进程控制”
- 优先用管道与小工具组合,而不是单一复杂命令
- 理解分层:硬件 → 内核 → VFS → 用户空间工具 → Shell
- 区分“内核行为”(一致)与“发行版策略”(差异)
掌握这些后,面对新发行版、新内核版本、新工具时,能快速定位差异点,而不是从零开始。
继续深入可关注:
- eBPF 与现代可观测性
- cgroup v2 + systemd 资源管理
- 内核模块与驱动开发基础
- 安全加固(Landlock、seccomp、AppArmor)
这些概念构成了 Linux 的骨架,理解它们远比记住 100 条命令更有价值。