Linux 从入门到实践:系统架构、常用命令、服务管理与故障排查详解

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 具有以下特点:

  1. 开源免费

    Linux 内核源代码公开,任何人都可以学习、修改和重新发布。

  2. 稳定性高

    Linux 经常被用于服务器和关键业务系统,可以长时间持续运行。

  3. 安全性较高

    Linux 提供完善的用户、用户组、文件权限、进程隔离和安全模块。

  4. 可定制性强

    用户可以根据需要选择不同的内核、桌面环境、Shell 和软件包。

  5. 支持多用户

    多个用户可以同时登录并使用同一台 Linux 服务器。

  6. 支持多任务

    Linux 可以同时运行大量进程,并通过调度器分配 CPU 时间。

  7. 网络功能强大

    Linux 原生支持 TCP/IP、路由、防火墙、VPN、DNS、SSH 等网络功能。

  8. 硬件平台广泛

    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 软件包
  • 常用 dnfyum 进行软件管理
  • 对 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:向下搜索 error
  • n:跳到下一个匹配项
  • 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

处理带空格的文件名时,应优先使用 -print0xargs -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:进程 ID
  • USER:进程所属用户
  • 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 分区与格式化

常见分区工具:

  • fdisk
  • parted
  • gdisk

格式化 ext4 文件系统:

bash 复制代码
sudo mkfs.ext4 /dev/sdb1

格式化 XFS 文件系统:

bash 复制代码
sudo mkfs.xfs /dev/sdb1

格式化会破坏目标分区上的原有数据。执行前必须通过 lsblk -fblkid 等命令确认设备名称、挂载状态和数据备份。

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 的优点:

  • 灵活扩容
  • 多磁盘组合
  • 支持快照
  • 便于管理逻辑存储

扩容时需要区分:

  1. 扩容底层磁盘或分区
  2. 扩容 PV
  3. 扩容 LV
  4. 扩容文件系统

不能只扩容逻辑卷而忽略文件系统。


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:用户态 CPU
  • sy:内核态 CPU
  • id:空闲 CPU
  • wa: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 库漏洞
  • 对外服务漏洞

更新生产服务器前应:

  1. 阅读变更说明
  2. 在测试环境验证
  3. 评估兼容性
  4. 准备回滚方案
  5. 选择维护窗口
  6. 更新后验证业务

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 第一阶段:掌握基础命令

重点学习:

  • pwd
  • cd
  • ls
  • mkdir
  • cp
  • mv
  • rm
  • cat
  • less
  • grep
  • find
  • tar

目标是能够熟练操作文件和目录。

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 或测试服务器中不断实践:

  1. 安装一个 Linux 系统
  2. 创建用户和用户组
  3. 部署一个简单 Web 服务
  4. 配置 systemd 开机启动
  5. 编写日志和备份脚本
  6. 模拟端口冲突、磁盘不足等故障
  7. 使用日志和监控命令定位问题
  8. 记录每次操作、判断依据和验证结果

当你能够理解每条命令为什么执行、可能产生什么影响,并且知道如何验证和回滚时,才算真正具备了可靠的 Linux 使用与运维能力。

相关推荐
小雪崩2 小时前
嵌入式学习 day27:标准IO
linux·c语言·学习
Arnold.Shen2 小时前
Dell Storage SC - 如何发送SupportAssist,并启用安全控制台
linux·安全
青瓦梦滋2 小时前
IP/MAC帧/ARP协议
运维·服务器·网络·网络协议·tcp/ip
wunaiqiezixin2 小时前
MIT 6.S081 xv6 源码精读(Scheduling):sched、scheduler
linux·unix·os·xv6·mit6.s081
老郑聊AI业财智造2 小时前
Qwen技术架构与源码深度剖析
人工智能·语言模型·架构·系统架构·软件工程
书生执笔画浮沉3 小时前
记录一个由浮点运算引起的崩溃
linux
阿 才3 小时前
Matlab(Simulink)使用详解
运维·网络·matlab
St_rive3 小时前
webUI自动化实现及封装
运维·自动化
xx~t3 小时前
嵌入式——Linux软件编程2
linux·运维·服务器·c语言·学习方法