第 01 天:Linux 是什么?内核、发行版及其生态系统
第 01 天:Linux 是什么?内核、发行版及其生态系统
推荐超级课程:
- AWS云服务快速入门实战
- 本地离线DeepSeek AI方案部署实战教程【完全版】
- Docker快速入门到精通
- Kubernetes入门到大师通关课
目录
- 第 01 天:Linux 是什么?内核、发行版及其生态系统
- 为什么要学习 Linux?
- 为什么 Linux 对您(DevOps/SRE/云工程师)很重要
- 什么是 Linux?
- Linux 简史
- Linux 的核心组件
- (a) 硬件层
- (b) 内核(Linux 操作系统的核心)
- (c) Shell(命令行界面 - CLI)
- 运行命令时发生了什么?(示例:`ls`)
- (d) 用户应用程序和系统实用程序
- Linux vs. Windows特点比较
- Linux 发行版(Distros)
- 流行 Linux 发行版(按类别)
- Linux 生态系统
- 生态系统中的软件包管理
- 软件包管理器如何工作?
- 软件包管理器如何从仓库获取软件
- 为什么安装 Ubuntu 后要运行 `apt update`?
- Linux 中流行的软件包管理器
- 基本的软件包管理器命令
- APT (Debian, Ubuntu)
- DNF (Fedora, RHEL, CentOS)
- Pacman (Arch Linux)
- Zypper (OpenSUSE)
- 使用软件包管理器的最佳实践
- Linux 系统的可视化工具
- 开源理念
- 关于 DevOps/SRE/云工程师的 Linux 常见误区
- 动手实践和实验
- 实验准备
- 第 1 部分:实验 - 启动两个不同的 Linux 实例
- 第 2 部分:连接、探索和识别
- 第 3 部分:实验和回顾问题
- 第 4 部分:编写并运行一个简单的脚本
- 第 5 部分:DevOps/SRE/云工程师挑战
- 问题答案
- 关键术语词汇表
- 面试准备问题
为什么要学习 Linux?
Linux 是现代技术的支柱。您每天其实都在与它互动,只是通常你没有意识到而已。从为科学研究提供动力的超级计算机,到运行互联网的服务器,再到家中的智能设备,Linux 无处不在。它是开发人员、系统管理员和网络安全专业人员的首选操作系统。了解 Linux 是任何从事技术职业的人都必备的技能。
为什么 Linux 对您(DevOps/SRE/云工程师)很重要
Linux 是现代基础设施的基础,使其成为 DevOps、站点可靠性工程师 (SRE) 和云工程师不可或缺的工具系统:
-
DevOps: Linux 为 CI/CD 流水线(例如 Jenkins、GitLab)和容器平台(例如 Docker、Kubernetes)提供支持。如Bash 脚本可以自动化部署工作流程。
-
SRE: Linux 的稳定性和可配置性确保了可靠、可扩展的系统。SREs 使用 Linux 应用系统进行监控(例如 Prometheus)、日志记录和高可用性设置等。
-
云工程师: 主要云平台(AWS、GCP、Azure)都运行在 Linux 实例上。精通 Linux 是管理虚拟机、优化成本和配置云服务的关键。
-
自动化和可扩展性: Linux 的命令行工具和脚本编写能力实现了自动化,而其轻量级的特性支持在数千台服务器上进行扩展。
-
行业主导地位: 超过 96% 的前 100 万个 Web 服务器和 100% 的前 500 台超级计算机运行的是 Linux操作系统(数据截至 2025 年)。
-
个人职业生涯需求: 大多数云原生工具(例如 Kubernetes、Terraform)都是 Linux 原生开发的,几乎所有雇主都期望对于 DevOps/SRE/云岗位上的人员是需要他们精通 Linux技术的。
什么是 Linux?
-
Linux 是一个由 Linus Torvalds 于 1991 年创建的免费、开源、类 Unix 的操作系统内核。
-
它构成了许多被称为“Linux 发行版”(distros)的操作系统的核心。
-
Linux 用于服务器、桌面、嵌入式系统、超级计算机、物联网 (IoT) 设备和移动设备(Android)。
Linux 简史
-
1983 年: Richard Stallman 启动 GNU 项目,旨在创建一个免费、类 Unix 的操作系统。
-
1991 年: Linus Torvalds 发布了第一个 Linux 内核(版本 0.01),作为个人项目。
-
1993 年: 最古老的 Linux 发行版之一 Debian 成立。
-
1994 年: Linux 内核 1.0 发布,标志着一个稳定的里程碑。
-
2000 年代: Linux 在服务器、超级计算机和嵌入式系统中获得关注。
-
2010 年代: Linux 为 Android、云平台(AWS、Azure)和容器(Docker)提供支持。
-
2025 年: Linux 运行在超过 80% 的云工作负载上,是 AI 和 IoT 生态系统的基础。
目前 Linus Torvalds 仍然通过 Linux 内核邮件列表 (LKML) 监督 Linux 内核的开发。
Linux 的核心组件
Linux 的结构是分层的,从硬件到用户应用程序。以下是一个高级概述:
+----------------------------------------------------+
| User Applications (Vim, Docker, Apache, etc.) |
+----------------------------------------------------+
| Shell (Bash, Zsh, Fish, etc.) | <-- 操作系统的一部分
+----------------------------------------------------+
| System Libraries (glibc, libc, OpenSSL, etc.) | <-- 操作系统的一部分
+----------------------------------------------------+
| System Utilities (ls, grep, systemctl, etc.) | <-- 操作系统的一部分
+----------------------------------------------------+
| Linux Kernel (Process, Memory, FS, Network) | <-- 操作系统的核心
+----------------------------------------------------+
| Hardware (CPU, RAM, Disk, Network, Peripherals) |
+----------------------------------------------------+
(a) 硬件层
- 物理组件(CPU、RAM、磁盘、网络接口等)。
- 操作系统通过内核中的设备驱动程序与硬件交互。
(b) 内核(Linux 操作系统的核心)
- 直接管理系统资源:
- 进程管理: 调度进程并处理多任务。
- 内存管理: 高效地分配和解除分配 RAM。
- 设备驱动程序: 软件和硬件之间的接口。
- 文件系统管理: 处理数据存储和检索。
- 网络管理: 管理系统间通信。
- 内核空间 vs. 用户空间:
- 内核空间: 内核运行的特权模式,对硬件和系统资源拥有无限制的访问权。这允许直接控制 CPU、内存和 I/O 设备,但它是隔离的,以防止崩溃影响整个系统。
- 用户空间: 针对用户应用程序和实用程序的受限模式。这里的应用程序不能直接访问硬件,以维护安全性和稳定性——防止有缺陷的应用程序使内核崩溃或危及系统。
- 为何分离? 它增强了安全性(例如,权限提升攻击更困难)和可靠性(用户应用程序故障不会导致操作系统崩溃)。在 DevOps/SRE 环境中,这种设计实现了安全的容器化(例如,Docker 进程在用户空间运行,但利用 cgroups 等内核功能进行隔离)。
- 系统调用: 空间之间的桥梁——用户应用程序通过系统调用请求内核服务(例如,
open()读取文件,fork()创建进程)。这些操作暂时将 CPU 切换到内核模式,执行请求,然后返回结果。示例:运行ls时,用户空间中的 Shell 调用内核函数来列出目录内容。
- 内核版本: 编号为 X.Y.Z(例如 5.15.0),其中 X=主版本,Y=次版本,Z=补丁。
- 单体内核: 核心服务在内核空间运行以获得性能,这对于低延迟的云和容器应用程序至关重要。
© Shell(命令行界面 - CLI)
- 一个命令解释器,将用户命令转换为内核系统调用。
- 示例:Bash(大多数发行版的默认 Shell)、Zsh、Fish、Dash、Ksh。
- 对于 DevOps 脚本和自动化至关重要。
运行命令时发生了什么?(示例:ls)
当您输入 ls(列出目录内容)等命令并按下 Enter 键时,Shell 会协调一个涉及用户空间和内核空间的多步骤过程。以下是分步分解:
- 用户输入: 您在终端中输入
ls并按下 Enter。终端捕获此输入。 - Shell 解析: Shell(例如 Bash)读取命令,解析它(检查参数、别名或内置命令),并确定它是一个外部程序(
/bin/ls)。 - 路径解析: Shell 搜索
$PATH环境变量以查找可执行文件(例如,找到/bin/ls)。 - 进程创建: Shell 使用系统调用 (
fork()) 来为ls创建一个子进程。 - 内核执行: 内核切换到内核模式,将
/bin/ls加载到内存中(通过execve()系统调用),并在用户空间开始执行。 - 命令执行:
ls在用户空间运行,进行系统调用(例如,opendir()打开目录,readdir()读取条目)以通过内核与文件系统交互。 - 输出生成:
ls格式化输出(例如,文件名),并使用内核系统调用 (write()) 将其写入标准输出 (stdout)。 - 进程终止:
ls退出,子进程结束(exit()系统调用),Shell 重新获得控制权,显示提示符。
这个过程突出了 Shell-内核的交互流程,确保了命令的安全高效的执行。
在 DevOps 中,理解这一点有助于更好地调试脚本和自动化。
flowchart TDA[用户输入 'ls' 并按 Enter] --> B[Shell 解析命令]B --> C[解析路径:查找 /bin/ls]C --> D[系统调用:fork - 创建子进程]D --> E[内核通过 execve 加载并执行 ls]E --> F[ls 在用户空间运行:调用 opendir, readdir]F --> G[系统调用:将输出写入终端]G --> H[ls 退出:exit 系统调用]H --> I[Shell 重新获得控制权:显示提示符]
(d) 用户应用程序和系统实用程序
- 用户应用程序: 最终用户程序,如网页浏览器、文本编辑器 (Vim)、DevOps 工具 (Docker、Ansible) 和服务器 (Apache)。通过 Shell 或 GUI 通过系统调用与操作系统交互。
- 系统实用程序: 用于系统交互的核心命令(例如 ls、grep、systemctl),由 GNU 项目提供。
- 文件系统: 以分层结构组织数据;一切皆文件。
- 进程: 程序的运行实例,由内核管理。
- Init 系统: 管理系统启动和服务 (systemd, SysVinit)。
Linux vs. Windows特点比较
| 特性 | Linux | Windows | 优势说明 |
|---|---|---|---|
| 源代码 | 开源 | 专有 | 开源允许检查、修改和分发,促进了对 DevOps 工作流程至关重要的透明度和协作。 |
| 文件系统 | 分层 (/) | 驱动器盘符 (C:) | Linux 的分层文件系统是一致的,是云环境中脚本和自动化的理想选择。 |
| 大小写敏感 | 是 | 否 | 严格的大小写敏感性防止歧义,对于健壮的 CI/CD 脚本至关重要。 |
| 用户 | 多用户 | 侧重单用户 | Linux 的多用户设计确保了 SRE 的安全、稳定的服务器操作。 |
| 包管理 | apt, yum 等 | .exe, .msi | 软件包管理器简化了软件和依赖项管理,这对于云自动化至关重要。 |
| 成本 | 免费(无许可费) | 付费许可 | 降低了云集群中大规模部署的成本。 |
| 资源使用 | 轻量级 | 资源密集型 | 容器和可扩展基础设施具有更高的效率。 |
| 安全性 | 强大的权限,公开审查 | 频繁的漏洞 | 最大限度地减少恶意软件风险,并支持快速、透明的补丁,无需重新启动。 |
| 稳定性 | 高正常运行时间(数年不崩溃) | 容易重启 | 确保生产环境中的 99.99%+ 可靠性。 |
Linux 发行版(Distros)
Linux 发行版是一个完整的操作系统包,包括 Linux 内核、GNU 工具、软件包管理器和应用程序。
不同的汽车制造商(例如丰田、法拉利)使用相似的发动机(内核),但制造用于不同目的的不同车辆(例如家用车 vs. 赛车)。每个都是一个不同的发行版。
流行 Linux 发行版(按类别)
- 新手友好: Ubuntu、Linux Mint、Fedora
- 企业/服务器: RHEL、CentOS Stream、Ubuntu Server
- 侧重安全: Kali Linux、Parrot Security OS
- 轻量级/嵌入式: Alpine Linux、Raspberry Pi OS
- 高级/可定制: Arch Linux、Gentoo
对于 DevOps/SRE/云工程师:
- Ubuntu Server 和 CentOS Stream:因稳定性和支持而被广泛用于云环境。
- Alpine Linux:因其最小的占用空间而在轻量级容器中很受欢迎。
- RHEL:因其长期支持和合规性而在企业中很常见。
Linux 生态系统
Linux 生态系统涵盖了使 Linux 多功能且强大的工具、技术和理念,它超越了内核和发行版。
- GNU 项目: 提供用户态工具(例如 bash、ls、GCC),使发行版可用。因此,术语为 GNU/Linux。
- 桌面环境: GNOME、KDE、XFCE(与侧重服务器的角色关系不大)。
- 容器技术: Docker、Podman 和 Kubernetes,对 DevOps 至关重要。
- 云平台: AWS、GCP 和 Azure 依赖 Linux 实例。
生态系统中的软件包管理
软件包管理器是 Linux 生态系统的基石,它自动化了跨发行版的软件处理。
软件包管理器是一种自动化 Linux 中软件的安装、更新、配置和移除的工具,确保了高效的依赖项管理——这对于 DevOps 自动化和可重现的构建至关重要。
软件包管理器如何工作?
- 仓库(Repos): 从官方在线仓库(例如,Ubuntu 从
archive.ubuntu.com)获取软件。 - 安装软件: 下载软件包,解析依赖项,并自动配置。
- 更新软件: 单个命令即可将所有软件包更新到最新版本。
- 移除软件: 清理软件和未使用的文件,不留残余。
软件包管理器如何从仓库获取软件
软件包管理器检查仓库列表(例如,Ubuntu 中的 /etc/apt/sources.list),下载软件包/依赖项,并安装它们。
Ubuntu 仓库条目示例:
Types: deb
URIs: [http://ports.ubuntu.com/ubuntu-ports/](http://ports.ubuntu.com/ubuntu-ports/)
Suites: noble noble-updates noble-backports noble-security
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
为什么安装 Ubuntu 后要运行 apt update?
Ubuntu 安装完成后,系统中可能包含过时的软件包。
因此运行以下命令可以进行包工具的更新:
apt install sudo
sudo apt update # 更新仓库中的软件包列表
sudo apt upgrade -y # 安装最新版本
Linux 中流行的软件包管理器
| Linux 发行版 | 软件包管理器 | 命令示例 |
|---|---|---|
| Ubuntu, Debian | apt | sudo apt install nginx |
| Fedora, RHEL, CentOS | dnf (或 yum) | sudo dnf install nginx |
| Arch Linux | pacman | sudo pacman -S nginx |
| OpenSUSE | zypper | sudo zypper install nginx |
基本的软件包管理器命令
APT (Debian, Ubuntu)
sudo apt update # 更新软件包列表
sudo apt upgrade -y # 升级已安装的软件包
sudo apt install nginx # 安装软件包
sudo apt remove nginx # 移除软件包
sudo apt autoremove # 移除未使用的依赖项
sudo apt search nginx # 搜索软件包
DNF (Fedora, RHEL, CentOS)
sudo dnf check-update # 检查更新
sudo dnf update # 更新所有软件包
sudo dnf install nginx # 安装软件包
sudo dnf remove nginx # 移除软件包
Pacman (Arch Linux)
sudo pacman -Syu # 同步并更新所有软件包
sudo pacman -S nginx # 安装软件包
sudo pacman -R nginx # 移除软件包
Zypper (OpenSUSE)
sudo zypper refresh # 刷新软件包列表
sudo zypper update # 更新所有软件包
sudo zypper install nginx # 安装软件包
sudo zypper remove nginx # 移除软件包
使用软件包管理器的最佳实践
- 始终在安装前更新:
sudo apt update && sudo apt upgrade -y - 清理:
sudo apt autoremove - 启用自动安全更新 (Ubuntu):
sudo apt install unattended-upgrades && sudo dpkg-reconfigure unattended-upgrades
Linux 系统的可视化工具
开源理念
Linux 建立在开源理念之上:
- 自由: 任何人都可以使用、修改和分发代码。
- 协作: 全球开发人员贡献力量,使 Linux 健壮且创新。
- 透明度: 开放代码确保了信任和安全,这对于企业和云环境至关重要。
Linux 内核采用 GNU 通用公共许可证 (GPL) 授权,确保衍生作品保持免费。这推动了 DevOps 工具和云基础设施的创新。
讨论问题: 为什么像 Google、AWS 和 Red Hat 这样的公司要投资于开源 Linux 项目?
关于 DevOps/SRE/云工程师的 Linux 常见误区
- 误区 1:Linux 对云工作来说过于复杂。 像 Ubuntu Server 这样的发行版和像 Docker 这样的工具简化了云管理。
- 误区 2:Linux 没有用于生产环境。 超过 80% 的云工作负载和大多数 Kubernetes 集群运行在 Linux 上。
- 误区 3:Linux 缺乏对 DevOps 工具的支持。 像 Jenkins、Terraform 和 Kubernetes 这样的工具都是支持 Linux 并基于其开发的,并且得到广泛支持。
动手实践和实验
实验准备
如果您没有 AWS 账户:
- 虚拟机: 使用 VirtualBox/VMware 和 Ubuntu Server 或 CentOS Stream ISO 镜像。
- 免费云替代方案: Oracle Cloud 免费套餐或 Google Cloud 的免费试用。
- 本地终端: macOS/Linux 用户可以在本地练习命令。
SSH 故障排除:
- “权限被拒绝 (Permission Denied)”:运行
chmod 400 my-key.pem并验证用户名(Amazon Linux 为ec2-user,Ubuntu 为ubuntu)。 - 连接超时 (Connection Timeout):确保安全组允许 SSH(端口 22)并检查公共 IP。
第 1 部分:实验 - 启动两个不同的 Linux 实例
-
启动您的第一个实例(基于 RHEL):
- 登录 AWS 管理控制台,导航到 EC2 控制面板。
- 点击**“启动实例”**并选择 Amazon Linux 2 AMI。
- 选择
t2.micro实例类型并创建新的密钥对(.pem文件)。请安全地保存此文件。 - 完成启动过程,等待实例状态变为“Running”。
-
启动您的第二个实例(基于 Debian):
- 重复上述步骤,选择 Ubuntu Server AMI。
- 为了简单起见,使用相同的密钥对。
- 完成启动过程,等待实例状态变为“Running”。
第 2 部分:连接、探索和识别
-
连接到 Amazon Linux 2:
- 运行
chmod 400 my-key.pem。 - 连接:
ssh -i "my-key.pem" ec2-user@<amazon_linux_ip_address>。
- 运行
-
连接到 Ubuntu:
- 打开新的终端标签/窗口。
- 连接:
ssh -i "my-key.pem" ubuntu@<ubuntu_ip_address>。
第 3 部分:实验和回顾问题
-
命令行基础:
- 在任一实例上运行
pwd、ls和man ls。 - 问题:
pwd告诉您什么?man为什么有用?
- 在任一实例上运行
-
识别发行版:
- 在两个实例上运行
cat /etc/os-release并进行比较。 - 问题: 输出中的主要区别是什么?
- 在两个实例上运行
-
识别软件包管理器:
- 在 Amazon Linux 2 上运行
sudo yum update,在 Ubuntu 上运行sudo apt update。 - 问题: 发生了什么?用一句话解释区别,并参考上面的软件包管理器部分。
- 在 Amazon Linux 2 上运行
-
发行版与内核:
- 问题: 用您自己的话解释 Linux 内核和 Linux 发行版之间的区别。
-
GNU 项目的作用:
- 问题: GNU 项目在 Linux 生态系统中的作用是什么?
第 4 部分:编写并运行一个简单的脚本
- 在任一实例上,创建
hello.sh:nano hello.sh - 添加以下内容:
#!/bin/bash echo "Hello, Linux World!" echo "My current directory is: $(pwd)" echo "My distribution is:" cat /etc/os-release | grep PRETTY_NAME - 保存(
Ctrl+O,Enter,Ctrl+X),使其可执行(chmod +x hello.sh),然后运行(./hello.sh)。 - 问题: 每行代码的作用是什么?比较两个实例上的输出。
第 5 部分:DevOps/SRE/云工程师挑战
- 任务: 在任一实例上运行
uname -r检查内核版本。将其与 kernel.org 上的最新稳定版本进行比较。为什么像 AWS 这样的云提供商可能会使用较旧的内核? - 提示: 考虑稳定性、与云工具的兼容性以及企业支持。
问题答案
-
命令行基础:
pwd显示您在文件系统中的当前位置。man提供命令的文档和示例。
-
发行版识别:
- 输出显示不同的名称/ID(例如,
NAME="Amazon Linux",ID="amzn"对比NAME="Ubuntu",ID="ubuntu"),证明它们是不同的发行版。
- 输出显示不同的名称/ID(例如,
-
软件包管理器:
sudo yum update在 Amazon Linux 上成功,在 Ubuntu 上失败。sudo apt update在 Ubuntu 上成功,在 Amazon Linux 上失败。- 解释: 不同的发行版使用不同的软件包管理器(基于 RHEL 的使用 yum/dnf,基于 Debian 的使用 apt)。
-
发行版与内核:
- 内核管理硬件资源;发行版将内核与工具、软件包管理器和软件捆绑在一起,构成一个完整的操作系统。
-
GNU 项目的作用:
- 提供用户工具(例如 bash、核心工具)来补充内核,以创建功能齐全的操作系统。
关键术语词汇表
- 内核 (Kernel): 操作系统的核心,用于管理硬件和系统资源。
- 发行版 (Distribution/Distro): 围绕 Linux 内核构建的完整操作系统,包括工具和应用程序。
- Shell: 用于与操作系统交互的命令行界面(例如 bash)。
- 软件包管理器 (Package Manager): 用于安装、更新和管理软件的工具(例如 apt, yum)。
- GNU: 提供补充 Linux 内核的基本工具的项目。
- 开源 (Open Source): 源代码可自由获取、修改和分发的软件。
- 仓库 (Repository): 软件软件包的在线存储,供软件包管理器使用。
- 系统库 (System Libraries): 应用程序用于常见功能的共享代码(例如 glibc)。
- 系统实用程序 (System Utilities): 用于系统交互的核心命令(例如 ls, grep)。
面试准备问题
通过这些常见的 DevOps、SRE 和云角色的面试问题来测试您学到的Linux知识。
目标是借鉴今天的课程内容,能够自信地回答它们:
-
Linux 内核是什么,它与 Linux 发行版有何不同?
(提示:侧重于内核在硬件管理中的作用 vs. 发行版添加用户工具。) -
解释内核空间 vs. 用户空间。为什么这种分离对系统安全性和稳定性很重要?
(提示:讨论系统调用和容器隔离等实际影响。) -
说出三个流行的 Linux 发行版及其在云环境中的典型用例。
(提示:提及用于通用云的 Ubuntu Server、用于容器的 Alpine 以及用于企业的 RHEL。) -
像 apt 和 yum 这样的软件包管理器是如何工作的?为什么它们对 DevOps 工作流程至关重要?
(提示:涵盖仓库、依赖项解析和自动化优势。) -
GNU 项目在 Linux 中的作用是什么?为什么全名通常是 “GNU/Linux”?
(提示:解释像 bash 和 ls 这样的用户态工具。) -
描述开源理念以及它如何使像 AWS 这样的公司在使用 Linux 时受益。
(提示:强调自由、协作和透明度。) -
在生产 SRE 角色中,您为什么可能更喜欢 Linux 而不是 Windows 作为服务器基础设施?
(提示:参考比较表中的稳定性、成本和可扩展性。) -
您如何检查 Linux 实例上的内核版本,为什么云提供商可能会使用较旧的版本?
(提示:使用uname -r并讨论稳定性/测试。)
