Linux 系统实战完全指南

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


目录

  1. [Linux 系统简介](#Linux 系统简介)
  2. 基本概念及操作
  3. 用户及文件权限管理
  4. [Linux 目录结构及文件基本操作](#Linux 目录结构及文件基本操作)
  5. 环境变量与文件查找
  6. 文件打包与解压缩
  7. 文件系统操作与磁盘管理
  8. [Linux 下的帮助命令](#Linux 下的帮助命令)
  9. [Linux 任务计划 crontab](#Linux 任务计划 crontab)
  10. 命令执行顺序控制与管道
  11. 简单的文本处理
  12. 数据流重定向
  13. 正则表达式基础
  14. [Linux 下软件安装](#Linux 下软件安装)
  15. [Linux 进程概念](#Linux 进程概念)
  16. [Linux 进程管理](#Linux 进程管理)
  17. [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

学习原则:

  1. 动手第一 --- 每个命令自己敲一遍,看输出,理解输出
  2. man 是你最好的老师 --- 遇到不认识的命令,第一时间 man xxx
  3. 记录踩坑 --- 每个报错都是学习机会
  4. 先理解再搜索 --- 别做"复制粘贴工程师"

本机环境确认:

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 内部实现

type vs which :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)

⚠️ 踩坑记录:

  1. crontab 中的 % 需要转义为 \%,否则会被解释为换行
  2. crontab 的环境变量极其精简,不要假设 PATH 与你登录时一致
  3. 命令中应使用绝对路径 ,如 /usr/bin/python3 而不是 python3
  4. 日志输出用 >> /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

相关推荐
未济3 天前
linux 配置环境变量
linux
傲世仙尊3 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
_艾伦 耶格尔.3 天前
进程间通信
linux
AI职业加油站3 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
Liuqy-053 天前
Linux IO编程——静态库、动态库
linux
此冬歌咏3 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
-梅3 天前
linux(8) 软硬链接
linux·运维·服务器
Wang's Blog3 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发