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.txtfile.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.txte 重复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 whichtype 是 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 -9SIGKILL 是最后手段。

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

相关推荐
xingyuzhisuan1 小时前
8 卡 / 16 卡 GPU 服务器机架布线与高速互联带宽优化技术详解
运维·服务器·云计算·gpu算力
aramae1 小时前
《计算机网络(第5版)》第二章 物理层
服务器·网络·后端·计算机网络
疯狂的维修1 小时前
博图不同版本下的OPC UA功能开启区别
服务器·https·ssl
Safeploy安策数据1 小时前
政务云加密太慢?万兆服务器密码机如何破解高并发性能瓶颈
linux·运维·github
阿泽·黑核1 小时前
06 keyflow 多平台移植指南:STM32/51/ESP32/Linux
linux·stm32·嵌入式硬件
开开心心_Every1 小时前
近200个工具的电脑故障修复合集
linux·运维·服务器·leetcode·智能手机·电脑·模拟退火算法
NGINX开源社区1 小时前
NGINX Gateway Fabric 支持 Gateway API Inference Extension
linux·服务器·网络
BomanGe101 小时前
NSK NH35EM 高负载法兰型直线导轨详述
服务器·网络·数据库·经验分享·规格说明书
不会C语言的男孩1 小时前
Linux 系统编程 · 第 9 章:进程创建
linux·c语言·开发语言