简介:本“Linux系统从入门到实战完整视频教程”全面深入讲解Linux操作系统,适用于服务器、云计算、物联网和开发环境。课程内容覆盖Linux基础命令、系统管理、网络配置、Shell脚本编程、服务部署、云平台应用及自动化运维等核心技能。适合初学者和IT从业者提升实战能力,帮助学员掌握Linux在运维、开发、部署等多场景的应用,助力职业发展。
1. Linux操作系统概述
Linux 是一种开源、多用户、多任务的类 Unix 操作系统内核,由芬兰程序员 Linus Torvalds 于 1991 年首次发布。其核心理念是“自由、开放、协作”,这使得 Linux 在全球开发者社区中迅速成长并广泛应用。
1.1 基本概念与发展历程
Linux 并非一个完整的操作系统,而是一个操作系统内核。完整的 Linux 系统由内核、GNU 工具链、系统管理工具、应用软件和文档组成。其发展经历了以下几个关键阶段:
| 阶段 | 时间 | 关键事件 |
|---|---|---|
| 起源 | 1991年 | Linus Torvalds 发布 Linux 0.01 内核 |
| 成长 | 1990年代 | 各大开源社区加入,形成多个发行版如 Red Hat、Debian |
| 成熟 | 2000年代 | 被广泛用于服务器、嵌入式设备,进入企业级市场 |
| 扩展 | 2010年至今 | 成为云计算、容器技术(如 Docker、Kubernetes)的核心操作系统 |
1.2 应用场景与重要性
Linux 在多个领域展现出卓越性能和灵活性:
- 服务器领域 :超过 70% 的 Web 服务器运行在 Linux 上,得益于其稳定性、安全性和低维护成本。
- 云计算 :主流云平台(如 AWS、Azure、Google Cloud)底层均基于 Linux 构建。
- 嵌入式系统 :Android(基于 Linux 内核)、路由器、智能电视、IoT 设备广泛采用 Linux。
- 高性能计算(HPC) :全球 Top 500 超级计算机几乎全部运行 Linux。
此外,Linux 的开源特性使其具备高度可定制性和可移植性,适合各种硬件架构(如 x86、ARM、MIPS 等)。它不仅是开发者和系统管理员的首选平台,也成为企业数字化转型的重要基石。
2. Linux内核功能与架构
Linux内核是整个操作系统的核心组件,负责管理系统资源、调度进程、处理硬件交互等关键任务。它的设计采用了模块化和分层架构,使其既具备强大的功能性,又保持了良好的可扩展性和灵活性。本章将深入探讨Linux内核的核心职责、模块化结构、与发行版的关系,以及源码分析与调试基础,帮助读者建立对Linux系统底层机制的深入理解。
2.1 Linux内核的核心职责
Linux内核作为操作系统的核心,承担着多个关键职责。它不仅要高效地管理系统的硬件资源,还需要为上层应用程序提供稳定的接口。其主要职责包括:
- 进程调度与资源管理
- 内存管理机制
- 文件系统与设备驱动
这些职责相互交织,构成了Linux内核的基本功能框架。
2.1.1 进程调度与资源管理
进程调度是内核最重要的任务之一。Linux内核通过 完全公平调度器 (Completely Fair Scheduler, CFS)来管理进程的运行,确保系统资源的合理分配。
1. 进程状态与生命周期
Linux中的进程具有以下状态:
| 状态 | 描述 |
|---|---|
| TASK_RUNNING | 进程正在运行或就绪等待调度 |
| TASK_INTERRUPTIBLE | 可中断的等待状态 |
| TASK_UNINTERRUPTIBLE | 不可中断的等待状态 |
| TASK_STOPPED | 进程被暂停 |
| TASK_TRACED | 被调试器暂停 |
| EXIT_ZOMBIE | 进程已结束,但尚未被父进程回收 |
| EXIT_DEAD | 进程已被完全销毁 |
2. CFS调度器机制
CFS通过红黑树(Red-Black Tree)结构来管理就绪队列,确保每个进程的虚拟运行时间尽可能公平。CFS的核心思想是“最小虚拟运行时间优先调度”。
// 内核中CFS队列的核心结构体(简化版)
struct cfs_rq {
struct rb_root tasks_timeline; // 红黑树根节点
struct rb_node *rb_leftmost; // 最左边节点,表示下一个要调度的进程
unsigned long nr_running; // 当前运行队列中的进程数
};
逐行解读:
-
tasks_timeline是红黑树的根节点,用于存储所有就绪进程。 -
rb_leftmost指向红黑树中最左边的节点,表示当前调度器将要调度的下一个进程。 -
nr_running表示当前队列中处于运行状态的进程数量,用于调度决策。
CFS调度器会根据每个进程的权重(nice值)动态调整其时间片,确保系统资源的公平分配。
3. 实时调度策略
除了CFS,Linux还支持实时调度策略:
- SCHED_FIFO :先进先出的实时调度,优先级高的进程会一直运行,直到它主动让出CPU。
- SCHED_RR :轮转调度的实时策略,每个进程有固定时间片。
2.1.2 内存管理机制
Linux内核的内存管理机制非常复杂,主要涉及 物理内存管理 、 虚拟内存管理 和 内存回收机制 。
1. 物理内存管理
Linux使用 伙伴系统 (Buddy System)来管理物理内存块的分配与释放。该系统通过将内存划分为大小为2的幂次方的块,实现高效的内存分配。
2. 虚拟内存管理
虚拟内存机制允许进程访问比物理内存更大的地址空间。Linux通过 页表 (Page Table)机制将虚拟地址转换为物理地址。
// 页表项结构体(简化)
typedef struct {
unsigned long pte;
} pte_t;
参数说明:
-
pte字段表示页表项的内容,包含页面的物理地址、访问权限、是否在内存中等信息。
Linux支持 按需分页 (Demand Paging)机制,即只有在访问页面时才加载数据,从而提高内存使用效率。
3. 内存回收机制
当系统内存不足时,Linux会启动 页回收机制 (Page Reclaim)来释放内存。主要方式包括:
- 直接回收 :在内存分配失败时触发。
- 后台回收 :由
kswapd内核线程定期执行。
Linux还使用 Slab分配器 来管理内核对象的内存分配,提升小对象的分配效率。
2.1.3 文件系统与设备驱动
Linux内核为文件系统和设备驱动提供了统一的接口,使得不同的硬件和文件系统可以无缝协作。
1. 虚拟文件系统(VFS)
VFS是Linux文件系统的抽象层,它为各种文件系统(如ext4、XFS、Btrfs)提供统一的接口。
graph TD
A[应用程序] --> B(VFS)
B --> C1[ext4]
B --> C2[XFS]
B --> C3[Btrfs]
B --> D[设备驱动]
流程说明:
- 应用程序通过标准系统调用(如
open、read)访问文件。 - VFS根据文件所在的文件系统类型,将请求转发给对应的文件系统模块。
- 最终由设备驱动程序将数据从磁盘读取或写入。
2. 设备驱动模型
Linux采用 设备模型 (Device Model)来统一管理设备驱动。主要结构包括:
- kobject :核心对象,用于设备和驱动的层次结构。
- sysfs :虚拟文件系统,用于导出设备和驱动信息供用户空间访问。
// 设备结构体(简化)
struct device {
struct kobject kobj;
struct device_type *type;
struct bus_type *bus;
};
参数说明:
-
kobj是该设备的kobject对象,用于sysfs中的表示。 -
type定义设备类型。 -
bus表示该设备连接的总线类型。
Linux内核支持 模块化设备驱动 ,即驱动可以作为模块动态加载或卸载,提高系统的灵活性。
2.2 Linux内核的模块化结构
Linux内核的模块化设计是其强大灵活性的体现。它允许用户在不重新编译整个内核的情况下,动态添加或移除功能模块。
2.2.1 模块加载与卸载机制
Linux模块(LKM,Loadable Kernel Module)是一种可以在运行时动态插入或移除的代码段。它通过 insmod 、 rmmod 等命令进行管理。
1. 模块的生命周期
模块的加载与卸载过程如下:
graph LR
A[编写模块代码] --> B[编译模块]
B --> C[使用insmod加载模块]
C --> D[模块运行]
D --> E{是否需要卸载?}
E -- 是 --> F[使用rmmod卸载模块]
E -- 否 --> D
2. 模块代码示例
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void) {
printk(KERN_INFO "Hello, Linux Module!\n");
return 0;
}
void cleanup_module(void) {
printk(KERN_INFO "Goodbye, Linux Module!\n");
}
逐行解读:
-
init_module()是模块加载时执行的入口函数。 -
printk()是内核日志打印函数,KERN_INFO表示日志级别。 -
cleanup_module()是模块卸载时执行的清理函数。
编译模块命令:
make -C /lib/modules/$(uname -r)/build M=$(PWD) modules
加载模块:
sudo insmod hello.ko
查看模块日志:
dmesg | tail
2.2.2 内核配置与编译实践
Linux内核可以通过 make menuconfig 、 make xconfig 等工具进行配置,选择需要编译的功能模块。
1. 内核编译流程
graph TD
A[获取源码] --> B[配置内核]
B --> C[编译内核]
C --> D[安装模块]
D --> E[更新引导配置]
2. 配置内核选项
make menuconfig
该命令会启动基于文本的配置界面,用户可以启用/禁用各种内核功能。
3. 编译与安装
make -j$(nproc)
sudo make modules_install dtbs_install
sudo make install
-
-j$(nproc)表示并行编译,利用多核CPU加速。 -
modules_install将编译好的模块安装到系统中。 -
install安装内核镜像和配置文件。
4. 更新GRUB引导
sudo update-grub
sudo reboot
2.3 内核版本与发行版的关系
Linux内核版本与发行版之间存在密切关系。发行版通常基于特定内核版本构建,并提供额外的工具和管理机制。
2.3.1 主流Linux发行版对比
| 发行版 | 内核版本管理 | 包管理系统 | 特点 |
|---|---|---|---|
| Ubuntu | 定期发布LTS版本 | APT | 用户友好,适合桌面与服务器 |
| CentOS | 基于RHEL同步 | YUM/DNF | 企业级稳定,适合服务器部署 |
| Fedora | 最新内核 | DNF | 社区驱动,适合开发者与尝鲜用户 |
| Arch Linux | 最新软件 | Pacman | 滚动更新,适合高级用户 |
| SUSE Linux | 企业级支持 | Zypper | 企业级稳定性,适合大型部署 |
2.3.2 如何选择适合的系统版本
选择系统版本时应考虑以下因素:
- 使用场景 :桌面、服务器、嵌入式设备等。
- 稳定性需求 :长期支持(LTS)版本适合生产环境。
- 内核版本要求 :某些硬件或软件可能依赖特定内核功能。
- 社区与支持 :是否有活跃社区和官方支持。
2.4 内核源码分析与调试基础
理解Linux内核源码是深入掌握系统机制的关键。本节将介绍内核源码的结构、关键组件以及常用的调试工具。
2.4.1 源码结构与关键组件
Linux内核源码结构如下(以v5.15为例):
linux/
├── arch/ // 架构相关代码
├── block/ // 块设备驱动
├── crypto/ // 加密算法
├── drivers/ // 设备驱动
├── fs/ // 文件系统
├── include/ // 头文件
├── init/ // 启动代码
├── ipc/ // 进程间通信
├── kernel/ // 核心调度、进程管理
├── lib/ // 库函数
├── mm/ // 内存管理
├── net/ // 网络协议栈
├── scripts/ // 编译脚本
└── security/ // 安全模块
关键组件:
- kernel/sched :调度器核心代码。
- mm/vmscan.c :内存回收机制。
- fs/ext4/ :ext4文件系统实现。
- drivers/net/ :网络设备驱动。
2.4.2 使用调试工具追踪内核行为
Linux提供了多种内核调试工具:
- gdb :结合kgdb进行内核级调试。
- ftrace :函数追踪工具。
- perf :性能分析工具。
- strace :系统调用跟踪。
- crash :分析内核崩溃转储。
示例:使用perf分析CPU使用
sudo perf record -a -g sleep 10
sudo perf report
-
-a表示监控所有CPU。 -
-g表示记录调用栈。 -
sleep 10是测试运行的命令。
该工具可以帮助开发者找出CPU热点函数,进行性能优化。
本章深入解析了Linux内核的核心职责、模块化结构、与发行版的关系以及源码分析与调试方法。通过理解这些内容,读者可以更深入地掌握Linux系统的运行机制,为进一步的系统优化与内核开发打下坚实基础。
3. Linux命令行基础操作
3.1 Shell与命令行交互机制
3.1.1 命令解析与执行流程
Shell 是 Linux 系统的核心交互界面,它不仅是命令解释器,还是脚本语言的运行环境。理解命令的解析与执行流程,有助于提升用户对系统的掌控能力。
命令的执行过程可以分为以下几个阶段:
- 用户输入命令 :通过终端输入一行命令,例如
ls -l /home。 - Shell 解析命令 :Shell 对输入的命令进行分词,识别出命令名、参数和选项。
- 查找可执行文件路径 :Shell 会根据环境变量
PATH查找命令的可执行文件位置。 - 创建子进程 :Shell 使用
fork()创建子进程。 - 执行命令 :子进程调用
execve()执行实际的程序。 - 等待与返回 :父进程等待子进程执行完成,并接收退出状态。
我们可以使用 strace 工具追踪一个命令的执行过程:
strace ls -l /home
代码逻辑分析 :
- strace 会打印出命令执行过程中调用的系统调用。
- 比如 execve("/bin/ls", ...) 表示调用了 /bin/ls 这个程序。
- open() 和 read() 系统调用用于读取目录信息。
- write() 调用用于输出结果到终端。
3.1.2 命令历史与自动补全技巧
Shell 提供了历史命令记录功能,通过上下箭头可以回溯之前输入的命令。默认情况下,Bash 会将历史命令保存在 ~/.bash_history 文件中。
启用历史命令扩展
HISTCONTROL=ignoreboth
HISTSIZE=1000
HISTFILESIZE=2000
-
HISTCONTROL:控制历史记录行为,ignoreboth表示忽略重复命令和以空格开头的命令。 -
HISTSIZE:内存中保存的历史命令条数。 -
HISTFILESIZE:历史文件中保存的最大命令条数。
自动补全功能
Bash 支持自动补全功能,按下 Tab 键可自动补全命令、文件名或路径。
例如:
cd /etc/sys[TAB]
将自动补全为:
cd /etc/sysconfig/
查看历史命令
history
可以查看所有历史命令,也可以结合 grep 进行过滤:
history | grep "ssh"
流程图:命令历史与自动补全机制
graph TD
A[用户输入命令] --> B[Shell执行命令]
B --> C[将命令写入历史缓存]
C --> D[命令执行完成后退出]
D --> E[用户按下上下箭头]
E --> F[从历史缓存中加载命令]
F --> G[显示命令并可编辑执行]
H[用户输入前缀] --> I[按下Tab键]
I --> J[Shell查找匹配项]
J --> K[自动补全路径/命令]
3.2 常用命令分类与实战演练
3.2.1 系统信息查看命令
Linux 提供了多种命令用于查看系统资源和运行状态,以下是几个常用的命令:
| 命令 | 功能说明 |
|---|---|
uname -a | 显示系统内核版本、主机名、架构等信息 |
top | 实时查看系统资源使用情况 |
df -h | 查看磁盘空间使用情况 |
free -h | 查看内存使用情况 |
uptime | 查看系统运行时间及负载 |
示例:查看当前系统负载
uptime
输出示例:
10:23:45 up 1 day 23:45, 2 users, load average: 0.15, 0.05, 0.01
-
up 1 day 23:45:系统已经运行了1天23小时45分钟。 -
load average:1分钟、5分钟、15分钟的平均负载值。
3.2.2 文件与目录操作命令
文件与目录管理是 Linux 命令行中最基础也是最频繁的操作之一。以下是一些常用命令:
| 命令 | 功能说明 |
|---|---|
ls | 列出目录内容 |
cd | 切换目录 |
pwd | 显示当前工作目录 |
mkdir | 创建目录 |
rmdir | 删除空目录 |
rm -r | 递归删除目录 |
cp | 复制文件 |
mv | 移动或重命名文件 |
示例:递归复制目录
cp -r /home/user/docs /backup/
-
-r:递归复制,复制整个目录及其内容。 -
/home/user/docs:源目录。 -
/backup/:目标目录。
3.2.3 用户与权限相关命令
Linux 是一个多用户系统,因此用户和权限管理非常重要。以下是一些与用户和权限相关的常用命令:
| 命令 | 功能说明 |
|---|---|
whoami | 显示当前用户 |
id | 显示用户ID和所属组 |
chmod | 修改文件权限 |
chown | 修改文件所有者 |
su | 切换用户 |
sudo | 以超级用户权限执行命令 |
示例:修改文件权限
chmod 755 script.sh
-
755表示权限模式: -
7:所有者(user)权限:读+写+执行(rwx) -
5:组(group)权限:读+执行(r-x) -
5:其他(others)权限:读+执行(r-x)
3.3 管道与重定向机制
3.3.1 输入输出重定向
Linux 中的输入输出重定向允许我们将命令的输入和输出指向不同的位置,而不是默认的终端。
常见重定向操作符
| 操作符 | 说明 |
|---|---|
> | 输出重定向(覆盖) |
>> | 输出重定向(追加) |
< | 输入重定向 |
2> | 错误输出重定向 |
&> | 同时重定向标准输出和错误输出 |
示例:将 ls 的输出写入文件
ls -l > output.txt
-
>:将ls -l的输出写入output.txt文件,若文件已存在则覆盖。
示例:将错误输出重定向到文件
grep "error" /var/log/syslog 2> error.log
-
2>:将错误信息写入error.log。
3.3.2 管道符的使用与组合命令
管道符( | )是 Linux 命令行中非常强大的工具,它允许我们将一个命令的输出作为另一个命令的输入。
示例:查找包含“error”的日志行
cat /var/log/syslog | grep "error"
-
cat输出日志文件内容。 -
|将输出传给grep。 -
grep过滤出包含 “error” 的行。
示例:统计当前目录下的文件数量
ls -l | grep "^-" | wc -l
-
ls -l:列出所有文件。 -
grep "^-":过滤出普通文件(^-表示文件类型为普通文件)。 -
wc -l:统计行数,即文件数。
3.4 命令别名与快捷键配置
3.4.1 自定义别名提升效率
Linux Shell 支持自定义命令别名,可以将常用命令简化为更短的形式。
查看当前别名
alias
设置别名
alias ll='ls -l'
- 设置
ll为ls -l的别名。 - 可以将别名写入
~/.bashrc或~/.zshrc文件,使其永久生效。
示例:设置 grep 忽略大小写
alias gi='grep -i'
- 使用
gi替代grep -i。
3.4.2 常用快捷键与命令优化
Shell 提供了多种快捷键来提高命令行效率,以下是一些常用快捷键:
| 快捷键 | 功能说明 |
|---|---|
Ctrl + C | 终止当前运行的命令 |
Ctrl + Z | 挂起当前命令 |
Ctrl + D | 退出当前 Shell |
Ctrl + A | 将光标移到行首 |
Ctrl + E | 将光标移到行尾 |
Ctrl + R | 反向搜索历史命令 |
示例:使用 Ctrl + R 搜索历史命令
按 Ctrl + R 后,输入关键词如 ssh ,系统会自动匹配历史命令。
示例:编辑历史命令
history | grep "scp"
找到编号后,使用 !编号 执行命令:
!123
将执行第 123 条命令。
总结 :
本章详细介绍了 Linux 命令行的基本操作,包括 Shell 的命令解析机制、常用命令的使用、管道与重定向的应用,以及如何通过别名和快捷键提升效率。这些知识构成了 Linux 系统管理的基础,熟练掌握将极大提升用户在命令行环境下的操作效率和问题排查能力。
4. Linux文件系统与目录结构
Linux 文件系统是操作系统的核心组成部分之一,它不仅决定了文件的存储方式,还影响着系统的性能、安全性和可维护性。本章将深入探讨 Linux 文件系统的类型、组织方式、标准目录结构、权限管理机制,以及文件系统的维护与修复方法。通过本章内容,读者将掌握 Linux 文件系统的核心知识,并能够灵活运用相关命令进行系统管理与故障排查。
4.1 文件系统的类型与组织方式
Linux 支持多种文件系统类型,每种文件系统都有其特定的用途和性能特点。理解不同文件系统之间的区别,有助于在不同的使用场景下选择最合适的文件系统。
4.1.1 常见文件系统(ext4、XFS、Btrfs)
Linux 系统中常见的文件系统包括:
| 文件系统 | 特点 | 适用场景 |
|---|---|---|
| ext4 | 支持大文件、日志功能、良好的兼容性 | 桌面与服务器系统 |
| XFS | 高性能、支持大容量磁盘 | 大型服务器、数据库系统 |
| Btrfs | 支持快照、压缩、RAID、子卷 | 高级文件管理、数据保护 |
ext4 是目前最广泛使用的 Linux 文件系统,它继承了 ext3 的日志功能,并提升了性能和可扩展性。
XFS 由 SGI 开发,适合处理大文件和高性能读写场景,广泛用于企业级服务器。
Btrfs 是新一代的 Copy-on-Write(写时复制)文件系统,支持快照、压缩、RAID 等高级功能,适合需要数据保护和版本控制的场景。
4.1.2 文件系统挂载与管理
Linux 文件系统通过挂载机制将设备(如硬盘分区)与目录树连接。以下是挂载的基本操作:
# 查看当前挂载信息
df -h
# 挂载一个 ext4 文件系统
sudo mount -t ext4 /dev/sdb1 /mnt/data
# 卸载文件系统
sudo umount /mnt/data
# 自动挂载配置(/etc/fstab)
UUID=1234-5678 /mnt/data ext4 defaults 0 2
逻辑分析:
-
mount命令用于将设备挂载到指定目录。 -
-t参数指定文件系统类型。 -
/etc/fstab文件用于定义系统启动时自动挂载的设备。
参数说明:
-
defaults:默认挂载选项(包含rw,suid,dev,exec,auto,nouser,async)。 -
0 2:第一个数字表示是否启用 dump 备份(0 为不启用),第二个数字表示启动时 fsck 检查顺序(0 为不检查)。
4.2 Linux标准目录结构详解
Linux 的目录结构遵循 Filesystem Hierarchy Standard(FHS)标准,确保不同发行版之间的兼容性。
4.2.1 /bin、/sbin、/usr/bin 的区别
| 目录 | 说明 |
|---|---|
/bin | 存放系统启动和运行所必需的基本命令(如 ls , cp ) |
/sbin | 存放系统管理员使用的管理命令(如 ifconfig , reboot ) |
/usr/bin | 存放用户应用程序的命令(如 gcc , python ) |
举例说明:
# 查看 /bin 下的命令
ls /bin
# 查看 /sbin 下的命令
ls /sbin
# 查看 /usr/bin 下的命令
ls /usr/bin
逻辑分析:
-
/bin和/sbin是系统运行的基本环境,通常挂载为只读文件系统。 -
/usr/bin包含用户安装的软件命令,依赖于/usr文件系统挂载。
4.2.2 /etc、/var、/tmp 的作用与用途
| 目录 | 用途 |
|---|---|
/etc | 系统配置文件存放目录(如 /etc/passwd , /etc/ssh/sshd_config ) |
/var | 存放经常变化的数据文件(如日志 /var/log 、邮件 /var/mail ) |
/tmp | 临时文件存储目录,重启后清空 |
配置文件示例:
# 查看 SSH 配置文件
cat /etc/ssh/sshd_config
# 查看系统日志
tail -n 20 /var/log/syslog
# 创建临时文件
echo "temp file" > /tmp/test.txt
逻辑分析:
-
/etc中的配置文件通常为文本格式,可手动编辑。 -
/var是日志、数据库等动态数据的存放位置,建议使用独立分区。 -
/tmp是临时目录,适用于程序运行时的临时文件存储。
4.3 文件权限与访问控制
Linux 的文件权限模型基于用户(User)、组(Group)、其他(Others)三类实体,每类具有读(r)、写(w)、执行(x)三种权限。
4.3.1 权限模型(rwx)
权限使用数字表示:
| 权限 | 数值 |
|---|---|
| r | 4 |
| w | 2 |
| x | 1 |
权限设置示例:
# 查看文件权限
ls -l file.txt
# 设置文件权限为所有者可读写执行,组和其他用户只读
chmod 744 file.txt
# 更改文件所有者
chown user:group file.txt
逻辑分析:
-
chmod命令用于更改文件权限。 -
chown命令用于更改文件所有者和所属组。 -
744表示用户(7 = 4+2+1)可读写执行,组和其他用户(4)只读。
4.3.2 特殊权限位(SUID、SGID、Sticky)
特殊权限位用于控制更高级别的权限行为:
| 权限位 | 描述 | 示例 |
|---|---|---|
| SUID | 以文件所有者身份执行程序 | /usr/bin/passwd |
| SGID | 以文件所属组身份执行程序或创建的文件继承组 | /usr/bin/write |
| Sticky | 仅文件所有者可以删除文件 | /tmp 目录 |
设置特殊权限:
# 设置 SUID
chmod u+s file
# 设置 SGID
chmod g+s dir
# 设置 Sticky
chmod +t /tmp
逻辑分析:
- SUID 通常用于需要临时提权的程序(如
passwd)。 - SGID 在目录上设置时,新文件将继承目录的组。
- Sticky 用于公共目录(如
/tmp),防止他人删除你的文件。
4.4 文件系统的维护与修复
文件系统的健康状况直接影响系统的稳定性和数据完整性。定期维护和修复是系统管理员的重要职责。
4.4.1 fsck与日志文件系统
fsck (File System Consistency Check)是 Linux 中用于检查和修复文件系统的工具。
# 强制检查并修复 /dev/sda1 文件系统
sudo fsck -f /dev/sda1
# 自动修复并显示进度
sudo fsck -y -C /dev/sda1
逻辑分析:
-
-f:强制检查文件系统。 -
-y:自动确认修复操作。 -
-C:显示进度条。
mermaid 流程图:
graph TD
A[启动系统] --> B[检测文件系统]
B --> C{是否需要修复?}
C -->|是| D[运行 fsck 修复]
C -->|否| E[继续启动]
D --> E
4.4.2 磁盘配额与空间管理
磁盘配额 (Disk Quota)用于限制用户或组的磁盘使用量,防止资源滥用。
启用配额:
# 安装 quota 工具
sudo apt install quota
# 编辑 /etc/fstab,添加 usrquota,grpquota
UUID=1234-5678 / ext4 defaults,usrquota,grpquota 0 1
# 重新挂载文件系统
mount -o remount /
# 创建配额数据库
quotacheck -cugm /
# 启用配额
quotaon -v /
设置用户配额:
# 编辑用户配额
edquota -u username
# 显示配额信息
quota -u username
逻辑分析:
-
quotacheck创建配额数据库文件(aquota.user,aquota.group)。 -
quotaon启用配额功能。 -
edquota可以设置软限制(soft limit)和硬限制(hard limit)。
配额示例( edquota 内容):
Disk quotas for user username (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sda1 2000 10000 15000 500 600 700
参数说明:
-
blocks:已使用磁盘空间(单位 KB)。 -
soft/hard:软限制和硬限制。 -
inodes:已使用 inode 数量。
通过本章的深入讲解,读者应已掌握 Linux 文件系统的类型、标准目录结构、权限管理机制,以及文件系统的维护与修复方法。这些知识对于日常系统管理、故障排查和安全加固具有重要意义。
5. Linux用户与权限管理
5.1 用户账户与组管理
5.1.1 用户添加、修改与删除
在Linux系统中,用户账户是系统安全和资源管理的核心组成部分。用户账户不仅用于登录系统,还决定了该用户对系统资源的访问权限。常见的用户账户操作包括添加、修改和删除。
用户添加
使用 useradd 命令可以创建新用户。以下是基本用法:
sudo useradd -m -s /bin/bash newuser
-
-m:自动创建用户的主目录。 -
-s:指定用户的默认Shell,例如/bin/bash。 -
newuser:要创建的用户名。
执行完成后,还需为用户设置密码:
sudo passwd newuser
用户修改
使用 usermod 命令可以修改现有用户的信息,例如更改主目录、登录Shell或所属组:
sudo usermod -d /home/newhome -s /bin/zsh -g developers newuser
-
-d:修改用户的主目录路径。 -
-s:更改默认Shell。 -
-g:更改用户的主要组。
用户删除
使用 userdel 命令可以删除用户账户:
sudo userdel -r newuser
-
-r:同时删除用户的主目录和邮件目录。
注意 :删除用户时需谨慎操作,确保不会误删关键系统账户或用户数据。
5.1.2 组的创建与成员管理
组是用户权限管理的重要机制,通过将用户分配到不同的组,可以实现对资源访问的统一控制。
组的创建
使用 groupadd 命令创建新组:
sudo groupadd developers
该命令将创建名为 developers 的组。
组成员管理
使用 usermod 命令将用户添加到指定组:
sudo usermod -aG developers newuser
-
-aG:将用户追加到指定的附加组中,而不影响原有组成员关系。
查看用户所属组的方法如下:
groups newuser
或直接查看 /etc/group 文件:
cat /etc/group | grep developers
组的删除
如果某个组不再需要,可以使用 groupdel 删除:
sudo groupdel developers
注意 :不能删除一个仍包含用户的组,必须先将用户从该组中移除或删除用户。
5.2 用户身份验证与密码策略
5.2.1 /etc/shadow文件解析
Linux系统中,用户密码信息存储在 /etc/shadow 文件中,而非 /etc/passwd 文件中。这种设计提升了系统的安全性。
文件结构解析
/etc/shadow 文件的每一行对应一个用户账户,格式如下:
username:hashed_password:last_change:min_age:max_age:warn:inactive:expire:reserved
-
username:用户名。 -
hashed_password:加密后的密码(使用$id$salt$hash格式)。 -
last_change:密码最后一次修改的时间(自1970年1月1日以来的天数)。 -
min_age:两次修改密码之间的最小天数。 -
max_age:密码的有效期(天数)。 -
warn:密码过期前多少天开始提醒用户。 -
inactive:密码过期后还能登录的天数。 -
expire:账户的失效时间(自1970年1月1日以来的天数)。 -
reserved:保留字段,通常为空。
查看和修改
普通用户无法直接查看 /etc/shadow 文件,需使用 sudo :
sudo cat /etc/shadow | grep username
修改密码信息可以使用 passwd 或 chage 命令,例如:
sudo chage -M 90 username
-
-M 90:设置密码最长使用90天。
5.2.2 密码复杂度与过期策略
为增强系统安全性,Linux支持通过 PAM(Pluggable Authentication Modules)模块配置密码复杂度和过期策略。
密码复杂度设置
在 /etc/pam.d/common-password 文件中,可以配置密码策略。例如:
password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
-
retry=3:允许用户尝试3次设置密码。 -
minlen=12:最小长度为12个字符。 -
dcredit=-1:至少包含1个数字。 -
ucredit=-1:至少包含1个大写字母。 -
lcredit=-1:至少包含1个小写字母。 -
ocredit=-1:至少包含1个特殊字符。
密码过期策略
通过 chage 命令可设置密码过期策略:
sudo chage -m 7 -M 90 -W 7 -I 5 username
-
-m 7:密码修改后的最小间隔为7天。 -
-M 90:密码最长使用时间为90天。 -
-W 7:提前7天提醒用户密码将过期。 -
-I 5:密码过期后5天内账户将被锁定。
5.3 sudo权限与最小权限原则
5.3.1 sudoers文件配置
sudo 允许用户以管理员身份执行命令,而无需知道 root 密码。其权限配置通过 /etc/sudoers 文件进行。
编辑 sudoers 文件
应使用 visudo 命令编辑,避免语法错误导致系统无法使用:
sudo visudo
基本语法
user_name ALL=(ALL:ALL) ALL
-
user_name:允许执行 sudo 的用户名。 -
ALL=(ALL:ALL):表示可以在任何主机上以任何用户和组身份运行。 -
ALL:允许执行所有命令。
示例配置
- 特定用户执行特定命令 :
dev_user ALL=(ALL) /usr/bin/apt update, /usr/bin/apt upgrade
- 组成员拥有 sudo 权限 :
%admin ALL=(ALL) ALL
- 无需输入密码 :
dev_user ALL=(ALL) NOPASSWD: ALL
权限最小化配置建议
- 避免 ALL 权限 :根据实际需求限制命令范围。
- 使用 NOPASSWD 谨慎 :仅在可信环境中使用。
- 日志审计 :启用
sudo日志记录,便于追踪操作行为。
5.3.2 安全审计与权限控制
为确保系统安全,应定期审计 sudo 使用情况,并通过日志分析潜在风险。
日志查看
sudo 命令的执行记录通常保存在 /var/log/auth.log 中(Debian/Ubuntu)或 /var/log/secure (CentOS/RHEL)中:
sudo grep sudo /var/log/auth.log
审计工具
可使用 auditd 工具监控 sudo 行为:
sudo auditctl -w /usr/bin/sudo -p war -k sudo_access
-
-w:监控指定文件。 -
-p war:监控写入、属性修改、执行。 -
-k:为规则设置标签,便于查询。
使用 ausearch 查看相关日志:
sudo ausearch -k sudo_access
5.4 用户环境配置与登录管理
5.4.1 .bashrc与.bash_profile
用户登录时,系统会加载特定的环境配置文件,以定义环境变量、别名、函数等。
.bashrc vs .bash_profile
-
.bashrc:适用于交互式非登录Shell(如打开终端时)。 -
.bash_profile:适用于登录Shell(如SSH登录时)。
通常建议将通用配置放入 .bashrc ,并在 .bash_profile 中调用它:
# .bash_profile
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
常见配置项
- 别名设置 :
alias ll='ls -l'
alias gs='git status'
- 环境变量 :
export PATH=$PATH:/opt/mytools
export EDITOR=vim
- 提示符设置 :
export PS1='\u@\h:\w\$ '
- 函数定义 :
function mkcd() {
mkdir -p "$1"
cd "$1"
}
自动加载配置
修改完 .bashrc 后,使用以下命令立即生效:
source ~/.bashrc
5.4.2 登录会话与资源限制
Linux系统支持通过 PAM 模块和 limits.conf 文件对用户资源进行限制,防止资源滥用。
设置资源限制
编辑 /etc/security/limits.conf 文件,格式如下:
<domain> <type> <item> <value>
示例配置:
# 普通用户限制
* soft nofile 1024
* hard nofile 2048
# 特定用户限制
dev_user soft nproc 100
dev_user hard nproc 200
-
soft:软限制,用户可自行调整。 -
hard:硬限制,只能由 root 修改。 -
nofile:最大打开文件数。 -
nproc:最大进程数。
PAM 模块启用
确保 /etc/pam.d/common-session 文件中包含:
session required pam_limits.so
查看当前限制
使用 ulimit 命令查看当前用户的资源限制:
ulimit -a
提示 :某些限制(如内存、CPU时间)也应根据应用需求进行合理配置,避免资源耗尽导致系统崩溃。
本章总结与延伸
本章深入探讨了Linux系统中的用户与权限管理机制,从用户账户管理、密码策略配置、 sudo 权限控制到环境配置和资源限制,构建了一个完整的用户安全管理体系。通过精细化的权限分配与审计机制,系统管理员可以有效保障系统的安全性和稳定性。
在后续章节中,我们将进一步探讨Linux的进程管理与网络配置,深入理解系统运行时的资源调度与网络通信机制。
6. Linux进程管理与监控
Linux系统的稳定性与性能表现,很大程度上取决于进程的管理和资源调度。作为系统管理员或开发者,掌握如何查看、管理、优化进程是日常运维和性能调优的核心技能。本章将从进程的基本概念入手,逐步深入到进程查看、监控、资源分析以及调度优化等关键领域,帮助读者全面理解Linux系统中进程的运行机制和管理方法。
6.1 进程的基本概念与状态
在Linux系统中, 进程 (Process)是程序的一次执行实例。每个运行中的程序都对应一个或多个进程,操作系统通过进程来分配资源(如CPU时间、内存等)并执行任务。
6.1.1 进程生命周期与状态转换
Linux进程在其生命周期中会经历多个状态,主要包括以下几种:
| 状态 | 说明 |
|---|---|
| R (Running/Runnable) | 进程正在运行或准备运行 |
| S (Interruptible Sleep) | 等待某个事件完成(如IO操作) |
| D (Uninterruptible Sleep) | 不可中断的睡眠状态,通常用于内核IO操作 |
| Z (Zombie) | 子进程已终止,但父进程尚未回收其资源 |
| T (Stopped) | 进程被暂停(如通过Ctrl+Z) |
| X (Dead) | 进程已终止,通常不可见 |
进程状态转换流程图如下:
graph TD
A[新建进程] --> B[R状态]
B --> C{是否等待资源?}
C -->|是| D[S或D状态]
C -->|否| E[继续执行]
D --> F{资源是否可用?}
F -->|是| B
F -->|否| G[Z状态]
B --> H[终止]
H --> I[X状态]
流程图说明:
- 新建进程后进入运行状态;
- 若进程需要等待外部资源(如磁盘读写),则进入S或D状态;
- 当资源可用后,进程重新进入运行状态;
- 进程完成后进入终止状态,并最终变为不可见的X状态;
- 若子进程终止而父进程未回收,则会进入僵尸状态(Z)。
6.1.2 守护进程与前台进程
前台进程 是用户直接运行并与终端交互的进程,如在终端执行 vim 或 top 。这些进程在终端关闭时可能会被终止。
守护进程 (Daemon)是后台运行的特殊进程,不与终端关联,通常用于系统服务,如 systemd 、 sshd 、 nginx 等。
创建守护进程的基本步骤如下:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
pid_t pid = fork(); // 创建子进程
if (pid < 0) {
exit(EXIT_FAILURE); // fork失败
}
if (pid > 0) {
exit(EXIT_SUCCESS); // 父进程退出
}
setsid(); // 创建新会话
chdir("/"); // 更改工作目录为根目录
umask(0); // 重设文件权限掩码
close(STDIN_FILENO); // 关闭标准输入
close(STDOUT_FILENO); // 关闭标准输出
close(STDERR_FILENO); // 关闭标准错误
while (1) {
// 守护进程主体逻辑
sleep(60); // 每隔60秒执行一次
}
return 0;
}
代码解析:
1. fork() 创建子进程,父进程退出,确保子进程成为孤儿进程;
2. setsid() 创建新的会话,脱离终端;
3. chdir("/") 避免占用挂载点;
4. umask(0) 重置权限掩码;
5. 关闭标准输入输出,防止意外输出;
6. 进入无限循环,模拟守护进程持续运行。
6.2 进程查看与管理命令
Linux提供了多种命令用于查看和管理进程,帮助我们理解系统运行状态和资源使用情况。
6.2.1 ps、top、htop等工具使用
1. ps 命令
用于显示当前运行的进程快照。常见用法如下:
ps aux
输出说明:
| 字段 | 含义 |
|---|---|
| USER | 运行该进程的用户 |
| PID | 进程ID |
| %CPU | 占用的CPU百分比 |
| %MEM | 占用的内存百分比 |
| VSZ | 虚拟内存大小 |
| RSS | 物理内存使用量 |
| TTY | 终端关联(? 表示无终端) |
| STAT | 进程状态 |
| START | 启动时间 |
| TIME | 占用CPU时间 |
| COMMAND | 启动命令 |
2. top 命令
实时监控系统中进程的动态变化。
top
3. htop 命令 (需安装)
htop 是 top 的增强版,支持颜色显示和交互式操作。
sudo apt install htop
htop
6.2.2 kill与信号处理机制
1. kill 命令
用于向进程发送信号。常见信号如下:
| 信号编号 | 名称 | 功能 |
|---|---|---|
| 1 | SIGHUP | 通知进程重新加载配置 |
| 9 | SIGKILL | 强制终止进程 |
| 15 | SIGTERM | 请求进程正常退出 |
示例:
kill -9 1234
2. 信号处理机制
在程序中,可以使用 signal() 或 sigaction() 捕获信号,进行自定义处理:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void handle_signal(int sig) {
printf("Caught signal %d\n", sig);
exit(0);
}
int main() {
signal(SIGINT, handle_signal); // 捕获Ctrl+C
while (1) {
printf("Running...\n");
sleep(1);
}
return 0;
}
代码说明:
- 使用 signal(SIGINT, handle_signal) 注册信号处理函数;
- 当用户按下 Ctrl+C(发送SIGINT)时,调用 handle_signal 函数;
- 输出提示信息后退出程序。
6.3 资源监控与性能调优
有效的资源监控是识别系统瓶颈和进行性能调优的前提。
6.3.1 CPU、内存、磁盘使用监控
1. top 或 htop
可实时查看CPU和内存使用情况。
2. free 命令
查看内存使用情况:
free -h
输出示例:
| total | used | free | shared | buff/cache | available |
|---|---|---|---|---|---|
| 16G | 2G | 10G | 0.5G | 4G | 14G |
3. iostat 命令
监控磁盘I/O性能:
iostat -x 1
6.3.2 使用sar与vmstat进行趋势分析
1. sar 命令(来自 sysstat 包)
用于记录和报告系统活动历史。
sar -u 1 5 # 查看CPU使用率,每秒采样一次,共5次
输出示例:
| 时间 | %user | %nice | %system | %iowait | %steal | %idle |
|---|---|---|---|---|---|---|
| 10:00 | 5.2 | 0.0 | 3.1 | 1.2 | 0.0 | 90.5 |
2. vmstat 命令
显示虚拟内存统计信息:
vmstat 1 5
输出字段包括:
| procs | memory | swap | io | system | cpu |
|---|---|---|---|---|---|
| r b | swpd | free | si | so | bi |
| 0 0 | 0 | 1G | 0 | 0 | 100 |
字段说明:
- r : 运行队列中进程数量;
- b : 等待IO的进程数量;
- swpd : 交换内存使用量;
- free : 空闲内存;
- si/so : 交换内存读写;
- bi/bo : 块设备读写;
- in : 每秒中断次数;
- cs : 上下文切换次数;
- us/sy/id/wa : 用户态、系统态、空闲、等待IO时间占比。
6.4 进程调度与优先级调整
Linux使用优先级和调度策略来决定进程何时获得CPU资源。了解并合理调整进程优先级对于系统性能调优至关重要。
6.4.1 nice与renice命令使用
1. nice 命令
启动进程时设置其优先级(nice值):
nice -n 10 my_program
nice值范围: -20(最高优先级)到 19(最低优先级)。
2. renice 命令
运行中调整进程的nice值:
renice 5 -p 1234
输出示例:
1234: old priority 0, new priority 5
6.4.2 实时调度策略与优先级管理
Linux支持多种调度策略,主要包括:
| 调度策略 | 说明 |
|---|---|
| SCHED_OTHER | 默认调度策略(普通进程) |
| SCHED_FIFO | 实时FIFO调度,优先级高 |
| SCHED_RR | 实时轮转调度,带时间片 |
| SCHED_BATCH | 批处理调度 |
| SCHED_IDLE | 仅在系统空闲时运行 |
使用 chrt 设置调度策略:
chrt -f -p 99 1234
参数说明:
- -f :使用 SCHED_FIFO 策略;
- -p 99 :设置实时优先级为99(范围1~99);
- 1234 :目标进程PID。
注意: 实时调度需要 root 权限。
本章通过从进程的生命周期、状态转换、查看管理命令,到资源监控和调度策略的详细讲解,帮助读者建立起对Linux进程管理的全面认知。下一章我们将深入探讨Linux的网络配置与测试方法,进一步提升系统运维能力。
7. Linux网络配置与测试
7.1 网络接口与IP地址管理
Linux系统通过网络接口设备进行通信,常见的网络接口包括物理网卡(如eth0)、虚拟接口(如veth)、回环接口(lo)等。IP地址的管理可通过命令行工具实现,其中 ip 命令是现代Linux系统推荐使用的网络配置工具,而 ifconfig 则逐渐被取代,但在某些老旧系统中仍可见到。
7.1.1 使用 ip 与 ifconfig 配置网络
使用 ip 命令配置IP地址:
# 设置eth0接口的IP地址为192.168.1.100,子网掩码24位
sudo ip addr add 192.168.1.100/24 dev eth0
# 启用eth0接口
sudo ip link set eth0 up
# 查看当前接口信息
ip addr show
使用 ifconfig 命令配置IP地址(旧式方法):
# 设置eth0的IP地址为192.168.1.100,子网掩码255.255.255.0
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0
# 查看接口状态
ifconfig
⚠️ 注意:
ifconfig已被标记为过时,推荐使用ip命令进行配置。
7.1.2 静态与动态IP分配
- 静态IP分配 :适用于服务器或需固定地址的设备,需手动配置IP、网关、DNS等信息。
配置文件示例(以Debian/Ubuntu为例):
bash # /etc/network/interfaces auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8
- 动态IP分配 :通过DHCP自动获取IP地址,适合临时接入的设备。
bash # /etc/network/interfaces(Debian/Ubuntu) auto eth0 iface eth0 inet dhcp
7.2 网络路由与DNS配置
网络路由决定了数据包如何在网络中传输,而DNS负责将域名解析为IP地址。
7.2.1 route 与 ip route 命令详解
查看当前路由表:
# 使用旧式route命令
route -n
# 使用ip route命令(推荐)
ip route show
添加默认路由:
# 添加默认网关192.168.1.1
sudo ip route add default via 192.168.1.1 dev eth0
删除路由:
# 删除特定路由
sudo ip route del 192.168.2.0/24 via 192.168.1.1
7.2.2 /etc/resolv.conf 与DNS解析
该文件用于配置DNS服务器地址。例如:
# /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
⚠️ 注意:某些系统使用
systemd-resolved或NetworkManager管理DNS,修改此文件可能无效。应使用resolvectl或图形工具配置。
7.3 网络连通性测试与故障排查
7.3.1 ping 、 traceroute 、 mtr 使用
-
ping:测试与目标主机的连通性。
ping 8.8.8.8
-
traceroute:追踪数据包路径,用于定位网络断点。
traceroute google.com
-
mtr:结合ping与traceroute功能,动态展示网络质量。
mtr google.com
7.3.2 网络抓包与 tcpdump 分析
安装与基本使用:
# 安装tcpdump
sudo apt install tcpdump
# 抓取eth0接口上所有流量并保存为pcap文件
sudo tcpdump -i eth0 -w capture.pcap
分析特定端口流量:
# 抓取80端口的数据包
sudo tcpdump -i eth0 port 80 -w http.pcap
过滤特定主机流量:
# 抓取与192.168.1.100的通信
sudo tcpdump host 192.168.1.100 -w host_traffic.pcap
抓包文件可用Wireshark进行详细分析。
7.4 防火墙与端口管理
Linux系统通常使用 iptables 或 firewalld 作为防火墙管理工具。
7.4.1 iptables 与 firewalld 配置
使用 iptables 添加规则:
# 允许SSH端口(22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 拒绝所有其他入站流量
sudo iptables -A INPUT -j DROP
# 查看当前规则
sudo iptables -L -n
保存规则(Debian/Ubuntu):
sudo iptables-save > /etc/iptables/rules.v4
使用 firewalld 管理端口:
# 开放HTTP服务(80端口)
sudo firewall-cmd --permanent --add-service=http
# 重新加载配置
sudo firewall-cmd --reload
# 查看开放的服务
sudo firewall-cmd --list-services
7.4.2 端口扫描与服务检测
使用 nmap 进行端口扫描:
# 扫描目标主机开放的端口
nmap 192.168.1.100
检测特定端口是否开放:
nmap -p 22,80 192.168.1.100
服务版本检测:
nmap -sV 192.168.1.100
nmap是一款强大的网络探测工具,常用于安全审计和故障排查。
简介:本“Linux系统从入门到实战完整视频教程”全面深入讲解Linux操作系统,适用于服务器、云计算、物联网和开发环境。课程内容覆盖Linux基础命令、系统管理、网络配置、Shell脚本编程、服务部署、云平台应用及自动化运维等核心技能。适合初学者和IT从业者提升实战能力,帮助学员掌握Linux在运维、开发、部署等多场景的应用,助力职业发展。

315

被折叠的 条评论
为什么被折叠?



