Appearance
Linux
Linux 是一个开源的类 Unix 操作系统内核,由 Linus Torvalds 于 1991 年首次发布。Linux 不仅是服务器操作系统的主流选择,也广泛应用于嵌入式系统、移动设备(Android)、超级计算机等领域。Linux 的开源特性使其拥有庞大的社区支持和完善的生态系统,从日常桌面应用到企业级数据中心,Linux 无处不在。Linux 的核心理念是自由软件运动的精神体现,任何人都可以自由地使用、研究、修改和分发 Linux 源代码。
Linux 操作系统通常指的是基于 Linux 内核的完整操作系统发行版,如 Ubuntu、Debian、Fedora、CentOS、Arch Linux 等。这些发行版在 Linux 内核的基础上,整合了 GNU 工具链、图形界面系统、软件包管理系统和其他应用软件,形成了完整的操作系统。不同的发行版针对不同的使用场景和用户群体进行了优化,有些注重稳定性,适合服务器部署;有些注重易用性,适合桌面办公;有些注重滚动更新,适合技术爱好者。
系统架构
内核层
Linux 内核是操作系统的核心组件,负责管理硬件资源、提供系统调用接口、调度进程、处理中断等关键任务。内核采用单内核架构,但通过模块化设计实现了高度的灵活性和可扩展性。内核的主要子系统包括进程调度器、内存管理器、虚拟文件系统、网络协议栈、设备驱动程序等。进程调度器负责公平合理地分配 CPU 时间,内存管理器负责物理内存和虚拟内存的管理,虚拟文件系统提供了统一的文件操作接口,网络协议栈实现了 TCP/IP 协议族,设备驱动程序则负责与各种硬件设备通信。
内核采用模块化设计,允许在运行时动态加载和卸载内核模块,这大大简化了硬件驱动的管理和系统功能的扩展。当系统启动时,内核首先加载到内存中,初始化各个子系统,然后启动第一个用户空间进程 init 或 systemd。内核运行在特权模式(内核态),具有访问所有硬件资源的权限,而用户程序运行在用户态,通过系统调用请求内核服务。这种双模式设计确保了系统的稳定性和安全性,防止用户程序直接访问关键硬件资源。
系统调用
系统调用是用户程序请求内核服务的接口,是用户空间与内核空间交互的唯一方式。当用户程序需要执行特权操作(如文件读写、进程创建、网络通信等)时,必须通过系统调用请求内核代为执行。Linux 提供了数百个系统调用,涵盖了进程管理、文件操作、内存管理、网络通信、设备控制等方面。每个系统调用都有一个唯一的系统调用号,用户程序通过软中断或快速系统调用指令触发系统调用,并将系统调用号和参数传递给内核。
常见的系统调用包括 fork 用于创建进程、exec 用于执行新程序、open 和 close 用于打开和关闭文件、read 和 write 用于读写文件、mmap 用于内存映射、socket 用于创建网络套接字等。在高级编程语言中,通常通过标准库(如 glibc)封装这些系统调用,提供更友好的编程接口。例如,C 语言的 fopen 函数内部会调用 open 系统调用,printf 函数最终会调用 write 系统调用。理解系统调用对于深入理解 Linux 操作系统的工作原理至关重要。
用户空间 内核空间
┌─────────────────┐ ┌─────────────────┐
│ 应用程序 │ │ 内核 │
│ ───────────── │ 系统调用 │ ───────────── │
│ 标准库 (glibc) │───────────→│ 系统调用接口 │
│ │ │ ───────────── │
│ │ │ 进程调度 │
│ │ │ 内存管理 │
│ │ │ 文件系统 │
│ │ │ 网络协议栈 │
│ │ │ 设备驱动 │
└─────────────────┘ └─────────────────┘用户空间
用户空间是用户程序运行的区域,与内核空间相互隔离。每个用户进程都有独立的虚拟地址空间,操作系统通过内存保护机制防止进程之间相互干扰或越权访问内核空间。用户空间程序包括系统工具、应用软件、脚本解释器等,它们通过标准库与系统调用接口交互。用户空间的初始化由内核完成,内核在完成系统初始化后,会启动第一个用户空间进程(通常是 /sbin/init 或 systemd),然后由 init 进程负责启动其他系统服务和用户程序。
用户空间程序可以分为前台程序和后台程序。前台程序与用户直接交互,接收用户输入并产生输出;后台程序通常作为服务运行,不需要用户直接干预。Linux 提供了多种机制来管理用户空间程序的生命周期,包括 init 系统、systemd、cron 定时任务等。系统启动过程中,内核首先初始化硬件和核心子系统,然后加载 init 程序,init 程序根据系统配置启动各种服务,最终进入用户可用的登录状态。了解用户空间与内核空间的交互机制,对于系统编程和系统管理都具有重要意义。
文件系统
目录结构
Linux 采用统一的目录结构,所有文件和设备都挂载在这个树形结构中。根目录 / 是整个文件系统的起点,所有其他目录都是根目录的子目录。/bin 目录存放基本的用户命令二进制文件,如 ls、cp、mv 等;/sbin 存放系统管理命令,如 fdisk、mkfs 等;/etc 存放系统配置文件,几乎所有系统级配置都在这个目录或其子目录中;/home 是普通用户的主目录,每个用户在该目录下有一个以用户名命名的子目录;/root 是超级用户 root 的主目录。
/var 目录存放可变数据,如日志文件、邮件队列、缓存数据等;/tmp 存放临时文件,系统重启后通常会被清空;/usr 存放用户程序和文件,是最大的目录之一,包含 /usr/bin、/usr/lib、/usr/share 等子目录;/opt 用于安装可选的软件包;/boot 存放启动相关文件,包括内核镜像和引导加载程序配置;/lib 和 /lib64 存放共享库文件;/dev 存放设备文件,通过这些文件可以访问硬件设备;/proc 和 /sys 是虚拟文件系统,提供访问内核信息和配置内核参数的接口。
Linux 目录结构:
/
├── bin # 基本命令
├── sbin # 系统管理命令
├── etc # 配置文件
│ ├── sysconfig/ # 系统配置
│ ├── systemd/ # systemd 服务配置
│ └── passwd, group # 用户和组信息
├── home # 用户主目录
│ ├── user1/
│ └── user2/
├── root # 超级用户主目录
├── var # 可变数据
│ ├── log/ # 日志文件
│ ├── mail/ # 邮件
│ └── www/ # Web 数据
├── tmp # 临时文件
├── usr # 用户程序
│ ├── bin/
│ ├── lib/
│ └── share/
├── opt # 可选软件包
├── boot # 启动文件
├── lib, lib64 # 共享库
├── dev # 设备文件
├── proc # 内核信息
└── sys # 系统信息文件类型
Linux 支持多种文件类型,普通文件是最常见的类型,用于存储数据和程序代码;目录文件用于组织其他文件,形成树形结构;字符设备文件和块设备文件用于访问硬件设备,通过设备文件可以与键盘、鼠标、磁盘、网络接口等硬件通信;套接字文件用于进程间网络通信,通常位于 /run 或 /var/run 目录下;命名管道(FIFO)用于进程间单向数据传输;符号链接和硬链接用于指向其他文件,提供便捷的访问路径。
每种文件类型都有其特定的用途和访问方式。设备文件分为字符设备(按字符流访问,如键盘、串口)和块设备(按数据块访问,如硬盘、U盘)。套接字文件用于本地进程间通信,是 Unix 域套接字的文件系统表示形式。命名管道用于相关进程间的数据传递,是进程通信的一种方式。符号链接类似于 Windows 的快捷方式,可以跨越文件系统边界;硬链接是文件的多个别名,与原文件共享同一个 inode。理解文件类型对于正确使用 Linux 文件系统至关重要。
文件操作命令
Linux 提供了丰富的文件操作命令,是日常系统管理和开发工作的基础。ls 命令用于列出目录内容,支持多种选项如 -l 显示详细信息、-a 显示隐藏文件、-h 以人类可读格式显示文件大小、-R 递归列出子目录。cd 命令用于切换当前目录,支持绝对路径和相对路径。pwd 命令显示当前工作目录的完整路径。mkdir 命令创建新目录,-p 选项可以创建多级目录。cp 命令复制文件或目录,-r 选项递归复制目录,-a 选项保持文件属性。
mv 命令移动或重命名文件和目录。rm 命令删除文件,-r 选项递归删除目录,-f 选项强制删除不提示。touch 命令创建空文件或更新文件时间戳。cat 命令连接并显示文件内容,适用于小文件。less 和 more 命令分页显示文件内容,支持前后翻页和搜索。head 和 tail 命令分别显示文件的开头和结尾部分,tail -f 选项可以实时监控文件变化。find 命令在目录树中搜索文件,支持按名称、大小、时间、权限等多种条件搜索。grep 命令在文件中搜索文本模式,是文本处理和日志分析的利器。
bash
# 文件和目录操作
ls -lah # 列出所有文件详细信息
ls -R # 递归列出目录
cd /path/to/directory # 切换目录
pwd # 显示当前路径
mkdir -p a/b/c # 创建多级目录
cp -r source dest # 递归复制目录
mv oldname newname # 重命名
rm -rf directory # 强制递归删除
touch filename # 创建空文件或更新时间
# 文件内容查看
cat file.txt # 显示文件全部内容
less file.txt # 分页查看大文件
head -20 file.txt # 查看前20行
tail -f /var/log/syslog # 实时监控日志
grep -r "keyword" /path # 递归搜索关键词
# 文件搜索
find / -name "*.log" # 查找所有日志文件
locate filename # 快速文件搜索
which command # 查找命令位置
whereis command # 查找命令位置和文档用户与权限
用户管理
Linux 是一个多用户操作系统,支持多个用户同时使用系统资源。每个用户都有一个唯一的用户 ID(UID),系统通过 UID 识别和管理用户。用户分为普通用户和超级用户,超级用户(root)的 UID 为 0,拥有系统的完全控制权。用户的属性信息存储在 /etc/passwd 文件中,包括用户名、UID、主组 ID、登录 shell、主目录等信息。用户的密码经过哈希处理后存储在 /etc/shadow 文件中,该文件只有 root 用户可读。
用户组是用户的逻辑集合,用于简化权限管理。每个用户都有一个主组,可以属于多个附加组。组的属性信息存储在 /etc/group 文件中,包括组名、GID 和成员列表。用户管理命令包括 useradd(创建用户)、usermod(修改用户属性)、userdel(删除用户)、passwd(修改密码)、chfn(修改用户信息)、chsh(修改登录 shell)等。合理的用户和组规划是系统安全的基础,应遵循最小权限原则,避免过度授权。
bash
# 用户管理
useradd -m username # 创建新用户(带主目录)
useradd -e 2025-12-31 user # 设置账户过期日期
usermod -aG group user # 将用户添加到组
usermod -L username # 锁定用户
userdel -r username # 删除用户及主目录
# 组管理
groupadd groupname # 创建新组
groupdel groupname # 删除组
gpasswd -a user group # 添加用户到组
gpasswd -d user group # 从组移除用户
# 密码管理
passwd username # 设置用户密码
passwd -l username # 锁定账户
passwd -u username # 解锁账户
chage -l username # 查看密码策略权限体系
Linux 使用三位八进制数表示文件权限,分别对应所有者(owner)、所属组(group)和其他用户(others)的权限。每组权限由读(r,值为 4)、写(w,值为 2)、执行(x,值为 1)三个权限位组成。例如,权限值 755 表示所有者有读写执行权限(7),组用户和其他用户有读和执行权限(5)。目录的执行权限表示可以进入目录,读权限可以列出目录内容,写权限可以在目录中创建和删除文件。
特殊权限位包括 SetUID(s)、SetGID(s)和粘滞位(t)。SetUID 和 SetGID 允许普通用户在执行程序时临时获得文件所有者或所属组的权限,常用于需要特权的程序如 passwd。粘滞位用于共享目录如 /tmp,确保用户只能删除自己创建的文件。文件属性还包括文件类型标识(如 d 表示目录、l 表示符号链接、- 表示普通文件)。chmod 命令用于修改权限,chown 用于修改所有者和所属组,chgrp 用于修改所属组。
bash
# 权限表示
# 权限格式: [文件类型][所有者权限][组权限][其他权限]
# 例如: -rw-r--r-- (普通文件, 所有者读写, 组读, 其他读)
# 例如: drwxr-xr-x (目录, 所有者读写执行, 组读执行, 其他读执行)
# 使用 chmod 修改权限
chmod 755 file # 设置权限为 rwxr-xr-x
chmod +x script.sh # 添加执行权限
chmod -R 644 docs/ # 递归设置目录权限
chmod u+x,go-w file # 所有者加执行, 组和其他减写
# 使用数字表示权限
# 7 = rwx, 6 = rw-, 5 = r-x, 4 = r--, 3 = -wx, 2 = -w-, 1 = --x, 0 = ---
# 特殊权限
chmod u+s /usr/bin/passwd # 设置 SetUID
chmod g+s /var/data # 设置 SetGID
chmod +t /tmp # 设置粘滞位
# 修改所有者和组
chown user:group file # 修改所有者和组
chown -R user:group dir/ # 递归修改
chgrp group file # 仅修改组访问控制列表
传统的 Unix 权限模型在复杂场景下存在局限性,访问控制列表(ACL)提供了更细粒度的权限控制能力。ACL 允许为单个文件设置多个用户或组的独立权限,而不仅仅局限于所有者、所属组和其他用户三类。Linux ACL 通过 getfacl 和 setfacl 命令进行管理,文件系统需要挂载时启用 ACL 支持。ACL 条目包括所有者、命名用户、命名组和掩码,可以为每个条目设置读、写、执行权限。
ACL 特别适用于需要临时授权或精细权限控制的场景。例如,开发团队需要共享某个项目目录,但不希望给予所有用户完全访问权限时,可以通过 ACL 为特定用户设置适当的权限。ACL 还支持默认 ACL,可以为目录设置继承规则,使在该目录中创建的新文件自动继承相应的权限。ACL 的存在与否可以通过文件权限后的 + 符号识别,如 -rw-rw-r--+ 表示该文件有 ACL 设置。
bash
# 查看 ACL
getfacl file # 显示文件 ACL
getfacl -R directory/ # 递归显示目录 ACL
# 设置 ACL
setfacl -m u:john:rw file # 为用户 john 设置读写权限
setfacl -m g:developers:rwx dir/ # 为组设置权限
setfacl -m o::r file # 修改其他用户权限
setfacl -m m::rw file # 修改 ACL 掩码
# 设置默认 ACL(目录继承)
setfacl -d -m u:newuser:rw directory/
setfacl -d -m g:team:rx directory/
# 删除 ACL
setfacl -x u:john file # 删除特定用户 ACL
setfacl -b file # 删除所有 ACL
# 备份和恢复 ACL
getfacl -R /data > acl.txt # 备份 ACL
setfacl --restore acl.txt # 恢复 ACL软件包管理
Debian 系(APT)
APT(Advanced Package Tool)是 Debian 及 Ubuntu 等发行版的软件包管理工具,提供软件的安装、升级、卸载和查询功能。APT 使用 .deb 软件包格式,软件源列表定义在 /etc/apt/sources.list 文件中。apt-get 和 apt 是最常用的 APT 命令,apt 是较新的用户友好型前端。软件包管理涉及软件源同步、本地数据库维护、依赖解决、下载安装等过程。定期更新软件源并升级系统是保持系统安全的重要措施。
apt 命令的常用操作包括 update(更新软件源索引)、upgrade(升级已安装软件包)、install(安装软件包)、remove(卸载软件包)、search(搜索软件包)、show(显示软件包信息)、list(列出软件包)等。apt 还支持软件源优先级配置、版本锁定、虚拟软件包等功能。对于本地软件包,可以使用 dpkg 命令直接安装。常用技巧包括使用 apt-mark hold 锁定软件包版本、使用 apt-cache policy 查看软件包可用版本、使用 apt full-upgrade 进行完整升级。
bash
# 更新和升级
sudo apt update # 更新软件源索引
sudo apt upgrade # 升级已安装软件包
sudo apt full-upgrade # 完整升级(包括删除不需要的包)
sudo apt dist-upgrade # 发行版升级
# 软件包安装和卸载
sudo apt install package # 安装软件包
sudo apt install package=version # 安装指定版本
sudo apt reinstall package # 重新安装
sudo apt remove package # 卸载软件包(保留配置)
sudo apt purge package # 彻底卸载(包括配置)
sudo apt autoremove # 自动删除不需要的依赖
# 软件包查询
apt search keyword # 搜索软件包
apt show package # 显示软件包信息
apt list --installed # 列出已安装软件包
apt list --upgradable # 列出可升级软件包
apt-cache policy package # 查看软件包版本信息
apt-cache depends package # 查看软件包依赖
# 本地软件包管理
sudo dpkg -i package.deb # 安装本地 .deb 文件
dpkg -l # 列出已安装软件包
dpkg -s package # 查询软件包状态
dpkg -L package # 列出软件包文件Red Hat 系(YUM/DNF)
YUM(Yellowdog Updater Modified)和 DNF(Dandified YUM)是 Red Hat 系发行版(CentOS、RHEL、Fedora)的软件包管理工具,使用 .rpm 软件包格式。DNF 是 YUM 的下一代替代者,提供了更好的性能、依赖解决和扩展性。软件源配置文件位于 /etc/yum.repos.d/ 或 /etc/dnf/dnf.conf。DNF 命令兼容大多数 YUM 命令,同时提供了更多高级功能如插件系统、事务历史、更好的内存管理等。
DNF 的核心操作与 APT 类似,但命令参数有所不同。dnf search 用于搜索软件包,dnf install 用于安装,dnf remove 用于卸载,dnf update 用于升级。dnf 还提供了 group 命令用于管理软件包组,dnf repolist 列出已配置的仓库,dnf check-update 检查可用的软件包更新。dnf 的历史功能可以回滚之前的操作,这在系统更新出现问题时非常有用。dnf downgrade 命令可以降级软件包到指定版本。
bash
# DNF 基本命令
sudo dnf check-update # 检查更新
sudo dnf update # 更新所有软件包
sudo dnf upgrade # 升级软件包
sudo dnf install package # 安装软件包
sudo dnf remove package # 卸载软件包
sudo dnf reinstall package # 重新安装
# 软件包查询
dnf search keyword # 搜索软件包
dnf info package # 显示软件包信息
dnf list installed # 列出已安装软件包
dnf list updates # 列出可更新软件包
dnf provides file # 查找提供指定文件的软件包
dnf repoquery --requires package # 查看软件包依赖
# 仓库管理
dnf repolist # 列出已配置仓库
dnf repolist all # 列出所有仓库
dnf config-manager --add-repo repository # 添加仓库
sudo dnf config-manager --set-enabled repository # 启用仓库
sudo dnf config-manager --set-disabled repository # 禁用仓库
# 软件包组管理
dnf group list # 列出软件包组
dnf group install "Group Name" # 安装软件包组
dnf group remove "Group Name" # 卸载软件包组
# 其他操作
dnf autoremove # 自动删除不需要的依赖
dnf clean all # 清理缓存
dnf makecache # 重建缓存
dnf history # 查看操作历史编译安装
除了使用软件包管理器安装预编译的软件包外,从源码编译安装是获取最新版本或定制功能的必要手段。编译安装的基本流程包括下载源码、解压、配置、编译和安装。configure 脚本通常由 autoconf 或 cmake 生成,用于检测系统环境和配置编译选项。make 命令执行实际的编译过程,make install 将编译生成的文件安装到指定位置。编译安装需要系统中安装有相应的编译器(如 gcc)和构建工具。
源码编译安装的典型步骤:首先从项目官网或代码仓库下载源码包,然后解压到工作目录,接着运行 ./configure --prefix=/usr/local 检查系统依赖并配置安装路径。configure 支持众多选项,可以根据需要启用或禁用特定功能。配置完成后,运行 make 命令编译源码,这个过程可能需要较长时间。最后运行 sudo make install 完成安装。安装后可能需要配置环境变量(如 PATH、LD_LIBRARY_PATH)或更新动态链接库缓存(ldconfig)。对于使用 cmake 的项目,流程类似但使用 cmake 和 make 命令。
bash
# 源码编译安装步骤
# 1. 安装编译工具和依赖
sudo apt install build-essential # Debian/Ubuntu
sudo dnf groupinstall "Development Tools" # Fedora/CentOS
# 2. 下载并解压源码
wget https://example.com/software.tar.gz
tar -xzf software.tar.gz
cd software/
# 3. 配置(使用 autoconf)
./configure --prefix=/usr/local \
--enable-feature \
--disable-debug
# 3. 配置(使用 cmake)
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local \
-DBUILD_SHARED_LIBS=ON ..
# 4. 编译
make -j$(nproc) # 并行编译
# 5. 安装
sudo make install
# 6. 更新动态链接库
sudo ldconfig
# 7. 验证安装
which software
software --version
# 常见选项说明
# --prefix=PATH 指定安装目录
# --enable-FEATURE 启用某功能
# --disable-FEATURE 禁用某功能
# --with-PACKAGE= 依赖某包
# --without-PACKAGE 不依赖某包进程管理
进程基础
进程是 Linux 系统中程序执行的实例,是资源分配的基本单位。每个进程都有一个唯一的进程 ID(PID),系统通过 PID 管理和调度进程。进程拥有独立的地址空间、文件描述符、环境变量等资源。父进程可以通过 fork 系统调用创建子进程,子进程继承父进程的大部分属性。进程的状态包括运行(running)、睡眠(sleeping)、停止(stopped)、僵尸(zombie)等。进程调度器负责在多个进程之间分配 CPU 时间,实现多任务处理。
进程间通信(IPC)是进程交换数据和协调工作的机制,主要包括管道(pipe)、命名管道(FIFO)、消息队列、共享内存、信号量、套接字等。管道用于父子进程或兄弟进程之间的数据传输;命名管道可用于任意进程之间;消息队列提供按消息类型的数据传递;共享内存是最快的 IPC 方式,但需要同步机制配合;信号量用于进程同步;套接字支持本地和网络通信。信号是进程间异步通信的主要方式,用于通知进程发生某个事件或请求进程执行某个操作。
bash
# 进程查看
ps aux # 查看所有进程(详细格式)
ps -ef # 查看所有进程(标准格式)
ps -ejH # 显示进程树
ps -U username # 查看特定用户的进程
ps -p 1234 # 查看特定 PID 的进程
top # 动态查看进程和系统负载
htop # 增强的进程查看工具
pstree # 以树形显示进程
# 进程状态
ps -o pid,ppid,stat,comm # 查看进程状态
# 进程搜索
pgrep process_name # 查找进程 PID
pkill process_name # 按名称终止进程
killall process_name # 按名称终止所有进程
# 进程状态说明
# R (运行) 进程正在运行或等待运行
# S (睡眠) 进程在等待某事件(如 I/O)
# D (不可中断) 进程在等待 I/O,不可中断
# Z (僵尸) 进程已终止但父进程未回收
# T (停止) 进程被暂停(收到 SIGSTOP)进程控制
进程控制是系统管理的核心操作之一,包括进程的启动、停止、暂停、恢复、优先级调整等。启动进程的最简单方式是直接在命令行输入命令,shell 会创建一个子进程执行该命令。通过在命令后添加 & 符号,可以将进程放到后台执行。使用 nohup 或 disown 可以使进程在终端关闭后继续运行。nice 和 renice 命令用于调整进程的优先级,优先级范围从 -20(最高)到 19(最低),普通用户只能调低自己进程的优先级。
信号是进程控制的主要机制,每个信号对应一个编号和默认行为。常见的信号包括 SIGTERM(15,请求终止)、SIGKILL(9,强制终止)、SIGINT(2,中断,通常由 Ctrl+C 触发)、SIGHUP(1,挂起,通常用于重新加载配置)。向进程发送信号使用 kill 命令,需要指定 PID 和信号编号。kill -0 可以检查进程是否存在而不发送实际信号。对于无响应进程,可以使用 kill -9 强制终止,但这是最后手段,可能导致资源泄漏或数据损坏。
bash
# 进程启动
./program & # 后台运行
nohup ./program & # 忽略 SIGHUP 信号
nohup ./program > output.log 2>&1 & # 重定向输出并后台运行
./program > /dev/null 2>&1 # 静默运行
# 进程优先级
nice -n 10 ./program # 以较低优先级启动
nice --10 ./program # 以较高优先级启动
renice -n 5 -p 1234 # 修改运行中进程的优先级
# 信号发送
kill -TERM 1234 # 发送 SIGTERM 信号
kill -KILL 1234 # 发送 SIGKILL 信号
kill -INT 1234 # 发送 SIGINT 信号
kill -HUP 1234 # 发送 SIGHUP 信号
kill -9 1234 # 强制终止进程
killall -9 program # 终止所有同名进程
# 检查进程
kill -0 1234 && echo "进程存在" || echo "进程不存在"
pidof program # 查找进程的 PID服务管理
systemd 是现代 Linux 发行版的主流 init 系统和服务管理器,替代了传统的 SysV init。systemd 不仅负责系统启动过程,还管理系统服务和进程。服务单元(unit)是 systemd 管理的基本对象,常见的单元类型包括 service(服务)、socket(套接字)、target(目标)、timer(定时器)等。服务配置文件位于 /etc/systemd/system/ 和 /usr/lib/systemd/system/ 目录,文件名以 .service 为后缀。
systemctl 是管理 systemd 服务的核心命令,支持启动(start)、停止(stop)、重启(restart)、重载(reload)、查看状态(status)、启用开机启动(enable)、禁用开机启动(disable)等操作。systemd 提供了日志管理工具 journalctl,可以查看和管理系统日志。服务配置文件的编写需要遵循特定的格式,包含 Unit 段(描述和依赖)、Service 段(服务配置)和 Install 段(安装信息)。常用的服务配置选项包括 ExecStart、ExecStop、Restart、User、WorkingDirectory、Environment 等。
bash
# 服务生命周期管理
sudo systemctl start servicename # 启动服务
sudo systemctl stop servicename # 停止服务
sudo systemctl restart servicename # 重启服务
sudo systemctl reload servicename # 重载配置
sudo systemctl status servicename # 查看服务状态
# 服务开机启动管理
sudo systemctl enable servicename # 启用开机启动
sudo systemctl disable servicename # 禁用开机启动
sudo systemctl is-enabled servicename # 检查是否开机启动
sudo systemctl list-unit-files # 列出所有服务单元
# 服务日志查看
journalctl -u servicename # 查看特定服务日志
journalctl -f # 实时查看日志
journalctl --since "2025-01-01" # 查看指定时间后的日志
journalctl -p err # 查看错误级别日志
journalctl -k # 查看内核日志
# 常用服务管理
systemctl poweroff # 关机
systemctl reboot # 重启
systemctl rescue # 进入救援模式
systemctl emergency # 进入紧急模式
systemctl default # 进入默认运行级别网络配置
网络基础
Linux 网络基于 TCP/IP 协议栈实现,提供了丰富的网络功能和灵活的配置方式。网络接口是系统与网络通信的通道,常见的网络接口包括以太网卡(eth0、ens0 等)、无线网卡(wlan0)、环回接口(lo)、虚拟网络接口(docker0、veth 等)。ip 命令是现代 Linux 发行版的网络配置工具,取代了传统的 ifconfig 命令。ip 命令可以显示和配置网络接口、路由表、ARP 缓存等网络相关参数。
TCP/IP 网络配置涉及 IP 地址、子网掩码、网关、DNS 等参数。静态配置需要手动指定这些参数,动态配置通过 DHCP 自动获取。Linux 支持配置多个网络接口和路由,实现复杂的网络拓扑。网络命名空间(network namespace)提供了隔离的网络环境,可以创建虚拟的网络栈,用于容器和网络隔离。虚拟以太网(veth)设备对用于连接不同命名空间的网络接口。理解 Linux 网络架构对于网络故障排查和网络服务部署至关重要。
bash
# 网络接口管理
ip addr # 显示网络接口和 IP 地址
ip addr show dev eth0 # 显示特定接口信息
ip link set eth0 up # 启用网络接口
ip link set eth0 down # 禁用网络接口
ip link set eth0 mtu 1500 # 设置 MTU
ip link add link eth0 name eth0:1 type vlan id 10 # 添加 VLAN
# IP 地址管理
ip addr add 192.168.1.100/24 dev eth0 # 添加 IP 地址
ip addr del 192.168.1.100/24 dev eth0 # 删除 IP 地址
ip addr flush dev eth0 # 清空接口 IP
# 路由管理
ip route # 显示路由表
ip route show # 显示路由表
ip route add 192.168.2.0/24 via 192.168.1.1 # 添加路由
ip route del 192.168.2.0/24 # 删除路由
ip route add default via 192.168.1.1 # 添加默认路由
# ARP 和邻居管理
ip neigh # 显示 ARP 缓存
ip neigh show dev eth0 # 显示特定接口 ARP
ip neigh add 192.168.1.1 lladdr aa:bb:cc:dd:ee:ff dev eth0 # 添加 ARP 条目网络服务
Linux 提供了丰富的网络服务,包括 Web 服务器、邮件服务器、DNS 服务器、文件服务器等。Nginx 和 Apache 是最常用的 Web 服务器,具有高性能、高并发处理能力。Nginx 采用事件驱动的异步架构,适合处理大量并发连接;Apache 采用多进程或多线程模型,功能丰富,模块化程度高。配置 Web 服务器需要了解虚拟主机、反向代理、负载均衡、SSL/TLS 等概念。
SSH(Secure Shell)是远程登录和命令执行的安全协议,是 Linux 系统管理的核心工具。sshd 是 SSH 服务器守护进程,ssh 是客户端程序。SSH 支持密码认证和公钥认证,公钥认证更加安全便捷。SSH 还支持端口转发、隧道、X11 转发等功能,是安全的远程访问和端口转发工具。rsync 是高效的文件同步工具,支持增量传输和远程同步,广泛用于备份和文件同步。防火墙是网络安全的关键组件,iptables、nftables 和 firewalld 是常用的 Linux 防火墙工具。
bash
# SSH 服务
sudo systemctl start sshd # 启动 SSH 服务
sudo systemctl enable sshd # 开机启动 SSH
ssh user@host # 远程登录
ssh -p 2222 user@host # 指定端口登录
ssh -i ~/.ssh/key user@host # 使用私钥登录
ssh -L 8080:localhost:80 user@host # 本地端口转发
ssh -R 2222:localhost:22 user@host # 远程端口转发
scp file user@host:/path # 安全复制文件
scp -r dir user@host:/path # 递归复制目录
sftp user@host # 安全文件传输
# SSH 密钥认证
ssh-keygen -t ed25519 # 生成 SSH 密钥
ssh-copy-id user@host # 复制公钥到服务器
ssh-add ~/.ssh/id_ed25519 # 添加密钥到 SSH 代理
# 文件同步
rsync -avz source/ dest/ # 本地同步
rsync -avz source/ user@host:/path # 远程同步
rsync -avz --delete source/ dest/ # 删除目标多余文件
rsync -avz -e ssh source/ user@host:/path # 使用 SSH 传输
# 防火墙管理
sudo iptables -L # 查看 iptables 规则
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 添加规则
sudo iptables -F # 清空所有规则
sudo firewall-cmd --list-all # 查看 firewalld 规则
sudo firewall-cmd --add-service=http # 开放服务网络诊断
网络故障排查是系统管理员的重要技能,Linux 提供了丰富的网络诊断工具。ping 是最基本的网络连通性测试工具,发送 ICMP 回显请求并等待回复。traceroute 追踪数据包从源到目的地的路径,显示经过的每一跳。mtr 结合了 ping 和 traceroute 的功能,提供更详细的网络统计信息。nc(netcat)是网络瑞士军刀,可以进行端口扫描、传输数据、调试协议等操作。
网络抓包是深度网络分析的必要手段,tcpdump 是命令行抓包工具,wireshark 是图形化抓包和分析工具。tcpdump 支持丰富的过滤表达式,可以捕获特定主机、端口、协议的网络流量。ss(socket statistics)是查看网络连接状态的现代工具,取代了 netstat。ss 可以显示 TCP 连接、套接字统计、进程信息等。DNS 查询工具包括 dig 和 nslookup,用于诊断 DNS 解析问题。网络带宽测试工具如 iperf3 可以测量网络吞吐量。
bash
# 网络连通性测试
ping -c 4 host # 发送 4 个 ping 请求
ping -i 0.5 host # 每 0.5 秒发送一次
ping -I eth0 host # 指定网卡发送
traceroute host # 追踪路由
mtr host # 实时路由追踪
# 端口和网络服务测试
nc -zv host 80 # 测试 TCP 端口
nc -zvu host 53 # 测试 UDP 端口
nc -lvp 8080 # 监听端口
nc host 8080 < file.txt # 发送文件
# 网络连接状态
ss -tunapl # 显示所有 TCP/UDP 连接
ss -t # 仅显示 TCP 连接
ss -u # 仅显示 UDP 连接
ss -s # 显示连接统计
ss -p # 显示进程信息
netstat -tulpn # 显示监听端口
# DNS 查询
dig domain # DNS 查询
dig +short domain # 简短输出
nslookup domain # DNS 查询(过时)
host domain # DNS 查询
# 流量分析
tcpdump -i eth0 host 192.168.1.1 # 捕获特定主机流量
tcpdump -i eth0 port 80 # 捕获 HTTP 流量
tcpdump -i eth0 -w capture.pcap # 保存到文件
tcpdump -r capture.pcap # 读取抓包文件
iperf3 -c server -p 5201 # 带宽测试Shell 编程
Shell 基础
Shell 是用户与 Linux 系统交互的接口,提供了命令解释、脚本执行、程序控制等功能。常见的 Shell 包括 bash( Bourne Again Shell)、zsh(Z Shell)、fish(Friendly Interactive Shell)等。bash 是大多数 Linux 发行版的默认 Shell,功能强大且兼容性好。Shell 脚本是文本文件,包含一系列 Shell 命令和控制结构,通过解释执行。Shell 脚本以 #!(shebang)指定解释器,如 #!/bin/bash 指定使用 bash 解释。
Shell 变量用于存储数据,分为环境变量和局部变量。环境变量对子进程可见,如 PATH、HOME、USER 等;局部变量仅在当前 Shell 会话中有效。变量赋值使用等号(=),引用变量使用 $ 符号。变量名只能包含字母、数字和下划线,且不能以数字开头。单引号保留字面值,双引号允许变量扩展和转义。数组是 Shell 脚本中的重要数据结构,支持索引数组和关联数组。函数将代码组织为可复用的单元,简化脚本结构和维护。
bash
#!/bin/bash
# 变量定义和使用
name="World"
echo "Hello, $name!" # 输出: Hello, World!
echo 'Hello, $name!' # 输出: Hello, $name!
greeting="Hello, ${name}!" # 使用花括号
# 数组操作
array=(one two three four)
echo ${array[0]} # 输出: one
echo ${array[@]} # 输出所有元素
echo ${#array[@]} # 输出数组长度
array[4]=five # 添加元素
unset array[2] # 删除元素
# 关联数组(需要 bash 4+)
declare -A hash
hash[key1]="value1"
hash[key2]="value2"
echo ${hash[key1]}
# 特殊变量
$0 # 脚本文件名
$1, $2... # 位置参数
$# # 参数个数
$@ # 所有参数(独立)
$* # 所有参数(合并)
$? # 上一个命令的返回值
$$ # 当前进程 PID
$! # 上一个后台进程 PID
# 运算
result=$((1 + 2 * 3)) # 算术运算
result=$((10 / 3)) # 整数除法
result=$((10 % 3)) # 取模
((result++)) # 自增
((result--)) # 自减控制结构
Shell 脚本的控制结构包括条件判断、循环和函数。条件判断使用 test 命令或 [] 语法,支持文件属性测试、字符串比较、整数比较等。if 语句根据条件执行不同的代码块,支持多层嵌套。case 语句是多分支选择结构,类似于其他语言的 switch 语句。循环结构包括 for、while、until 三种,for 循环遍历列表或范围,while 在条件为真时循环,until 在条件为假时循环。
循环控制语句 break 和 continue 用于控制循环流程。break 退出循环,continue 跳过后续代码进入下一次迭代。select 循环提供交互式菜单功能,适合需要用户选择的场景。算术 for 循环使用 (( )) 语法,支持 C 风格的循环控制。循环可以嵌套使用,实现复杂的数据处理。管道和子 Shell 可以在循环中处理数据流,提高脚本的灵活性和效率。
bash
#!/bin/bash
# 条件判断
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
# 文件测试
if [ -f "$1" ]; then
echo "Regular file"
elif [ -d "$1" ]; then
echo "Directory"
else
echo "Other type"
fi
# 字符串比较
if [ "$str1" = "$str2" ]; then
echo "Equal"
fi
# 整数比较
if [ $num1 -gt $num2 ]; then
echo "Greater"
fi
# case 语句
case $extension in
.txt)
echo "Text file"
;;
.jpg|.png|.gif)
echo "Image file"
;;
*)
echo "Unknown type"
;;
esac
# for 循环
for file in *.txt; do
echo "Processing $file"
done
# C 风格 for 循环
for ((i=0; i<10; i++)); do
echo $i
done
# 遍历目录
for dir in /home/*/; do
echo "$dir"
done
# while 循环
count=0
while [ $count -lt 5 ]; do
echo $count
((count++))
done
# until 循环(条件为假时执行)
until [ -f "/tmp/done" ]; do
sleep 1
done
# select 菜单
select option in "Option 1" "Option 2" "Quit"; do
case $option in
"Option 1")
echo "Selected 1"
;;
"Option 2")
echo "Selected 2"
;;
"Quit")
break
;;
esac
done实用技巧
Shell 编程有许多实用技巧可以提高脚本质量和效率。字符串处理是 Shell 脚本的常见任务,包括模式匹配、替换、截取等。参数扩展提供了丰富的字符串操作功能,如 ${var#pattern} 移除前缀、${var%pattern} 移除后缀、${var/pattern/replacement} 替换等。数组切片和操作可以高效处理列表数据。命令替换 $( ) 语法比反引号更推荐,支持嵌套且易于阅读。
错误处理是健壮脚本的必要组成部分。使用 set -e 命令使脚本在遇到错误时立即退出,set -u 在使用未定义变量时报错,set -o pipefail 捕获管道中的错误。trap 命令可以捕获信号和错误,执行清理操作。调试脚本可以使用 bash -x 启用跟踪模式,或在脚本中添加 set -x 临时启用。函数库和配置文件可以将常用功能模块化,提高代码复用性。日志记录帮助追踪脚本执行过程和问题排查。
bash
#!/bin/bash
# 字符串操作
path="/home/user/documents/file.txt"
filename=${path##*/} # 移除最长前缀: file.txt
dirname=${path%/*} # 移除最短后缀: /home/user/documents
extension=${path##*.} # 获取扩展名: txt
base=${path%.*} # 移除扩展名: /home/user/documents/file
# 字符串替换
str="Hello World"
echo ${str/World/Linux} # 替换第一个: Hello Linux
echo ${str//o/O} # 替换所有: HellO WOrld
echo ${str/#Hello/Hi} # 开头匹配替换: Hi World
# 参数默认值
${var:-default} # var 未定义或为空时使用 default
${var:=default} # 同时赋值
${var:+value} # var 存在时返回 value
# 错误处理
set -e # 遇错退出
set -u # 使用未定义变量报错
set -o pipefail # 管道错误传播
trap 'echo "Error on line $LINENO"' ERR # 错误捕获
# 调试模式
set -x # 打印命令及参数
set -v # 打印输入行
# 命令行参数解析
while [[ $# -gt 0 ]]; do
case $1 in
-f|--file)
file="$2"
shift 2
;;
-v|--verbose)
verbose=true
shift
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
# 函数定义
log() {
local level="$1"
shift
echo "[$level] $*"
}
log INFO "Starting process"
log ERROR "Something failed"性能监控
系统监控
Linux 提供了丰富的系统监控工具,帮助了解系统资源使用情况和性能瓶颈。top 是最常用的实时系统监控工具,显示进程列表、CPU 使用率、内存使用量、系统负载等信息。htop 是 top 的增强版本,提供颜色显示、更友好的交互界面和更多功能。glances 是一个跨平台的系统监控工具,提供更全面的信息展示。vmstat 显示虚拟内存统计信息,iostat 显示 CPU 和 I/O 统计,sar 是系统活动报告工具,提供历史数据分析能力。
系统负载是衡量系统繁忙程度的重要指标,三个数值分别表示最近 1 分钟、5 分钟、15 分钟的平均负载。在单核 CPU 上,负载为 1 表示 CPU 满负荷运行;在多核系统上,负载除以 CPU 核心数来判断是否过载。CPU 使用率分为用户态(user)、系统态(sys)、等待 I/O(wait)和空闲(idle)。内存监控关注已用内存、可用内存、缓存和交换空间使用情况。磁盘 I/O 监控关注读写速度、队列深度和 I/O 等待时间。
bash
# 进程和系统监控
top # 实时进程监控
htop # 增强的进程监控
glances # 全方位系统监控
atop # 高级系统监控
# CPU 和内存监控
vmstat 1 # 每秒显示虚拟内存统计
vmstat -s # 显示详细统计
mpstat -P ALL 1 # 每 CPU 核心统计
free -h # 显示内存使用情况
free -m -s 5 # 每 5 秒刷新
# 磁盘 I/O 监控
iostat -x 1 # 显示扩展 I/O 统计
iostat -dx 1 # 仅显示设备统计
iotop # 按进程显示 I/O 使用
du -sh directory/ # 目录大小统计
du -h --max-depth=1 # 当前目录各子目录大小
# 网络监控
iftop # 按连接显示带宽使用
nethogs # 按进程显示带宽使用
vnstat # 网络流量统计
sar -n DEV 1 # 网络设备统计
# 系统负载和进程状态
uptime # 系统运行时间和负载
w # 显示登录用户和负载
who # 显示登录用户性能分析
性能分析是定位和解决系统性能问题的关键步骤。perf 是 Linux 内置的性能分析工具,支持硬件事件采样、软件事件跟踪、调用图分析等功能。strace 跟踪进程的系统调用,帮助理解程序与内核的交互。ltrace 跟踪库函数调用,分析程序的库函数使用情况。这些工具可以深入了解程序的执行过程和资源使用方式,是性能优化的重要依据。
CPU 性能分析关注热点函数和调用链,识别消耗 CPU 资源最多的代码路径。内存性能分析关注内存分配、泄漏和碎片问题。I/O 性能分析关注磁盘瓶颈和文件系统性能。网络性能分析关注带宽使用、延迟和丢包情况。火焰图(Flame Graph)是一种直观的性能可视化工具,可以清晰展示调用栈和资源消耗分布。ebpf 是 Linux 内核的高级跟踪和性能分析技术,提供了强大的内核级数据收集能力。
bash
# CPU 性能分析
perf top # 实时热点函数
perf record -g program # 记录性能数据
perf report # 查看记录报告
perf stat program # 统计程序执行
# 系统调用跟踪
strace -c program # 统计系统调用
strace -f -t program # 跟踪子进程和时间戳
strace -p 1234 # 跟踪运行中进程
strace -o output.txt program # 输出到文件
# 库函数跟踪
ltrace -c program # 统计库函数调用
ltrace -f -t program # 跟踪子进程和时间戳
ltrace -S program # 同时跟踪系统调用
# 内存分析
valgrind --tool=memcheck program # 内存错误检测
valgrind --tool= massif program # 堆内存分析
pmap -x 1234 # 进程内存映射
# 磁盘 I/O 分析
blktrace /dev/sda # 块设备 I/O 跟踪
bpftrace -l # 列出可用 bpftrace 探针
bpftrace -e 'kprobe:vfs_read { @[comm] = count(); }' # 内核跟踪