Linux 不仅是一套操作系统,更是现代服务器、云计算、容器、嵌入式设备和软件开发基础设施的重要基石。本文将从 Linux 的基本概念开始,逐步介绍文件系统、用户权限、进程、网络、磁盘、Shell 脚本、服务管理、安全配置以及常见故障排查方法。
1. Linux 是什么
Linux 是一个自由、开源、类 Unix 的操作系统内核,由 Linus Torvalds 于 1991 年首次发布。
严格来说,Linux 这个名称指的是"Linux 内核"。我们平时使用的 Ubuntu、Debian、Rocky Linux、Fedora 等完整操作系统,通常由以下部分组成:
- Linux 内核
- GNU 基础工具
- Shell 命令解释器
- 软件包管理器
- 系统服务
- 桌面环境
- 各类应用程序
因此,完整的 Linux 操作系统有时也被称为 GNU/Linux。
Linux 内核负责管理计算机底层资源,包括:
- CPU 调度
- 内存管理
- 文件系统
- 硬件驱动
- 网络通信
- 进程管理
- 系统调用
- 安全与权限控制
1.1 Linux 的主要特点
Linux 具有以下特点:
-
开源免费
Linux 内核源代码公开,任何人都可以学习、修改和重新发布。
-
稳定性高
Linux 经常被用于服务器和关键业务系统,可以长时间持续运行。
-
安全性较高
Linux 提供完善的用户、用户组、文件权限、进程隔离和安全模块。
-
可定制性强
用户可以根据需要选择不同的内核、桌面环境、Shell 和软件包。
-
支持多用户
多个用户可以同时登录并使用同一台 Linux 服务器。
-
支持多任务
Linux 可以同时运行大量进程,并通过调度器分配 CPU 时间。
-
网络功能强大
Linux 原生支持 TCP/IP、路由、防火墙、VPN、DNS、SSH 等网络功能。
-
硬件平台广泛
Linux 可以运行在个人计算机、服务器、手机、路由器、开发板和超级计算机上。
1.2 Linux 与 Unix 的关系
Unix 是较早出现的操作系统体系,Linux 借鉴了 Unix 的设计思想,但 Linux 并不是传统 Unix 源代码的直接复制。
Linux 延续了许多 Unix 设计理念:
- 一切皆文件
- 一个程序只做好一件事
- 多个小工具可以通过管道组合
- 配置通常使用文本文件
- 使用统一的文件权限模型
- 设备、进程和网络信息可以通过文件系统访问
2. Linux 的发展历史
Linux 的发展与 Unix、GNU 计划和自由软件运动密切相关。
2.1 Unix 的出现
Unix 最早诞生于贝尔实验室。它强调简洁、模块化、多用户和多任务设计,对后续操作系统产生了深远影响。
2.2 GNU 计划
GNU 计划的目标是创建一套自由的类 Unix 操作系统。
GNU 项目开发了大量基础工具,例如:
- GCC 编译器
- Bash Shell
- glibc 标准库
- coreutils 基础命令
- GDB 调试器
- Make 构建工具
但当时 GNU 自己的内核尚未完全成熟。
2.3 Linux 内核诞生
1991 年,Linus Torvalds 开始开发 Linux 内核,并将其发布到互联网上。
Linux 内核与 GNU 工具结合后,逐渐形成了完整、可用的自由操作系统。
2.4 Linux 的现代应用
如今,Linux 被广泛应用于:
- Web 服务器
- 数据库服务器
- 云计算平台
- Kubernetes 集群
- Docker 容器
- 大数据平台
- 人工智能训练
- 网络设备
- 安卓设备
- 嵌入式设备
- 超级计算机
- 软件开发环境
3. 常见 Linux 发行版
Linux 发行版是将 Linux 内核、GNU 工具、软件包管理器和应用程序组合起来形成的完整系统。
不同发行版的主要区别包括:
- 软件包格式
- 软件包管理器
- 默认配置
- 发布周期
- 技术支持方式
- 桌面环境
- 目标用户群体
3.1 Debian 系列
常见发行版:
- Debian
- Ubuntu
- Linux Mint
特点:
- 软件生态丰富
- 使用 DEB 软件包
- 常用
apt进行软件管理 - 文档和社区资源丰富
Ubuntu 常用于:
- 个人桌面
- 云服务器
- 开发环境
- 容器基础镜像
3.2 Red Hat 系列
常见发行版:
- Red Hat Enterprise Linux
- Fedora
- Rocky Linux
- AlmaLinux
- CentOS Stream
特点:
- 企业级应用广泛
- 使用 RPM 软件包
- 常用
dnf或yum进行软件管理 - 对 SELinux、systemd 和企业运维支持较好
3.3 Arch Linux 系列
常见发行版:
- Arch Linux
- Manjaro
特点:
- 滚动更新
- 软件版本相对较新
- 高度可定制
- 安装和配置需要一定 Linux 基础
- 使用
pacman管理软件
3.4 SUSE 系列
常见发行版:
- SUSE Linux Enterprise
- openSUSE
特点:
- 企业管理工具完善
- 使用 RPM 软件包
- 常用
zypper管理软件 - 提供 YaST 系统管理工具
3.5 如何选择 Linux 发行版
| 使用场景 | 推荐方向 |
|---|---|
| Linux 初学者 | Ubuntu、Linux Mint |
| 个人开发环境 | Ubuntu、Debian、Fedora |
| 企业服务器 | RHEL、Rocky Linux、AlmaLinux、SUSE |
| 云服务器 | Ubuntu、Debian、Rocky Linux |
| 深入学习 Linux | Debian、Arch Linux |
| 追求较新软件 | Fedora、Arch Linux |
| 轻量级容器镜像 | Alpine Linux |
没有绝对最好的 Linux 发行版,只有更适合具体场景的发行版。
4. Linux 系统架构
Linux 系统可以大致分为以下几个层次:
#mermaid-svg-WYsfoxres5iUCL1T{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WYsfoxres5iUCL1T .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WYsfoxres5iUCL1T .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WYsfoxres5iUCL1T .error-icon{fill:#552222;}#mermaid-svg-WYsfoxres5iUCL1T .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WYsfoxres5iUCL1T .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WYsfoxres5iUCL1T .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WYsfoxres5iUCL1T .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WYsfoxres5iUCL1T .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WYsfoxres5iUCL1T .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WYsfoxres5iUCL1T .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WYsfoxres5iUCL1T .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WYsfoxres5iUCL1T .marker.cross{stroke:#333333;}#mermaid-svg-WYsfoxres5iUCL1T svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WYsfoxres5iUCL1T p{margin:0;}#mermaid-svg-WYsfoxres5iUCL1T .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WYsfoxres5iUCL1T .cluster-label text{fill:#333;}#mermaid-svg-WYsfoxres5iUCL1T .cluster-label span{color:#333;}#mermaid-svg-WYsfoxres5iUCL1T .cluster-label span p{background-color:transparent;}#mermaid-svg-WYsfoxres5iUCL1T .label text,#mermaid-svg-WYsfoxres5iUCL1T span{fill:#333;color:#333;}#mermaid-svg-WYsfoxres5iUCL1T .node rect,#mermaid-svg-WYsfoxres5iUCL1T .node circle,#mermaid-svg-WYsfoxres5iUCL1T .node ellipse,#mermaid-svg-WYsfoxres5iUCL1T .node polygon,#mermaid-svg-WYsfoxres5iUCL1T .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WYsfoxres5iUCL1T .rough-node .label text,#mermaid-svg-WYsfoxres5iUCL1T .node .label text,#mermaid-svg-WYsfoxres5iUCL1T .image-shape .label,#mermaid-svg-WYsfoxres5iUCL1T .icon-shape .label{text-anchor:middle;}#mermaid-svg-WYsfoxres5iUCL1T .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WYsfoxres5iUCL1T .rough-node .label,#mermaid-svg-WYsfoxres5iUCL1T .node .label,#mermaid-svg-WYsfoxres5iUCL1T .image-shape .label,#mermaid-svg-WYsfoxres5iUCL1T .icon-shape .label{text-align:center;}#mermaid-svg-WYsfoxres5iUCL1T .node.clickable{cursor:pointer;}#mermaid-svg-WYsfoxres5iUCL1T .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WYsfoxres5iUCL1T .arrowheadPath{fill:#333333;}#mermaid-svg-WYsfoxres5iUCL1T .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WYsfoxres5iUCL1T .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WYsfoxres5iUCL1T .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WYsfoxres5iUCL1T .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WYsfoxres5iUCL1T .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WYsfoxres5iUCL1T .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WYsfoxres5iUCL1T .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WYsfoxres5iUCL1T .cluster text{fill:#333;}#mermaid-svg-WYsfoxres5iUCL1T .cluster span{color:#333;}#mermaid-svg-WYsfoxres5iUCL1T div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WYsfoxres5iUCL1T .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WYsfoxres5iUCL1T rect.text{fill:none;stroke-width:0;}#mermaid-svg-WYsfoxres5iUCL1T .icon-shape,#mermaid-svg-WYsfoxres5iUCL1T .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WYsfoxres5iUCL1T .icon-shape p,#mermaid-svg-WYsfoxres5iUCL1T .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WYsfoxres5iUCL1T .icon-shape .label rect,#mermaid-svg-WYsfoxres5iUCL1T .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WYsfoxres5iUCL1T .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WYsfoxres5iUCL1T .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WYsfoxres5iUCL1T :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户与应用程序
Shell、系统工具与运行库
系统调用接口
Linux 内核
进程调度
内存管理
虚拟文件系统
网络协议栈
设备驱动
硬件
4.1 硬件层
硬件层包括:
- CPU
- 内存
- 磁盘
- 网卡
- 显卡
- 键盘
- 鼠标
- USB 设备
4.2 Linux 内核
内核运行在高权限的内核空间,负责管理硬件和系统资源。
内核的主要模块包括:
进程调度
决定哪个进程在什么时候使用 CPU。
内存管理
管理物理内存、虚拟内存、页表、缓存和交换空间。
文件系统
为 ext4、XFS、Btrfs、NFS 等文件系统提供统一接口。
网络协议栈
实现 TCP/IP、UDP、路由、防火墙等网络能力。
设备驱动
负责操作磁盘、网卡、USB、显卡等硬件。
安全机制
实现用户权限、Capabilities、SELinux、AppArmor 等机制。
4.3 系统调用
普通应用程序不能直接操作内核资源,需要通过系统调用向内核提出请求。
常见系统调用包括:
open():打开文件read():读取数据write():写入数据fork():创建进程exec():执行程序socket():创建网络套接字
4.4 Shell
Shell 是用户与操作系统交互的重要接口。
常见 Shell:
- Bash
- Zsh
- Fish
- Dash
- Ksh
Shell 的主要职责包括:
- 读取用户命令
- 解析命令参数
- 启动程序
- 管理环境变量
- 处理管道和重定向
- 执行 Shell 脚本
5. Linux 的安装与使用方式
初学者不一定要直接在物理机上安装 Linux,可以根据实际需求选择不同方式。
5.1 虚拟机
可以使用虚拟机软件安装 Linux,例如:
- VMware
- VirtualBox
- Hyper-V
优点:
- 不影响现有操作系统
- 可以创建快照
- 可以快速恢复
- 适合学习安装、分区和网络配置
缺点:
- 占用额外内存和磁盘
- 性能低于物理机
5.2 WSL
Windows 用户可以使用 WSL,在 Windows 中运行 Linux 用户空间。
适合:
- 学习 Linux 命令
- 使用 Git、Python、Node.js 等开发工具
- 执行 Shell 脚本
- 进行跨平台开发
需要注意,WSL 与完整物理 Linux 在硬件、网络和部分系统服务方面可能存在差异。
5.3 云服务器
可以购买一台云服务器,通过 SSH 远程连接。
适合:
- 部署网站
- 学习服务器运维
- 配置 Nginx、MySQL、Docker
- 体验公网环境
5.4 双系统或物理机安装
将 Linux 直接安装到物理机上可以获得较完整的硬件体验,但需要注意磁盘分区和数据备份。
6. 终端、Shell 与命令格式
6.1 命令提示符
普通用户的命令提示符通常以 $ 结尾:
bash
user@server:~$
root 用户通常以 # 结尾:
bash
root@server:~#
在教程中,$ 和 # 一般只是提示符,不需要复制执行。
6.2 Linux 命令基本格式
Linux 命令通常由命令、选项和参数组成:
text
命令 [选项] [参数]
例如:
bash
ls -lah /var/log
其中:
ls:命令-l:显示详细信息-a:显示隐藏文件-h:以易读格式显示文件大小/var/log:命令参数
多个短选项通常可以合并:
bash
ls -l -a -h
ls -lah
6.3 获取命令帮助
查看简单帮助:
bash
ls --help
查看命令手册:
bash
man ls
搜索手册描述:
bash
apropos network
查看命令类型:
bash
type cd
type ls
查找可执行文件位置:
bash
which java
command -v java
6.4 Tab 补全
输入命令或路径的一部分后按 Tab,Shell 会自动补全。
例如:
bash
cd /var/lo
按下 Tab 后可能补全为:
bash
cd /var/log/
6.5 命令历史
查看历史命令:
bash
history
重新执行上一条命令:
bash
!!
重新执行历史中的指定命令:
bash
!100
反向搜索历史命令:
text
Ctrl + R
7. Linux 文件系统
Linux 使用树形目录结构,最顶层目录是根目录 /。
text
/
├── bin
├── boot
├── dev
├── etc
├── home
├── lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin
├── srv
├── sys
├── tmp
├── usr
└── var
7.1 常见目录说明
| 目录 | 作用 |
|---|---|
/ |
根目录,所有目录的起点 |
/bin |
基础用户命令 |
/sbin |
系统管理命令 |
/boot |
内核、引导加载器相关文件 |
/dev |
设备文件 |
/etc |
系统和软件配置文件 |
/home |
普通用户主目录 |
/root |
root 用户主目录 |
/lib |
系统运行所需共享库 |
/opt |
可选的第三方软件 |
/proc |
进程和内核信息的虚拟文件系统 |
/sys |
内核设备与驱动信息 |
/tmp |
临时文件 |
/usr |
用户程序、库和共享资源 |
/var |
日志、缓存、队列等经常变化的数据 |
/run |
系统启动后的运行时数据 |
/mnt |
临时挂载目录 |
/media |
移动设备挂载目录 |
/srv |
服务提供的数据 |
7.2 绝对路径与相对路径
绝对路径从 / 开始:
text
/etc/nginx/nginx.conf
相对路径从当前目录开始:
text
./config/application.yml
特殊路径:
| 路径 | 含义 |
|---|---|
/ |
根目录 |
. |
当前目录 |
.. |
上一级目录 |
~ |
当前用户主目录 |
- |
上一次所在目录 |
查看当前目录:
bash
pwd
进入指定目录:
bash
cd /var/log
返回上一级:
bash
cd ..
返回用户主目录:
bash
cd
返回上一次目录:
bash
cd -
7.3 隐藏文件
Linux 中,以 . 开头的文件或目录通常是隐藏文件。
例如:
text
.bashrc
.gitconfig
.ssh
显示隐藏文件:
bash
ls -a
8. 文件与目录操作
8.1 查看目录内容
bash
ls
ls -l
ls -a
ls -lh
ls -lah
按修改时间排序:
bash
ls -lt
按文件大小排序:
bash
ls -lhS
8.2 创建目录
创建一个目录:
bash
mkdir project
递归创建多级目录:
bash
mkdir -p project/src/main/java
8.3 创建文件
创建空文件:
bash
touch README.md
如果文件已存在,touch 会更新其时间戳。
8.4 复制文件
复制文件:
bash
cp source.txt target.txt
复制目录:
bash
cp -r source-dir target-dir
保留文件权限、时间等属性:
bash
cp -a source-dir target-dir
覆盖前询问:
bash
cp -i source.txt target.txt
8.5 移动与重命名
移动文件:
bash
mv app.log /tmp/
重命名文件:
bash
mv old-name.txt new-name.txt
覆盖前询问:
bash
mv -i source.txt target.txt
8.6 删除文件
删除文件:
bash
rm file.txt
删除目录及其内容:
bash
rm -r directory
强制递归删除:
bash
rm -rf directory
rm -rf不会进入回收站。执行前必须确认当前路径和目标路径,避免使用未检查的变量、通配符或过于宽泛的目录。
相对安全的交互方式:
bash
rm -ri directory
8.7 查看文件类型和信息
查看文件类型:
bash
file application.jar
查看文件详细属性:
bash
stat application.jar
查看文件大小:
bash
du -h application.jar
8.8 查找文件
按名称查找:
bash
find /var/log -name "*.log"
忽略大小写:
bash
find /opt -iname "*.jar"
查找最近一天修改的文件:
bash
find /var/log -type f -mtime -1
查找大于 100 MB 的文件:
bash
find /var -type f -size +100M
找到后显示详细信息:
bash
find /var/log -type f -name "*.log" -ls
删除查找结果前,建议先打印确认:
bash
find /tmp/my-app -type f -name "*.tmp" -print
确认无误后再执行删除:
bash
find /tmp/my-app -type f -name "*.tmp" -delete
8.9 文件链接
Linux 支持硬链接和软链接。
创建硬链接:
bash
ln source.txt hard-link.txt
创建软链接:
bash
ln -s /opt/app/current/app.jar /usr/local/bin/app.jar
软链接类似快捷方式,可以跨文件系统,也可以指向目录。
查看链接目标:
bash
readlink -f /usr/local/bin/app.jar
9. 文本查看与处理
Linux 的一个重要特点是可以将多个文本处理工具通过管道组合。
9.1 查看文件内容
查看整个文件:
bash
cat application.yml
带行号显示:
bash
cat -n application.yml
分页查看:
bash
less application.log
在 less 中:
/error:向下搜索errorn:跳到下一个匹配项N:跳到上一个匹配项q:退出
查看前 20 行:
bash
head -n 20 application.log
查看最后 100 行:
bash
tail -n 100 application.log
持续追踪日志:
bash
tail -f application.log
从最后 200 行开始持续追踪:
bash
tail -n 200 -f application.log
9.2 grep 搜索
搜索包含 ERROR 的行:
bash
grep "ERROR" application.log
忽略大小写:
bash
grep -i "error" application.log
显示行号:
bash
grep -n "ERROR" application.log
递归搜索目录:
bash
grep -R "database.url" /etc/my-app/
显示匹配行前后内容:
bash
grep -C 3 "OutOfMemoryError" application.log
只统计匹配数量:
bash
grep -c "ERROR" application.log
使用扩展正则表达式:
bash
grep -E "ERROR|WARN|FATAL" application.log
排除包含指定内容的行:
bash
grep -v "health-check" access.log
9.3 管道
管道符 | 会将前一个命令的标准输出传递给下一个命令。
例如,查看占用内存最多的进程:
bash
ps aux | sort -k4 -nr | head -n 10
统计日志中的错误数量:
bash
grep "ERROR" application.log | wc -l
统计访问日志中出现次数最多的 IP:
bash
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
9.4 输入输出重定向
覆盖写入文件:
bash
echo "hello" > output.txt
追加写入文件:
bash
echo "world" >> output.txt
读取文件作为输入:
bash
sort < names.txt
将标准错误写入文件:
bash
java -jar app.jar 2> error.log
将标准输出和标准错误分别保存:
bash
java -jar app.jar > app.log 2> error.log
将标准错误合并到标准输出:
bash
java -jar app.jar > app.log 2>&1
丢弃输出:
bash
command > /dev/null 2>&1
9.5 常用文本处理命令
wc
统计行数:
bash
wc -l application.log
统计单词数:
bash
wc -w README.md
sort
排序:
bash
sort names.txt
数字倒序:
bash
sort -nr numbers.txt
uniq
去除相邻重复行:
bash
sort names.txt | uniq
统计重复次数:
bash
sort names.txt | uniq -c
cut
提取以冒号分隔的第一列:
bash
cut -d ':' -f 1 /etc/passwd
awk
提取第一列和第九列:
bash
awk '{print $1, $9}' access.log
按条件过滤:
bash
awk '$9 >= 500 {print $1, $7, $9}' access.log
sed
替换文本并输出结果:
bash
sed 's/localhost/127.0.0.1/g' config.txt
直接修改文件前建议先备份:
bash
cp -a config.txt config.txt.bak
sed -i 's/localhost/127.0.0.1/g' config.txt
xargs
将标准输入转换为命令参数:
bash
find . -type f -name "*.log" -print0 | xargs -0 ls -lh
处理带空格的文件名时,应优先使用 -print0 和 xargs -0。
10. 用户、用户组与权限
Linux 是多用户操作系统,每个用户都有自己的身份和权限。
10.1 查看当前用户
bash
whoami
查看用户和用户组 ID:
bash
id
查看当前登录用户:
bash
who
查看用户登录活动:
bash
w
10.2 用户信息文件
用户信息:
text
/etc/passwd
密码摘要和密码策略:
text
/etc/shadow
用户组信息:
text
/etc/group
查看用户信息:
bash
getent passwd username
查看用户组信息:
bash
getent group developers
10.3 用户管理
创建用户:
bash
sudo useradd -m developer
设置密码:
bash
sudo passwd developer
修改用户默认 Shell:
bash
sudo usermod -s /bin/bash developer
创建用户组:
bash
sudo groupadd developers
将用户加入附加组:
bash
sudo usermod -aG developers developer
这里的 -aG 非常重要:
-G:设置附加组列表-a:追加,而不是覆盖已有附加组
删除用户前应确认其文件和运行中的进程:
bash
id developer
ps -u developer
10.4 文件权限
使用 ls -l 查看权限:
text
-rwxr-x--- 1 app developers 1024 Aug 20 10:00 deploy.sh
可以拆分为:
text
- | rwx | r-x | ---
用户 用户组 其他用户
权限含义:
| 权限 | 文件 | 目录 |
|---|---|---|
r |
读取文件内容 | 查看目录列表 |
w |
修改文件内容 | 创建、删除或重命名目录中的文件 |
x |
执行文件 | 进入目录并访问目录中的对象 |
10.5 数字权限
权限对应的数字:
| 权限 | 数值 |
|---|---|
r |
4 |
w |
2 |
x |
1 |
常见组合:
| 数字 | 权限 |
|---|---|
| 7 | rwx |
| 6 | rw- |
| 5 | r-x |
| 4 | r-- |
| 0 | --- |
例如:
bash
chmod 755 deploy.sh
表示:
- 所有者:
rwx - 用户组:
r-x - 其他用户:
r-x
配置文件通常不需要执行权限:
bash
chmod 640 application.yml
10.6 符号方式修改权限
给所有者增加执行权限:
bash
chmod u+x deploy.sh
去掉其他用户的写权限:
bash
chmod o-w file.txt
给用户组增加读权限:
bash
chmod g+r file.txt
10.7 修改所有者
修改所有者:
bash
sudo chown app application.jar
同时修改所有者和用户组:
bash
sudo chown app:developers application.jar
递归修改目录:
bash
sudo chown -R app:developers /opt/my-app
递归操作前应仔细确认目录范围。
10.8 sudo
sudo 允许授权用户以其他用户身份执行命令,通常是 root。
bash
sudo systemctl restart nginx
不建议长期直接使用 root 用户工作。更合理的方式是:
- 普通操作使用普通用户
- 需要管理权限时临时使用
sudo - 只授予完成任务所需的最小权限
10.9 umask
umask 决定新建文件和目录默认去掉哪些权限。
查看当前值:
bash
umask
常见值:
text
0022
通常意味着:
- 新建普通文件默认权限为
644 - 新建目录默认权限为
755
10.10 特殊权限
SUID
程序执行时临时使用文件所有者权限。
bash
chmod u+s program
SGID
用于目录时,新文件通常继承目录所属组。
bash
chmod g+s shared-directory
Sticky Bit
常用于共享目录,用户只能删除自己拥有的文件。
bash
chmod +t shared-directory
典型例子是 /tmp:
bash
ls -ld /tmp
11. 进程与任务管理
程序是存储在磁盘上的可执行文件,进程是程序运行后的实例。
11.1 查看进程
查看当前终端进程:
bash
ps
查看系统全部进程:
bash
ps aux
以层级结构显示:
bash
ps auxf
查找指定进程:
bash
ps aux | grep nginx
更简洁的方式:
bash
pgrep -a nginx
查看进程树:
bash
pstree -p
11.2 动态查看系统状态
bash
top
如果安装了 htop:
bash
htop
常见指标:
%CPU:CPU 使用率%MEM:内存使用率PID:进程 IDUSER:进程所属用户RES:实际使用的物理内存VIRT:虚拟内存空间TIME+:累计使用 CPU 的时间
11.3 终止进程
正常终止进程:
bash
kill PID
默认发送 SIGTERM,允许程序执行清理操作。
强制终止:
bash
kill -9 PID
SIGKILL 无法被程序捕获或忽略,应作为最后手段使用。
按名称终止:
bash
pkill nginx
查看信号列表:
bash
kill -l
常见信号:
| 信号 | 数字 | 说明 |
|---|---|---|
SIGHUP |
1 | 重新加载或终端断开 |
SIGINT |
2 | 中断,通常对应 Ctrl+C |
SIGTERM |
15 | 请求正常终止 |
SIGKILL |
9 | 强制终止 |
SIGSTOP |
19 | 暂停进程 |
SIGCONT |
18 | 继续运行 |
11.4 前台与后台任务
后台运行:
bash
long-command &
查看当前 Shell 的任务:
bash
jobs
将任务切换到前台:
bash
fg %1
将暂停的任务放到后台:
bash
bg %1
在前台按下 Ctrl+Z 可以暂停当前任务。
11.5 nohup
让程序在退出终端后继续运行:
bash
nohup java -jar app.jar > app.log 2>&1 &
对于正式服务,更推荐使用 systemd、容器编排或专业进程管理工具。
11.6 进程优先级
查看优先级:
bash
ps -eo pid,ni,comm
以指定优先级运行:
bash
nice -n 10 long-command
修改运行中进程的优先级:
bash
renice 5 -p PID
Nice 值越大,进程获得 CPU 的优先级通常越低。
11.7 /proc 文件系统
/proc 是虚拟文件系统,可以查看进程和内核信息。
查看 CPU 信息:
bash
cat /proc/cpuinfo
查看内存信息:
bash
cat /proc/meminfo
查看指定进程命令行:
bash
tr '\0' ' ' < /proc/PID/cmdline
查看进程状态:
bash
cat /proc/PID/status
查看进程打开的文件描述符:
bash
ls -l /proc/PID/fd
12. 软件包管理
Linux 通常通过软件仓库和软件包管理器安装软件。
软件包管理器负责:
- 下载软件
- 安装依赖
- 升级软件
- 卸载软件
- 查询软件信息
- 校验软件包
12.1 Debian 和 Ubuntu
更新软件包索引:
bash
sudo apt update
升级已安装软件:
bash
sudo apt upgrade
安装软件:
bash
sudo apt install nginx
卸载软件:
bash
sudo apt remove nginx
卸载软件和配置:
bash
sudo apt purge nginx
搜索软件:
bash
apt search nginx
查看软件信息:
bash
apt show nginx
查看某个文件属于哪个已安装软件包:
bash
dpkg -S /usr/bin/curl
12.2 RHEL、Rocky Linux 和 Fedora
安装软件:
bash
sudo dnf install nginx
升级软件:
bash
sudo dnf upgrade
卸载软件:
bash
sudo dnf remove nginx
搜索软件:
bash
dnf search nginx
查看软件信息:
bash
dnf info nginx
部分旧系统可能使用:
bash
yum install nginx
12.3 Arch Linux
同步并升级系统:
bash
sudo pacman -Syu
安装软件:
bash
sudo pacman -S nginx
卸载软件:
bash
sudo pacman -R nginx
搜索软件:
bash
pacman -Ss nginx
12.4 openSUSE
安装软件:
bash
sudo zypper install nginx
更新软件:
bash
sudo zypper update
搜索软件:
bash
zypper search nginx
12.5 源码编译安装
某些软件可以从源码编译:
bash
tar -xf source.tar.gz
cd source
./configure
make
sudo make install
不同项目的构建方式可能不同,应优先阅读项目文档。
源码安装的缺点包括:
- 软件包管理器可能无法追踪
- 升级和卸载不方便
- 依赖管理更复杂
- 容易与系统软件发生冲突
生产环境中应优先使用受信任的软件仓库、官方软件包或可追踪的构建流程。
13. systemd 与服务管理
systemd 是许多 Linux 发行版使用的系统和服务管理器。
它负责:
- 系统启动
- 服务管理
- 服务依赖
- 自动重启
- 定时任务
- 日志收集
- 挂载管理
13.1 查看服务状态
bash
systemctl status nginx
启动服务:
bash
sudo systemctl start nginx
停止服务:
bash
sudo systemctl stop nginx
重启服务:
bash
sudo systemctl restart nginx
重新加载配置:
bash
sudo systemctl reload nginx
设置开机启动:
bash
sudo systemctl enable nginx
立即启动并设置开机启动:
bash
sudo systemctl enable --now nginx
取消开机启动:
bash
sudo systemctl disable nginx
查看所有运行中的服务:
bash
systemctl list-units --type=service --state=running
查看启动失败的服务:
bash
systemctl --failed
13.2 Unit 文件
一个简单的 Java 服务 Unit 文件如下:
ini
[Unit]
Description=My Java Application
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=app
Group=app
WorkingDirectory=/opt/my-app
ExecStart=/usr/bin/java -jar /opt/my-app/app.jar
Restart=on-failure
RestartSec=5
SuccessExitStatus=143
Environment="JAVA_OPTS=-Xms512m -Xmx512m"
[Install]
WantedBy=multi-user.target
保存为:
text
/etc/systemd/system/my-app.service
重新加载 Unit:
bash
sudo systemctl daemon-reload
启动并设置开机启动:
bash
sudo systemctl enable --now my-app
查看状态:
bash
systemctl status my-app
查看日志:
bash
journalctl -u my-app
13.3 systemd 定时器
除了传统的 Cron,systemd 也可以通过 Timer Unit 执行定时任务。
Timer 的优点包括:
- 可统一查看状态
- 可记录执行日志
- 可以设置依赖
- 支持错过执行后的补偿
- 与 systemd 服务管理统一
14. 磁盘、分区与文件系统
14.1 查看磁盘设备
bash
lsblk
显示文件系统信息:
bash
lsblk -f
查看设备分区:
bash
sudo fdisk -l
查看设备 UUID:
bash
blkid
14.2 查看磁盘空间
查看文件系统空间:
bash
df -h
查看文件系统类型:
bash
df -Th
查看目录大小:
bash
du -sh /var/log
查看当前目录下各子目录大小:
bash
du -h --max-depth=1 .
按大小排序:
bash
du -h --max-depth=1 /var | sort -h
14.3 分区与格式化
常见分区工具:
fdiskpartedgdisk
格式化 ext4 文件系统:
bash
sudo mkfs.ext4 /dev/sdb1
格式化 XFS 文件系统:
bash
sudo mkfs.xfs /dev/sdb1
格式化会破坏目标分区上的原有数据。执行前必须通过
lsblk -f、blkid等命令确认设备名称、挂载状态和数据备份。
14.4 挂载文件系统
创建挂载点:
bash
sudo mkdir -p /data
临时挂载:
bash
sudo mount /dev/sdb1 /data
查看挂载:
bash
findmnt
卸载:
bash
sudo umount /data
如果设备正在使用,可以查看占用进程:
bash
sudo lsof +D /data
或者:
bash
sudo fuser -vm /data
14.5 /etc/fstab
/etc/fstab 用于配置开机自动挂载。
示例:
fstab
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data ext4 defaults,nofail 0 2
修改后不要直接重启,应先检查配置:
bash
sudo mount -a
检查 systemd 是否能正确解析:
bash
sudo systemctl daemon-reload
建议使用 UUID,避免设备名称变化导致挂载错误。
14.6 inode
文件系统不仅要有可用磁盘空间,还需要有可用 inode。
查看 inode 使用率:
bash
df -i
可能出现磁盘空间未满,但无法创建文件的情况,此时应检查 inode 是否耗尽。
14.7 Swap
查看交换空间:
bash
swapon --show
查看内存和 Swap:
bash
free -h
Swap 可以缓解物理内存压力,但不能替代足够的物理内存。持续大量使用 Swap 往往意味着:
- 内存不足
- 应用存在异常内存占用
- 并发量过高
- 内存参数配置不合理
14.8 LVM
LVM 是 Linux 中常见的逻辑卷管理机制。
基本结构:
text
物理磁盘或分区
↓
PV:Physical Volume
↓
VG:Volume Group
↓
LV:Logical Volume
↓
文件系统与挂载点
常用命令:
bash
pvs
vgs
lvs
LVM 的优点:
- 灵活扩容
- 多磁盘组合
- 支持快照
- 便于管理逻辑存储
扩容时需要区分:
- 扩容底层磁盘或分区
- 扩容 PV
- 扩容 LV
- 扩容文件系统
不能只扩容逻辑卷而忽略文件系统。
15. Linux 网络管理
15.1 查看网卡和 IP
bash
ip addr
简写:
bash
ip a
查看指定网卡:
bash
ip addr show eth0
查看链路状态:
bash
ip link
15.2 查看路由
bash
ip route
通常可以看到默认网关:
text
default via 192.168.1.1 dev eth0
测试路由选择:
bash
ip route get 8.8.8.8
15.3 测试连通性
bash
ping 192.168.1.1
限制发送次数:
bash
ping -c 4 example.com
需要注意:
- Ping 成功不代表业务端口正常
- Ping 失败也不一定代表目标服务不可用
- 防火墙可能禁止 ICMP
15.4 DNS 查询
bash
dig example.com
查看简洁结果:
bash
dig +short example.com
使用指定 DNS:
bash
dig @8.8.8.8 example.com
也可以使用:
bash
nslookup example.com
查看系统解析结果:
bash
getent hosts example.com
15.5 查看端口
查看监听端口:
bash
ss -lntp
查看 UDP 端口:
bash
ss -lnup
查看所有 TCP 连接:
bash
ss -ant
查看 8080 端口:
bash
ss -lntp | grep ':8080'
查找占用端口的进程:
bash
sudo lsof -i :8080
15.6 使用 curl 测试 HTTP
查看响应内容:
bash
curl https://example.com
只查看响应头:
bash
curl -I https://example.com
显示详细连接过程:
bash
curl -v https://example.com
设置超时时间:
bash
curl --connect-timeout 5 --max-time 10 https://example.com
发送 JSON 请求:
bash
curl -X POST 'http://127.0.0.1:8080/api/users' \
-H 'Content-Type: application/json' \
-d '{"name":"linux-user"}'
查看状态码和耗时:
bash
curl -sS -o /dev/null \
-w 'status=%{http_code} connect=%{time_connect}s total=%{time_total}s\n' \
https://example.com
15.7 使用 nc 测试端口
bash
nc -vz example.com 443
测试本地端口:
bash
nc -vz 127.0.0.1 8080
15.8 路由追踪
bash
traceroute example.com
部分系统可以使用:
bash
tracepath example.com
15.9 SSH
远程登录:
bash
ssh user@server
指定端口:
bash
ssh -p 2222 user@server
生成密钥:
bash
ssh-keygen -t ed25519
复制公钥:
bash
ssh-copy-id user@server
SSH 配置示例:
sshconfig
Host my-server
HostName 192.168.1.100
User developer
Port 22
IdentityFile ~/.ssh/id_ed25519
之后可以直接连接:
bash
ssh my-server
15.10 防火墙
不同发行版可能使用不同防火墙管理工具:
- firewalld
- nftables
- iptables
- UFW
查看 firewalld 状态:
bash
sudo firewall-cmd --state
查看当前配置:
bash
sudo firewall-cmd --list-all
Ubuntu 中查看 UFW:
bash
sudo ufw status
开放端口前,应先确认:
- 是否确实需要公网访问
- 是否可以限制来源 IP
- 服务是否有身份认证
- 是否已经启用 TLS
- 是否存在默认口令
16. 日志与系统监控
16.1 journalctl
查看所有系统日志:
bash
journalctl
查看本次启动日志:
bash
journalctl -b
查看上一次启动日志:
bash
journalctl -b -1
查看指定服务:
bash
journalctl -u nginx
持续追踪:
bash
journalctl -u nginx -f
查看最近 100 行:
bash
journalctl -u nginx -n 100
按时间查看:
bash
journalctl --since "2026-08-20 10:00:00" \
--until "2026-08-20 11:00:00"
只看错误级别:
bash
journalctl -p err
16.2 /var/log
常见日志可能包括:
text
/var/log/messages
/var/log/syslog
/var/log/auth.log
/var/log/secure
/var/log/kern.log
/var/log/nginx/
/var/log/audit/
具体文件取决于发行版和日志服务配置。
16.3 内核日志
bash
dmesg
以易读时间显示:
bash
dmesg -T
查看错误和警告:
bash
dmesg -T | grep -Ei "error|warn|fail|oom"
dmesg 常用于排查:
- 磁盘错误
- 网卡异常
- 文件系统问题
- 驱动问题
- OOM Killer
- USB 设备问题
16.4 CPU 监控
查看负载:
bash
uptime
示例:
text
load average: 0.50, 0.80, 1.20
分别表示过去:
- 1 分钟
- 5 分钟
- 15 分钟
的平均负载。
负载不等于 CPU 使用率。处于不可中断等待状态的任务也可能增加系统负载。
查看 CPU 核数:
bash
nproc
查看每个 CPU 的使用情况:
bash
mpstat -P ALL 1
16.5 内存监控
bash
free -h
Linux 会尽可能利用空闲内存作为缓存,因此不能只看 free 列判断内存是否不足。
重点关注:
available- Swap 使用量
- 是否发生 OOM
- 进程的实际内存
- 内存是否持续增长
查看占用内存最多的进程:
bash
ps aux --sort=-%mem | head
16.6 磁盘 I/O
查看磁盘 I/O:
bash
iostat -xz 1
常见关注指标:
r/s:每秒读请求w/s:每秒写请求await:平均等待时间%util:设备繁忙程度
查看进程级 I/O:
bash
sudo iotop
16.7 综合监控
bash
vmstat 1
常见字段:
r:等待 CPU 的任务b:不可中断等待任务si:Swap 读入so:Swap 写出us:用户态 CPUsy:内核态 CPUid:空闲 CPUwa:I/O 等待
16.8 查看打开的文件
查看进程打开的文件:
bash
lsof -p PID
查看指定文件被谁占用:
bash
lsof /var/log/application.log
查看已删除但仍被进程占用的文件:
bash
sudo lsof +L1
这种情况可能出现:
- 日志文件已经删除
- 进程仍然持有文件描述符
df显示空间没有释放du却找不到对应大文件
17. Shell 脚本基础
Shell 脚本可以自动执行一系列 Linux 命令。
17.1 第一个 Shell 脚本
创建 hello.sh:
bash
#!/usr/bin/env bash
echo "Hello, Linux!"
增加执行权限:
bash
chmod +x hello.sh
执行:
bash
./hello.sh
17.2 变量
bash
name="Linux"
echo "$name"
等号两边不能随意添加空格:
bash
name="Linux"
下面的写法是错误的:
bash
name = "Linux"
读取命令结果:
bash
current_time="$(date '+%F %T')"
echo "$current_time"
17.3 引号区别
单引号不会展开变量:
bash
name="Linux"
echo '$name'
输出:
text
$name
双引号会展开变量:
bash
echo "$name"
输出:
text
Linux
在大多数情况下,变量应使用双引号:
bash
cp -- "$source_file" "$target_file"
这样可以降低空格、通配符和空变量造成的问题。
17.4 位置参数
bash
#!/usr/bin/env bash
echo "脚本名称:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "参数数量:$#"
echo "全部参数:$@"
执行:
bash
./args.sh hello linux
17.5 条件判断
bash
#!/usr/bin/env bash
file_path="/etc/passwd"
if [[ -f "$file_path" ]]; then
echo "文件存在:$file_path"
else
echo "文件不存在:$file_path"
fi
常见文件判断:
| 表达式 | 含义 |
|---|---|
-e |
路径存在 |
-f |
普通文件 |
-d |
目录 |
-r |
可读 |
-w |
可写 |
-x |
可执行 |
-s |
文件非空 |
字符串判断:
bash
if [[ "$environment" == "production" ]]; then
echo "生产环境"
fi
数字判断:
bash
if (( count > 10 )); then
echo "数量大于 10"
fi
17.6 循环
遍历参数:
bash
for item in "$@"; do
echo "$item"
done
数字循环:
bash
for number in {1..5}; do
echo "$number"
done
读取文件:
bash
while IFS= read -r line; do
echo "$line"
done < input.txt
17.7 函数
bash
log_info() {
local message="$1"
printf '[INFO] %s %s\n' "$(date '+%F %T')" "$message"
}
log_info "服务启动"
17.8 错误处理
建议在需要严格失败处理的脚本中使用:
bash
set -Eeuo pipefail
含义:
-e:命令失败时退出-E:让 ERR trap 在函数等场景继承-u:使用未定义变量时报错pipefail:管道中任一命令失败则认为管道失败
需要注意,这些选项会影响脚本控制流,不能机械地加入所有历史脚本,应结合实际逻辑测试。
17.9 一个简单的备份脚本
bash
#!/usr/bin/env bash
set -Eeuo pipefail
readonly SOURCE_DIR="/opt/my-app"
readonly BACKUP_DIR="/data/backups/my-app"
readonly TIMESTAMP="$(date '+%Y%m%d-%H%M%S')"
readonly BACKUP_FILE="${BACKUP_DIR}/my-app-${TIMESTAMP}.tar.gz"
log() {
printf '[%s] %s\n' "$(date '+%F %T')" "$*"
}
if [[ ! -d "$SOURCE_DIR" ]]; then
log "源目录不存在:$SOURCE_DIR"
exit 1
fi
mkdir -p -- "$BACKUP_DIR"
log "开始备份:$SOURCE_DIR"
tar -czf "$BACKUP_FILE" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
if [[ ! -s "$BACKUP_FILE" ]]; then
log "备份文件为空:$BACKUP_FILE"
exit 1
fi
log "备份完成:$BACKUP_FILE"
生产备份还需要考虑:
- 数据一致性
- 数据库事务
- 文件校验
- 加密
- 异地存储
- 保留周期
- 恢复演练
- 监控告警
备份成功不等于数据一定可以恢复,必须定期进行恢复验证。
17.10 Cron 定时任务
编辑当前用户的 Cron:
bash
crontab -e
查看任务:
bash
crontab -l
示例:
cron
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
表示每天凌晨 2 点执行。
Cron 格式:
text
分钟 小时 日期 月份 星期 命令
需要注意 Cron 的运行环境通常比较精简,脚本中应:
- 使用绝对路径
- 明确设置环境变量
- 保存标准输出和错误输出
- 设置合理超时
- 防止重复执行
- 检查退出码
18. Linux 安全实践
18.1 最小权限原则
只授予完成工作所需的最小权限。
不要为了方便直接执行:
bash
chmod -R 777 /opt/my-app
777 意味着所有用户都可以读、写、执行,可能导致:
- 配置被篡改
- 程序被替换
- 恶意文件被写入
- 权限边界失效
更合理的方式是明确所有者和用户组:
bash
sudo chown -R app:app /opt/my-app
sudo find /opt/my-app -type d -exec chmod 750 {} +
sudo find /opt/my-app -type f -exec chmod 640 {} +
sudo chmod 750 /opt/my-app/bin/start.sh
执行前应先确认目标目录和实际权限需求。
18.2 及时安装安全更新
定期更新软件包,优先修复:
- 内核漏洞
- OpenSSH 漏洞
- Web 服务器漏洞
- 数据库漏洞
- TLS 库漏洞
- 对外服务漏洞
更新生产服务器前应:
- 阅读变更说明
- 在测试环境验证
- 评估兼容性
- 准备回滚方案
- 选择维护窗口
- 更新后验证业务
18.3 SSH 安全
建议:
- 使用密钥认证
- 禁止弱密码
- 限制 root 远程登录
- 限制允许登录的用户
- 配置防火墙来源限制
- 监控失败登录
- 妥善保护私钥
- 为私钥设置口令
私钥权限应足够严格:
bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 600 ~/.ssh/authorized_keys
18.4 防火墙
只开放业务真正需要的端口。
例如,一个 Web 服务器可能只需要:
- 22:SSH,最好限制来源
- 80:HTTP
- 443:HTTPS
数据库端口通常不应直接暴露到公网。
18.5 SELinux 与 AppArmor
SELinux 和 AppArmor 属于强制访问控制机制。
SELinux 常见模式:
- Enforcing:强制执行
- Permissive:只记录,不阻止
- Disabled:禁用
查看 SELinux 状态:
bash
getenforce
遇到权限问题时,不应第一时间永久关闭 SELinux。应先检查审计日志,确认:
- 哪个进程被阻止
- 访问了什么资源
- 使用了什么安全上下文
- 是否是程序配置或文件标签问题
18.6 保护敏感信息
不要在以下位置明文保存密码、Token 和私钥:
- Git 仓库
- Shell 历史
- 公共日志
- 命令行参数
- 普通用户可读配置
- 镜像构建层
建议使用:
- 环境隔离的密钥管理服务
- 权限受控的配置文件
- 容器 Secret
- CI/CD Secret
- 专业密码管理工具
18.7 审计和监控
应关注:
- 登录成功与失败记录
- sudo 使用记录
- 新用户创建
- 用户组变更
- SSH 密钥变更
- 服务配置变更
- 对外监听端口变化
- 异常进程
- 异常网络连接
- 磁盘与内存异常
- 安全策略告警
19. Linux 常见故障排查
Linux 故障排查的核心不是盲目重启,而是建立完整证据链。
建议按照以下顺序排查:
text
确认现象
↓
确认影响范围
↓
记录发生时间
↓
检查最近变更
↓
检查服务状态
↓
检查日志
↓
检查 CPU、内存、磁盘、网络
↓
定位根因
↓
制定恢复和修复方案
↓
验证结果
↓
记录复盘
19.1 服务无法启动
第一步,查看状态:
bash
systemctl status my-app
第二步,查看服务日志:
bash
journalctl -u my-app -n 200 --no-pager
第三步,检查 Unit 文件:
bash
systemctl cat my-app
第四步,检查启动命令:
bash
sudo -u app /usr/bin/java -jar /opt/my-app/app.jar
第五步,检查常见问题:
- 配置文件语法错误
- 端口被占用
- 文件不存在
- 权限不足
- 环境变量缺失
- 工作目录错误
- 依赖服务未启动
- 磁盘空间不足
- 内存不足
- 程序启动后立即退出
19.2 端口无法访问
检查服务是否监听:
bash
ss -lntp | grep ':8080'
本机访问:
bash
curl -v http://127.0.0.1:8080/
使用实际网卡地址测试:
bash
curl -v http://192.168.1.100:8080/
检查监听地址:
text
127.0.0.1:8080
0.0.0.0:8080
[::]:8080
区别:
127.0.0.1:通常只能本机访问0.0.0.0:监听所有 IPv4 地址[::]:监听 IPv6,是否同时接受 IPv4 取决于系统和程序配置
继续检查:
- 防火墙
- 云安全组
- 路由
- 代理配置
- 容器端口映射
- SELinux
- 服务认证
- DNS 解析
19.3 CPU 使用率过高
查看整体状态:
bash
top
查看 CPU 占用最高的进程:
bash
ps aux --sort=-%cpu | head
查看指定进程线程:
bash
top -H -p PID
排查方向:
- 死循环
- 高频重试
- 大量垃圾回收
- 正则表达式回溯
- 压缩或加密计算
- 数据库慢查询导致应用自旋
- 流量突然增加
- 异常进程或挖矿程序
- 内核中断异常
不要只看某一个瞬时采样,应持续观察一段时间。
19.4 内存不足
查看内存:
bash
free -h
查看内存占用进程:
bash
ps aux --sort=-%mem | head
检查 OOM:
bash
journalctl -k | grep -i -E "out of memory|killed process|oom"
排查方向:
- 内存泄漏
- JVM 堆设置过大
- 并发量异常
- 缓存无限增长
- 大文件一次性载入内存
- 容器内存限制过小
- 进程数量异常
- Swap 持续抖动
19.5 磁盘空间不足
查看文件系统:
bash
df -h
查看 inode:
bash
df -i
定位大目录:
bash
du -xhd1 / | sort -h
du -xhd1 /var | sort -h
定位大文件:
bash
find /var -xdev -type f -size +500M -ls
检查已删除但仍被占用的文件:
bash
sudo lsof +L1
常见原因:
- 应用日志无限增长
- Docker 镜像和容器日志
- 数据库日志
- 临时文件
- 备份文件没有清理
- core dump
- 文件被删除但进程仍占用
- inode 耗尽
不要在未确认文件用途时直接删除数据库、系统或应用数据。
19.6 磁盘 I/O 高
bash
iostat -xz 1
sudo iotop
vmstat 1
排查方向:
- 大量日志写入
- 数据库全表扫描
- 备份任务
- 大文件复制
- Swap 频繁读写
- 磁盘故障
- 网络存储延迟
- 多个任务竞争同一磁盘
19.7 DNS 解析异常
检查系统解析:
bash
getent hosts example.com
直接查询 DNS:
bash
dig example.com
使用指定 DNS 对比:
bash
dig @8.8.8.8 example.com
检查:
bash
cat /etc/resolv.conf
还需要注意:
/etc/hosts- systemd-resolved
- 容器 DNS
- VPN 配置
- 企业内部 DNS
- DNS 缓存
- 域名是否过期
- 不同网络环境的分流策略
19.8 系统负载高但 CPU 不高
查看负载:
bash
uptime
查看不可中断等待任务:
bash
ps -eo state,pid,ppid,comm,wchan:32 | awk '$1 ~ /^D/'
查看 I/O:
bash
iostat -xz 1
vmstat 1
这种情况可能是:
- 磁盘 I/O 阻塞
- NFS 卡顿
- 块设备异常
- 内核锁竞争
- 文件系统问题
- 大量不可中断睡眠进程
19.9 "命令不存在"
例如:
text
bash: curl: command not found
排查:
bash
command -v curl
echo "$PATH"
可能原因:
- 软件未安装
- 可执行文件不在
PATH - 命令名称错误
- 当前 Shell 环境不同
- 脚本在 Cron 中缺少环境变量
- 文件没有执行权限
- 脚本解释器不存在
19.10 权限不足
错误示例:
text
Permission denied
检查:
bash
id
namei -l /path/to/file
ls -l /path/to/file
ls -ld /path/to/directory
需要同时检查:
- 文件权限
- 目录的执行权限
- 文件所有者和用户组
- ACL
- SELinux 或 AppArmor
- 挂载参数
- 只读文件系统
- 容器用户映射
不要简单地用 chmod 777 掩盖根因。
20. Linux 使用最佳实践
20.1 操作前确认环境
执行重要命令前确认:
bash
whoami
hostname
pwd
如果是 Git 项目,还应确认:
bash
git rev-parse --show-toplevel
git branch --show-current
git status --short --branch
20.2 修改配置前备份
bash
sudo cp -a /etc/nginx/nginx.conf \
/etc/nginx/nginx.conf.bak
备份文件应包含时间戳或版本信息,避免重复覆盖。
20.3 修改后先检查语法
例如 Nginx:
bash
sudo nginx -t
SSH:
bash
sudo sshd -t
systemd:
bash
sudo systemd-analyze verify /etc/systemd/system/my-app.service
确认无误后再重新加载服务。
20.4 优先 reload,必要时 restart
如果服务支持平滑加载配置:
bash
sudo systemctl reload nginx
相比重启,reload 通常对现有连接影响更小。
但是否支持以及是否真正生效,需要以对应软件的行为为准。
20.5 使用日志轮转
Linux 通常使用 logrotate 管理日志。
示例:
text
/var/log/my-app/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
copytruncate
}
需要注意,copytruncate 可能存在少量日志丢失窗口。更可靠的方式通常是让应用响应日志重开信号或直接使用标准输出配合日志系统。
20.6 为命令设置超时
防止网络命令无限等待:
bash
timeout 30s curl -f https://example.com/health
20.7 谨慎使用通配符和变量
执行删除或移动前先打印目标:
bash
printf '%s\n' "$target_path"
检查目录:
bash
ls -ld -- "$target_path"
避免未经验证地执行:
bash
rm -rf "$target_path"
尤其当变量可能为空、来源不可信或目标范围不明确时。
20.8 自动化任务要支持重复执行
好的运维脚本应尽量具备:
- 幂等性
- 清晰日志
- 明确退出码
- 参数校验
- 超时处理
- 并发控制
- 失败回滚
- 执行结果校验
- 告警通知
20.9 监控四大基础资源
至少监控:
- CPU
- 内存
- 磁盘
- 网络
同时还应监控:
- 服务存活
- 业务接口
- 错误率
- 响应时间
- 连接数
- 队列积压
- 数据库状态
- 证书有效期
- 备份状态
20.10 变更必须可回滚
生产变更前应明确:
- 改了什么
- 为什么修改
- 谁执行
- 什么时候执行
- 如何验证
- 如何回滚
- 回滚需要多长时间
- 数据是否兼容回滚
21. Linux 常用命令速查
21.1 系统信息
bash
uname -a
cat /etc/os-release
hostnamectl
uptime
date
timedatectl
nproc
lscpu
free -h
21.2 文件和目录
bash
pwd
ls -lah
cd /path
mkdir -p directory
touch file
cp -a source target
mv source target
rm -i file
find /path -name "*.log"
stat file
file filename
21.3 文本处理
bash
cat file
less file
head -n 20 file
tail -n 100 file
tail -f file
grep -n "ERROR" file
awk '{print $1}' file
sed 's/old/new/g' file
sort file
uniq -c
wc -l file
21.4 权限管理
bash
whoami
id
chmod 640 file
chmod u+x script.sh
chown user:group file
sudo command
getent passwd username
getent group groupname
21.5 进程管理
bash
ps aux
top
pgrep -a process-name
pstree -p
kill PID
kill -9 PID
jobs
fg %1
bg %1
nohup command &
21.6 服务管理
bash
systemctl status service
systemctl start service
systemctl stop service
systemctl restart service
systemctl reload service
systemctl enable --now service
systemctl disable service
systemctl --failed
journalctl -u service
21.7 磁盘管理
bash
lsblk -f
blkid
df -h
df -i
du -sh directory
findmnt
mount
umount
swapon --show
21.8 网络管理
bash
ip addr
ip route
ping -c 4 host
dig domain
getent hosts domain
ss -lntp
curl -v URL
nc -vz host port
traceroute host
ssh user@host
21.9 日志与性能
bash
journalctl -b
journalctl -p err
dmesg -T
vmstat 1
iostat -xz 1
mpstat -P ALL 1
lsof -p PID
sudo lsof +L1
21.10 压缩与解压
创建 tar 包:
bash
tar -cf archive.tar directory
创建 gzip 压缩包:
bash
tar -czf archive.tar.gz directory
解压 tar 包:
bash
tar -xf archive.tar
解压 gzip 压缩包:
bash
tar -xzf archive.tar.gz
查看压缩包内容:
bash
tar -tf archive.tar.gz
ZIP 压缩:
bash
zip -r archive.zip directory
ZIP 解压:
bash
unzip archive.zip
22. Linux 学习路线
22.1 第一阶段:掌握基础命令
重点学习:
pwdcdlsmkdircpmvrmcatlessgrepfindtar
目标是能够熟练操作文件和目录。
22.2 第二阶段:理解系统基础
重点学习:
- Linux 文件系统
- 用户和用户组
- 文件权限
- 进程与信号
- 环境变量
- 软件包管理
- systemd 服务
目标是能够安装软件、管理用户和运行服务。
22.3 第三阶段:学习网络和存储
重点学习:
- IP 地址
- 路由
- DNS
- TCP 和 UDP
- SSH
- 防火墙
- 磁盘分区
- 文件系统
- 挂载
- LVM
目标是能够部署和维护基础服务器。
22.4 第四阶段:学习 Shell 脚本
重点学习:
- 变量
- 条件
- 循环
- 函数
- 参数处理
- 错误处理
- 日志记录
- 定时任务
目标是能够将重复操作自动化。
22.5 第五阶段:学习服务部署
可以尝试部署:
- Nginx
- Java 应用
- MySQL
- Redis
- Docker
- Git 服务
- 监控系统
目标是将 Linux 基础知识应用到真实项目。
22.6 第六阶段:学习故障排查
重点练习:
- CPU 高
- 内存不足
- 磁盘满
- 端口冲突
- DNS 异常
- 服务启动失败
- 权限错误
- 网络不通
- I/O 延迟
- 日志异常
排障能力的核心不是记住多少命令,而是能否建立清晰的证据链。
23. 常见问题
23.1 Linux 是否适合普通用户
适合。
如果只是办公、浏览网页和日常开发,可以选择带桌面环境的 Ubuntu、Linux Mint 等发行版。
但某些专业软件、游戏和硬件驱动可能仍需要确认兼容性。
23.2 Linux 是否没有图形界面
不是。
Linux 可以使用多种桌面环境,例如:
- GNOME
- KDE Plasma
- Xfce
- Cinnamon
- LXQt
服务器通常不安装图形界面,是为了减少资源占用和攻击面。
23.3 Linux 是否不需要重启
Linux 可以长时间运行,许多服务也支持单独重启或重新加载,但以下情况仍可能需要重启:
- 更换内核
- 某些安全更新
- 底层驱动更新
- 硬件维护
- 无法在线恢复的系统故障
不能将"不经常重启"理解为"永远不需要重启"。
23.4 为什么 Linux 内存看起来总是被占满
Linux 会将空闲内存用于文件缓存,以提高磁盘访问性能。
应重点查看:
bash
free -h
输出中的 available,而不是只看 free。
当应用需要内存时,系统可以回收一部分缓存。
23.5 root 用户和 sudo 有什么区别
root 是系统超级用户,拥有几乎所有权限。
sudo 是让经过授权的普通用户临时以其他用户身份执行某条命令。
日常操作推荐使用普通用户,需要时再使用 sudo。
23.6 为什么不建议使用 chmod 777
因为 777 会让所有用户都拥有读、写和执行权限,容易造成安全风险。
应根据实际需要设置:
- 正确的所有者
- 正确的用户组
- 最小化的读写执行权限
- 必要时使用 ACL
23.7 为什么删除日志后磁盘空间没有释放
如果进程仍然打开该日志文件,文件虽然从目录中消失,但磁盘空间仍被占用。
可以检查:
bash
sudo lsof +L1
正确处理方式通常是:
- 让程序重新打开日志
- 平滑重载服务
- 必要时重启相关进程
- 配置合理的日志轮转
23.8 Linux 命令是否区分大小写
区分。
例如:
text
README.md
readme.md
在 Linux 中通常是两个不同的文件。
命令名称和参数也可能区分大小写。
23.9 Linux 与 Docker 是什么关系
Docker 容器依赖 Linux 内核提供的隔离和资源控制能力,例如:
- Namespace
- Control Groups
- Capabilities
- Union 文件系统
- 网络命名空间
容器不是传统意义上的完整虚拟机。多个容器通常共享宿主机内核,但拥有相互隔离的用户空间和资源视图。
23.10 学 Linux 是否需要背命令
不需要死记所有命令。
更重要的是:
- 理解系统结构
- 知道某类问题应使用什么工具
- 会查看
--help - 会使用
man - 会阅读日志
- 会组合管道
- 会验证操作结果
- 对危险操作保持谨慎
常用命令会在持续使用中自然记住。
24. 总结
Linux 是现代软件基础设施中非常重要的一部分。
学习 Linux 不只是学习一组命令,而是逐步理解:
- 操作系统如何管理硬件
- 文件系统如何组织数据
- 用户和权限如何隔离资源
- 进程如何运行和通信
- 服务如何启动和维护
- 网络请求如何到达应用
- 日志如何记录系统行为
- 故障如何通过证据逐步定位
- 自动化脚本如何减少重复工作
- 安全策略如何降低系统风险
对于初学者来说,可以从文件操作、权限、进程和网络命令开始,再逐步学习 systemd、Shell 脚本、磁盘管理、性能监控和故障排查。
真正掌握 Linux 的最好方式不是只阅读命令,而是在虚拟机、WSL 或测试服务器中不断实践:
- 安装一个 Linux 系统
- 创建用户和用户组
- 部署一个简单 Web 服务
- 配置 systemd 开机启动
- 编写日志和备份脚本
- 模拟端口冲突、磁盘不足等故障
- 使用日志和监控命令定位问题
- 记录每次操作、判断依据和验证结果
当你能够理解每条命令为什么执行、可能产生什么影响,并且知道如何验证和回滚时,才算真正具备了可靠的 Linux 使用与运维能力。