Skip to content

技术概论 ​

在动手敲第一条命令之前,先建立一张"操作系统到底在管什么"的地图:进程怎么被调度、内存怎么被分配、磁盘上的文件如何被组织成路径——这些问题的答案决定了你后续遇到"进程起不来"、"内存不够用"、"权限被拒"时,能否沿着正确的层次去排查,而不是在终端前反复试错。Linux 的答案可以压缩成三条设计哲学:一切皆文件(设备、进程、网络状态都映射为路径)、小工具组合(每个命令只做一件事,用管道串成流水线)、纯文本配置(配置即可读、可 diff、可脚本化)。本章从操作系统原理讲到 Linux 内核与 Shell,为后面所有章节搭建知识框架。

本页以 Debian/Ubuntu、Arch、RHEL/CentOS/Rocky 三大发行版家族为主线对照讲解;原理层三系完全一致,差异集中在默认 Shell、包管理与内核版本上,详见下方对比与实战命令。内容参考自鸟哥的私房菜、Arch Wiki 与内核文档,见文末参考资料。

学习目标 ​

  • 理解操作系统的核心职责和工作原理
  • 掌握 Linux 的设计哲学
  • 了解内核架构和版本命名规则
  • 区分 Shell、内核、文件系统的关系

1. 操作系统基础 ​

1.1 什么是操作系统 ​

操作系统(Operating System, OS)是管理计算机硬件与软件资源的系统软件,为上层应用程序提供统一的抽象接口。

text
┌───────────────────────────────────┐
│            应用程序                │  用户态
├───────────────────────────────────┤
│            系统调用                │  内核态
├──────────┬──────────┬─────────────┤
│ 进程管理  │ 内存管理  │  文件系统    │
├──────────┼──────────┼─────────────┤
│ 设备驱动  │ 网络协议  │  安全控制    │
├──────────┴──────────┴─────────────┤
│            硬件                    │
└───────────────────────────────────┘

核心职责:

职责说明示例
进程管理创建、调度、终止进程ps、top
内存管理分配、回收虚拟内存free、vmstat
文件系统组织和管理磁盘数据df、mount
设备管理控制硬件设备/dev、lsmod
网络协议实现网络通信ip、ss
安全控制用户权限和访问控制chmod、SELinux

1.2 内核态与用户态 ​

CPU 运行在两个特权级别上:

模式权限用途
内核态(Ring 0)完全访问硬件内核代码、驱动程序
用户态(Ring 3)受限访问应用程序

应用程序需要访问硬件时,必须通过系统调用(System Call)陷入内核态。strace 是观察这条边界的显微镜:

bash
$ strace ls /tmp 2>&1 | head -5      # 逐条打印 ls 触发的系统调用
$ strace -c ls /tmp 2>&1             # 汇总各类系统调用的次数与耗时

1.3 中断机制 ​

中断是 CPU 响应外部事件的机制,按来源分两类:硬件中断(网卡收到数据、磁盘完成读写)与软件中断(系统调用、异常处理)。两者在 /proc 下都有实时计数:

bash
$ cat /proc/interrupts      # 硬中断计数(按 CPU 分列)
$ cat /proc/softirqs        # 软中断计数(网络收发等下半部工作)

2. Linux 设计哲学 ​

2.1 一切皆文件 ​

Linux 将几乎所有资源抽象为文件,通过统一的文件接口操作:

资源类型文件路径说明
普通文件/home/user/file.txt存储数据
目录/home/user/容器
设备/dev/sda、/dev/tty硬件设备
进程/proc/1/进程信息
网络/proc/net/网络状态
管道|进程间通信
套接字/var/run/docker.sock网络通信
bash
$ ls -la /dev/sda          # 块设备:与普通文件一样的 ls 输出
$ ls -la /proc/1/cmdline   # 进程 1 的命令行,读文件即读进程
$ ls -la /proc/net/tcp     # 已建立的 TCP 连接状态

2.2 小工具组合 ​

每个命令只做一件事,通过管道组合完成复杂任务——这是"可组合性"换来的力量:

