Linux 系统实战完全指南
实验环境 :华为云 ECS | Ubuntu 24.04.4 LTS (Noble Numbat) | Kernel 6.8.0-106-generic | x86_64
规格:2vCPU / 4GiB (3.3Gi 可用) / 40GB SSD | 创建于 2026-06-15
目录
- [Linux 系统简介](#Linux 系统简介)
- 基本概念及操作
- 用户及文件权限管理
- [Linux 目录结构及文件基本操作](#Linux 目录结构及文件基本操作)
- 环境变量与文件查找
- 文件打包与解压缩
- 文件系统操作与磁盘管理
- [Linux 下的帮助命令](#Linux 下的帮助命令)
- [Linux 任务计划 crontab](#Linux 任务计划 crontab)
- 命令执行顺序控制与管道
- 简单的文本处理
- 数据流重定向
- 正则表达式基础
- [Linux 下软件安装](#Linux 下软件安装)
- [Linux 进程概念](#Linux 进程概念)
- [Linux 进程管理](#Linux 进程管理)
- [Linux 日志系统](#Linux 日志系统)
1. Linux 系统简介
1.1 Linux 为何物(What is Linux)
Linux 是一个类 Unix(Unix-like) 的开源操作系统内核(Kernel - 内核),由 Linus Torvalds 于 1991 年首次发布。
┌─────────────────────────────────────────────┐
│ 用户空间 (User Space) │
│ ┌─────────┐ ┌─────────┐ ┌───────────────┐ │
│ │ Shell │ │ GUI │ │ Applications │ │
│ │ (bash) │ │ (GNOME) │ │ (vim,gcc...) │ │
│ └────┬────┘ └────┬────┘ └───────┬───────┘ │
│ │ │ │ │
├───────┴───────────┴──────────────┴──────────┤
│ 系统调用接口 (System Call Interface) │
├─────────────────────────────────────────────┤
│ 内核空间 (Kernel Space) │
│ ┌──────────────────────────────────────┐ │
│ │ 进程管理 │ 内存管理 │ 文件系统 │ 网络栈 │ │
│ │ 设备驱动 │ 安全模块 │ I/O调度 │ IPC │ │
│ └──────────────────────────────────────┘ │
├─────────────────────────────────────────────┤
│ 硬件 (Hardware) │
│ CPU │ Memory │ Disk │ NIC │
└─────────────────────────────────────────────┘
关键区分 :严格来说 Linux 只是内核。我们常说的"Linux 系统"实际上是 GNU/Linux ------ Linux 内核 + GNU 工具链 + 桌面环境/服务器组件组成的完整操作系统。
1.2 Linux 历史简介(Brief History)
1969 ── Unix 诞生于 AT&T 贝尔实验室 (Ken Thompson, Dennis Ritchie)
│
1977 ── BSD (Berkeley Software Distribution) 发布
│
1983 ── Richard Stallman 发起 GNU 项目 (GNU's Not Unix!)
│
1987 ── Andrew Tanenbaum 发布 MINIX (教学用微型 Unix)
│
1991 ── Linus Torvalds 发布 Linux 0.01
│ "I'm doing a (free) operating system (just a hobby, won't be big...)"
│
1992 ── Linux 采用 GPL 许可证
│
1994 ── Linux 1.0 正式发布
│
2003 ── RHEL (Red Hat Enterprise Linux) 发布,企业级 Linux 开端
│
2004 ── Ubuntu 4.10 (Warty Warthog) 首次发布
│
2011 ── Linux 3.0 发布,Android 基于 Linux 成为最大移动 OS
│
2024 ── Ubuntu 24.04 LTS (Noble Numbat) --- 本实验环境
│
至今 ── 全球 Top500 超算 100% 运行 Linux,96.3% 的云服务器为 Linux
1.3 Linux 重要人物(Key Figures)
| 人物 | 贡献 | 名言/备注 |
|---|---|---|
| Linus Torvalds | Linux 内核创始人 | "Talk is cheap. Show me the code." |
| Richard Stallman (RMS) | GNU 项目创始人、GPL 许可证 | Free Software Foundation (FSF) |
| Ken Thompson | Unix 联合发明人 | 也发明了 B 语言 (C 语言前身) |
| Dennis Ritchie | Unix 联合发明人,C 语言之父 | "UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." |
| Andrew Tanenbaum | MINIX 作者 | Linus 的技术辩论对手,间接促成了 Linux 的诞生 |
| Mark Shuttleworth | Ubuntu 创始人 | Canonical 公司 CEO,南非宇航员 |
1.4 Linux 与 Windows 的不同(Linux vs Windows)
| 对比维度 | Linux | Windows |
|---|---|---|
| 内核类型 | 宏内核(Monolithic Kernel) | 混合内核(Hybrid Kernel) |
| 文件系统 | ext4 / XFS / Btrfs(树形单根 /) |
NTFS / FAT32(盘符 C:\ D:\) |
| 路径分隔符 | 正斜杠 / |
反斜杠 \ |
| 大小写敏感 | 是 (File.txt ≠ file.txt) |
否(不区分) |
| 权限模型 | UGO(User/Group/Other)+ ACL | ACL(Access Control List) |
| 软件安装 | 包管理器(apt/dnf/pacman) | .exe/.msi 安装包 |
| 命令行 | Bash/Zsh/Fish(一等公民) | CMD/PowerShell |
| 桌面环境 | GNOME/KDE/XFCE(可选多桌面) | Windows Shell(唯一) |
| 源码开放性 | 开源(GPL) | 闭源专有 |
| 商业授权 | 免费(部分发行版收费为服务费) | 需购买许可证 |
| 服务器占有率 | 96%+(2024年数据) | <4% |
1.5 如何学习 Linux(How to Learn Linux)
阶段一:环境准备
├── 虚拟机 (VirtualBox / VMware) → 入门推荐
├── 云服务器 (华为云 / 阿里云 ECS) ← 本教程使用
├── WSL2 (Windows Subsystem for Linux)
└── Docker 容器
阶段二:核心技能
├── 命令行基本功 (cd/ls/cp/mv/rm → grep/sed/awk)
├── 权限管理 (chmod/chown/umask)
├── 软件管理 (apt/dpkg/snap)
├── 进程管理 (ps/top/kill/nohup)
└── Shell 脚本 (变量/循环/函数)
阶段三:进阶方向
├── 运维方向: 日志/监控/自动化/CI-CD
├── 开发方向: 编译工具链/Vim/IDE
├── 安全方向: 防火墙/审计/渗透测试
└── 云原生方向: Docker/K8s/Istio
学习原则:
- 动手第一 --- 每个命令自己敲一遍,看输出,理解输出
- man 是你最好的老师 --- 遇到不认识的命令,第一时间
man xxx- 记录踩坑 --- 每个报错都是学习机会
- 先理解再搜索 --- 别做"复制粘贴工程师"
本机环境确认:
bash
$ uname -a
Linux ecs-b97e-0001 6.8.0-106-generic #106-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 6 07:58:08 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.4 LTS (Noble Numbat)"
$ free -h
total used free shared buff/cache available
Mem: 3.3Gi 456Mi 2.2Gi 2.5Mi 931Mi 2.9Gi
Swap: 0B 0B 0B
$ df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 3.6G 34G 10% /
2. 基本概念及操作
2.1 Linux 基本命令(Essential Commands)
Shell(壳)是用户与内核交互的命令解释器(Command Interpreter)。Bash (Bourne Again SHell) 是 Linux 默认 Shell。
┌──────────────────────────────────────┐
│ Terminal (终端模拟器) │
│ ┌────────────────────────────────┐ │
│ │ user@host:~$ ls -la │ │ ← 命令输入
│ │ drwxr-xr-x 2 root root 4096 │ │ ← 标准输出 (stdout)
│ │ $ │ │ ← 提示符 (PS1)
│ └────────────────────────────────┘ │
│ ↑ 用户输入 │
│ ↓ Shell 解析执行 │
│ Shell → 系统调用 → 内核 → 硬件 │
└──────────────────────────────────────┘
核心命令速览
| 命令 | 全称 | 功能 | 常用参数 |
|---|---|---|---|
ls |
list | 列出目录内容 | -l 详细, -a 全部, -h 人类可读 |
cd |
change directory | 切换目录 | ~ 家目录, - 上次目录, .. 上级 |
pwd |
print working directory | 显示当前目录 | -P 物理路径 |
mkdir |
make directory | 创建目录 | -p 递归创建 |
touch |
touch | 创建空文件/更新时间戳 | --- |
cp |
copy | 复制文件 | -r 递归, -p 保留属性 |
mv |
move | 移动/重命名 | -i 交互确认 |
rm |
remove | 删除文件 | -r 递归, -f 强制 |
cat |
concatenate | 查看/拼接文件 | -n 显示行号 |
echo |
echo | 输出文本 | -e 转义字符, -n 不换行 |
真实实操:
bash
# 切换到实验目录
$ cd /tmp && mkdir -p linux-lab && cd linux-lab && pwd
/tmp/linux-lab
# 查看初始状态
$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Jun 15 21:50 .
drwxrwxrwt 15 root root 4096 Jun 15 21:50 ..
# 创建文件
$ touch test.txt && ls -l test.txt
-rw-r--r-- 1 root root 0 Jun 15 21:50 test.txt
# 写入内容
$ echo "Hello Linux" > hello.txt && cat hello.txt
Hello Linux
# 复制文件
$ cp hello.txt hello.bak && ls -l
total 8
-rw-r--r-- 1 root root 12 Jun 15 21:50 hello.bak
-rw-r--r-- 1 root root 12 Jun 15 21:50 hello.txt
-rw-r--r-- 1 root root 0 Jun 15 21:50 test.txt
# 删除文件
$ rm test.txt && ls
hello.bak hello.txt
2.2 通配符的使用(Wildcards / Globbing)
通配符(Wildcard)是 Shell 提供的文件名匹配机制,不是正则表达式!
| 通配符 | 含义 | 示例 |
|---|---|---|
* |
匹配任意数量(含0)的任意字符 | ls *.txt → 所有 .txt 文件 |
? |
匹配任意单个字符 | ls file?.txt → file1.txt, file2.txt |
[abc] |
匹配 [] 中的任意一个字符 |
ls [ab]*.txt → a开头或b开头的 .txt |
[a-z] |
匹配范围中的任意一个字符 | ls [a-z]*.sh → 小写字母开头的 .sh |
{a,b} |
展开为逗号分隔的列表(Brace Expansion) | ls *.{txt,csv} → 所有 .txt 和 .csv |
真实实操:
bash
# 创建测试文件群
$ cd /tmp/linux-lab && mkdir -p wildcard-demo && cd wildcard-demo
$ touch file1.txt file2.txt file3.txt data1.csv data2.csv image1.png script.sh README.md
# 通配符 * 演示
$ ls *.txt
file1.txt file2.txt file3.txt
# 单字符 ? 演示
$ ls file?.txt
file1.txt file2.txt file3.txt
# 花括号 {} 展开 - 匹配多种后缀
$ ls *.{txt,csv}
data1.csv data2.csv file1.txt file2.txt file3.txt
# 字符范围 [a-z] 演示
$ ls [a-z]*.sh
script.sh
⚠️ 踩坑提醒 :通配符 ≠ 正则表达式。
*在通配符中匹配"任意字符序列",在正则中匹配"0次或多次前一个字符"。例如file*.txt在通配符中匹配file1.txt,但在正则中file*.txt匹配的是fileee.txt(e重复0次或多次)。
2.3 查看帮助文档(Help & Documentation)
参见 [第8章:Linux 下的帮助命令](#第8章:Linux 下的帮助命令)。
3. 用户及文件权限管理
3.1 Linux 用户管理(User Management)
Linux 是**多用户(Multi-user)**操作系统。用户信息存储在 /etc/passwd,密码哈希存储在 /etc/shadow。
/etc/passwd 格式:
┌──────────┬──┬──────┬──────┬──────────────┬─────────────┬──────────────┐
│ username │x │ UID │ GID │ GECOS(描述) │ Home目录 │ 登录Shell │
└──────────┴──┴──────┴──────┴──────────────┴─────────────┴──────────────┘
例: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin ← 系统用户,禁止登录
UID(User Identifier)范围:
| UID 范围 | 类型 | 说明 |
|---|---|---|
| 0 | root(超级用户) | 拥有所有权限 |
| 1-999 | 系统用户(System User) | 用于运行服务,不能登录 |
| 1000+ | 普通用户(Regular User) | 日常使用 |
真实实操:
bash
# 查看当前用户身份
$ whoami
root
$ id
uid=0(root) gid=0(root) groups=0(root)
# 用户数据库
$ head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
# 用户组数据库
$ head -5 /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog
| 用户管理命令 | 功能 |
|---|---|
useradd |
添加用户 |
usermod |
修改用户 |
userdel |
删除用户 |
passwd |
设置/修改密码 |
groupadd |
添加组 |
su |
切换用户(Switch User) |
sudo |
以 root 身份执行命令 |
3.2 Linux 权限管理(File Permissions)
文件权限格式(ls -l 输出):
┌──┬──────────┬───┬───┬────────────┬──────┬──────────────┬─────────┐
│ -│ rwxr-xr-x│ 1 │root│ root │ 1234 │ Jun 15 21:50 │ file.txt│
└──┴──────────┴───┴───┴────────────┴──────┴──────────────┴─────────┘
类型 权限 硬链接 属主 属组 大小 修改时间 文件名
^ ^^^^^
│ │
└─ - 普通文件 └─ 权限共10位字符
d 目录 第1位: 文件类型
l 符号链接 第2-4位: 属主权限 (User) rwx
c 字符设备 第5-7位: 属组权限 (Group) r-x
b 块设备 第8-10位: 其他人权限 (Other) r-x
p 管道
s 套接字
权限含义:
┌──────┬──────┬────────────────────────────────┐
│ 字符 │ 数字 │ 含义 │
├──────┼──────┼────────────────────────────────┤
│ r │ 4 │ 读取 (Read) │
│ w │ 2 │ 写入 (Write) │
│ x │ 1 │ 执行 (eXecute) / 目录: 进入 │
│ - │ 0 │ 无权限 │
└──────┴──────┴────────────────────────────────┘
常用组合:
chmod 755 → rwxr-xr-x (目录/可执行文件)
chmod 644 → rw-r--r-- (普通文件)
chmod 600 → rw------- (私密配置文件)
chmod 700 → rwx------ (私密目录)
真实实操:
bash
# 创建脚本并查看权限
$ cd /tmp/linux-lab
$ echo -e "#!/bin/bash\necho 'test'" > test.sh
$ ls -l test.sh
-rw-r--r-- 1 root root 25 Jun 15 21:50 test.sh
# ↑ 初始权限: 属主可读写, 其他只读
# 添加可执行权限 (755 = rwxr-xr-x)
$ chmod 755 test.sh && ls -l test.sh
-rwxr-xr-x 1 root root 25 Jun 15 21:50 test.sh
# ↑ 现在所有用户都能执行
chmod 两种模式对比:
| 模式 | 语法 | 示例 | 适用场景 |
|---|---|---|---|
| 数字模式(Octal) | chmod 755 file |
一次性设置全部权限 | 脚本部署、CI/CD |
| 符号模式(Symbolic) | chmod u+x file |
只改特定角色的特定权限 | 调试时微调 |
⚠️ 常见踩坑 :
chmod 777千万别滥用!给所有人所有权限看似方便,实际是安全隐患。严格遵守最小权限原则(Principle of Least Privilege)。
4. Linux 目录结构及文件基本操作
4.1 FHS --- 每个目录的大体内容
**FHS(Filesystem Hierarchy Standard - 文件系统层次结构标准)**定义了 Linux 目录的组织方式。
/ ← 根目录 (Root),一切起点
├── /bin → /usr/bin ← 基本命令二进制文件 (Ubuntu 24.04 合并)
├── /boot ← 内核镜像 & 引导加载器
├── /dev ← 设备文件 (device files)
├── /etc ← 系统配置文件 (Host-Specific Config)
│ ├── passwd # 用户信息
│ ├── shadow # 加密密码
│ ├── fstab # 文件系统挂载表
│ ├── hostname # 主机名
│ └── apt/sources.list # 软件源
├── /home ← 普通用户家目录
├── /lib → /usr/lib ← 共享库 & 内核模块
├── /media ← 可移动设备挂载点 (U盘/CD)
├── /mnt ← 临时挂载点
├── /opt ← 第三方应用 (optional)
├── /proc ← 进程 & 内核信息 (虚拟文件系统)
│ └── cpuinfo # CPU信息
├── /root ← root 用户家目录
├── /run ← 运行时临时文件 (tmpfs)
├── /sbin → /usr/sbin ← 系统管理命令
├── /srv ← 服务数据 (Web/FTP)
├── /sys ← 内核设备信息 (sysfs)
├── /tmp ← 临时文件 (重启可能清空)
├── /usr ← Unix System Resources (只读数据)
│ ├── bin # 用户命令
│ ├── lib # 库文件
│ ├── local # 本地安装的软件
│ └── share # 架构无关数据 (文档/图标)
└── /var ← 可变数据 (variable)
├── log # 系统日志
├── cache # 应用缓存
└── spool # 队列 (邮件/打印)
真实实操:
bash
$ ls -la /
total 100
drwxr-xr-x 24 root root 4096 Jun 15 21:13 .
drwxr-xr-x 24 root root 4096 Jun 15 21:13 ..
lrwxrwxrwx 1 root root 7 Apr 22 2024 bin -> usr/bin ← 注意软链接
drwxr-xr-x 3 root root 4096 Mar 30 11:53 boot
drwxr-xr-x 19 root root 3940 Jun 15 21:13 dev
drwxr-xr-x 118 root root 12288 Jun 15 21:20 etc
drwxr-xr-x 2 root root 4096 Mar 30 11:49 home
lrwxrwxrwx 1 root root 7 Apr 22 2024 lib -> usr/lib
drwx------ 8 root root 4096 Jun 15 21:47 root
drwxrwxrwt 15 root root 4096 Jun 15 21:50 tmp
drwxr-xr-x 12 root root 4096 Apr 23 2024 usr
drwxr-xr-x 13 root root 4096 Mar 30 11:48 var
Ubuntu 24.04 新特性 :
/bin→/usr/bin、/sbin→/usr/sbin、/lib→/usr/lib全部使用符号链接合并,简化了目录结构。
4.2 文件的属性(File Attributes)
bash
# file 命令 --- 探测文件类型
$ file hello.txt
hello.txt: ASCII text
$ file /bin/ls
/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, ...
# ↑ ELF = Executable and Linkable Format (Linux 可执行文件格式)
# LSB = Least Significant Byte first (小端序)
# PIE = Position Independent Executable (安全特性: ASLR)
# stat 命令 --- 查看文件详细属性
$ touch newfile && stat newfile
File: newfile
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 253,1 Inode: 395682 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-06-15 21:50:56.789047448 +0800 ← atime (访问时间)
Modify: 2026-06-15 21:50:56.789047448 +0800 ← mtime (修改时间)
Change: 2026-06-15 21:50:56.789047448 +0800 ← ctime (属性变更时间)
Birth: 2026-06-15 21:50:56.789047448 +0800 ← 创建时间 (ext4支持)
Linux 文件时间三剑客:
| 时间 | 缩写 | 含义 | 何时更新 |
|---|---|---|---|
| Access Time | atime | 最后读取时间 | cat/less/grep 读取文件 |
| Modify Time | mtime | 内容最后修改时间 | 文件内容被修改 |
| Change Time | ctime | 元数据最后变更时间 | 权限/属主/硬链接数变更 |
4.3 文件基本操作命令详解
| 命令 | 核心参数 | 用途 |
|---|---|---|
touch |
-t 指定时间, -a 仅改 atime |
创建空文件/更新时间戳 |
file |
-i MIME类型, -b 简要输出 |
探测文件类型 |
rm |
-r 递归, -f 强制, -i 确认, -v 详细 |
删除文件 |
mv |
-i 确认覆盖, -n 不覆盖, -v 详细 |
移动/重命名 |
真实实操:
bash
$ cd /tmp/linux-lab && file hello.txt
hello.txt: ASCII text
$ mv hello.txt hello_renamed.txt && ls
hello.bak hello_renamed.txt newfile test.sh wildcard-demo
$ touch delete_me && rm -v delete_me
removed 'delete_me'
# ↑ -v 参数让 rm 输出详细信息
5. 环境变量与文件查找
5.1 环境变量 --- 设置与修改
**环境变量(Environment Variable)**是操作系统运行环境中的动态键值对,影响进程的行为。
运行中的 Shell 进程
├── 本地变量 (Local Variable) ← 仅当前 Shell 可见,set 查看
│ └── export 后升级为 ↓
├── 环境变量 (Environment Variable) ← 子进程可继承,env 查看
│ ├── PATH → 可执行文件搜索路径
│ ├── HOME → 当前用户家目录
│ ├── SHELL → 默认 Shell
│ ├── USER → 当前用户名
│ ├── PWD → 当前工作目录
│ └── LANG → 语言/编码设置
└── Shell 变量 ← Shell 内部专用 ($RANDOM, $?, $$)
真实实操:
bash
# 查看关键环境变量
$ echo "PATH=$PATH"
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ echo "HOME=$HOME"
HOME=/root
$ echo "SHELL=$SHELL"
SHELL=/bin/bash
# 查看所有环境变量(前10行)
$ env | head -10
SHELL=/bin/bash
PWD=/root
LOGNAME=root
HOME=/root
LANG=en_US.UTF-8
USER=root
SHLVL=1
PATH 解析顺序(从左到右):
/usr/local/sbin → /usr/local/bin → /usr/sbin → /usr/bin → /sbin → /bin
↑ 本地安装 ↑ 系统级 ↑ 基本命令
优先级最高 优先级最低
5.2 变量操作命令
| 操作 | 命令 | 说明 |
|---|---|---|
| 设置本地变量 | MY_VAR="hello" |
仅当前 Shell |
| 升级为环境变量 | export MY_VAR |
子进程可继承 |
| 一步到位 | export MY_VAR="hello" |
设置+导出 |
| 删除变量 | unset MY_VAR |
取消变量 |
| 追加 PATH | export PATH=$PATH:/new/path |
注意用 $PATH 保留原值 |
bash
# 演示
$ export MY_VAR="Hello_from_linux_lab"
$ echo "MY_VAR=$MY_VAR"
MY_VAR=Hello_from_linux_lab
5.3 文件查找
| 命令 | 原理 | 速度 | 实性时 | 适用场景 |
|---|---|---|---|---|
which |
搜索 PATH 中的可执行文件 | 极快 | 实时 | 找命令位置 |
whereis |
搜索二进制/源码/man 页面 | 快 | 实时 | 找程序的全部关联文件 |
find |
遍历文件系统 | 慢 | 实时 | 按名称/大小/时间/权限查找 |
locate |
查询索引数据库 (updatedb) | 极快 | 非实时 | 模糊查找文件名 |
真实实操:
bash
# which --- 定位命令位置
$ which python3
/usr/bin/python3
# whereis --- 查找命令及相关文件
$ whereis python3
python3: /usr/bin/python3 /usr/lib/python3 /etc/python3 /usr/share/python3
# find --- 按名称查找(全文件系统遍历)
$ cd /tmp/linux-lab
$ find . -name "*.txt" -type f
./hello_renamed.txt
./wildcard-demo/file2.txt
./wildcard-demo/file3.txt
./wildcard-demo/file1.txt
# type --- 区分内置命令与外部命令
$ type ls
ls is /usr/bin/ls ← 外部命令,位于磁盘
$ type cd
cd is a shell builtin ← 内置命令,Shell 内部实现
typevswhich:type是 Shell 内置命令,能区分内置/外部/别名/函数。which只查 PATH 中的可执行文件。判断命令类型优先用type。
6. 文件打包与解压缩
6.1 常用压缩工具对比
| 工具 | 压缩格式 | 压缩率 | 速度 | 常用场景 |
|---|---|---|---|---|
zip |
.zip | 低 | 快 | Windows 兼容 |
gzip |
.gz | 中 | 快 | Linux 通用 |
bzip2 |
.bz2 | 高 | 慢 | 高压缩需求 |
xz |
.xz | 最高 | 最慢 | 长期归档 |
打包 (Archive) vs 压缩 (Compress)
─────────────────────────────────────
tar : 打包(把多个文件拼成一个大文件)
gzip/bzip2 : 压缩(减少文件体积)
tar.gz : 先打包再压缩(Linux 标准做法)
6.2 zip 命令
zip (Zip) 是跨平台兼容的压缩格式。
| 参数 | 含义 |
|---|---|
-r |
递归压缩目录(Recursive) |
-e |
加密压缩 |
-m |
压缩后删除原文件 |
6.3 tar 命令 --- Linux 打包标准
tar (Tape ARchive) 是 Linux/Unix 标准的归档工具。
tar [操作参数] [压缩参数] -f [文件名] [待打包文件...]
^^^^^^^^ ^^^^^^^^
c = create 打包 z = gzip 压缩
x = extract 解包 j = bzip2 压缩
t = list 查看 J = xz 压缩
v = verbose 详细 (不加) = 仅打包不压缩
真实实操:
bash
# 创建测试文件
$ cd /tmp/linux-lab && mkdir -p pack-demo && cd pack-demo
$ echo "file1 content" > file1.txt
$ echo "file2 content" > file2.txt
$ mkdir subdir && echo "sub file" > subdir/sub.txt
# === zip 压缩 ===
$ zip -r demo.zip file1.txt file2.txt subdir
adding: file1.txt (stored 0%)
adding: file2.txt (stored 0%)
adding: subdir/ (stored 0%)
adding: subdir/sub.txt (stored 0%)
# 查看压缩包内容
$ unzip -l demo.zip
Archive: demo.zip
Length Date Time Name
--------- ---------- ----- ----
14 2026-06-15 21:54 file1.txt
14 2026-06-15 21:54 file2.txt
0 2026-06-15 21:54 subdir/
9 2026-06-15 21:54 subdir/sub.txt
--------- -------
37 4 files
# === tar 打包(不压缩) ===
$ tar -cvf demo.tar file1.txt file2.txt subdir
file1.txt
file2.txt
subdir/
subdir/sub.txt
# === tar.gz 压缩 ===
$ tar -czvf demo.tar.gz file1.txt file2.txt subdir
file1.txt
file2.txt
subdir/
subdir/sub.txt
# === tar.bz2 压缩 ===
$ tar -cjvf demo.tar.bz2 file1.txt file2.txt subdir
# === 大小对比 ===
$ ls -lhS demo.*
-rw-r--r-- 1 root root 10K Jun 15 21:54 demo.tar ← 最大: 无压缩
-rw-r--r-- 1 root root 649 Jun 15 21:54 demo.zip ← zip: 中等
-rw-r--r-- 1 root root 210 Jun 15 21:54 demo.tar.bz2 ← bz2: 压缩好
-rw-r--r-- 1 root root 204 Jun 15 21:54 demo.tar.gz ← gz: 压缩最好(本例)
小文件压缩的启示 :本实验中 gz (204B) 比 bz2 (210B) 还小,因为文件极小(几十字节)时压缩算法开销反而占主导。大文件场景下 bz2/xz 优势才明显。
常用组合速查表:
| 操作 | 命令 |
|---|---|
| 打包为 .tar.gz | tar -czvf archive.tar.gz dir/ |
| 解压 .tar.gz | tar -xzvf archive.tar.gz |
| 打包为 .tar.bz2 | tar -cjvf archive.tar.bz2 dir/ |
| 解压 .tar.bz2 | tar -xjvf archive.tar.bz2 |
| 查看压缩包内容 | tar -tvf archive.tar.gz |
| 解压到指定目录 | tar -xzvf archive.tar.gz -C /target/ |
解压演示:
bash
$ mkdir -p extract-test && cd extract-test
$ tar -xzvf ../demo.tar.gz
file1.txt
file2.txt
subdir/
subdir/sub.txt
$ ls -R
.:
file1.txt file2.txt subdir
./subdir:
sub.txt
7. 文件系统操作与磁盘管理
7.1 磁盘空间查看 --- df / du
| 命令 | 全称 | 功能 | 关键参数 |
|---|---|---|---|
df |
Disk Free | 查看文件系统磁盘空间 | -h 人类可读, -i inode |
du |
Disk Usage | 查看目录/文件占用空间 | -h 人类可读, -s 汇总, --max-depth=N |
真实实操:
bash
# df --- 查看各挂载点的磁盘使用情况
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 341M 1.1M 340M 1% /run
/dev/vda1 40G 3.6G 34G 10% /
tmpfs 1.7G 0 1.7G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
# df -i --- 查看 inode 使用情况
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda1 2621440 108983 2512457 5% /
# ↑ 总计 ↑已用 ↑剩余 ↑使用率
# 当 IUse% 达到 100% 时,即使磁盘有空闲空间也无法创建新文件!
# du --- 查看目录占用
$ du -sh /tmp/linux-lab
40K /tmp/linux-lab
$ du -sh /var/log
14M /var/log
# du 按大小排序(找大文件利器)
$ du -h --max-depth=1 / 2>/dev/null | sort -rh | head -10
3.6G /
2.8G /usr ← 占用最大
470M /var
225M /CloudrResetPwdAgent
104M /boot
6.4M /etc
1.9M /tmp
1.5M /root
1.1M /run
16K /lost+found
⚠️ 踩坑:inode 耗尽 --- 当大量小文件(如邮件队列、session文件)耗尽 inode 时,
df -h显示磁盘有空间,但无法创建新文件。务必也检查df -i。
7.2 磁盘与挂载 --- lsblk / mount / fstab
bash
# lsblk --- 列出块设备(最直观的磁盘视图)
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 253:0 0 40G 0 disk ← 虚拟磁盘
└─vda1 253:1 0 40G 0 part / ← 唯分区,挂载到 /
# fdisk -l --- 查看分区详情
$ fdisk -l
Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors
Units: sectors of 1 * 512 = 512 bytes
Device Boot Start End Sectors Size Id Type
/dev/vda1 * 2048 83886046 83883999 40G 83 Linux
# 当前挂载情况
$ mount | head -5
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=1704128k)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620)
tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=349176k)
# /etc/fstab --- 开机自动挂载配置
$ cat /etc/fstab
UUID=35f7b939-7473-4e43-8527-a2f647b4c6a2 / ext4 defaults 0 1
# ↑ 设备UUID(稳定标识) ↑挂载点 ↑类型 ↑选项 ↑dump ↑fsck顺序
fstab 各字段含义:
| 字段 | 含义 | 示例 |
|---|---|---|
| 设备 | UUID 或设备路径 | UUID=xxx / /dev/vda1 |
| 挂载点 | 挂载目录 | / /home |
| 文件系统类型 | ext4/xfs/ntfs/nfs | ext4 |
| 挂载选项 | defaults/ro/noexec/nosuid | defaults |
| dump | 备份标记 (0=不备份) | 0 |
| fsck | 开机检查顺序 (0=不检查, 1=根, 2=其他) | 1 |
7.3 磁盘知识
物理磁盘 → 分区 (Partition) → 文件系统 (Filesystem) → 挂载点 (Mount Point)
/dev/vda /dev/vda1 ext4 /
Linux 常见文件系统对比:
┌──────────┬──────────┬──────────┬──────────┬──────────┐
│ ext4 │ XFS │ Btrfs │ ZFS │ tmpfs │
├──────────┼──────────┼──────────┼──────────┼──────────┤
│ 最成熟 │ 大文件强 │ 快照/压缩│ 最强特性 │ 内存文件 │
│ 默认选择 │ RHEL默认 │ 实验创新 │ Ubuntu │ 临时文件 │
│ 稳定可靠 │ 高性能 │ CoW │ 功能丰富 │ 重启消失 │
└──────────┴──────────┴──────────┴──────────┴──────────┘
8. Linux 下的帮助命令
8.1 内建命令与外部命令
bash
$ type echo && type ls && type pwd && type cd
echo is a shell builtin ← 内置命令 (builtin): Shell 内部实现,无独立可执行文件
ls is /usr/bin/ls ← 外部命令: 磁盘上的独立可执行文件
pwd is a shell builtin ← 内置命令(也有 /usr/bin/pwd 外部版本)
cd is a shell builtin ← 纯内置命令(必须由 Shell 实现,因为要改变 Shell 状态)
为什么
cd必须是内置命令? --- 外部命令在子进程中执行,无法改变父进程(Shell)的工作目录。所以cd必须由 Shell 自身实现。
8.2 help / man / info 三剑客
| 命令 | 适用对象 | 详细程度 | 使用方式 |
|---|---|---|---|
help |
Bash 内置命令 | 简洁 | help cd |
--help |
外部命令 | 简洁 | ls --help |
man |
所有命令/系统调用/配置文件 | 详细 | man ls |
info |
GNU 工具 | 最详细(超文本) | info coreutils |
真实实操:
bash
# help --- 查看内置命令帮助
$ help cd | head -5
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
Change the current directory to DIR.
# man --- 最常用的帮助系统
$ man -w ls # 查看 man page 文件位置
/usr/share/man/man1/ls.1.gz # 第1章:用户命令
# man 手册章节(Manual Sections)
$ man man | grep "The table below"
# 1 可执行程序或 Shell 命令 ← 最常用
# 2 系统调用 (内核函数)
# 3 库函数
# 4 特殊文件 (通常是 /dev 中的设备)
# 5 文件格式和约定 (如 /etc/passwd)
# 6 游戏
# 7 杂项 (包括宏包和约定)
# 8 系统管理命令 (通常仅 root)
# 指定章节查看
$ man 1 printf # 查看命令 printf
$ man 3 printf # 查看 C 库函数 printf
# info --- GNU 超文本帮助系统
$ info --version
info (GNU texinfo) 7.1
# /usr/share/doc --- 软件包文档
$ ls /usr/share/doc/ | head -10
adduser
apparmor
apt
base-files
⚠️ 常见误区 :
man不是 "manual" 的缩写? 不,它就是 "manual" 的缩写。手册页 (man pages) 是最全面、最权威的命令文档来源。养成用man的好习惯比记住所有参数更有价值。
9. Linux 任务计划 crontab
9.1 crontab 语法
Cron(Chronos,希腊语"时间")是 Linux 的定时任务调度器。
crontab 时间格式:
┌───────────── 分钟 (0 - 59)
│ ┌───────────── 小时 (0 - 23)
│ │ ┌───────────── 日期 (1 - 31)
│ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ ┌───────────── 星期 (0 - 7) (0和7都表示周日)
│ │ │ │ │
* * * * * command_to_execute
常用时间表达式:
| 表达式 | 含义 |
|---|---|
* * * * * |
每分钟执行 |
0 * * * * |
每小时整点 |
0 2 * * * |
每天凌晨 2:00 |
0 2 * * 1 |
每周一凌晨 2:00 |
0 2 1 * * |
每月 1 号凌晨 2:00 |
*/5 * * * * |
每 5 分钟 |
0 9-18 * * * |
每天 9:00-18:00 整点 |
0 9,12,18 * * * |
每天 9:00, 12:00, 18:00 |
真实实操:
bash
# 查看当前 crontab
$ crontab -l
no crontab for root
# 设置测试任务(每5分钟执行一次)
$ (crontab -l 2>/dev/null; echo "*/5 * * * * echo cron-test >> /tmp/cron-test.log") | crontab -
# 验证
$ crontab -l
*/5 * * * * echo cron-test >> /tmp/cron-test.log
# 查看 cron 日志(确认任务被加载)
$ grep -i cron /var/log/syslog | tail -3
2026-06-15T21:54:02+08:00 localhost crontab[11337]: (root) LIST (root)
2026-06-15T21:54:02+08:00 localhost crontab[11336]: (root) REPLACE (root)
2026-06-15T21:54:02+08:00 localhost crontab[11338]: (root) LIST (root)
# 清理
$ crontab -r
crontab cleared
crontab 管理命令:
| 命令 | 功能 |
|---|---|
crontab -l |
列出当前用户的定时任务 |
crontab -e |
编辑定时任务(推荐,会语法检查) |
crontab -r |
删除所有定时任务 |
crontab -u user -l |
查看指定用户的定时任务(需 root) |
⚠️ 踩坑记录:
- crontab 中的
%需要转义为\%,否则会被解释为换行- crontab 的环境变量极其精简,不要假设 PATH 与你登录时一致
- 命令中应使用绝对路径 ,如
/usr/bin/python3而不是python3- 日志输出用
>> /var/log/xxx.log 2>&1同时捕获 stdout 和 stderr
10. 命令执行顺序控制与管道
10.1 执行顺序控制
; 顺序执行,不管成败
&& 前一个成功 (exit code=0) 才执行后一个
|| 前一个失败 (exit code≠0) 才执行后一个
| 管道:前一个的 stdout → 后一个的 stdin
真实实操:
bash
# ; --- 顺序执行(互不影响)
$ echo "A" ; echo "B" ; echo "C"
A
B
C
# && --- 条件执行(成功才继续)
$ echo "step1 success" && echo "step2 success" && echo "step3 success"
step1 success
step2 success
step3 success
# 实际场景:编译 && 测试 && 部署
# make && make test && make deploy
# || --- 失败时才执行(错误处理)
$ false || echo "previous failed, this runs"
previous failed, this runs
# 实际场景:命令失败时记录日志
# critical_command || logger -t "monitor" "CRITICAL: command failed!"
10.2 管道(Pipe)
**管道(Pipe, |)**是 Linux 哲学的精髓------"小工具组合完成大任务"。
命令A (stdout) ──→ | ──→ 命令B (stdin)
│
命令C (stdin) ←── | ←── 命令B (stdout)
核心命令组合:
| 命令 | 全称 | 功能 | 示例 |
|---|---|---|---|
cut |
cut | 按列提取 | cut -d: -f1,3,7 |
grep |
Global Regular Expression Print | 文本过滤 | grep "root" |
wc |
Word Count | 计数 | wc -l (行), wc -c (字节) |
sort |
sort | 排序 | sort -rn (逆序数字) |
uniq |
unique | 去重/统计 | uniq -c (计数) |
真实实操:
bash
# cut --- 按分隔符提取列
$ head -3 /etc/passwd | cut -d: -f1,3,7
root:0:/bin/bash
daemon:1:/usr/sbin/nologin
bin:2:/usr/sbin/nologin
# ↑ -d: 指定冒号为分隔符
# -f1,3,7 提取第1、3、7字段
# grep --- 文本过滤
$ grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
# ↑ 匹配包含 "root" 的行
# wc --- 计数
$ wc -l /etc/passwd # 行数
35 /etc/passwd
$ wc -c /etc/passwd # 字节数
1863 /etc/passwd
$ wc -w /etc/passwd # 单词数
52 /etc/passwd
# sort + uniq --- 统计 Shell 使用分布
$ cat /etc/passwd | cut -d: -f7 | sort | uniq -c | sort -rn | head -5
30 /usr/sbin/nologin ← 30个系统用户,禁止登录
3 /bin/false ← 3个禁用账户
1 /bin/sync
1 /bin/bash ← 仅 root 使用 bash!
10.3 管道综合实战
bash
# 找出所有可使用 bash 登录的用户
$ cat /etc/passwd | grep "/bin/bash" | cut -d: -f1 | sort
root
# ↑ 读取 ↑ 过滤bash用户 ↑ 取用户名 ↑ 排序
# 数据源 过滤器 提取器 排序器
11. 简单的文本处理
11.1 常见文本处理命令速查
| 命令 | 功能 | 典型用法 |
|---|---|---|
tr |
字符转换/删除 | tr 'a-z' 'A-Z' 大小写转换 |
column |
格式化列对齐 | column -t |
join |
按公共字段合并文件 | join file1 file2 |
paste |
按列拼接文件 | paste file1 file2 |
sed |
流编辑器 (Stream Editor) | sed 's/old/new/' 替换 |
awk |
文本处理语言 | awk -F: '{print $1,$3}' 列处理 |
真实实操:
bash
# tr --- 字符转换(大小写转换)
$ echo "Hello World" | tr "a-z" "A-Z"
HELLO WORLD
# column --- 格式化列对齐
$ printf "col1\tcol2\tcol3\n" | column -t
col1 col2 col3
# join --- 按第一列合并两个文件
$ printf "1 Alice\n2 Bob\n3 Carol\n" > /tmp/f1.txt
$ printf "1 Engineer\n2 Designer\n3 Manager\n" > /tmp/f2.txt
$ join /tmp/f1.txt /tmp/f2.txt
1 Alice Engineer
2 Bob Designer
3 Carol Manager
# paste --- 按列拼接(不合并)
$ paste /tmp/f1.txt /tmp/f2.txt
1 Alice 1 Engineer
2 Bob 2 Designer
3 Carol 3 Manager
# sed --- 文本替换
$ echo "Hello Linux World" | sed "s/Linux/Ubuntu/"
Hello Ubuntu World
# awk --- 列处理
$ awk -F: '{print $1, $3, $7}' /etc/passwd | head -5
root 0 /bin/bash
daemon 1 /usr/sbin/nologin
bin 2 /usr/sbin/nologin
sys 3 /usr/sbin/nologin
sync 4 /bin/sync
# sort + uniq --- 统计频次
$ printf "apple\nbanana\napple\norange\nbanana\napple\n" | sort | uniq -c | sort -rn
3 apple
2 banana
1 orange
uniq的陷阱 :uniq只处理相邻 的重复行。必须先用sort排序,再uniq -c统计。否则会漏掉不相邻的重复项。
12. 数据流重定向
12.1 文件描述符(File Descriptors)
每个 Linux 进程启动时默认打开三个数据流:
┌───────────────┬─────┬──────────────┬──────────────┐
│ 名称 │ FD │ 默认目标 │ 重定向符号 │
├───────────────┼─────┼──────────────┼──────────────┤
│ stdin 标准输入 │ 0 │ 键盘 │ < │
│ stdout 标准输出 │ 1 │ 终端屏幕 │ > 或 1> │
│ stderr 标准错误 │ 2 │ 终端屏幕 │ 2> │
└───────────────┴─────┴──────────────┴──────────────┘
12.2 重定向操作速查
| 操作 | 命令 | 说明 |
|---|---|---|
| stdout → 文件(覆盖) | cmd > file |
文件内容被覆盖 |
| stdout → 文件(追加) | cmd >> file |
追加到文件末尾 |
| stderr → 文件 | cmd 2> file |
错误输出重定向 |
| stdout + stderr → 同一文件 | cmd > file 2>&1 |
常见写法 |
| stdout + stderr → 同一文件(追加) | cmd >> file 2>&1 |
日志追加 |
| 文件 → stdin | cmd < file |
文件作为输入 |
| 丢弃输出 | cmd > /dev/null 2>&1 |
完全静默 |
| Here Document | cmd << EOF ... EOF |
多行输入 |
2>&1 解析:
2>&1 = 将文件描述符 2 (stderr) 重定向到 文件描述符 1 (stdout) 的当前目标
注意顺序:> file 必须在 2>&1 之前,否则 stderr 会指向旧 stdout
正确: cmd > file 2>&1 ← stdout→file, stderr→stdout的当前目标(file)
错误: cmd 2>&1 > file ← stderr→旧的stdout(终端), stdout→file
12.3 /dev/null --- 黑洞设备
/dev/null 是 Linux 的数据垃圾桶------写入的任何数据都会被丢弃,读取永远返回 EOF。
bash
# 丢弃所有输出(静默执行)
command > /dev/null 2>&1
# 实际场景:只关心退出码
if curl -s https://example.com > /dev/null 2>&1; then
echo "Site is up"
else
echo "Site is down"
fi
13. 正则表达式基础
13.1 正则表达式概览
正则表达式(Regular Expression, Regex) 是描述字符串匹配模式的表达式语言,Linux 中 grep/sed/awk 都支持正则。
Linux 中两种正则 "方言":
BRE (Basic Regular Expression) ERE (Extended Regular Expression)
grep (默认) grep -E / egrep
sed (默认) sed -r / sed -E
awk
13.2 正则符号速查
| 符号 | BRE | ERE | 含义 | 示例 |
|---|---|---|---|---|
^ |
✅ | ✅ | 行首锚定 | ^root 匹配以 root 开头的行 |
$ |
✅ | ✅ | 行尾锚定 | bash$ 匹配以 bash 结尾的行 |
. |
✅ | ✅ | 匹配任意单字符 | r..t 匹配 root, raft |
* |
✅ | ✅ | 前一个字符 0次或多次 | ab*c 匹配 ac, abc, abbc |
[] |
✅ | ✅ | 字符类 | [0-9] 匹配任一数字 |
[^] |
✅ | ✅ | 否定字符类 | [^0-9] 匹配非数字 |
\+ |
\+ |
+ |
1次或多次 | [0-9]+ 至少一个数字 |
\? |
\? |
? |
0次或1次 | colou?r 匹配 color/colour |
| ` | ` | ` | ` | ` |
() |
\(\) |
() |
分组 | (ab)+ 匹配 ab, abab |
13.3 grep / sed / awk 正则实战
真实实操:
bash
# === grep 正则 ===
# 行首行尾锚定
$ grep "^root" /etc/passwd # 以 root 开头的行
root:x:0:0:root:/root:/bin/bash
$ grep "bash$" /etc/passwd # 以 bash 结尾的行
root:x:0:0:root:/root:/bin/bash
# 字符类匹配数字
$ echo "abc123 def456 ghi789" | grep -o "[0-9]\+"
123
456
789
# === sed 正则 ===
# 全局替换(元音 → X)
$ echo "The quick brown fox" | sed "s/[aeiou]/X/g"
ThX qXXck brXwn fXx
# 删除空行
$ echo -e "line1\n\nline2\n\n\nline3" | sed "/^$/d"
line1
line2
line3
# 打印指定行范围
$ sed -n "3,5p" /etc/passwd
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
# === awk 正则 ===
# 条件匹配(UID ≥ 1000 的普通用户)
$ awk -F: '$3 >= 1000 {print $1, $3}' /etc/passwd
nobody 65534
# 正则匹配(Shell 是 bash 的用户)
$ awk -F: '$7 ~ /bash$/ {print $1, $7}' /etc/passwd
root /bin/bash
# BEGIN/END 模式(表头+统计)
$ awk -F: 'BEGIN {print "USER LIST"; print "========="}
{print $1}
END {print "========="; print "Total users: " NR}' /etc/passwd
USER LIST
=========
root
daemon
... (35个用户)
=========
Total users: 35
grep / sed / awk 应用场景对比:
| 工具 | 最适合 | 典型场景 |
|---|---|---|
grep |
行过滤 | 查找包含特定模式的行 |
sed |
行编辑 | 批量替换、删除行、插入行 |
awk |
列处理 | 按分隔符取字段、计算、格式化输出 |
14. Linux 下软件安装
14.1 四种安装方式对比
┌────────────┬──────────────┬──────────┬──────────┬──────────────┐
│ 安装方式 │ 管理器 │ 难度 │ 速度 │ 适用场景 │
├────────────┼──────────────┼──────────┼──────────┼──────────────┤
│ 在线安装 │ apt / yum │ ★☆☆ │ 极快 │ 99%的场景 │
│ deb包安装 │ dpkg -i │ ★★☆ │ 快 │ 离线/特定版本 │
│ 二进制安装 │ 手动 │ ★★★ │ 快 │ Go/Java程序 │
│ 源码编译 │ make install │ ★★★★ │ 极慢 │ 定制化需求 │
└────────────┴──────────────┴──────────┴──────────┴──────────────┘
14.2 APT --- 在线安装(最常用)
APT (Advanced Package Tool) 是 Debian/Ubuntu 生态的包管理器。
bash
# Ubuntu 24.04 软件源(华为云镜像)
$ head -5 /etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: http://repo.huaweicloud.com/ubuntu
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
# APT 核心命令
apt update # 更新软件包索引
apt upgrade # 升级所有可升级的包
apt install <pkg> # 安装软件包
apt remove <pkg> # 卸载(保留配置)
apt purge <pkg> # 完全卸载(删除配置)
apt search <keyword> # 搜索软件包
apt show <pkg> # 查看软件包详情
apt list --installed # 列出已安装的包
apt autoremove # 删除不再需要的依赖
真实实操:
bash
# 系统已安装 760 个软件包
$ dpkg -l | grep "^ii" | wc -l
760
# 搜索软件包
$ apt-cache search "cowsay"
cowsay - configurable talking cow
cowsay-off - configurable talking cow (offensive cows)
# 查看已安装的特定包
$ dpkg -l | grep git | head -5
ii git 1:2.43.0-1ubuntu7.3 amd64 fast, scalable, distributed revision control system
# ↑ ii = 已安装 (Installed)
# 安装演示
$ apt-get install -y cowsay
...
$ cowsay "Linux is awesome!"
___________________
< Linux is awesome! >
-------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
14.3 dpkg --- deb 包安装
bash
dpkg -i package.deb # 安装本地 deb 包
dpkg -r package # 卸载(保留配置)
dpkg -P package # 完全卸载
dpkg -l # 列出所有包
dpkg -L package # 列出包安装的文件
dpkg -S /path/to/file # 查找文件属于哪个包
14.4 源码编译安装
经典三部曲:
bash
./configure # 检测环境,生成 Makefile
make # 编译
make install # 安装到系统
bash
# 本机确认编译工具链
$ which gcc g++ make
/usr/bin/gcc
/usr/bin/g++
/usr/bin/make
# 缺少 cmake(如需更多构建系统可安装)
⚠️ 踩坑:依赖地狱(Dependency Hell) --- 源码编译最头疼的是依赖问题。遇到
configure: error: xxx not found时,先apt search xxx找对应的xxx-dev开发包。
14.5 Snap --- 新一代包管理
bash
$ snap list
No snaps are installed yet. Try 'snap install hello-world'.
Snap 是 Canonical 推出的沙盒化包格式,自带依赖隔离,适合跨发行版分发。
15. Linux 进程概念
15.1 进程与程序(Process vs Program)
程序 (Program) 进程 (Process)
────────────────── ──────────────────
磁盘上的二进制文件 程序在内存中的运行实例
静态的 动态的
一个文件 可以多个实例
不消耗资源 消耗CPU/内存/IO
15.2 进程的衍生 --- fork + exec
创建新进程的唯一方式:fork() + exec()
Parent Process (PID=1000)
│
├─ fork() → 创建子进程副本 (PID=2000)
│ 子进程继承父进程的: 内存映像/文件描述符/环境变量
│
└─ 子进程调用 exec() → 替换自身为新程序
新程序覆盖子进程的内存空间,保留 PID=2000
这就是 Shell 执行 ls 的完整过程:
bash(1000) → fork() → bash(2000) → exec("ls") → ls(2000)
真实实操:
bash
# 进程树 --- 查看父子关系
$ pstree -p | head -10
systemd(1)-+-ModemManager(4363)-+-{ModemManager}(4367)
|-NetworkManager(4326)-+-{NetworkManager}(4374)
|-sshd(5340)-+-sshd(12576)---bash(12623)---pstree(12825)
# fork 演示(bash 中创建子进程)
$ bash -c 'echo "Parent PID: $$" && (echo "Child PID: $$" ; echo "Child PPID: $PPID")'
Parent PID: 12572
Child PID: 12572 ← 子进程的 PID 看起来相同(因为 bash 子进程的 $$ 展开时机)
Child PPID: 12564
15.3 工作管理 --- jobs / fg / bg / nohup
bash
# 后台运行任务
$ sleep 10 & # & = 放到后台运行
[1] 12345 # [作业号] PID
$ jobs -l # 查看后台任务
[1]- 12345 Running sleep 10 &
[2]+ 12346 Running sleep 15 &
# 前台/后台切换
$ fg %1 # 将作业1调至前台
$ bg %1 # 将作业1继续在后台运行
# nohup --- 脱离终端运行(SSH断开后继续)
$ nohup echo "nohup test" > /tmp/nohup-test.log 2>&1
$ cat /tmp/nohup-test.log
nohup test
进程优先级:
bash
# NI (Nice值) 范围: -20(最高优先级) ~ 19(最低优先级)
$ ps -eo pid,ni,comm | head -5
PID NI COMMAND
1 0 systemd
2 0 kthreadd
3 0 pool_workqueue_release
4 -20 kworker/R-rcu_g ← -20 最高实时优先级
16. Linux 进程管理
16.1 查看进程
| 命令 | 特点 | 常用参数 |
|---|---|---|
ps |
进程快照 | aux BSD风格, -ef Unix风格 |
top |
实时动态监控 | -b -n1 批处理模式 |
htop |
top 增强版(彩色) | 需安装 |
pgrep |
按名称查找PID | -a 显示完整命令 |
pstree |
进程树 | -p 显示PID |
真实实操:
bash
# ps aux --- 按内存排序(查看最耗内存的进程)
$ ps aux --sort=-%mem | head -8
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 5885 0.1 0.9 1329156 33852 ? Ssl 21:14 0:03 [kthreadd]
root 342 0.0 0.7 288952 27292 ? SLsl 21:13 0:00 /sbin/multipathd
root 4488 0.0 0.6 109640 23400 ? Ssl 21:13 0:00 python3 unattended-upgrades
# ps -ef --- Unix 风格(显示PPID)
$ ps -ef | head -5
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 21:13 ? 00:00:02 /sbin/init noibrs
# top --- 系统负载总览
$ top -b -n1 | head -15
top - 21:58:02 up 44 min, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 125 total, 1 running, 124 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3409.9 total, 1764.6 free, 519.2 used, 1417.6 buff/cache
# ↑ 总共3.3G ↑ 1.7G空闲 ↑ 519M已用 ↑ 1.4G缓存
# pgrep --- 按名称查找
$ pgrep -a ssh | head -5
5340 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
# /proc --- 进程信息伪文件系统
$ cat /proc/$$/status | head -15 # $$ = 当前 Shell 的 PID
Name: bash
Umask: 0022
State: S (sleeping)
Pid: 12623
PPid: 12576
Uid: 0 0 0 0
Gid: 0 0 0 0
ps 输出 STAT 字段含义:
| 状态码 | 含义 |
|---|---|
R |
Running(运行中或可运行) |
S |
Sleeping(可中断睡眠) |
D |
Disk Sleep(不可中断睡眠,等IO) |
Z |
Zombie(僵尸进程,已终止但未被回收) |
T |
Stopped(暂停) |
s |
Session Leader(会话领导者) |
l |
Multi-threaded(多线程) |
< |
High Priority(高优先级) |
N |
Low Priority(低优先级) |
16.2 进程的结束控制 --- kill / 信号
bash
# 查看所有信号(64种)
$ kill -l | head -5
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
常用信号:
| 信号编号 | 信号名 | 含义 | 默认行为 |
|---|---|---|---|
| 1 | SIGHUP |
挂起/重载配置 | 终止 |
| 2 | SIGINT |
中断 (Ctrl+C) | 终止 |
| 9 | SIGKILL |
强制杀死 (不可捕获) | 强制终止 |
| 15 | SIGTERM |
优雅终止 (默认) | 终止 |
| 17 | SIGCHLD |
子进程状态改变 | 忽略 |
| 18 | SIGCONT |
继续执行 | 继续 |
| 19 | SIGSTOP |
暂停 (不可捕获) | 暂停 |
bash
kill 1234 # 发送 SIGTERM (15) --- 请进程自己清理并退出
kill -9 1234 # 发送 SIGKILL (9) --- 强制杀死(最后手段!)
kill -HUP 1234 # 发送 SIGHUP (1) --- 常用于让守护进程重载配置
kill -STOP 1234 # 发送 SIGSTOP (19) --- 暂停进程
kill -CONT 1234 # 发送 SIGCONT (18) --- 继续暂停的进程
原则 :先用
SIGTERM(15)给进程自行清理的机会,不要直接kill -9。SIGKILL是最后手段。
16.3 前台/后台进程控制
bash
# 启动一个睡眠进程作为演示
$ sleep 5 &
$ PID=$! # $! = 最近一个后台进程的 PID
$ echo "PID=$PID"
PID=12624
$ ps -p $PID -o pid,stat,comm
PID STAT COMMAND
12624 S bash # S = Sleeping(等待 sleep 结束)
17. Linux 日志系统
17.1 常见的日志
/var/log 目录 --- 系统日志汇聚地
$ ls -lh /var/log/ | head -20
-rw-r----- 1 syslog adm 152K Jun 15 21:58 auth.log ← 认证日志
-rw-r----- 1 root adm 73K Jun 15 21:13 dmesg ← 内核启动日志
-rw-r--r-- 1 root root 2.0K Jun 15 21:57 dpkg.log ← 包管理日志
-rw-r----- 1 syslog adm 95K Jun 15 21:57 kern.log ← 内核日志
-rw-r----- 1 syslog adm ... Jun 15 21:57 syslog ← 主系统日志
drwxr-sr-x+ 3 root systemd-journal ... journal ← systemd 日志
核心日志文件:
| 日志文件 | 记录内容 | 查看命令 |
|---|---|---|
/var/log/syslog |
全局系统日志 | tail -f /var/log/syslog |
/var/log/auth.log |
认证相关(SSH登录/sudo) | grep "Failed" /var/log/auth.log |
/var/log/kern.log |
内核消息 | dmesg 或查看此文件 |
/var/log/dpkg.log |
软件包安装/卸载 | grep "install" /var/log/dpkg.log |
/var/log/dmesg |
启动时的内核消息 | dmesg |
17.2 日志查看工具
bash
# tail --- 查看日志尾部(最常用)
tail -f /var/log/syslog # -f: 实时追踪 (follow)
tail -n 50 /var/log/syslog # 最后50行
# journalctl --- systemd 日志(Ubuntu 24.04)
journalctl -n 5 --no-pager # 最后5条
journalctl -u ssh.service # 查看特定服务
journalctl --since "1 hour ago" # 时间范围过滤
journalctl -f # 实时追踪
真实实操:
bash
# auth.log --- 查看最近的SSH登录
$ tail -3 /var/log/auth.log
2026-06-15T21:58:07+08:00 localhost sshd[12640]: Accepted password for root from 120.25.187.184 port 61279 ssh2
2026-06-15T21:58:07+08:00 localhost sshd[12640]: pam_unix(sshd:session): session opened for root(uid=0)
2026-06-15T21:58:07+08:00 localhost systemd-logind[4315]: New session 66 of user root.
# dmesg --- 内核日志(查看硬件/驱动信息)
$ dmesg | tail -5
[ 15.460541] EXT4-fs (vda1): resizing filesystem from 2621184 to 10485499 blocks
[ 16.356309] EXT4-fs (vda1): resized filesystem to 10485499
[ 2675.499705] loop0: detected capacity change from 0 to 8
# journalctl --- systemd 日志
$ journalctl -n 5 --no-pager
Jun 15 21:58:07 ecs-b97e-0001 sshd[12640]: Accepted password for root from 120.25.187.184
Jun 15 21:58:07 ecs-b97e-0001 sshd[12640]: pam_unix(sshd:session): session opened for root(uid=0)
Jun 15 21:58:07 ecs-b97e-0001 systemd-logind[4315]: New session 66 of user root.
Jun 15 21:58:07 ecs-b97e-0001 systemd[1]: Started session-66.scope - Session 66 of User root.
# logger --- 手动写入日志
$ logger -t "linux-lab" "This is a test log message from linux-lab"
$ grep "linux-lab" /var/log/syslog | tail -1
2026-06-15T21:58:07+08:00 localhost linux-lab: This is a test log message from linux-lab
17.3 日志轮替 --- logrotate
日志文件会不断增长,logrotate 负责定期轮替(rotate)、压缩、删除旧日志。
bash
# 全局配置
$ cat /etc/logrotate.conf | head -15
weekly # 每周轮替一次
rotate 4 # 保留 4 个归档
create # 轮替后创建新的空日志
su root adm # 以 root:adm 执行
# 各应用独立配置
$ ls /etc/logrotate.d/
alternatives apport apt bootlog btmp chrony
dpkg ppp rsyslog ubuntu-pro-client
# 轮替状态
$ cat /var/lib/logrotate/status | head -5
logrotate state -- version 2
"/var/log/syslog" 2026-6-15-21:0:0
"/var/log/dpkg.log" 2026-6-15-21:0:0
"/var/log/auth.log" 2026-6-15-21:0:0
附录 A:命令速查总表
| 分类 | 命令 | 一句话描述 |
|---|---|---|
| 基础 | ls -lah |
详细列出所有文件(含隐藏) |
| 基础 | cd - |
回到上次目录 |
| 基础 | mkdir -p a/b/c |
递归创建目录 |
| 权限 | chmod 755 file |
设权限为 rwxr-xr-x |
| 权限 | chown user:group file |
改变属主属组 |
| 查找 | find . -name "*.log" -mtime -7 |
找7天内的日志文件 |
| 查找 | grep -rn "pattern" dir/ |
递归搜索文本 |
| 文本 | sed -i 's/old/new/g' file |
原地替换 |
| 文本 | awk -F: '{print $1}' /etc/passwd |
按冒号分割取第一列 |
| 进程 | `ps aux | grep nginx` |
| 进程 | kill -15 PID |
优雅终止进程 |
| 磁盘 | `du -sh * | sort -rh |
| 磁盘 | df -h |
查看磁盘空间 |
| 网络 | ss -tlnp |
查看监听端口 |
| 网络 | curl -I url |
查看 HTTP 响应头 |
| 包管理 | apt update && apt upgrade |
更新系统 |
| 包管理 | apt install pkg |
安装软件包 |
附录 B:Shell 高效快捷键
| 快捷键 | 功能 |
|---|---|
Ctrl+C |
终止当前前台进程 |
Ctrl+D |
EOF (退出 Shell) |
Ctrl+Z |
暂停当前进程 |
Ctrl+L |
清屏 |
Ctrl+R |
搜索命令历史 |
Ctrl+A |
光标移到行首 |
Ctrl+E |
光标移到行尾 |
Ctrl+U |
删除光标前所有内容 |
Ctrl+K |
删除光标后所有内容 |
Ctrl+W |
删除前一个单词 |
!! |
重复上一条命令 |
!$ |
上一条命令的最后一个参数 |
!ssh |
执行最近以 ssh 开头的命令 |
附录 C:学习资源推荐
| 资源 | 说明 |
|---|---|
man 命令 |
最好的老师,每个 Linux 系统自带的完整文档 |
| Linux Journey | 交互式 Linux 教程 |
tldr 工具 |
apt install tldr → 命令的简洁使用示例 |
| explainshell.com | 可视化解释 shell 命令 |
| 《鸟哥的 Linux 私房菜》 | 中文最佳入门书籍 |
| Arch Wiki | 最全面的 Linux 技术文档(适用所有发行版) |
实验环境 :华为云 ECS ecs-b97e-0001 | Ubuntu 24.04.4 LTS | Kernel 6.8.0-106-generic
编写日期:2026-06-15