Linux/UNIX 核心概念万字详解(增强版)
一、系统基础与架构(新增至18个)
-
内核(Kernel)内核是操作系统的核心,直接附着在硬件平台之上,控制和管理系统内各种资源(CPU、内存、设备),并向上层提供系统调用接口。它负责进程管理、内存管理、文件系统管理、设备驱动和安全控制等核心功能。Linux内核采用单块架构,但支持模块化加载,允许在运行时动态链接或解除链接功能模块,实现了高效与灵活的统一。
-
发行版(Distribution)发行版是基于Linux内核的完整操作系统套装,包含内核、系统工具、应用软件和包管理器。常见的发行版有Ubuntu(面向桌面用户)、CentOS(面向服务器)、Arch(面向高级用户)等。发行版通过整合GNU工具集、桌面环境(如GNOME、KDE)和软件仓库,降低了用户使用Linux的门槛,同时提供了差异化的生态体验。
-
ShellShell是用户与内核交互的命令解释器,位于操作系统的最外层,接收用户输入的命令并将其传递给内核执行。常见的Shell有Bash(Bourne Again Shell)、Zsh、Fish等。Shell不仅是一个命令行界面,还是一种编程语言,支持变量、循环、条件判断等结构,用户可以通过编写Shell脚本自动化完成复杂任务。
-
终端(Terminal)终端是运行Shell的窗口程序,提供了文本输入输出的图形化界面。常见的终端模拟器有GNOME Terminal、Konsole、Terminator等。终端本身不执行命令,而是启动一个Shell进程,将用户的键盘输入传递给Shell,并将Shell的输出显示在屏幕上。终端还支持多标签、分屏、配色方案等增强功能。
-
控制台(Console)控制台是系统启动时直接显示的文本界面,通常通过Ctrl+Alt+F1~F6切换。控制台不依赖图形环境,在系统故障或图形界面无法启动时,仍可通过控制台进行系统维护。每个控制台对应一个独立的虚拟终端,支持多用户同时登录,是Linux系统可靠性的重要保障。
-
根用户(Root)根用户是Linux系统中的超级管理员,拥有对系统的完全控制权,其用户标识符(UID)固定为0。根用户可以访问任何文件、执行任何命令、修改系统配置。由于权限过大,日常操作应避免直接使用root账户,而是通过sudo命令临时提权,这样既能完成管理任务,又能记录操作日志,提高安全性。
-
sudosudo(superuser do)允许普通用户以root或其他用户的身份执行命令,同时将操作记录到日志中。通过配置/etc/sudoers文件,管理员可以精细控制哪些用户、在哪些主机上、可以执行哪些命令。sudo相比直接使用root账户更安全,因为它要求用户输入自己的密码(而非root密码),且可以限制命令范围,防止误操作。
-
系统调用(System Call)系统调用是用户程序请求内核服务的接口,是用户态进入内核态的唯一合法途径。常见的系统调用有open()、read()、write()、fork()、exec()等。当应用程序需要访问硬件设备、创建进程、分配内存时,必须通过系统调用陷入内核,由内核代表应用程序完成操作。系统调用是操作系统提供的最小功能单元,库函数和Shell命令最终都依赖系统调用实现。
-
POSIXPOSIX(Portable Operating System Interface)是IEEE制定的操作系统接口标准,旨在确保不同Unix系统之间的应用程序可移植性。POSIX定义了系统调用、库函数、Shell、环境变量等规范。Linux遵循POSIX标准,因此许多为其他Unix系统编写的程序可以不经修改地在Linux上编译运行,这也是Linux能够成为Unix生态重要成员的原因。
-
GNU工具集GNU(GNU's Not Unix)是自由软件基金会发起的项目,旨在创建一个完全自由的操作系统。GNU工具集包括编译器(GCC)、调试器(GDB)、文本编辑器(Emacs)、Shell(Bash)以及大量命令行工具(ls、grep、sed、awk等)。Linux内核与GNU工具集结合,形成了完整的操作系统,因此严格来说应称为“GNU/Linux”。
-
引导流程(Boot Process)Linux系统的引导流程从BIOS/UEFI开始,依次经过引导加载程序(GRUB)、内核加载、init进程启动(现代系统使用systemd)。具体步骤:BIOS/UEFI执行硬件自检并加载GRUB;GRUB读取配置文件,加载内核和initramfs(初始内存文件系统)到内存;内核初始化硬件、挂载根文件系统;最后启动init进程(PID=1),由init负责启动其他系统服务。整个流程体现了从硬件到软件的逐层抽象。
-
init 系统init是系统启动后的第一个用户空间进程,负责启动、监控和终止其他系统服务。传统SysV init使用串行启动方式,效率较低;现代Linux广泛使用systemd,它采用并行启动、按需启动、依赖管理等机制,大大加快了系统启动速度。systemd还提供了systemctl、journalctl等工具,统一管理服务、日志和系统状态。
-
cgroups(控制组)cgroups是Linux内核特性,用于限制、隔离和统计进程组的资源使用(CPU、内存、磁盘I/O、网络带宽)。它通过将进程分组,并为每个组设置资源配额,防止某个进程过度消耗资源影响整个系统。cgroups是容器技术(如Docker、LXC)的底层支撑,每个容器可以看作一个独立的cgroup,实现资源隔离和限制。
-
命名空间(Namespace)命名空间是Linux内核的隔离机制,为进程提供独立的系统资源视图。常见的命名空间包括PID(进程隔离)、Network(网络栈隔离)、Mount(文件系统挂载点隔离)、UTS(主机名隔离)、IPC(进程间通信隔离)、User(用户ID隔离)等。命名空间与cgroups结合,构成了容器技术的核心,使得容器内的进程仿佛运行在独立的操作系统中。
-
虚拟文件系统(VFS)VFS是Linux内核的抽象层,位于用户进程和具体文件系统之间,定义了一组所有文件系统都支持的数据结构和标准接口(如open、read、write)。用户进程只需与VFS交互,无需关心底层是ext4、XFS还是NFS。VFS屏蔽了不同文件系统的实现差异,实现了“一切皆文件”的设计哲学——普通文件、目录、设备、管道、套接字都通过统一的文件接口操作。
-
sysctl(内核参数动态调优)sysctl是运行时查看和修改内核参数的接口,通过/proc/sys/虚拟文件系统实现。使用sysctl -a查看所有参数,sysctl -w net.ipv4.ip_forward=1临时开启路由转发。持久化配置写入/etc/sysctl.conf或/etc/sysctl.d/*.conf。生产环境中,fs.file-max(最大文件句柄数)、net.core.somaxconn(监听队列大小)等参数的调优是保障高并发服务稳定的关键。
-
initramfs(初始内存文件系统)initramfs是一个临时的根文件系统,在Linux内核启动初期加载到内存中。它包含加载真实根文件系统所需的驱动(如SATA、NVMe、LVM、RAID)和工具。内核先挂载initramfs,执行其中的/init脚本探测硬件、加载模块,然后pivot_root切换到真正的根目录。initramfs解决了内核体积限制和驱动加载顺序问题,是系统引导不可或缺的一环。
-
运行时目录(/run)/run是tmpfs(内存文件系统)挂载的临时目录,用于存储系统启动以来的运行时数据,如进程PID文件(/run/nginx.pid)、登录会话信息、systemd运行时单元等。与/var/run(通常是指向/run的符号链接)不同,/run在系统启动早期即可用,且重启后数据自动清空,是系统运行时状态的核心存放地。
二、文件系统与目录结构(新增至22个)
-
一切皆文件“一切皆文件”是Unix/Linux的核心设计哲学,意味着所有系统资源(普通文件、目录、设备、管道、套接字、进程信息等)都可以通过文件描述符和统一的read()/write()接口进行访问。这种抽象简化了程序设计,使得用户可以使用相同的系统调用来操作不同类型的资源。例如,向/dev/null写入数据等同于丢弃数据,从/dev/random读取数据则获得随机数。
-
根目录(/)根目录是Linux文件系统树状结构的起点,用斜杠“/”表示。所有文件、目录、设备、挂载点都位于根目录之下。根目录是文件系统的顶层,其内容由FHS标准规定,包含/bin、/etc、/home、/usr、/var等子目录。根目录本身也是一个目录文件,其inode编号通常为2,由系统在格式化时创建。
-
FHS(文件系统层次结构标准)FHS定义了Linux系统中目录的布局和用途,确保不同发行版之间的兼容性。例如,/bin存放基本命令(ls、cp),/etc存放配置文件,/var存放可变数据(日志、邮件),/usr存放用户程序和只读数据,/home存放用户家目录。遵循FHS的发行版,用户和管理员可以快速定位文件,便于系统维护和脚本编写。
-
inodeinode(索引节点)是文件系统中存储文件元数据的数据结构,每个文件或目录都有一个唯一的inode。inode包含文件类型、权限(rwx)、所有者(UID/GID)、文件大小、时间戳(atime/mtime/ctime)、数据块指针、硬链接计数等信息。文件名不存储在inode中,而是存储在目录项中。inode是文件系统的核心,通过它内核可以快速定位文件数据。
-
硬链接(Hard Link)硬链接是多个目录项指向同一个inode的链接方式。创建硬链接后,文件名和原文件共享相同的inode和数据块,删除其中一个不会影响另一个(只有当链接计数降为0时,inode和数据块才会被释放)。硬链接不能跨文件系统创建,也不能用于目录(防止形成循环)。硬链接常用于备份和文件共享,节省磁盘空间。
-
符号链接(Symbolic Link)符号链接(软链接)是一个独立的文件,其内容存储了目标文件的路径。访问符号链接时,内核会自动重定向到目标文件。与硬链接不同,符号链接可以跨文件系统,也可以指向目录。但删除原文件后,符号链接会变成“悬空链接”,访问时会报错。符号链接常用于创建快捷方式、管理软件版本(如/usr/bin/python -> python3)。
-
挂载(Mount)挂载是将一个文件系统附加到目录树的过程,使得该文件系统的内容可以通过指定的挂载点目录访问。例如,mount /dev/sda1 /mnt 将分区/dev/sda1挂载到/mnt目录。挂载点必须是已存在的空目录,挂载后该目录的原有内容会被临时隐藏。Linux支持多种文件系统类型,通过mount命令的-t参数指定。持久化挂载需写入/etc/fstab文件。
-
ext4ext4是第四代扩展文件系统,是Linux最主流的文件系统之一。它支持最大1EB的分区和16TB的单个文件,具备日志机制(保证数据一致性)、区段(Extents)分配(减少碎片化)、延迟分配、多块分配等特性。ext4向下兼容ext2/ext3,性能稳定,适用于服务器系统盘、个人电脑和普通数据存储。
-
XFSXFS是一种高性能64位日志文件系统,由SGI开发,现为RHEL/CentOS的默认文件系统。它支持最大8EB的分区和9EB的单个文件,并发读写性能优异,特别适合大文件和视频存储场景。XFS采用分配组(Allocation Group)设计,支持在线扩容,但缩容较困难。在数据库服务器和高性能计算集群中广泛使用。
-
BtrfsBtrfs(B-tree文件系统)是一种写时复制(CoW)文件系统,支持快照、压缩、子卷、RAID管理、数据校验等高级功能。它允许动态调整分区大小,提供自我修复能力(通过校验和检测数据损坏)。时至今日,Btrfs已进入生产就绪状态,是RHEL 9和Fedora的默认文件系统,在容器存储、桌面系统和通用服务器中应用广泛;但在极高并发OLTP数据库场景下,仍需结合具体负载进行压测评估。
-
LVM(逻辑卷管理)LVM是Linux存储管理的抽象层,将物理磁盘(PV)组合成卷组(VG),再从中划分逻辑卷(LV)。逻辑卷支持在线动态扩容、缩容(需文件系统配合)、快照回滚和条带化。LVM极大地提高了存储的灵活性,生产环境中通常将系统盘和数据库目录部署在LVM上,以便在磁盘空间不足时在线扩展,避免了停机扩容的麻烦。
-
RAID(独立磁盘冗余阵列)RAID通过将多块物理磁盘组合成一个逻辑单元,实现性能提升或数据冗余。常用级别:RAID 0(条带化,性能高但无冗余)、RAID 1(镜像,高冗余但容量减半)、RAID 5(分布式奇偶校验,兼顾容量与冗余)、RAID 10(镜像+条带,性能与冗余兼得)。Linux支持软RAID(通过mdadm管理)和硬件RAID。在服务器部署中,系统盘常用RAID 1,数据盘常用RAID 10或RAID 5。
-
Swap(交换空间)Swap是磁盘上的交换分区或交换文件,当物理内存不足时,内核将不活跃的内存页换出到Swap,从而释放物理内存给活跃进程。Swap并非越多越好,传统“双倍内存”规则已过时。核心调优参数是vm.swappiness(默认60),值越小越倾向使用物理内存,值越大越积极换出。在容器和数据库环境中,常调低swappiness以保障性能。
-
/proc/proc是一个虚拟文件系统,不占用磁盘空间,由内核在内存中动态生成。它反映了内核和进程的实时状态,例如/proc/cpuinfo显示CPU信息,/proc/meminfo显示内存使用情况,/proc/<PID>/ 目录下包含每个进程的详细信息。用户可以通过读取/proc文件获取系统信息,也可以通过写入某些文件(如/proc/sys/)动态调整内核参数。
-
/sys/sys是sysfs虚拟文件系统,提供设备、驱动、电源管理、总线等硬件信息的统一视图。它由内核在启动时创建,将设备模型以文件形式呈现。例如,/sys/class/net/ 下包含网卡信息,/sys/block/ 下包含块设备信息。udev工具利用/sys中的信息动态管理设备节点,实现即插即用功能。
-
/dev/dev目录存放设备文件,是用户空间访问硬件设备的接口。设备文件分为字符设备(如/dev/tty、/dev/random)和块设备(如/dev/sda、/dev/nvme0n1)。传统上设备文件是静态创建的,现代Linux使用udev(用户空间设备管理器)动态创建和删除设备节点,当硬件插入或移除时自动更新/dev目录。
-
/tmp/tmp目录用于存放临时文件,任何用户都可以在此创建文件,但通常只有文件所有者才能删除(粘滞位保护)。/tmp通常挂载为tmpfs(基于内存的文件系统),重启后内容自动清空。系统服务也会使用/tmp存储临时数据,因此应确保/tmp有足够的空间并定期清理。
-
/var/var目录存放可变数据,包括系统日志(/var/log)、邮件队列(/var/mail)、打印队列(/var/spool)、数据库文件(/var/lib)、临时文件(/var/tmp)等。与/tmp不同,/var/tmp中的文件在重启后通常保留。/var是系统运行过程中数据增长的主要区域,需要监控磁盘使用情况,并配置logrotate等工具管理日志轮转。
三、文件操作与权限(新增至14个)
-
文件权限(rwx)Linux文件权限使用9位二进制表示,分为三组:所有者(User)、所属组(Group)、其他用户(Other),每组包含读(r=4)、写(w=2)、执行(x=1)三种权限。例如,-rwxr-xr--表示所有者可读写执行,组用户可读可执行,其他用户只读。权限通过chmod命令修改,数字模式(如755)或符号模式(如u+x)均可。权限信息存储在inode中。
-
chmodchmod用于修改文件或目录的访问权限。数字模式:chmod 755 file 将权限设为rwxr-xr-x(所有者7=4+2+1,组5=4+1,其他5=4+1)。符号模式:chmod u+x file 给所有者添加执行权限,chmod o-w file 移除其他用户的写权限。chmod -R 可递归修改目录及其子文件权限。注意:只有文件所有者和root才能修改权限。
-
chownchown用于修改文件或目录的所有者和所属组。语法:chown user:group file,例如chown alice:staff data.txt 将文件所有者改为alice,组改为staff。只修改所有者:chown alice file;只修改组:chown :staff file。chown -R 递归修改。普通用户不能将文件所有权转让给他人,只有root可以任意修改。
-
chgrpchgrp专门用于修改文件或目录的所属组,功能与chown :group相同。语法:chgrp group file。普通用户只能将文件组改为自己所属的组(且必须是该组的成员),root可以改为任意组。chgrp -R 递归修改。chgrp是chown的子集,但单独提供便于记忆和使用。
-
umaskumask是文件创建时的默认权限掩码,用于控制新文件或目录的初始权限。umask值从系统权限中减去,得到实际权限。例如,umask 022 表示新文件权限为666-022=644(rw-r--r--),新目录权限为777-022=755(rwxr-xr-x)。umask通常在Shell配置文件(如.bashrc)中设置,影响当前会话中所有新建文件。
-
ACL(访问控制列表)ACL提供了比传统rwx更细粒度的权限控制,允许为特定用户或组单独设置权限,而不仅限于所有者、组和其他三类。例如,setfacl -m u:alice:rw file 给用户alice赋予读写权限。ACL通过getfacl查看,setfacl设置。ACL在需要复杂权限共享的场景(如多用户协作的项目目录)中非常有用,但会略微增加文件系统开销。
-
setuid/setgidsetuid和setgid是特殊权限位,当应用于可执行文件时,允许用户以文件所有者(setuid)或文件所属组(setgid)的身份运行该程序,而不是以当前用户身份。例如,/usr/bin/passwd设置了setuid位,普通用户执行它时临时获得root权限,从而可以修改/etc/shadow文件。setgid还可用于目录,使在该目录下创建的新文件继承目录的组。
-
粘滞位(Sticky Bit)粘滞位(t位)主要用于/tmp等共享目录,防止非文件所有者删除或重命名其他用户的文件。设置粘滞位后,目录的权限显示为drwxrwxrwt(最后一位t)。只有文件所有者、目录所有者或root才能删除文件。粘滞位通过chmod +t dir设置,对普通文件无意义。它是多用户系统中保护临时文件安全的重要机制。
-
chattr(文件属性与不可变位)chattr用于设置文件的扩展属性(ext2/ext3/ext4系列文件系统特有)。生产环境最常用chattr +i /etc/shadow(设置不可变位),此时任何用户(包括root)都无法修改、删除或重命名该文件,除非执行chattr -i解除。chattr +a仅允许追加写入,适合日志文件。lsattr查看属性。这是系统安全加固中防御勒索病毒或恶意篡改的终极防线之一。
-
Linux Capabilities(能力机制)Capabilities将root的超级权限拆分为独立的“能力位”(如CAP_NET_ADMIN管理网络、CAP_SYS_TIME修改系统时间、CAP_NET_BIND_SERVICE绑定1024以下端口)。通过setcap cap_net_bind_service+ep /usr/bin/nginx,普通用户也能启动监听80端口的Nginx,无需setuid赋权整个root。这种“最小权限”原则极大降低了安全风险,是容器化和现代服务部署的重要实践。
-
ls -lls -l以长格式列出文件详细信息,输出格式为:-rw-r--r-- 1 alice staff 1024 Jan 1 10:00 file.txt。各部分含义:第一个字符表示文件类型(-普通文件,d目录,l符号链接),后9位为权限,数字为硬链接计数,alice为所有者,staff为所属组,1024为文件大小(字节),Jan 1 10:00为最后修改时间,file.txt为文件名。ls -i可同时显示inode编号。
-
findfind是强大的文件搜索命令,支持按名称、类型、大小、时间、权限、所有者等条件查找文件。基本语法:find [路径] [条件] [动作]。例如,find /home -name "*.txt" 查找所有.txt文件;find /var -size +100M 查找大于100MB的文件;find . -mtime -7 查找7天内修改过的文件。find还支持-exec参数对找到的文件执行命令,是系统管理和脚本编写的重要工具。
-
xargsxargs用于将标准输入数据转换成命令行参数,常与管道和find配合使用,解决“参数列表过长”问题。例如,find /tmp -name "*.log" | xargs rm -f批量删除日志文件。xargs支持-n(分组数量)、-P(并行进程数)等高级选项,是Shell批处理任务中不可或缺的性能利器。
-
sort / uniqsort用于对文本行进行排序(-n数字排序,-r降序,-k指定字段);uniq用于报告或忽略重复行(通常与sort联用,如sort file | uniq -c统计重复次数)。两者在日志分析(如统计IP访问频率awk '{print $1}' access.log | sort | uniq -c | sort -nr)中频繁出场,是文本统计的黄金组合。
四、进程与作业管理(新增至14个)
-
进程(Process)进程是程序在计算机上的一次执行活动,是系统进行资源分配和调度的基本单位。每个进程有独立的地址空间、文件描述符、环境变量等资源。进程由内核创建,通过fork()系统调用复制父进程,再通过exec()加载新程序。进程拥有唯一PID(进程ID),所有进程形成树状结构,根为init(PID=1)。进程是动态的,有生命周期:创建、运行、等待、终止。
-
守护进程(Daemon)守护进程是后台持续运行的服务进程,通常以d结尾(如sshd、httpd、crond)。它们脱离终端控制,在系统启动时自动启动,并在后台等待处理请求。守护进程通过fork()创建子进程后,父进程退出,子进程调用setsid()创建新会话,从而与终端完全脱离。守护进程是Linux服务架构的基础,常见于网络服务、系统监控、定时任务等。
-
PIDPID(进程标识符)是系统为每个进程分配的唯一正整数,用于区分不同进程。PID从1开始(init/systemd),最大值为/proc/sys/kernel/pid_max(通常32768)。当进程终止后,其PID可被新进程重用,但系统会避免立即重用。PID是进程管理的基础,通过PID可以使用kill、renice、wait等命令操作特定进程。
-
PPIDPPID(父进程ID)是创建当前进程的父进程的PID。每个进程都有父进程(除了init),通过ps -ef或pstree命令可以查看进程树。PPID在进程创建时由内核设置,用于追踪进程层级关系。当父进程先于子进程终止时,子进程成为孤儿进程,被init收养,其PPID变为1。
-
僵尸进程(Zombie)僵尸进程是已经终止但未被父进程回收的进程,其进程描述符仍保留在进程表中,占用一个PID。僵尸进程不占用CPU和内存,但会消耗进程表项(系统资源有限)。如果父进程没有调用wait()或waitpid()来获取子进程的退出状态,子进程就会变成僵尸。父进程终止后,僵尸进程会被init收养并自动清理。
-
孤儿进程孤儿进程是指父进程先于子进程终止的进程。此时子进程成为孤儿,被init(PID=1)收养,init会定期调用wait()回收它们。孤儿进程不会变成僵尸,因为init会自动处理。孤儿进程在后台运行时不会产生问题,但如果父进程意外崩溃,子进程可能失去控制,需要系统管理员注意。
-
psps(process status)用于查看当前系统的进程快照。常用选项:ps aux 显示所有进程的详细信息(包括用户、CPU/内存使用率、状态、启动时间等);ps -ef 显示标准格式;ps -eo pid,ppid,cmd 自定义输出列。ps从/proc文件系统读取进程信息,是系统监控和故障排查的基础工具。
-
top/htoptop是动态实时监控进程资源占用的工具,默认按CPU使用率排序,显示进程ID、用户、CPU%、内存%、运行时间、命令等。按P键按CPU排序,按M键按内存排序,按k键可终止进程。htop是top的增强版,支持彩色显示、鼠标操作、树状视图、垂直/水平滚动,更直观易用。两者都依赖/proc文件系统,是性能分析的首选工具。
-
killkill用于向进程发送信号,默认发送SIGTERM(15),请求进程优雅终止。常用信号:kill -9 PID 发送SIGKILL强制终止;kill -15 PID 发送SIGTERM;kill -1 PID 发送SIGHUP(让守护进程重新加载配置)。kill通过PID指定目标进程,如果进程不存在会报错。killall命令可通过进程名发送信号。
-
nice/renicenice用于以指定优先级启动程序,renice用于调整已运行进程的优先级。优先级范围从-20(最高)到19(最低),默认值为0。只有root可以设置负优先级(提高优先级)。语法:nice -n 10 command 以较低优先级运行;renice -n 5 -p PID 将进程优先级调整为5。调整优先级可以控制CPU资源分配,确保重要任务获得更多CPU时间。
-
作业控制(Job Control)作业控制是Shell对前台和后台进程组的管理机制。command & 将命令放入后台运行;Ctrl+Z 挂起当前前台作业;jobs 查看作业列表;fg %1 将作业1切回前台;bg %1 让作业1在后台继续执行。作业控制允许用户在一个终端内灵活切换多个任务,是交互式Shell高效使用的必备技能。
-
nohup 与终端复用(screen/tmux)nohup command & 使进程忽略SIGHUP信号,即使退出终端,进程仍继续运行(输出重定向到nohup.out)。更强大的方案是终端复用器——tmux和screen,它们创建持久会话,网络断开后重连即可恢复会话,且支持分屏多窗口。在远程服务器开发、长期运行数据迁移任务中,tmux是事实上的标准工具。
-
iostat / iotopiostat(来自sysstat包)报告CPU利用率和磁盘I/O统计信息(如iostat -x 1查看每秒的读写速率、await等待时间、util磁盘繁忙度)。iotop类似于top,但专门按I/O使用率排序进程。两者是定位“磁盘慢、应用卡顿”问题的核心工具,能快速识别是哪个进程在疯狂读写磁盘导致系统负载过高。
-
平均负载(Load Average)系统平均负载是单位时间内处于可运行状态(R状态)和不可中断睡眠状态(D状态,通常为等待I/O)的进程平均数。top或uptime显示1分钟、5分钟、15分钟三个值。理想情况下,负载值应小于CPU核心数。若负载长期高于核心数,通常意味着CPU资源不足或磁盘I/O瓶颈,是性能告警的首要关注指标。
五、信号与进程间通信(8个,保持原样,新增信号trap概念移植至Shell章节)
-
信号(Signal)信号是软件中断,用于通知进程发生了异步事件。信号由内核或另一个进程发送,进程可以捕获、忽略或执行默认操作。Linux支持多种信号,如SIGINT(Ctrl+C)、SIGTERM(终止请求)、SIGKILL(强制终止)、SIGCHLD(子进程状态变化)等。信号是进程间通信的一种简单方式,常用于进程控制、错误通知和定时器。
-
SIGKILL (9)SIGKILL是强制终止信号,进程无法捕获、忽略或阻塞它。收到SIGKILL后,内核立即终止进程并释放其资源,不给进程任何清理机会。因此,SIGKILL应作为最后手段使用,仅当进程无响应且SIGTERM无效时使用。使用kill -9 PID发送。注意:SIGKILL不能杀死僵尸进程(僵尸已死,只是未回收)。
-
SIGTERM (15)SIGTERM是优雅终止信号,请求进程自行退出。进程可以捕获SIGTERM并执行清理操作(如保存数据、关闭文件、释放资源),然后退出。如果进程忽略SIGTERM,则不会终止。大多数守护进程和应用程序会注册SIGTERM处理函数,实现平滑关闭。使用kill PID(默认发送SIGTERM)或kill -15 PID。
-
SIGINT (2)SIGINT是中断信号,通常由用户按下Ctrl+C触发。前台进程收到SIGINT后,默认行为是终止。进程可以捕获SIGINT并执行自定义操作(如提示确认退出)。SIGINT与SIGTERM类似,但通常用于用户主动中断,而SIGTERM用于系统或管理员请求终止。
-
SIGCHLDSIGCHLD是子进程状态变化时(终止、停止、继续)发送给父进程的信号。父进程可以通过捕获SIGCHLD来异步回收子进程,避免子进程变成僵尸。如果父进程不处理SIGCHLD,子进程终止后父进程需要显式调用wait()来回收。现代程序常使用SIGCHLD结合waitpid()实现高效的子进程管理。
-
管道(Pipe)管道是Unix/Linux中最基本的进程间通信方式,将一个命令的标准输出连接到另一个命令的标准输入,用竖线“|”表示。例如,ls -l | grep "txt" 将ls的输出作为grep的输入。管道是单向的、无名的,只能在有亲缘关系的进程(如父子进程)之间使用。管道本质上是内核中的一个缓冲区,默认大小通常为64KB。
-
命名管道(FIFO)命名管道(FIFO)是一种特殊的文件类型,通过mkfifo命令创建。与普通管道不同,FIFO有文件名,允许无亲缘关系的进程通过它通信。FIFO遵循先进先出原则,数据以流的形式传输。常用于客户端-服务器模型,例如一个进程写入FIFO,另一个进程读取。FIFO在文件系统中可见,使用ls -l查看时类型为p。
-
信号量(Semaphore)信号量是用于同步多个进程对共享资源访问的计数器。它支持两种原子操作:P(等待,减少计数)和V(释放,增加计数)。当计数为0时,P操作会阻塞进程直到其他进程执行V操作。信号量可以解决互斥和同步问题,例如控制对共享内存的访问。Linux提供System V信号量和POSIX信号量两种实现。
六、用户与组管理(8个,保持原样)
-
用户(User)用户是系统资源的访问者,每个用户有唯一的用户名和UID(用户标识符)。用户信息存储在/etc/passwd文件中,包括用户名、加密密码占位符(x)、UID、GID、用户描述、家目录、登录Shell。用户通过登录认证后,获得相应的权限。Linux是多用户系统,支持同时多个用户登录,每个用户拥有独立的家目录和环境。
-
组(Group)组是用户的集合,用于简化权限管理。每个组有唯一的组名和GID(组标识符)。组信息存储在/etc/group文件中。一个用户可以属于多个组,其中一个是主组(在/etc/passwd中指定),其他为附加组。通过将用户加入特定组,可以批量授予文件访问权限,例如将开发人员加入dev组,然后设置项目目录的组权限为读写。
-
/etc/passwd/etc/passwd是系统用户账户信息文件,每行代表一个用户,格式为:用户名:密码占位符:UID:GID:描述:家目录:Shell。例如,alice:x:1000:1000:Alice:/home/alice:/bin/bash。密码字段通常为x,表示密码存储在/etc/shadow中。该文件对所有用户可读,因此不能存储明文密码。修改用户信息应使用usermod、useradd等专用命令。
-
/etc/shadow/etc/shadow存储加密后的用户密码和密码策略信息,仅root可读。每行格式为:用户名:加密密码:最后修改日:最小天数:最大天数:警告天数:禁用天数:过期日:保留字段。加密密码使用SHA-512( 6 )等算法。密码策略包括密码有效期、过期警告、账户锁定等,通过chage命令管理。shadow文件的存在提高了密码安全性。
-
/etc/group/etc/group存储组信息,每行格式为:组名:密码占位符:GID:成员列表。例如,staff:x:100:alice,bob。密码字段通常为空(x),组密码很少使用。成员列表是用逗号分隔的用户名,表示该组的附加成员。主组成员不在/etc/group中列出,而是通过/etc/passwd中的GID确定。
-
useradduseradd用于创建新用户,常用选项:-m 创建家目录,-s 指定Shell,-G 指定附加组,-u 指定UID。例如,useradd -m -s /bin/bash -G sudo alice 创建用户alice,家目录为/home/alice,Shell为bash,加入sudo组。useradd还会在/etc/shadow中创建密码条目(需用passwd设密码)。不同发行版默认行为略有差异。
-
passwdpasswd用于设置或修改用户密码。普通用户只能修改自己的密码(需输入旧密码),root可以修改任何用户的密码。passwd会加密新密码并更新/etc/shadow。密码强度由系统策略(如pam_cracklib)控制,要求包含大小写字母、数字和特殊字符,长度至少8位。使用passwd -l可锁定账户,-u解锁。
-
usermodusermod用于修改已有用户的属性,如用户名(-l)、家目录(-d)、Shell(-s)、UID(-u)、附加组(-aG)等。例如,usermod -aG docker alice 将用户添加到docker组(-a表示追加,防止覆盖现有组)。usermod -L 锁定账户(在密码前加!),-U解锁。修改用户信息后,用户需重新登录才能生效。
七、网络与远程访问(新增至14个)
-
IP地址IP地址是网络设备的唯一标识,分为IPv4(32位,如192.168.1.1)和IPv6(128位,如fe80::1)。Linux中通过ifconfig或ip addr查看IP地址。IP地址与子网掩码配合使用,确定网络地址和主机地址。IP地址是网络通信的基础,每个网络接口(如eth0、wlan0)可以配置一个或多个IP地址。
-
SSHSSH(Secure Shell)是加密的远程登录协议,默认端口22。它使用公钥加密技术,确保数据传输的机密性和完整性。SSH客户端(ssh命令)连接到SSH服务器(sshd守护进程),支持密码认证和密钥认证。SSH还支持端口转发、X11转发、文件传输(通过SCP、SFTP)等功能,是Linux系统管理的必备工具。
-
SCPSCP(Secure Copy)基于SSH协议,用于在本地和远程主机之间安全复制文件。语法:scp source destination,例如scp file.txt user@host:/path/。SCP支持递归复制目录(-r)、保留文件属性(-p)等选项。与FTP不同,SCP全程加密,适合传输敏感数据。
-
rsync(远程增量同步)rsync是比SCP更强大的文件传输和同步工具,核心优势是增量传输(仅传输差异部分)和断点续传。语法:rsync -avz --progress /local/dir user@host:/remote/dir。它支持本地复制、远程Shell(SSH)传输、守护进程模式,并能保留权限、属主、时间戳等所有属性。在生产环境中,rsync是日志备份、代码分发、数据迁移的绝对主力工具。
-
pingping用于测试网络连通性,通过发送ICMP回显请求并等待响应。ping hostname 会持续发送数据包,显示响应时间和丢包率。ping -c 4 hostname 发送4个包后停止。ping是网络故障排查的第一步,可以判断目标主机是否可达、网络延迟是否正常。注意:某些防火墙会屏蔽ICMP,导致ping不通但其他服务正常。
-
netstat/ssnetstat和ss用于查看网络连接、路由表、接口统计等。ss是netstat的现代替代,性能更好。常用选项:ss -tuln 显示所有监听端口(t TCP,u UDP,l监听,n数字格式);ss -an 显示所有连接。通过ss可以查看哪些服务在监听哪些端口,以及当前建立的连接状态(ESTABLISHED、TIME_WAIT等),是网络调试的重要工具。
-
tcpdumptcpdump是命令行网络抓包工具,用于捕获和分析网络流量。语法:tcpdump -i eth0 host 192.168.1.1 抓取eth0接口上与192.168.1.1通信的包。支持过滤表达式(如port 80、tcp、udp),可保存到文件(-w)并用Wireshark分析。tcpdump是网络故障排查、协议分析和安全审计的利器,但需要root权限。
-
iptables/nftablesiptables是Linux内核的包过滤防火墙工具,通过规则表(filter、nat、mangle)控制网络流量。nftables是iptables的现代替代,语法更简洁,性能更好。防火墙规则可以允许、拒绝或修改数据包,实现访问控制、端口转发、NAT等功能。例如,iptables -A INPUT -p tcp --dport 22 -j ACCEPT 允许SSH连接。防火墙配置通常保存为脚本或使用firewalld管理。
-
DNSDNS(域名系统)将域名(如www.example.com)解析为IP地址。Linux系统通过/etc/resolv.conf配置DNS服务器(如8.8.8.8)。常用DNS工具:nslookup、dig、host。DNS解析是网络通信的前提,如果DNS配置错误,域名将无法访问。
-
systemd-resolved现代Linux发行版(如Ubuntu、Fedora)使用systemd-resolved管理DNS解析,它通过D-Bus接口提供域名解析,并缓存结果以加速访问。resolvectl status查看当前DNS配置,resolvectl query example.com测试解析。systemd-resolved监听127.0.0.53,需注意它可能覆盖/etc/resolv.conf,新手配置DNS时常在此处踩坑。
-
DHCPDHCP(动态主机配置协议)自动为网络设备分配IP地址、子网掩码、网关、DNS等参数。Linux客户端通过dhclient或NetworkManager获取IP。DHCP服务器(如isc-dhcp-server)管理地址池,避免IP地址冲突。DHCP简化了网络配置,特别适合移动设备和大型网络。静态IP则需手动配置/etc/network/interfaces或使用nmcli。
-
NetworkManager 与 nmcliNetworkManager是Linux系统的动态网络控制与管理守护进程,不仅管理有线/Wi-Fi网络,还支持VPN、蓝牙共享等。nmcli是其命令行工具:nmcli dev status查看设备状态,nmcli con add type ethernet ifname eth0 con-name static ip4 192.168.1.10/24 gw4 192.168.1.1创建静态连接。无论是在桌面环境还是服务器(RHEL 8+默认启用),nmcli都是现代网络配置的首选工具。
-
curl/wgetcurl和wget是命令行HTTP/HTTPS请求工具。curl功能更丰富,支持多种协议(HTTP、FTP、SMTP等)、自定义请求头、Cookie、认证等。例如,curl -O https://example.com/file.zip 下载文件。wget更专注于下载,支持递归下载、断点续传。两者都是自动化脚本和API测试的常用工具。
八、Shell脚本与文本处理(新增至14个)
-
BashBash(Bourne Again Shell)是Linux默认的Shell,兼容sh,并扩展了命令行编辑、作业控制、数组、算术运算等功能。Bash脚本以#!/bin/bash开头,支持变量、条件判断(if)、循环(for、while)、函数、输入输出重定向等。Bash是系统管理自动化的核心语言,通过编写脚本可以批量处理文件、监控系统、部署应用。
-
环境变量环境变量是影响进程行为的动态命名值,通过export命令设置。常见环境变量:PATH(可执行文件搜索路径)、HOME(用户家目录)、USER(当前用户名)、LANG(语言环境)、SHELL(当前Shell)。环境变量在进程创建时从父进程继承,子进程可以修改自己的环境变量而不影响父进程。配置文件如.bashrc、.profile用于设置用户环境。
-
PATHPATH环境变量定义了Shell查找可执行文件的目录列表,各目录用冒号分隔。例如,PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。当用户输入命令时,Shell按顺序在PATH目录中查找同名可执行文件。如果命令不在PATH中,需使用绝对路径或相对路径。修改PATH(如export PATH=$PATH:/opt/bin)可以扩展命令搜索范围。
-
grepgrep是强大的文本搜索工具,根据正则表达式匹配文件内容。基本语法:grep pattern file。常用选项:-i 忽略大小写,-r 递归搜索目录,-n 显示行号,-v 反向匹配,-c 统计匹配行数,-E 支持扩展正则。例如,grep -rn "error" /var/log/ 在日志中递归搜索error。grep常与管道结合,用于过滤命令输出。
-
sedsed(流编辑器)用于对文本进行非交互式编辑,支持替换、删除、插入、打印等操作。基本语法:sed 's/old/new/g' file。常用命令:s(替换)、d(删除行)、a(追加)、i(插入)、p(打印)。sed逐行处理文本,默认输出到标准输出,使用-i选项直接修改文件。sed是文本处理的重要工具,常用于批量替换配置文件中的参数。
-
awkawk是一种模式扫描与处理语言,擅长格式化文本报告。基本语法:awk 'pattern {action}' file。awk自动将每行分割为字段, 1、 2等表示第1、2个字段。例如,awk '{print 1, 3}' file 打印每行的第1和第3列。awk支持变量、数组、算术运算、控制流,可以编写复杂的数据处理脚本。awk与grep、sed并称文本处理三剑客。
-
正则表达式正则表达式是用于模式匹配的字符串规则,被grep、sed、awk、vim等工具支持。基本元字符:. 匹配任意字符,* 匹配前一个字符零次或多次,^ 匹配行首,$ 匹配行尾,[] 匹配字符集,\ 转义。扩展正则(ERE)支持+、?、|、()等。正则表达式是文本处理的基石,掌握正则可以高效地搜索、替换和提取文本信息。
-
脚本调试(set -x / -e / -u)Shell脚本调试通过bash -x script.sh或脚本内set -x实现,显示每条命令及其参数(前面加+号)。set -e使脚本在遇到非零返回码时立即退出(防止错误蔓延),set -u将未定义变量视为错误并终止。trap命令可以捕获信号(如EXIT、ERR)执行清理操作。良好的调试习惯能快速定位脚本中的逻辑错误。
-
printfprintf是比echo更强大的格式化输出命令,继承自C语言。它支持格式说明符(%s字符串、%d整数、%f浮点数)和转义序列(\n换行、\t制表符)。例如printf "%-10s %5d\n" "Alice" 100输出左对齐字符串和右对齐数字。在生成报表、填充表格时,printf是awk之外最精准的输出利器。
-
重定向与文件描述符Linux中每个进程默认有三个文件描述符:0(标准输入)、1(标准输出)、2(标准错误)。重定向操作:>覆盖标准输出,>>追加,2>重定向标准错误,&>同时重定向两者。2>&1将标准错误合并到标准输出。高级技巧:exec 3>file创建自定义描述符,read -u 3读取。重定向是Shell脚本与文件交互最基础的机制。
-
进程替换(<() / >())进程替换是Bash的高级特性,允许将命令的输出作为文件参数传递给其他命令。diff <(ls dir1) <(ls dir2)比较两个目录的列表,而无需创建临时文件。grep error <(tail -f app.log)实时过滤日志。进程替换比管道更灵活,常用于对比、组合多个命令的输出流。
-
jq(JSON处理利器)随着API和微服务普及,JSON成为主流数据格式。jq是命令行下的JSON处理器:curl -s api.example.com | jq '.data[0].id'提取特定字段,jq '. | map(select(.age > 18))'过滤数组。jq支持复杂的切片、映射、拼接操作,是云原生架构中排查接口返回、处理Kubernetes资源清单的核心辅助工具。
九、系统服务与日志(新增至10个)
-
systemdsystemd是Linux系统的服务管理器,取代了传统的SysV init。它使用单元(unit)文件管理服务、挂载点、套接字、定时器等。systemd支持并行启动、按需启动、依赖管理、自动重启等特性,显著加快系统启动速度。systemd还集成了日志系统(journald)、时间同步(timesyncd)、网络管理(networkd)等功能,成为现代Linux发行版的标准组件。
-
systemctlsystemctl是systemd的控制命令,用于管理服务单元。常用操作:systemctl start nginx 启动服务;systemctl stop nginx 停止;systemctl restart nginx 重启;systemctl enable nginx 设置开机自启;systemctl status nginx 查看服务状态。systemctl还支持mask(屏蔽服务)、daemon-reload(重载配置)等高级功能。
-
systemd Targets(运行目标)Target是systemd中一组单元的集合,用于定义系统的运行状态,类似于SysV的“运行级别”(Runlevel)。常见Target:multi-user.target(多用户命令行模式)、graphical.target(图形界面)、rescue.target(单用户维护模式)。通过systemctl get-default查看默认启动目标,systemctl set-default multi-user.target切换。Target之间存在依赖链,实现服务的分组启动控制。
-
journalctljournalctl用于查询systemd日志(journald),支持按时间、服务、优先级等过滤。例如,journalctl -u nginx 查看nginx服务的日志;journalctl --since "1 hour ago" 查看最近一小时的日志;journalctl -f 实时跟踪新日志。journalctl将日志存储在二进制文件中,支持结构化查询,比传统文本日志更高效。
-
croncron是Linux的定时任务调度器,通过crontab文件配置。crontab格式:分 时 日 月 周 命令。例如,0 2 * * * /usr/bin/backup.sh 每天凌晨2点执行备份。cron服务(crond)每分钟检查一次crontab,执行到期的任务。用户可以使用crontab -e编辑自己的任务,root可以管理所有用户的任务。cron是系统自动化的基础,常用于日志轮转、数据备份、系统更新。
-
systemd Timers(定时器)systemd定时器是cron的现代替代方案,通过.timer单元和对应的.service单元配合工作。优势:精确到微秒、支持日历事件和单调计时、可设置依赖链、日志集成到journald。示例:systemd-analyze calendar "--* 02:00:00"测试触发时间,systemctl enable backup.timer启用。在RHEL/CentOS 7+中,systemd定时器正逐步成为官方推荐的任务调度方式。
-
logrotatelogrotate用于管理日志文件,防止日志无限增长占用磁盘空间。它根据配置自动轮转、压缩、删除旧日志。配置文件在/etc/logrotate.conf和/etc/logrotate.d/中。例如,/var/log/syslog { weekly rotate 4 compress } 表示每周轮转一次,保留4个备份,并压缩。logrotate通常由cron定时执行,是系统日志管理的重要工具。
-
syslog/rsyslogsyslog是系统日志记录框架,rsyslog是其增强版,支持多源日志收集、过滤、转发。日志消息根据设施(facility)和优先级(priority)分类,写入/var/log/下的文件(如messages、auth.log)。rsyslog支持TCP/UDP传输、数据库存储、模板格式化等高级功能。日志是系统故障排查和安全审计的重要依据。
-
服务单元文件(Service Unit)Systemd的服务单元文件(.service)位于/etc/systemd/system/或/usr/lib/systemd/system/,采用INI格式。核心段:[Unit](描述、依赖)、[Service](ExecStart、ExecStop、Restart、User)、[Install](WantedBy)。编写自定义服务单元是将任何应用程序(如Python Web应用、Java Jar包)托管为系统守护进程的标准做法,便于统一管理和监控。
-
系统启动时间分析(systemd-analyze)systemd-analyze是分析系统启动性能的工具:systemd-analyze time显示内核和用户空间启动耗时;systemd-analyze blame按耗时的降序列出每个服务单元的启动时间;systemd-analyze critical-chain显示关键路径上的依赖链。此工具是排查服务器重启缓慢、优化启动速度的利器,能精准定位哪些服务拖慢了系统。
十、软件包管理(新增至8个)
-
包管理器包管理器是自动化安装、更新、卸载软件的工具,解决软件依赖关系。Linux发行版通常使用两种包格式:Debian系(.deb)使用APT,Red Hat系(.rpm)使用YUM/DNF。包管理器从软件仓库(repository)下载预编译的二进制包,自动处理依赖,确保系统一致性。包管理器的出现大大简化了软件安装过程,是Linux生态繁荣的重要基础。
-
APTAPT(Advanced Package Tool)是Debian/Ubuntu的包管理工具。常用命令:apt update 更新软件源列表;apt install package 安装包;apt remove package 卸载包;apt upgrade 升级所有可升级的包;apt search keyword 搜索包。APT自动处理依赖关系,并将包信息缓存到本地。现代APT还支持apt list、apt show等查询命令。
-
YUM/DNFYUM(Yellowdog Updater Modified)和DNF(Dandified YUM)是Red Hat/CentOS/Fedora的包管理器。DNF是YUM的下一代,性能更好,依赖解析更准确。常用命令:dnf install package;dnf remove package;dnf update;dnf search keyword。DNF使用RPM作为底层包格式,支持插件扩展(如自动镜像选择、增量更新)。
-
RPM/DEBRPM(Red Hat Package Manager)和DEB(Debian Package)是两种主流的软件包格式。RPM用于Red Hat系(CentOS、Fedora),DEB用于Debian系(Ubuntu、Debian)。包文件包含二进制程序、配置文件、文档和元数据(版本、依赖、描述)。直接使用rpm -ivh package.rpm或dpkg -i package.deb可以安装,但不处理依赖,因此通常通过包管理器使用。
-
仓库(Repository)软件仓库是存储预编译包的服务器,通过配置文件(如/etc/apt/sources.list)指定。仓库分为官方仓库(如Ubuntu的main、universe)和第三方仓库(如PPA、EPEL)。包管理器从仓库下载包并验证签名,确保软件来源可靠。添加第三方仓库可以获取官方未提供的软件,但需注意安全风险。仓库机制是Linux软件分发的主要方式。
-
模块流(AppStream)RHEL/CentOS 8+引入了AppStream模块流机制,允许用户在同一发行版上选择不同版本的软件包(如PHP 7.4或PHP 8.0)。dnf module list查看可用模块,dnf module enable php:8.0启用特定流,dnf install php安装。模块流解决了传统RPM发行版“版本固定”的痛点,使企业级系统既能保持稳定内核,又能灵活使用新版应用软件。
十一、安全与审计(新增至6个)
-
防火墙(Firewall)防火墙是监控和控制网络流量的安全系统,基于规则允许或拒绝数据包。Linux防火墙通过iptables/nftables实现,也可使用firewalld(动态防火墙管理工具)简化配置。防火墙规则可以基于IP地址、端口、协议、状态等条件。例如,firewall-cmd --add-service=http --permanent 开放HTTP服务。防火墙是系统安全的第一道防线。
-
fail2banfail2ban是入侵防御工具,通过监控日志文件(如/var/log/auth.log)检测多次认证失败,然后使用iptables临时封禁攻击IP。它支持多种服务(SSH、Apache、Postfix等),可自定义封禁时间和重试次数。fail2ban能有效防止暴力破解攻击,是服务器安全加固的常用工具。配置在/etc/fail2ban/jail.conf中。
-
SELinuxSELinux(安全增强型Linux)是强制访问控制(MAC)机制,由美国国家安全局开发。它通过安全策略定义进程可以访问哪些文件、端口、资源,即使进程被攻破,也无法越权操作。SELinux有三种模式:Enforcing(强制)、Permissive(仅记录)、Disabled(禁用)。配置复杂,但能提供极高的安全性,常用于政府、军事等高安全环境。
-
AppArmorAppArmor是基于路径的强制访问控制,与SELinux互补。它通过配置文件(profile)限制程序可以访问的文件、网络、能力。例如,/usr/bin/evince的profile允许它读取PDF文件但禁止访问网络。AppArmor比SELinux更易配置,适合桌面和通用服务器。Ubuntu默认使用AppArmor,而CentOS使用SELinux。
-
审计(Audit)Linux审计系统(auditd)用于记录系统安全相关事件,如文件访问、系统调用、用户登录等。审计规则通过auditctl命令配置,日志写入/var/log/audit/audit.log。审计可以检测入侵行为、追踪用户操作、满足合规要求。例如,auditctl -w /etc/passwd -p wa -k passwd_changes 监控passwd文件的写和属性修改。审计日志需定期审查,结合ausearch工具分析。
-
加密与哈希Linux中密码存储使用SHA-512(影子文件),文件完整性校验常用md5sum、sha256sum。GPG(GNU Privacy Guard)用于非对称加密和签名验证,常用于软件包签名(如APT源验证)。OpenSSL是SSL/TLS协议的实现,提供对称/非对称加密、证书管理功能。在生产环境中,配置HTTPS、加密数据传输、校验软件包完整性均依赖这些工具。
十二、容器化与云原生基石(全新章节,共6个)
-
OverlayFS(联合文件系统)OverlayFS是Linux内核原生的联合挂载文件系统,将多个目录(lowerdir、upperdir)合并成一个统一的视图。它是Docker/Podman容器镜像分层存储的底层技术:只读层作为lowerdir,容器可写层作为upperdir,写时复制(CoW)机制保证容器修改不影响镜像层。docker inspect查看GraphDriver即OverlayFS。理解OverlayFS是排查容器磁盘占用和文件丢失问题的基础。
-
容器网络模型(CNI与veth)容器使用veth pair(虚拟以太网对)连接宿主机网络桥接(如docker0、cni0),一端在容器网络命名空间内,另一端在宿主机上。CNI(容器网络接口)是容器运行时与网络插件交互的标准,实现IP分配、路由配置。常用插件包括bridge、macvlan、flannel、Calico。容器的网络隔离与通信本质上依赖Linux网桥、iptables/nftables规则和路由表转发。
-
Podman(无守护进程容器引擎)Podman是Red Hat主导的容器引擎,与Docker CLI完全兼容(可别名alias docker=podman)。最大区别是无守护进程(无dockerd),采用fork/exec模型,容器直接作为子进程运行,支持Rootless模式(非root用户运行容器),安全性更高。在RHEL/CentOS 8+中,Podman是默认容器工具,与systemd集成良好(通过podman generate systemd生成服务单元)。
-
容器运行时(runC与CRI-O)runC是OCI(开放容器标准)的参考实现,负责创建和运行容器(底层调用namespaces和cgroups)。Docker和Podman都依赖runC。CRI-O是Kubernetes CRI(容器运行时接口)的轻量级实现,直接兼容OCI镜像,专为K8s设计,替代docker-shim。了解容器运行时的层级(CLI -> 守护进程/管理器 -> runC -> 内核),有助于诊断“容器无法启动”或“资源限制不生效”等深层次问题。
-
容器镜像构建(Dockerfile与多阶段构建)Dockerfile是定义容器镜像构建步骤的文本文件,核心指令包括FROM(基础镜像)、RUN(执行命令)、COPY/ADD(添加文件)、EXPOSE(声明端口)、CMD/ENTRYPOINT(启动命令)。多阶段构建允许在一个Dockerfile中使用多个FROM,将构建环境与运行环境分离,大幅缩减最终镜像体积(如将Golang编译环境与Alpine运行环境分离),是云原生微服务镜像瘦身的核心技巧。
-
Kubernetes 基本概念(Pod、Service、Ingress)虽然K8s是编排层,但底层依赖Linux内核特性。Pod是最小调度单元,包含一个或多个共享网络命名空间(同IP、同IPC)的容器;Service通过标签选择器提供稳定的ClusterIP和负载均衡;Ingress管理外部HTTP/HTTPS流量路由。理解Pod的网络共享(依赖容器间命名空间共享)和服务发现(依赖DNS和iptables/IPVS),能帮助运维精准定位服务连接超时、网络策略冲突等云原生故障。
总结与进阶建议
以上 133 个概念 涵盖了从底层内核机制(Cgroup/Namespace/OverlayFS)、企业存储(LVM/RAID/XFS/Btrfs)、系统调优(sysctl/swap) 到自动化管理(systemd/rsync/jq) 以及云原生基石(容器/K8s基础) 的完整知识链路。
随着 2026 年技术演进,Linux 已不仅仅是一个操作系统,更是云原生、边缘计算和 AI 基础设施的底座。建议读者:
-
实践为王:在虚拟机或云服务器上亲手执行 lvm 扩容、编写 systemd 服务单元、配置 rsync 定时备份。
-
追踪内核:关注 Linux 内核 6.x 在 BPF(eBPF)、新调度器和安全模块上的创新。
-
融入生态:将学到的 cgroups、namespace 知识与 Kubernetes 调度、资源配额(ResourceQuota)相互印证,达到融会贯通。
这份万字长文不仅是一份备考手册,更是一张清晰的企业级 Linux 技术地图。