bash
$ who | wc -l                                  # 统计当前登录用户数
$ du -sh /* 2>/dev/null | sort -hr | head -5   # 占用磁盘最多的前 5 个目录

更长的流水线同样只是把单词接起来,例如查登录失败排行:lastb | awk '{print $1}' | sort | uniq -c | sort -rn | head -10,语义是"取出失败记录的用户名 → 去重计数 → 按次数倒序"。

2.3 纯文本配置 ​

配置文件采用纯文本格式,便于版本控制和自动化管理;改坏了可以用 diff 回看,也可以一行 sed 批量改:

配置文件用途典型操作
/etc/netplan/01-netcfg.yamlUbuntu 网络(YAML)sudo netplan apply 生效
/etc/ssh/sshd_configSSH 服务端grep -v '^#' 后改字段,sshd -t 校验
/etc/passwd用户与家目录清单head -5 /etc/passwd 查看

3. Linux 内核 ​

3.1 内核架构 ​

text
┌──────────────────────────────────────┐
│              用户空间                 │
│    应用1     应用2      应用3         │
├─────────── 系统调用接口 ──────────────┤
│              内核空间                 │
│ 进程调度 │ 内存管理 │ 虚拟文件系统VFS │
│   网络协议栈   │   设备驱动框架       │
└──────────────────────────────────────┘

用户空间的三个应用各自持有独立地址空间,互相访问必须绕道内核;它们与内核之间的唯一合法通道就是那条"系统调用接口"横线,这正是 1.2 节 strace 能逐条列出的东西。

3.2 内核子系统 ​

子系统职责相关文件
进程调度进程创建、调度、通信/proc/sched*
内存管理虚拟内存、页面交换/proc/meminfo
文件系统VFS 抽象层、具体实现/proc/filesystems
网络协议TCP/IP 协议栈/proc/net/
设备驱动硬件抽象/proc/modules

3.3 内核模块 ​

内核模块是可动态加载的内核代码,不必为一个文件系统或一块网卡重编整核:

bash
$ lsmod                  # 查看已加载模块(可读 /proc/modules)
$ modinfo ext4           # 查看模块信息:作者、参数、依赖
$ sudo modprobe vfat     # 加载模块(自动带上依赖)
$ sudo modprobe -r vfat  # 卸载模块(正被占用会失败)

3.4 内核版本命名 ​

命名规则是 主版本.次版本.修订版本[-稳定标记]:Ubuntu 24.04 默认内核是 6.8.0-generic,RHEL/Rocky 9 则是 5.14.0-362.el9——多出的 -362.el9 是发行版自己打的补丁与构建后缀,也是区分"社区内核"与"厂商内核"最快的一眼。

bash
$ uname -r           # 只看内核版本
6.8.0-generic
$ uname -a           # 完整串:主机名、版本、架构、编译信息
Linux dev 6.8.0-generic #31-Ubuntu SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
$ cat /proc/version  # 内核编译来源(编译机、gcc 版本)
Linux version 6.8.0-31-generic (buildd@lcy02) ... x86_64 GNU/Linux

4. Shell ​

4.1 什么是 Shell ​

Shell 是用户与内核之间的命令解释器,负责:

  • 解析用户输入的命令
  • 查找并执行对应程序
  • 处理输入输出重定向
  • 管理环境变量

4.2 常见 Shell 对比 ​

Shell默认发行版特点配置文件
Bash大多数发行版兼容性好,功能丰富~/.bashrc
ZshmacOS、Kali自动补全、主题丰富~/.zshrc
Fish—语法高亮、自动建议~/.config/fish/
DashDebian/Ubuntu /bin/sh轻量快速—
bash
$ echo $SHELL          # 当前登录使用的 Shell
$ cat /etc/shells      # 系统允许切换的 Shell 列表
$ chsh -s /bin/zsh     # 切换默认 Shell(下次登录生效)

4.3 登录 Shell 与非登录 Shell ​

类型触发方式配置文件加载顺序
登录 Shell终端登录、ssh/etc/profile → ~/.bash_profile
非登录 Shell图形终端、bash~/.bashrc
交互式 Shell手动输入命令加载提示符和历史
非交互式 Shell脚本执行仅加载必要环境

判断当前会话属于哪一类:Bash 里跑 shopt login_shell(输出 on 即登录 Shell),或用 [[ -o login ]] && echo "登录 Shell" 做条件判断——排查"我明明改了 .bashrc 为什么没生效"时,第一步就是它。

5. Linux 与 Unix/Windows 对比 ​

特性LinuxUnixWindows
源代码开源(GPL)闭源(多数)闭源
内核Linux 内核各厂商内核NT 内核
文件系统ext4/XFS/BtrfsUFS/ZFSNTFS
包管理APT/DNF各厂商工具MSI/EXE
ShellBash/ZshBourne/KornCMD/PowerShell
权限模型DAC + MAC(SELinux)DACACL
配置方式纯文本文件纯文本文件注册表
适用场景服务器/嵌入式/桌面企业服务器桌面/企业
典型成本免费商业授权商业授权

5.1 三大发行版家族差异 ​

同为 Linux,三系在"用什么工具"上的差异远大于内核本身,后面每章的命令对照都以这张表为锚点:

场景Debian/UbuntuArchRHEL/CentOS/Rocky
包管理apt / dpkgpacmandnf / rpm
第三方扩展PPAAUR(yay/paru)EPEL、RPM Fusion
更新方式固定版本 + 点升级滚动更新固定版本 + 小版本升级
典型内核命名6.8.0-generic6.x.x-arch1-15.14.0-362.el9
/bin/sh 实现dashbashbash
默认强制访问控制AppArmor无默认配置SELinux(enforcing)

6. 实战:查看系统信息 ​

下面这些命令覆盖"接手一台陌生机器先看什么"的全部问题,按类别记即可,输出都很短、适合直接读:

类别命令看什么
内核uname -r / uname -a版本、架构、主机名、编译信息
发行版cat /etc/os-releaseID=、VERSION_ID=(三系通用)
发行版lsb_release -aDebian/Ubuntu 专用,未必预装
主机hostnamectl主机名、启动时间、虚拟化类型
CPUlscpu核数、线程、虚拟化标志
内存free -h总量、可用、缓存(原始值看 /proc/meminfo)
块设备lsblk磁盘、分区、挂载点
硬件清单lspci / lsusbPCI 设备 / USB 设备

先跑 uname -a && cat /etc/os-release | head -3 就能同时拿到内核与发行版两个最关键的答案;其余按需再查,不必每次全量输出。

参考资料 ​

相关页面 ​

基于 Apache License 2.0 许可发布