运维高级课笔记(RHCSA复习)

一.命令行使用技巧

1.什么是内核、什么是shell、什么是Linux、什么是开源

内核:是 Linux 系统的 "大脑",是操作系统的核心程序,负责管理硬件资源(CPU、内存、磁盘等)、进程调度、硬件驱动等底层工作。

Shell:是用户和内核之间的 "翻译官",是一个命令解释器。用户输入命令后,Shell 会将其翻译成内核能理解的指令,再把结果返回给用户(比如常用的 Bash 就是一种 Shell)。

Linux:是一种开源的操作系统,基于 Unix 思想开发,核心是 Linux 内核,通常搭配各种工具、Shell 组成完整的 Linux 发行版(如 Ubuntu、CentOS)。

开源:指软件的源代码是公开的,用户可以自由查看、修改、分发代码,Linux 就是典型的开源软件。

2.Linux中命令录入方式

直接在终端(Terminal)里输入命令,按Enter键执行即可。

3.命令行快捷键

  • Ctrl+C:终止当前正在运行的命令
  • Ctrl+D:退出当前 Shell(相当于exit
  • Ctrl+L:清空终端屏幕(相当于clear
  • Ctrl+A:光标跳转到命令开头
  • Ctrl+E:光标跳转到命令结尾
  • Ctrl+U:删除光标前的所有内容
  • Ctrl+K:删除光标后的所有内容

4.命令行补齐

<TAB>

5.命令行中如何获得帮助

--help man

二.Linux下文件管理

1.touch、mkdir、rm、cp、mv、cat、head、less、vim、file、wc、ls

(1) .创建空文件

touch :核心功能是创建空文件,同时也可用于修改文件的访问时间和修改时间(不改变文件内容)。

  • 示例 1:创建单个空文件 touch test.txt
  • 示例 2:创建多个空文件 touch file1.txt file2.log
  • 示例 3:修改文件时间(改为当前系统时间) touch -c existing.txt-c 避免创建不存在的文件

mkdir :专门创建目录(文件夹),支持多级目录创建。

  • 示例 1:创建单个目录 mkdir dir1
  • 示例 2:创建多级嵌套目录(二级 / 三级) mkdir -p dir2/subdir1/subdir2-p 自动创建不存在的父目录)

(2) . 文件 / 目录删除类

  • rm删除文件或目录 ,默认仅能删除文件,删除目录需加参数。
    • 示例 1:删除单个文件 rm test.txt
    • 示例 2:强制删除文件(不弹出确认提示) rm -f file1.txt
    • 示例 3:删除目录及其中所有内容(递归删除) rm -rf dir1-r 递归处理,-f 强制删除,谨慎使用)

(3) . 文件 / 目录复制类

  • cp复制文件或目录 ,将源文件 / 目录复制到目标路径。
    • 示例 1:复制单个文件到目标目录 cp test.txt dir1/
    • 示例 2:复制目录及所有内容(递归复制) cp -r dir1 dir2/-r 递归处理目录)
    • 示例 3:保留文件属性(权限、时间)复制 cp -a file1.txt dir1/-a 等价于-dpr,适合备份)

(4) . 文件 / 目录移动 / 重命名类

  • mv :有两个核心功能,移动文件 / 目录给文件 / 目录重命名
    • 示例 1:移动文件到目标目录 mv test.txt dir1/
    • 示例 2:给文件重命名 mv file1.txt file2.txt
    • 示例 3:移动目录到目标路径 mv dir1 dir2/

(5) . 文件内容查看类

  • cat一次性显示文件的全部内容 ,适合查看小型文件(大文件内容会刷屏)。
    • 示例 1:查看文件内容 cat test.txt
    • 示例 2:查看文件并显示行号 cat -n test.txt
    • 示例 3:拼接多个文件内容并输出 cat file1.txt file2.txt
  • head查看文件的前 N 行内容 ,默认显示前 10 行。
    • 示例 1:默认查看前 10 行 head test.txt
    • 示例 2:指定查看前 5 行 head -n 5 test.txt(可简写为head -5 test.txt
  • less分页查看大型文件内容 ,支持上下滚动、搜索,交互性更强(相比more功能更全)。
    • 示例 1:打开文件进行分页查看 less test.txt
    • 常用交互操作:/ 上下滚动、/关键词 向下搜索、q 退出查看
  • vim :一款功能强大的全屏幕文本编辑器 ,支持编辑、查找、替换等多种操作,有三种核心模式(命令模式、插入模式、末行模式)。
    • 示例 1:打开 / 创建文件进行编辑 vim test.txt
    • 核心操作流程:打开文件(命令模式)→ 按i进入插入模式(编辑内容)→ 按Esc返回命令模式 → 输入:wq保存并退出(末行模式)

(6) . 文件属性 / 统计类

  • file识别文件的类型 (不是通过后缀名,而是通过文件内部格式 / 编码)。
    • 示例 1:识别文件类型 file test.txt(可能返回 "ASCII text" 纯文本文件)
    • 示例 2:识别可执行文件 file /bin/ls(可能返回 "ELF 64-bit LSB executable")
  • wc统计文件的行号、单词数、字节数 (Word Count)。
    • 示例 1:完整统计文件(行、词、字节) wc test.txt
    • 示例 2:仅统计行数 wc -l test.txt(最常用,用于统计日志行数等)
    • 示例 3:仅统计字节数 wc -c test.txt、仅统计单词数 wc -w test.txt
  • ls列出目录中的文件 / 目录信息 ,是最常用的查看命令之一。
    • 示例 1:列出当前目录的简易列表 ls
    • 示例 2:列出详细信息(权限、所有者、大小、时间) ls -l(简写为ll,部分系统需配置)
    • 示例 3:显示隐藏文件(以.开头的文件) ls -a
    • 示例 4:递归列出所有子目录内容 ls -R

2.二级目录的作用

Linux 系统根目录/下的二级目录是标准化的,每个目录有明确的用途,核心目录及作用如下:

  1. /bin :存放所有用户可执行的基本命令 (如lscatmv),/bin 目录中的命令在单用户模式下也能使用,文件通常为二进制可执行文件。
  2. /etc :存放系统的配置文件 (如用户配置、服务配置、网络配置等),例如/etc/passwd(用户信息)、/etc/profile(系统环境变量)、/etc/nginx(Nginx 服务配置),该目录通常只有 root 用户有修改权限。
  3. /home :普通用户的家目录(主目录) ,每个普通用户会在这里有一个以用户名命名的子目录(如/home/lee),用户对自己的家目录有完全操作权限,用于存放个人文件、配置等。
  4. /root :超级用户root的家目录,普通用户无访问权限。
  5. /usr :存放系统软件资源 (相当于 Windows 的Program Files),核心子目录有/usr/bin(非基本命令,如高级工具)、/usr/lib(软件库文件)、/usr/share(帮助文档、字体等)。
  6. /var :存放可变数据文件 (内容会随系统运行动态变化),例如/var/log(系统日志)、/var/www(网站根目录)、/var/spool(邮件、打印队列)。
  7. /dev :存放设备文件 (Linux 中一切皆文件,硬件设备被抽象为文件),例如/dev/sda(硬盘)、/dev/tty(终端)、/dev/null(空设备,相当于 "黑洞")。
  8. /tmp :存放临时文件,所有用户都可读写,系统重启后该目录下的文件会被自动清除。
  9. /boot :存放系统启动相关文件(如 Linux 内核、启动引导程序 GRUB),如果该目录损坏,系统将无法正常启动。
  10. /mnt临时挂载目录 ,用于挂载 U 盘、移动硬盘、光盘等外部存储设备,例如mount /dev/cdrom /mnt/cdrom(挂载光盘到/mnt/cdrom)。

3.文件寻址 相对路径、绝对路径

文件寻址是指通过路径定位到目标文件 / 目录,Linux 中有两种路径表示方式,核心区别在于是否以根目录/开头。

1. 绝对路径

  • 定义 :从 ** 根目录/** 开始的完整路径,明确指向文件 / 目录的唯一位置,不受当前工作目录的影响。
  • 特征 :必然以/开头,路径完整无歧义。
  • 示例
    • 根目录下的etc目录:/etc
    • 普通用户lee的家目录:/home/lee
    • 配置文件test.conf/home/lee/config/test.conf
  • 适用场景:编写脚本、配置服务、指定固定路径时(确保路径不会出错)。

2. 相对路径

  • 定义 :从当前工作目录 (用户当前所处的目录)开始的路径,不以/开头,路径的有效性依赖于当前所在目录。
  • 特征 :不以/开头,可使用特殊符号简化路径:
    • . :表示当前目录
    • .. :表示当前目录的上一级目录(父目录)
    • ~ :表示当前用户的家目录(如~等价于/home/leeroot用户下~等价于/root
  • 示例 (假设当前工作目录为/home/lee):
    • 访问当前目录下的test.txt./test.txt(可简写为test.txt
    • 访问当前目录下config子目录的test.confconfig/test.conf(等价于绝对路径/home/lee/config/test.conf
    • 访问上一级目录/home下的westos目录:../westos(等价于绝对路径/home/westos
    • 访问家目录下的download目录:~/download
  • 适用场景:手动在终端操作,当前目录附近的文件 / 目录寻址(更简洁)。

4、 文件批处理:通配符与表达式(匹配多个文件 / 目录)

*、?、\[:alpha:]、\[:aigit:]、\[:lower:]、\[:upper:]、\[:alnum:]、\[:punct:]、\[:space:]

\[\]、{}

bash 复制代码
#实验
#说明:建议开启两个shell,在一个shell中开启监控
[root@localhost mnt]# watch -n 1 ls -Rl

#在另外一个shell中操作

[root@localhost mnt]# touch le8e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr lee
[root@localhost mnt]# touch le8e leAe le@e leae le\ e lee
[root@localhost mnt]#
[root@localhost mnt]# rm -fr *
[root@localhost mnt]# touch le8e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr ???
[root@localhost mnt]# touch le8e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr ????
[root@localhost mnt]# touch le8e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le*e
[root@localhost mnt]# touch le8e leAe le@e leae le\ e lee file
[root@localhost mnt]# rm -fr le*e
[root@localhost mnt]# rm -fr *
[root@localhost mnt]# touch le8e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[[:digit:]]e
[root@localhost mnt]# touch le8e leAe le@e leae le\ e lee
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# touch le66e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[[:digit:]]e
[root@localhost mnt]# rm -fr le[[:digit:]][[:digit:]]e
[root@localhost mnt]# touch le66e leAe le@e leae le\ e lee
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[[:digit:]]*e
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[[:punct:]]*e
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[[:punct:]]*e
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]#
[root@localhost mnt]# rm -fr le[[:punct:]]*e
[root@localhost mnt]# rm -fr le[[:space:]]*e
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[[:alpha:]]*e
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[[:upper:]]*e
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[[:lower:]]*e
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[[:alnum:]]*e
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[[:punct:][:space:]]*e
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[![:punct:][:space:]]*e
[root@localhost mnt]# touch le6e leAe le@e leae le\ e lee
[root@localhost mnt]# rm -fr le[^[:punct:][:space:]]*e

文件批处理的核心是通过通配符 / 表达式匹配多个符合规则的文件 / 目录,用于批量操作(如批量删除、批量复制),下面分两类详解:

第一类:通配符(全局匹配,由 Shell 解析,适用于大部分命令)

  1. 基础通配符
  • * :匹配任意长度的任意字符(包括 0 个字符),是最常用的批量匹配符号。

    • 示例 1:匹配当前目录下所有.txt后缀的文件 *.txt(如test.txtfile1.txta.txt
    • 示例 2:匹配当前目录下所有以file开头的文件 file*(如file1file2.logfileabc
    • 示例 3:匹配当前目录下所有文件(隐藏文件除外) *
  • ? :匹配单个任意字符(仅 1 个,不能多也不能少)

    • 示例 1:匹配当前目录下文件名长度为 5(4 个字符 +.txt)的.txt文件 ????.txt(如abcd.txt,不匹配abc.txtabcde.txt
    • 示例 2:匹配当前目录下以f开头、后面跟 1 个任意字符、以.log结尾的文件 f?.log(如f1.logfa.log,不匹配f12.log
  1. 字符类通配符([[:xxx:]],匹配指定类别中的单个字符)

这类通配符用于精准匹配某一类字符,仅匹配单个字符,常见类别如下:

  • [[:alpha:]] :匹配单个字母字符 (包括大小写,a-z、A-Z)
    • 示例:file[[:alpha:]].txt(匹配filea.txtfileB.txt,不匹配file1.txt
  • [[:digit:]] (注意:你输入的aigit是笔误,正确为digit):匹配单个数字字符 (0-9)
    • 示例:file[[:digit:]].txt(匹配file1.txtfile9.txt,不匹配filea.txt
  • [[:lower:]] :匹配单个小写字母字符 (a-z)
    • 示例:file[[:lower:]].txt(匹配filea.txtfilez.txt,不匹配fileA.txt
  • [[:upper:]] :匹配单个大写字母字符 (A-Z)
    • 示例:file[[:upper:]].txt(匹配fileA.txtfileZ.txt,不匹配filea.txt
  • [[:alnum:]] :匹配单个字母或数字字符 (a-z、A-Z、0-9)
    • 示例:file[[:alnum:]].txt(匹配filea.txtfile1.txtfileZ.txt
  • [[:punct:]] :匹配单个标点符号 / 特殊字符 (如!@#.,等)
    • 示例:file[[:punct:]].txt(匹配file!.txtfile@.txt
  • [[:space:]] :匹配单个空白字符 (如空格、制表符Tab
    • 示例:匹配文件名中包含空格的文件 *[[:space:]]*
  1. 自定义字符集[]
  • 定义 :手动指定一组字符,匹配其中任意单个字符 ,支持范围表示(-),也支持排除(^!,放在[]开头)。
  • 示例 1:匹配file1.txtfile2.txtfile3.txtfile[123].txtfile[1-3].txt-表示范围)
  • 示例 2:匹配filea.txtfileb.txtfilec.txtfile[a-c].txt
  • 示例 3:匹配除了 1、2、3 之外的单个字符 → file[^123].txtfile[!123].txt(排除 1、2、3)
  • 注意:[]内仅匹配单个字符,多个字符需多个[]或结合*使用。

大括号表达式{}

  • 定义{}用于生成一组符合规则的字符串(批量生成 / 匹配) ,与通配符不同,{}是 "预先生成" 字符串,再传递给命令,不依赖于实际存在的文件。
  • 核心作用:1. 批量生成文件名 / 路径;2. 批量匹配已知的固定字符串。
  • 示例 1:批量创建文件file1.txtfile2.txtfile3.txttouch file{1,2,3}.txt,分隔多个值)
  • 示例 2:批量创建文件file1.txtfile10.txttouch file{1..10}.txt..表示连续范围,支持数字、字母)
  • 示例 3:批量复制文件,将test1.txttest2.txt分别复制为test1.baktest2.bakcp test{1,2}.txt test{1,2}.bak
  • 示例 4:批量创建嵌套目录dir1/sub1dir1/sub2dir2/sub1dir2/sub2mkdir -p {dir1,dir2}/{sub1,sub2}
  • 注意:{}内的内容是 "固定 / 预定义" 的,不会匹配未知字符,与*(匹配任意字符)的区别在于:*.txt匹配所有已存在的.txt文件,而{a,b,c}.txt生成a.txtb.txtc.txt(无论是否存在)。

通配符与{}的核心区别

对比项 通配符(*?[] 大括号{}
解析主体 由 Shell 解析,依赖实际文件 由 Shell 解析,预先生成字符串,不依赖实际文件
匹配逻辑 匹配已存在的文件 / 目录 生成指定字符串,用于创建 / 批量操作
适用场景 批量操作已存在的文件 批量创建文件 / 目录、批量操作已知固定对象

三.Linux中的输入和输出

1.字符设备是啥?

字符设备(Character Device)是按 "字符流" 方式逐字节 / 逐字符读写数据的硬件设备,具有两个关键特征:

  1. 无缓冲(或极简缓冲):数据传输不经过系统大缓存,直接在设备和应用程序之间传递,延迟低;
  2. 顺序访问:数据只能按先后顺序读写,无法随机定位(与块设备的 "按块随机访问" 形成对比)。

说明:字符设备在系统中对应/dev目录下的文件,通过ls -l查看时,文件类型标识为c(块设备为b

2.输入和输出的基本原理

Linux 把所有 I/O 操作都映射为 "文件读写",无论是操作硬件设备(键盘、显示器),还是操作普通文件,应用程序都只需要调用统一的文件读写接口,由内核负责转换为具体的设备操作。

三个默认标准文件描述符

每个进程启动时,内核会自动为其打开 3 个标准文件描述符,对应默认的输入 / 输出设备,无需手动创建:

文件描述符(FD) 名称 英文缩写 默认对应设备 核心作用
0 标准输入 stdin 键盘 程序从这里读取输入数据
1 标准输出 stdout 显示器 程序输出正常运行结果
2 标准错误输出 stderr 显示器 程序输出错误信息、异常日志

3.输出重定向

输出重定向是指改变 "标准输出(FD=1)" 的默认指向(从显示器改为普通文件),将程序原本要显示在屏幕上的正常结果,直接写入到指定文件中,而不在终端屏幕上显示。

关键特点

覆盖模式:如果目标文件已经存在,会先清空该文件的所有原有内容,再写入新的输出数据;如果目标文件不存在,会自动创建该文件。

输出重定向仅针对标准输出(FD=1),程序的错误信息(FD=2)仍会输出到显示器上,例如:

4.追加

追加是输出重定向的 "追加模式",同样是改变标准输出(FD=1)的指向(改为普通文件),但不会清空目标文件的原有内容,而是将新的输出数据添加到目标文件的末尾。

关键特点

追加模式:如果目标文件已经存在,直接在文件末尾追加新数据,原有内容保留;如果目标文件不存在,会自动创建该文件(与覆盖模式一致)。

核心区别(覆盖 vs 追加)

模式 语法 目标文件已存在时的行为 适用场景
覆盖 > / 1> 清空原有内容,写入新数据 重新生成文件、覆盖旧数据
追加 >> / 1>> 保留原有内容,末尾加新数据 记录日志、累积数据、不丢失旧内容

5.输入重定向

核心定义

输入重定向是指改变 "标准输入(FD=0)" 的默认指向(从键盘改为普通文件),让程序从指定文件中读取输入数据,而不是等待用户从键盘手动输入。

关键特点

程序会一次性读取源文件中的所有数据作为输入,无需手动交互,适合批量处理数据、自动化脚本执行。

补充说明

有些命令本身支持直接传入文件名作为参数(如cat test.txtsort data.txt),其底层逻辑与输入重定向一致,都是从文件中读取数据,输入重定向更适合用于 "不支持直接传入文件名" 的命令。

6.多行录入

核心定义

多行录入(又称 Here Document,简称 Heredoc)是一种特殊的输入重定向方式,用于在命令行或 Shell 脚本中,一次性输入多行文本作为程序的标准输入,无需创建额外的文件。

关键规则

  1. 分界符可以是任意自定义字符串(常用EOFEOTEND等),前后分界符必须完全一致(大小写敏感);
  2. 开头的分界符(<< 分界符)后不能有多余空格;
  3. 结尾的分界符必须单独一行,且行首不能有任何空格、制表符等字符;
  4. 多行内容中可以包含变量、命令替换等(如需关闭变量替换,可将分界符用单引号包裹,如<< 'EOF')。

关键特点

无需创建临时文件,直接在命令行 / 脚本中编写多行输入,适合编写简单配置、批量生成文本内容、自动化脚本中的多行输入场景。

7.管道

核心定义

管道(Pipe,符号为|)是Linux 中实现 "命令之间数据传递" 的核心机制 ,它的作用是将前一个命令的标准输出(FD=1) ,直接作为后一个命令的标准输入(FD=0),实现多个命令的 "串联执行、数据流水线处理"。

关键特点

  1. 管道是 "单向数据流":只能从左到右传递数据(前一个命令的输出→后一个命令的输入);

  2. 管道仅传递标准输出(FD=1) ,不传递标准错误输出(FD=2)(错误信息仍会输出到屏幕);

  3. 管道中的每个命令都是独立的进程,并行执行,数据实时传递,无需创建临时文件存储中间结果。

  4. 补充说明

    管道是 Linux "组合命令" 的核心,通过简单命令的串联,可以实现复杂的功能,这也是 Linux 命令行的强大之处。

8.错误输出通过管道

核心背景

默认情况下,管道(|)仅传递标准输出(FD=1),而 ** 标准错误输出(FD=2)** 会直接输出到终端屏幕,不会参与管道传递,导致如果前一个命令执行出错,错误信息无法被后一个命令处理。

核心解决思路

要让错误输出通过管道传递,需要先将 "标准错误输出(FD=2)重定向到标准输出(FD=1)",让错误信息和正常输出合并,再通过管道传递给后一个命令。

补充说明

2>&1不仅可以用于管道,还可以用于输出重定向,实现 "将正常输出和错误输出同时写入同一个文件

9.输出复制

核心定义

输出复制是指将程序的标准输出(FD=1)同时发送到两个目标 :一是 "终端屏幕"(正常显示),二是 "指定文件"(保存备份),实现 "一边查看结果,一边记录结果" 的需求,核心通过tee命令实现。

核心命令:tee

tee命令的作用类似于 "三通管",将输入数据分流到两个方向:标准输出(屏幕)和指定文件,这也是其名称的由来。

关键特点

  1. 实时分流:数据一边输出到屏幕,一边写入文件,无需等待命令执行完成;

  2. 支持多个文件:可以同时写入多个文件,格式为tee 文件1 文件2 文件3

  3. 支持管道串联:tee的输出(屏幕)还可以继续通过管道传递给后续命令。

  4. 补充说明

    tee命令默认会覆盖目标文件,使用-a参数(append)可改为追加模式,这与输出重定向的>>>对应,在日志记录、自动化脚本调试中非常常用。

bash 复制代码
#实验步骤
#1.建立实验环境
[root@localhost mnt]# chmod  777 /mnt/
[root@localhost mnt]# watch -n 1  cat *

#2.在另外一个shell中
[root@localhost mnt]# useradd lee
[root@localhost mnt]#
[root@localhost mnt]# su - lee
[lee@localhost ~]$

#3.实验过程
[lee@localhost ~]$ find /etc/ -name passwd  2> /mnt/lee
/etc/pam.d/passwd
/etc/passwd
[lee@localhost ~]$ find /etc/ -name passwd  &> /mnt/lee
[lee@localhost ~]$ > /mnt/lee
[lee@localhost ~]$
[lee@localhost ~]$ echo hello linux > lee
[lee@localhost ~]$ echo hello linux > lee^C
[lee@localhost ~]$ cd /mnt/
[lee@localhost mnt]$ echo hello linux > lee
[lee@localhost mnt]$ echo hello linux > lee
[lee@localhost mnt]$ find /etc/ -name passwd  >> /mnt/lee
find: '/etc/sudoers.d': 权限不够
find: '/etc/pki/rsyslog': 权限不够
find: '/etc/sssd': 权限不够
find: '/etc/nftables': 权限不够
find: '/etc/sos/cleaner': 权限不够
find: '/etc/ssh/sshd_config.d': 权限不够
find: '/etc/lvm/archive': 权限不够
find: '/etc/lvm/backup': 权限不够
find: '/etc/lvm/cache': 权限不够
find: '/etc/lvm/devices': 权限不够
find: '/etc/polkit-1/rules.d': 权限不够
find: '/etc/polkit-1/localauthority': 权限不够
find: '/etc/grub.d': 权限不够
find: '/etc/audit': 权限不够
find: '/etc/firewalld': 权限不够
[lee@localhost mnt]$ find /etc/ -name passwd  ^C /mnt/lee
[lee@localhost mnt]$
[lee@localhost mnt]$ tr ''
tr: "" 后缺少操作数
当进行替换操作时必须给定两组字符串。
请尝试执行 "tr --help" 来获取更多信息。
[lee@localhost mnt]$ cat lee | tr 'a-z' 'A-Z'
HELLO LINUX
/ETC/PAM.D/PASSWD
/ETC/PASSWD
[lee@localhost mnt]$
[lee@localhost mnt]$  tr 'a-z' 'A-Z' <lee
HELLO LINUX
/ETC/PAM.D/PASSWD
/ETC/PASSWD
[lee@localhost mnt]$ echo haha |  tr 'a-z' 'A-Z'
HAHA
[lee@localhost mnt]$ echo -e "haha\nhehe" |  tr 'a-z' 'A-Z'
HAHA
HEHE
[lee@localhost mnt]$  tr 'a-z' 'A-Z' <<EOF
> hehe
> haha
> xixi
> EOF
HEHE
HAHA
XIXI
[lee@localhost mnt]$
[lee@localhost mnt]$ echo haha |  tr 'a-z' 'A-Z' ^C
[lee@localhost mnt]$ find /etc/ -name passwd | wc -l
find: '/etc/sudoers.d': 权限不够
find: '/etc/pki/rsyslog': 权限不够
find: '/etc/sssd': 权限不够
find: '/etc/nftables': 权限不够
find: '/etc/sos/cleaner': 权限不够
find: '/etc/ssh/sshd_config.d': 权限不够
find: '/etc/lvm/archive': 权限不够
find: '/etc/lvm/backup': 权限不够
find: '/etc/lvm/cache': 权限不够
find: '/etc/lvm/devices': 权限不够
find: '/etc/polkit-1/rules.d': 权限不够
find: '/etc/polkit-1/localauthority': 权限不够
find: '/etc/grub.d': 权限不够
find: '/etc/audit': 权限不够
find: '/etc/firewalld': 权限不够
2
[lee@localhost mnt]$ find /etc/ -name passwd 2>&1 |  wc -l
17
[lee@localhost mnt]$ find /etc/ -name passwd 2>&1 |  wc -l
17
[lee@localhost mnt]$ find /etc/ -name passwd 2>&1 | tee file |  wc -l
17
[lee@localhost mnt]$ rm -fr /mnt/*
[lee@localhost mnt]$ find /etc/ -name passwd 2>&1 | tee file |  wc -l
[lee@localhost mnt]$ find /etc/ -name passwd 2>&1 | tee file |  wc -l
17

总结

  1. 字符设备是按字符流无缓冲读写的硬件抽象,对应/dev目录下的c类型文件;
  2. Linux I/O 的核心是文件描述符,默认 3 个 FD(0 = 输入、1 = 正常输出、2 = 错误输出);
  3. 重定向用于改变 FD 的默认指向,>/>>操作 FD=1,<操作 FD=0,2>&1合并错误与正常输出;
  4. 管道实现命令间数据传递,默认仅传递 FD=1,需合并输出才能传递错误信息;
  5. 多行录入(Heredoc)适合批量输入多行文本,tee命令实现输出的屏幕 + 文件双重保存。

四.用户管理

1. 用户存在的意义(3A 机制)

Linux 是多用户多任务操作系统 ,用户存在的核心意义是实现权限隔离、资源分配和操作审计 ,其底层依托3A 机制(认证、授权、审计)保障系统安全与可控。

3A 机制详解

机制名称 英文 核心作用 实现方式
认证 Authentication 验证 "用户是谁",确认身份合法性 - 验证用户名和密码(核心文件/etc/passwd/etc/shadow)- 密钥认证(SSH 免密登录)- 生物识别、第三方认证等
授权 Authorization 验证 "用户能做什么",分配操作权限 - 通过用户 ID(UID)组 ID(GID) 控制文件 / 目录访问权限(rwx)- 通过sudo分配临时管理员权限- 通过 ACL(访问控制列表)实现精细化权限管控
审计 Auditing 记录 "用户做了什么",追溯操作行为 - 系统日志(/var/log/secure记录用户登录、权限变更;/var/log/auth.log记录认证信息)- 命令历史(~/.bash_history记录用户执行过的命令)- 审计工具(auditd服务,监控特定文件 / 命令的操作记录)

2. 用户存在的核心价值

  • 权限隔离:不同用户拥有不同权限,普通用户无法修改系统核心文件,避免误操作或恶意破坏。
  • 资源分配:通过磁盘配额(quota)限制用户可用磁盘空间,通过进程优先级限制 CPU 占用,实现资源公平分配。
  • 操作追溯:所有用户操作可通过审计日志追溯,便于故障排查和安全审计。

. 用户涉及到的系统配置文件

Linux 中用户的身份、密码、组信息等全部存储在纯文本配置文件中,核心文件如下:

(1)核心用户信息文件

文件路径 作用 关键字段说明
/etc/passwd 存储所有用户的基本信息(全局可读) 格式:用户名:密码占位符:UID:GID:注释信息:家目录:登录Shell示例:lee:x:2000:2000::/home/lee:/bin/bash- x:表示密码存储在/etc/shadow中- UID=0:超级用户 root;UID 1-999:系统用户;UID≥1000:普通用户
/etc/shadow 存储用户密码的加密信息(仅 root 可读) 格式:用户名:加密密码:最后一次修改时间:最小修改间隔:最大有效期:警告期:不活动期:过期时间:保留字段示例:lee:$6$xxxx:19500:0:30:7:::- 加密密码:采用 SHA-512 等算法加密,空字段表示无密码,!*表示账户锁定

(2)用户组信息文件

文件路径 作用 关键字段说明
/etc/group 存储所有用户组的基本信息 格式:组名:组密码占位符:GID:组成员列表示例:shengcan:x:2000:lee- 组成员列表:多个用户用逗号分隔
/etc/gshadow 存储用户组密码的加密信息(仅 root 可读) 格式:组名:加密组密码:组管理员:组成员列表- 组密码:用于加入该组(newgrp 组名时验证)

(3)用户环境配置文件

这类文件控制用户登录后的环境变量、命令别名等,分为全局配置 (对所有用户生效)和用户个人配置(仅对当前用户生效):

作用范围 文件路径 作用
全局 /etc/profile 全局环境变量配置,所有用户登录时执行
全局 /etc/bashrc 全局 Shell 配置(命令别名、函数),所有用户打开 Shell 时执行
个人 ~/.bash_profile 用户个人环境变量,登录时执行(优先级高于全局)
个人 ~/.bashrc 用户个人 Shell 配置,打开 Shell 时执行
个人 ~/.bash_history 记录用户执行过的命令(默认保存 1000 条)
个人 ~/.bash_logout 用户退出登录时执行的操作(如清理临时文件)

(4)权限控制相关文件

文件路径 作用
/etc/sudoers 配置sudo权限的核心文件,定义哪些用户可以执行哪些管理员命令
/etc/security/limits.conf 配置用户的资源限制(如最大打开文件数、最大进程数)
bash 复制代码
/etc/passwd
/etc/group
/etc/shadow
/etc/skel/.*        #用户配置文件模板,建立用户时会把此目录中的所有文件复制到新建用户的家目录中
/var/spool/mail/username
/home/username

3.用户管理

用户管理包括用户创建、修改、删除、密码设置 ,以及用户组管理 ,所有命令需以root权限执行(加sudo)。

(1)用户组管理命令

功能 命令 示例
创建用户组(指定 GID) groupadd -g GID 组名 groupadd -g 2000 shengcan
修改用户组 GID groupmod -g 新GID 组名 groupmod -g 2005 shengcan
删除用户组 groupdel 组名 groupdel shengcan
查看用户所属组 groups 用户名 groups lee

(2)用户管理命令

功能 命令 示例
创建用户(指定 UID、主组、附加组) useradd -u UID -g 主组 -G 附加组 用户名 useradd -u 2000 -g shengcan -G caiwu,jishu lee
创建系统用户(禁止登录) useradd -r -s /sbin/nologin 用户名 useradd -r -s /sbin/nologin linux
设置用户密码 passwd 用户名 passwd lee(交互设置密码)`echo "westos" passwd --stdin lee`(非交互设置)
修改用户信息(如主组、家目录) usermod -g 新主组 -d 新家目录 用户名 usermod -g caiwu -d /home/newlee lee
锁定用户账户 passwd -l 用户名 passwd -l lee(密码字段加!
解锁用户账户 passwd -u 用户名 passwd -u lee
删除用户(保留家目录) userdel 用户名 userdel lee
删除用户(同时删除家目录) userdel -r 用户名 userdel -r lee
切换用户身份 su - 用户名 su - root(切换到 root,带环境变量)

(3)用户信息查询命令

功能 命令
查看当前用户 whoami
查看用户登录信息 w/who/last
查看用户 UID、GID 等详细信息 id 用户名
bash 复制代码
userdel  -r
useradd  -u -g -G -M -s -c -d 
usermod  -l -g -G -aG -c -d -md  -s  -U -L
passwd  -S -d -e -x -n -w --stdin
chage   -d -W -m -M -E -I 

4.权力下放

Linux 中root用户拥有最高权限,直接使用root登录存在安全风险,权力下放 指通过sudo机制,给普通用户分配临时的管理员权限 ,让其执行特定命令,无需共享root密码。

(1)sudo 的核心配置文件:/etc/sudoers

该文件默认权限为440必须用visudo命令编辑 (避免语法错误导致 sudo 失效),visudo会自动检查语法。

配置文件基本格式

bash

运行

复制代码
用户 主机=(可切换的用户) 可执行的命令列表
  • 用户 :可以是普通用户名、用户组(前缀%)、ALL(所有用户)。
  • 主机ALL表示所有主机,指定主机名则仅在该主机生效。
  • 可切换的用户 :通常为rootALL表示可切换到任意用户。
  • 可执行的命令 :命令的绝对路径(which 命令查看),ALL表示所有命令,多个命令用逗号分隔。

常用配置示例

配置内容 作用
lee ALL=(root) ALL 允许用户lee在所有主机上,以 root 身份执行所有命令
lee ALL=(root) /usr/sbin/useradd,/usr/sbin/userdel 允许lee仅执行useradduserdel命令
%jishu ALL=(root) NOPASSWD: ALL 允许jishu组的所有用户,免密码以 root 身份执行所有命令(NOPASSWD跳过密码验证)

(2)sudo 的常用操作

功能 命令 说明
以 root 身份执行单个命令 sudo 命令 执行时需输入当前用户的密码(默认 5 分钟内无需重复验证)
切换到 root Shell sudo -i/sudo -s sudo -i加载 root 的环境变量,sudo -s保留当前用户环境
查看当前用户可执行的 sudo 命令 sudo -l 列出用户被授权的命令列表
免密码执行 sudo 命令 配置文件中加NOPASSWD: 适合自动化脚本、频繁执行的命令

(3)sudo 的优势

  1. 安全可控:细粒度分配权限,普通用户只能执行授权命令,避免误操作。
  2. 审计追溯 :所有 sudo 操作会记录到/var/log/secure/var/log/auth.log,便于审计。
  3. 无需共享 root 密码:普通用户用自己的密码即可获取临时权限,无需知道 root 密码。
bash 复制代码
/etc/sudoers        #不建议直接编写,因为没有语法检测
visudo
sudo  command

五.Linux系统中的权限管理

1.权限读取

元数据?

文件的元数据是描述文件属性的 "数据的数据",不包含文件的实际内容,用于系统识别和管理文件。

元数据包含的内容

  • 基本属性:文件类型、权限、硬链接数
  • 归属属性:所有者(UID)、所属组(GID)
  • 时间属性:最后访问时间(atime)、最后修改时间(mtime)、最后元数据修改时间(ctime)
  • 存储属性:文件大小、占用磁盘块数、inode 编号
  1. 文件类型与权限 :第一位是文件类型,后 9 位是普通权限(如 -rw-r--r--
    • 文件类型标识:
      • -:普通文件
      • d:目录
      • l:软链接文件
      • c:字符设备文件
      • b:块设备文件
  2. 硬链接数 :表示指向该文件 inode 的文件数量(示例中为 1
  3. 所有者 :文件的属主用户(示例中为 root
  4. 所属组 :文件的属组用户组(示例中为 root
  5. 时间与大小:文件大小、最后修改时间

(3)元数据的存储位置

元数据存储在文件系统的 inode(索引节点) 中,每个文件对应唯一的 inode。

  • inode 的作用:记录文件元数据、存储文件数据块的指针(指向文件实际内容的磁盘位置)
  • inode 与文件名的关系 :文件名存储在目录项中,目录项仅关联 "文件名" 和 "inode 编号",系统通过 inode 编号查找元数据和文件内容
  • 查看文件 inodels -i 文件名stat 文件名

(4)权限读取的核心命令

命令 作用 示例
ls -l 文件名 查看文件普通权限、归属、大小等 ls -l test.txt
ls -ld 目录名 查看目录本身的权限(而非目录内文件) ls -ld /home
stat 文件名 查看文件完整元数据(含 inode、时间属性) stat test.txt

文件属性种类?

通过 ls -l 命令查看文件详细属性

元数据被记录在磁盘的什么位置

2.更改文件所有人所有组

需以 root 权限执行(加 sudo),核心命令为 chown(改所有者)、chgrp(改所属组)。

(1)更改文件所有者(chown)

语法:

bash

运行

复制代码
# 仅改所有者
chown 新所有者 文件名/目录名

# 同时改所有者和所属组(格式:所有者:所属组)
chown 新所有者:新所属组 文件名/目录名

# 递归修改目录内所有文件的归属(-R 递归)
chown -R 新所有者:新所属组 目录名

示例:

bash

运行

复制代码
# 将test.txt的所有者改为lee
chown lee test.txt

# 将dir1及其子文件的所有者改为lee,所属组改为jishu
chown -R lee:jishu dir1

(2)更改文件所属组(chgrp)

语法:

bash

运行

复制代码
# 仅改所属组
chgrp 新所属组 文件名/目录名

# 递归修改目录内所有文件的所属组
chgrp -R 新所属组 目录名

示例:

bash

运行

复制代码
# 将test.txt的所属组改为caiwu
chgrp caiwu test.txt

# 递归修改dir1内所有文件的所属组为jishu
chgrp -R jishu dir1
bash 复制代码
chown
chgrp

3.文件普通权限

普通权限是文件最基础的权限,分为读、写、执行 三类,分别作用于所有者(u)、所属组(g)、其他用户(o) 三个身份。

(1)权限符号与数字对应关系

权限符号 权限含义 数字标识 对文件的作用 对目录的作用
r 读权限 4 可以查看文件内容(如 catless 可以列出目录内文件(如 ls
w 写权限 2 可以修改文件内容(如 vimecho 可以增删目录内文件(如 touchrm
x 执行权限 1 可以运行文件(如脚本、二进制程序) 可以进入目录(如 cd
- 无权限 0 无法操作文件 无法进入目录

(2)权限的两种表示方式

  1. 符号表示 :分 3 段,对应 ugo,如 rw-r--r-- 表示:
    • 所有者(u):读 + 写(rw-)
    • 所属组(g):只读(r--)
    • 其他用户(o):只读(r--)
  2. 数字表示 :3 位数字,每位是对应身份的权限数值之和,如 rw-r--r-- 对应 644
    • u:4+2=6
    • g:4=4
    • o:4=4

(3)修改普通权限的命令(chmod)

支持符号模式数字模式两种修改方式:

① 符号模式(灵活,适合修改部分权限)

语法:chmod [身份][操作][权限] 文件名

  • 身份:u(所有者)、g(所属组)、o(其他)、a(所有身份,默认)
  • 操作:+(添加权限)、-(移除权限)、=(设置权限)
  • 权限:rwx

示例:

bash

运行

复制代码
# 给test.txt的所有者添加执行权限
chmod u+x test.txt

# 移除其他用户对dir1的读权限
chmod o-r dir1

# 给所有身份设置读权限,移除写和执行权限
chmod a=r test.txt

② 数字模式(简洁,适合直接设置完整权限)

语法:chmod 数字权限 文件名示例:

bash

运行

复制代码
# 将test.txt权限设为rw-r--r--(644)
chmod 644 test.txt

# 将脚本file.sh设为所有者可执行(755:rwxr-xr-x)
chmod 755 file.sh

# 递归设置dir1内所有文件权限为644
chmod -R 644 dir1
bash 复制代码
文件权限的类型
    -        0
    r        4
    w        2
    x        1
chmod

4.默认权限

Linux 中新建文件 / 目录的默认权限,由 umask(权限掩码)决定,umask 表示从最大权限中减去的权限值

(1)最大默认权限基准

  • 普通文件 :最大默认权限为 666(无执行权限,避免新建文件直接可执行)
  • 目录 :最大默认权限为 777(目录需要执行权限才能进入)

(2)默认权限计算规则

  • 新建文件权限 = 666 - umask(结果若出现奇数,保留偶数,因为文件默认无执行权限)
  • 新建目录权限 = 777 - umask

(3)查看与修改 umask

  1. 查看 umask 值

    bash

    运行

    复制代码
    umask  # 显示数字模式(如0022)
    umask -S  # 显示符号模式(如u=rwx,g=rx,o=rx)
  2. 临时修改 umask(仅当前 Shell 生效)

    bash

    运行

    复制代码
    umask 002  # 设置umask为002
  3. 永久修改 umask

    • 对所有用户生效:编辑 /etc/profile/etc/bashrc
    • 对单个用户生效:编辑 ~/.bash_profile~/.bashrc
    • 添加一行 umask 002,重启 Shell 生效

(4)常见 umask 值与默认权限对应

umask 值 新建文件默认权限(666-umask) 新建目录默认权限(777-umask)
0022 644(rw-r--r--) 755(rwxr-xr-x)
0002 664(rw-rw-r--) 775(rwxrwxr-x)
0000 666(rw-rw-rw-) 777(rwxrwxrwx)
bash 复制代码
umask

5.特殊权限

特殊权限是普通权限的补充,共 3 种:SUIDSGIDSticky BIT,作用于特定场景。

(1)SUID(Set UID)

  • 标识 :符号表示为 s(替代所有者的执行权限位 x),数字标识为 4
  • 作用对象仅对可执行文件有效
  • 核心作用 :用户执行该文件时,临时获得文件所有者的权限
  • 典型示例/usr/bin/passwd 权限为 rwsr-xr-x(4755),普通用户执行 passwd 时,临时获得 root 权限,才能修改 /etc/shadow 文件

设置命令:

bash

运行

复制代码
# 符号模式:给file.sh添加SUID
chmod u+s file.sh

# 数字模式:4+普通权限(如4755)
chmod 4755 file.sh

(2)SGID(Set GID)

  • 标识 :符号表示为 s(替代所属组的执行权限位 x),数字标识为 2
  • 作用对象:可执行文件、目录
  • 核心作用
    • 对可执行文件:用户执行该文件时,临时获得文件所属组的权限
    • 对目录:目录内新建的文件 / 目录,自动继承该目录的所属组(用于团队共享目录)
  • 典型示例 :共享目录 /data/share 设置 SGID 后,所有用户在该目录下创建的文件,所属组都是共享组

设置命令:

bash

运行

复制代码
# 符号模式:给dir1添加SGID
chmod g+s dir1

# 数字模式:2+普通权限(如2755)
chmod 2755 dir1

(3)Sticky BIT(粘滞位)

  • 标识 :符号表示为 t(替代其他用户的执行权限位 x),数字标识为 1
  • 作用对象仅对目录有效
  • 核心作用 :目录内的文件,只有文件所有者、目录所有者、root 才能删除,其他用户即使有写权限也无法删除
  • 典型示例 :系统临时目录 /tmp 权限为 rwxrwxrwt(1777),所有用户可在其中创建文件,但只能删除自己的文件

设置命令:

bash

运行

复制代码
# 符号模式:给dir1添加粘滞位
chmod o+t dir1

# 数字模式:1+普通权限(如1777)
chmod 1777 dir1

(4)特殊权限的数字表示

将特殊权限的数字标识加在普通权限数字前,形成 4 位数字:

特殊权限 数字标识 示例权限(数字) 符号表示
SUID 4 4755 rwsr-xr-x
SGID 2 2755 rwxr-sr-x
Sticky BIT 1 1777 rwxrwxrwt
bash 复制代码
suid
sgid
stickybit     针对目录,当目录开启了此权限,在目录中文件只能被文件的所有人删除
[root@localhost ~]# mkdir  /mnt/pub
[root@localhost ~]# chmod  777 /mnt/pub/
[root@localhost ~]# watch ls -Rl /mnt/
​
[root@localhost mnt]# su - lee
[lee@localhost ~]$ touch  /mnt/pub/leefile
[lee@localhost ~]$
注销
[root@localhost mnt]# su - timinglee
[timinglee@localhost ~]$ touch  /mnt/pub/tfile
[timinglee@localhost ~]$ rm -fr /mnt/pub/tfile
[timinglee@localhost ~]$ rm -fr /mnt/pub/leefile
[timinglee@localhost ~]$ ^C
[timinglee@localhost ~]$
注销
[root@localhost mnt]#
[root@localhost mnt]# chmod  1777 /mnt/pub/
[root@localhost mnt]# touch  /mn^C
[root@localhost mnt]# su - timinglee
[timinglee@localhost ~]$ touch /mnt/pub/tfile
[timinglee@localhost ~]$
注销
[root@localhost mnt]# su - lee
[lee@localhost ~]$ rm -fr /mnt/pub/tfile
复制代码

6.权限列表acl

bash 复制代码
setfac -m -m d  -x  -b
getfac

7.attr

bash 复制代码
-i
[root@localhost mnt]# chattr +i /mnt/pub/
[root@localhost mnt]# touch /mnt/pub/file
touch: 正在设置 '/mnt/pub/file' 的时间: 没有那个文件或目录
​
-a
[root@localhost mnt]# chattr +a /mnt/pub/
[root@localhost mnt]# lsattr /mnt/pub/ -d
-----a---------------- /mnt/pub/
[root@localhost mnt]# touch /mnt/pub/file
[root@localhost mnt]# rm -fr /mnt/pub/file
rm: 无法删除 '/mnt/pub/file': 不允许的操作

六.进程管理

1.什么时进程什么是线程

1)进程(Process)

进程是操作系统进行资源分配和调度的基本单位,是一个正在运行的程序实例。

  • 核心特征:
    1. 每个进程拥有独立的地址空间、内存、文件描述符等系统资源,进程之间资源相互隔离,互不干扰。
    2. 进程是 "重量级" 的,创建、销毁、切换进程的开销较大(需要分配 / 释放大量资源)。
    3. 进程有自己独立的 PID(进程 ID),操作系统通过 PID 唯一标识进程。
  • 简单理解:一个运行中的QQ、一个正在执行的Shell脚本、一个nginx服务,都对应一个或多个进程,进程是程序运行的 "容器"。

(2)线程(Thread)

线程是进程内的执行单元,是操作系统进行调度的最小单位,也被称为 "轻量级进程"。

  • 核心特征:

    1. 线程隶属于进程,一个进程可以包含多个线程(至少有一个主线程),所有线程共享该进程的全部资源(地址空间、内存、文件描述符等)。
    2. 线程有自己独立的栈空间和线程 ID(TID),切换线程的开销远小于进程(无需分配 / 释放资源,仅切换执行上下文)。
    3. 线程之间通信更高效(直接共享进程资源,无需额外的跨进程通信机制),但也存在线程安全问题(多个线程同时操作共享资源可能导致数据混乱)。
  • 简单理解:一个QQ进程(主进程)中,"接收消息""发送消息""显示界面" 分别对应不同的线程,这些线程共享QQ的内存资源,协同完成QQ的全部功能。

  • 3)进程与线程的核心区别

    对比项 进程 线程
    资源分配单位 是(独立分配系统资源) 否(共享所属进程的资源)
    调度最小单位
    资源隔离性 高(进程间相互隔离) 低(线程间共享进程资源)
    创建 / 切换开销
    标识 ID PID(进程 ID) TID(线程 ID)

2.进程状态

Linux 中进程运行时会处于不同的状态,通过pstop等命令可查看,核心状态分为以下几种(以ps命令显示的状态标识为准):

状态标识 状态名称 核心说明
R(Running) 运行态 / 就绪态 要么正在 CPU 上执行,要么处于就绪队列等待被 CPU 调度执行(Linux 中R包含就绪态)
S(Sleeping) 可中断睡眠态(浅睡眠) 进程等待某个事件完成(如 I/O 操作、信号),可被信号唤醒(如Ctrl+C
D(Disk Sleep) 不可中断睡眠态(深睡眠) 进程正在进行磁盘 I/O 操作,无法被信号唤醒,只能等待 I/O 完成,避免数据丢失
T(Stopped) 停止态 进程被暂停执行,可通过信号恢复运行(如Ctrl+Z暂停进程,fg命令恢复)
Z(Zombie) 僵尸态 进程已经执行完毕,释放了大部分资源,但进程描述符仍保留在系统中,等待父进程回收其 PID 和状态信息,若父进程未回收,会形成 "僵尸进程"
X(Dead) 死亡态 进程已完全终止,资源被全部回收,该状态仅为过渡状态,无法通过命令捕获

补充说明:

  • 常见状态为RSTD态较少见(仅磁盘 I/O 密集型进程可能出现)。
  • 僵尸进程(Z)会占用系统 PID 资源,大量僵尸进程可能导致系统无法创建新进程,需通过重启父进程或杀死父进程(由init进程接管回收)解决。

3.进程查看命令

(1)ps:静态查看进程(快照式,仅显示当前时刻进程状态)

最常用的进程查看命令,支持多种参数组合,核心用法:

  1. 基础查看:ps aux(BSD 风格,显示所有用户的所有进程,最常用)

    bash

    运行

    复制代码
    ps aux

    输出字段说明:

    • USER:进程所属用户
    • PID:进程 ID
    • %CPU:进程占用 CPU 百分比
    • %MEM:进程占用内存百分比
    • COMMAND:启动进程的命令
  2. 树形查看:ps -efH(System V 风格,显示进程父子关系,树形结构)

    bash

    运行

    复制代码
    ps -efH
  3. 过滤指定进程:结合管道grep

    bash

    运行

    复制代码
    # 查看nginx相关进程
    ps aux | grep nginx

(2)top:动态查看进程(实时刷新,默认每 3 秒刷新一次)

交互式进程监控工具,可实时查看进程资源占用情况,核心用法:

  1. 启动top

    bash

    运行

    复制代码
    top
  2. 核心交互操作(启动后输入):

    • P:按 CPU 占用率从高到低排序
    • M:按内存占用率从高到低排序
    • p:输入 PID,查看指定进程详情
    • k:输入 PID,终止指定进程
    • q:退出top
  3. 补充:htoptop的增强版,界面更友好,需额外安装)

(3)pstree:树形查看进程关系

清晰展示进程的父子继承关系,简化版ps -efH

bash

运行

复制代码
# 基础树形展示
pstree

# 显示PID和用户名
pstree -up

(4)pgrep:快速查找进程 PID

直接返回指定进程的 PID,无需管道过滤:

bash

运行

复制代码
# 查找nginx进程的PID
pgrep nginx
bash 复制代码
ps
pidof
[root@localhost mnt]# vim &
[1] 27942
[root@localhost mnt]# pidof  vim
27942
​
[1]+  已停止               vim
​
pgrep
root@localhost mnt]# su - lee
[lee@localhost ~]$ vim &
[1] 28012
[lee@localhost ~]$ vim &
[2] 28013
​
[1]+  已停止               vim
[lee@localhost ~]$ vim ^
​
[2]+  已停止               vim
[lee@localhost ~]$ vim &
[3] 28015
​
[root@localhost ~]# pgrep  -lu lee
27979 bash
28012 vim
28013 vim
28015 vim
​
top

4.进程前后台调用

在 Linux 终端中,进程默认在前台 运行(占用终端,无法执行其他命令),可通过命令将进程切换到后台运行(释放终端,不影响后续操作),核心命令和操作如下:

(1)前台启动进程(默认)

直接执行命令,进程在前台运行,终端被占用,例如:

bash

运行

复制代码
# 前台运行脚本,终端无法输入其他命令,直到脚本执行完毕
./test.sh

(2)后台启动进程(直接后台运行,不占用终端)

命令末尾加&,进程后台运行,终端立即释放,同时返回进程 PID 和后台作业号:

bash

运行

复制代码
# 后台运行test.sh脚本,终端可继续执行其他命令
./test.sh &

# 输出示例:[1] 12345([1]是后台作业号,12345是PID)

(3)前台进程切换到后台(暂停后转入后台)

  1. 先按Ctrl+Z:暂停当前前台进程(进程进入T停止态),终端释放。

  2. 执行bg命令:将暂停的进程转入后台运行(可选指定作业号,bg %作业号):

    bash

    运行

    复制代码
    # 将最近一个暂停的进程转入后台
    bg
    
    # 将作业号为1的进程转入后台
    bg %1

(4)后台进程切换到前台

执行fg命令:将后台运行的进程转回前台(可选指定作业号,fg %作业号):

bash

运行

复制代码
# 将最近一个后台进程转回前台
fg

# 将作业号为1的后台进程转回前台
fg %1

(5)查看后台作业列表

执行jobs命令:查看当前终端的所有后台作业(作业号、状态、命令):

bash

运行

复制代码
jobs

(6)终止后台进程

  1. 先通过jobs获取作业号,再执行kill %作业号

    bash

    运行

    复制代码
    # 终止作业号为1的后台进程
    kill %1
  2. 直接通过kill PIDpgrep获取 PID):

    bash

    运行

    复制代码
    # 终止PID为12345的进程
    kill 12345
bash 复制代码
[root@localhost mnt]# ping www.baidu.com
PING www.a.shifen.com (183.2.172.177) 56(84) 比特的数据。
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=1 ttl=128 时间=45.9 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=2 ttl=128 时间=53.5 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=3 ttl=128 时间=48.6 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=4 ttl=128 时间=51.4 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=5 ttl=128 时间=48.9 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=6 ttl=128 时间=41.6 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=7 ttl=128 时间=44.7 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=8 ttl=128 时间=46.6 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=9 ttl=128 时间=44.7 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=10 ttl=128 时间=46.2 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=11 ttl=128 时间=46.8 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=12 ttl=128 时间=43.8 毫秒
^Z  #ctrl+z 标识把占用终端的进程打入后台停止
[1]+  已停止               ping www.baidu.com
[root@localhost mnt]# ps
    PID TTY          TIME CMD
   1732 pts/0    00:00:00 bash
  28027 pts/0    00:00:00 ping
  28028 pts/0    00:00:00 ps
[root@localhost mnt]# jobs
[1]+  已停止               ping www.baidu.com
root@localhost mnt]# jobs
[1]+  已停止               ping www.baidu.com
[root@localhost mnt]# fg 1
ping www.baidu.com
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=13 ttl=128 时间=45.2 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=14 ttl=128 时间=48.1 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=15 ttl=128 时间=61.4 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=16 ttl=128 时间=41.8 毫秒
^Z
[1]+  已停止               ping www.baidu.com
ost mnt]#
[root@localhost mnt]# bg 1
[1]+ ping www.baidu.com &
[root@localhost mnt]# 64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=17 ttl=128 时间=38.6 毫秒
64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=18 ttl=128 时间=38.2 毫秒
​
[root@localhost mnt]# 64 比特,来自 183.2.172.177 (183.2.172.177): icmp_seq=19 ttl=128 时间=37.3 毫秒
​
[root@localhost mnt]#
[root@localhost mnt]#
[root@localhost mnt]#
[root@localhost mnt]#
[root@localhost mnt]#
​
[root@localhost mnt]# vim &

5.进程优先级

Linux 中 CPU 会优先调度优先级高的进程,进程优先级通过NI(Nice 值)PR(优先级值) 控制,核心规则和操作如下:

(1)核心概念

  1. Nice 值(NI) :用户可调整的优先级值,范围为-20 ~ 19(共 40 个级别)。
    • Nice 值越小,进程优先级越高(-20为最高优先级,仅root可设置)。
    • Nice 值越大,进程优先级越低(19为最低优先级)。
    • 默认新建进程的 Nice 值为0
  2. PR 值(优先级值) :CPU 调度器实际使用的优先级值,由系统根据 Nice 值计算得出(PR = 20 + NI),用户无法直接修改,只能通过调整 Nice 值间接影响。

(2)查看进程优先级

  1. top命令:输出中NI列(Nice 值)、PR列(优先级值)。

  2. ps命令:结合-l参数查看

    bash

    运行

    复制代码
    ps -l 进程PID

(3)调整进程优先级

① 新建进程时指定 Nice 值(nice命令)

语法:nice -n Nice值 命令

bash

运行

复制代码
# 新建test.sh进程,指定Nice值为5(优先级低于默认)
nice -n 5 ./test.sh

# 新建nginx进程,指定Nice值为-10(优先级高于默认,需root权限)
sudo nice -n -10 nginx

② 修改已运行进程的 Nice 值(renice命令)

语法:renice -n 新Nice值 进程PID

bash

运行

复制代码
# 修改PID为12345的进程,Nice值改为8(需root权限修改为负值)
renice -n 8 12345

# 批量修改某个用户的所有进程Nice值
renice -n 10 -u lee

注意:普通用户只能将 Nice 值调大(降低优先级,从0调到19),只有root用户可以将 Nice 值调小(提高优先级,从0调到-20)。

6.进程信号

进程信号是 Linux 系统与进程之间通信的一种方式,用于通知进程执行特定操作(如终止、暂停、重启),每个信号对应一个数字标识和一个名称,核心信号和操作如下:

(1)常见核心信号

信号数字 信号名称 核心作用 是否可捕获 / 忽略
1 SIGHUP 挂起信号,通常用于重启进程(如配置文件修改后重启服务) 可捕获
2 SIGINT 中断信号,对应终端Ctrl+C,用于终止前台进程 可捕获
3 SIGQUIT 退出信号,对应终端Ctrl+\,终止进程并生成核心转储文件 可捕获
9 SIGKILL 强制终止信号,无法被进程捕获、忽略,强制杀死进程(用于终止无响应进程) 不可捕获
15 SIGTERM 正常终止信号,默认kill命令发送该信号,进程可清理资源后退出 可捕获
17 SIGSTOP 暂停信号,对应Ctrl+Z,暂停进程执行 不可捕获
18 SIGCONT 继续信号,恢复被暂停的进程执行 可捕获

(2)发送信号的核心命令(kill/killall

kill:给指定 PID 的进程发送信号

语法:kill [信号数字/名称] 进程PID

bash

运行

复制代码
# 默认发送SIGTERM(15)信号,正常终止PID为12345的进程
kill 12345

# 发送SIGKILL(9)信号,强制终止PID为12345的进程(无响应进程优先使用)
kill -9 12345

# 发送SIGHUP(1)信号,重启nginx进程(PID为12345)
kill -1 12345

killall:给指定名称的所有进程发送信号(无需 PID)

语法:killall [信号数字/名称] 进程名称

bash

运行

复制代码
# 终止所有nginx进程
killall nginx

# 强制终止所有test.sh进程
killall -9 test.sh

7.守护进程

(1)核心定义

守护进程(Daemon Process)是在 Linux 后台长期运行的、脱离终端的特殊进程,通常在系统启动时自动启动,系统关闭时才终止,用于提供持续的系统服务。

(2)核心特征

  1. 脱离终端:守护进程不与任何终端关联,即使启动它的终端关闭,守护进程仍继续运行(不会被终端信号影响)。
  2. 后台运行 :始终处于后台(状态多为S可中断睡眠态,等待客户端请求)。
  3. root或专用用户运行 :通常拥有较高权限(如root),或为了安全,以专用系统用户运行(如nginxmysql用户)。
  4. 进程名末尾通常带d :约定俗成的命名方式,用于区分普通进程(如sshdnginxmysqldcrond)。

(3)常见示例

  • 系统服务:sshd(SSH 远程连接服务)、crond(定时任务服务)、systemd(系统初始化守护进程,PID=1)。
  • 应用服务:mysqld(MySQL 数据库服务)、nginx(Web 服务)、redis-server(Redis 缓存服务)。

(4)守护进程的管理(systemctl命令,systemd系统)

现代 Linux 系统(CentOS 7+、Ubuntu 16.04+)通过systemd管理守护进程,核心命令:

  1. 启动守护进程(服务): bash

    运行

    复制代码
    sudo systemctl start nginx
  2. 停止守护进程: bash

    运行

    复制代码
    sudo systemctl stop nginx
  3. 重启守护进程: bash

    运行

    复制代码
    sudo systemctl restart nginx
  4. 设置开机自启(系统启动时自动运行守护进程): bash

    运行

    复制代码
    sudo systemctl enable nginx
  5. 查看守护进程状态: bash

    运行

    复制代码
    sudo systemctl status nginx

(5)补充说明

  • 守护进程的核心价值是提供 "持续可用" 的服务,无需人工干预,是 Linux 系统稳定运行的基础。
  • 传统 Linux 系统(CentOS 6 及以下)通过servicechkconfig命令管理守护进程,现已被systemctl替代。

总结

  1. 进程是资源分配单位(重量级),线程是调度执行单位(轻量级),线程共享进程资源。
  2. 进程核心状态有R(运行)、S(睡眠)、T(停止)、Z(僵尸),可通过ps/top查看。
  3. 进程前后台切换依赖&bgfgjobs命令,灵活释放终端资源。
  4. 进程优先级通过 Nice 值调整(-20最高,19最低),nice/renice实现优先级配置。
  5. 进程信号用于控制进程行为,kill -9是强制终止无响应进程的终极手段。
  6. 守护进程是后台长期运行的服务进程,通过systemctl管理,保障系统持续提供服务。
bash 复制代码
systemctl

七. Linux下的软件管理

1.软件的类型

复制代码
压缩包(绿色安装包、源码编译)
DEB(类DEBIN)
RPM(类RHEL)

2.RPM命令的用法

3.利用镜像搭建本地软件仓库

bash 复制代码
[root@localhost ~]# mkdir  /rhel9               #挂载光驱读取镜像内容
[root@localhost ~]# mount /dev/cdrom   /rhel9/  #手动挂载光驱
[root@localhost ~]# vim /etc/rc.d/rc.local      #开启自动运行mount动作实现自动挂载
mount /dev/cdrom   /rhel9/
​
    
[root@localhost ~]# chmod +x /etc/rc.d/rc.local
​
​
#设定软件仓库指向
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# vim rhel.repo
[AppStream]
name = AppStream
baseurl = file:///rhel9/AppStream
gpgcheck = 0
​
[BaseOS]
name = BaseOS
baseurl = file:///rhel9/BaseOS
gpgcheck = 0
​
#检测软件仓库是否可用
[root@localhost yum.repos.d]# dnf list httpd
正在更新 Subscription Management 软件仓库。
无法读取客户身份
​
本系统尚未在权利服务器中注册。可使用 "rhc" 或 "subscription-manager" 进行注册。
​
AppStream                                                             82 MB/s | 7.7 MB     00:00
BaseOS                                                               155 MB/s | 2.1 MB     00:00
可安装的软件包
httpd.x86_64                                  2.4.62-4.el9                                  AppStream

4.dnf软件管理命令

5.网络软件仓库的使用

bash 复制代码
#比如加载docker容器的网络repo源:
https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/



[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
redhat.repo  rhel.repo

[root@localhost yum.repos.d]# vim docker.repo
[docker]
name  = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0


#测试
[root@localhost yum.repos.d]# dnf search  docker
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 "rhc" 或 "subscription-manager" 进行注册。

docker                                                                48 kB/s |  42 kB     00:00
===================================== 名称 和 概况 匹配:docker =====================================
docker-buildx-plugin.x86_64 : Docker Buildx plugin for the Docker CLI
docker-ce-rootless-extras.x86_64 : Rootless support for Docker
docker-compose-plugin.x86_64 : Docker Compose plugin for the Docker CLI
docker-model-plugin.x86_64 : Docker Model Runner plugin for the Docker CLI
pcp-pmda-docker.x86_64 : Performance Co-Pilot (PCP) metrics from the Docker daemon
podman-docker.noarch : Emulate Docker CLI using podman
========================================= 名称 匹配:docker =========================================
docker-ce.x86_64 : The open-source application container engine
docker-ce-cli.x86_64 : The open-source application container engine

6.epel源的使用

bash 复制代码
#epel源的地址:
https://mirrors.aliyun.com/epel-archive/9.6-2025-11-11/Everything/x86_64/
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# vim epel.repo
[epel]
name = epel
baseurl = https://mirrors.aliyun.com/epel-archive/9.6-2025-11-11/Everything/x86_64/
gpgcheck = 0

#测试:
[root@localhost ~]# dnf search  ansible
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 "rhc" 或 "subscription-manager" 进行注册。

epel                                                                  13 MB/s |  20 MB     00:01
上次元数据过期检查:0:00:11 前,执行于 2026年01月14日 星期三 15时46分05秒。
==================================== 名称 和 概况 匹配:ansible =====================================
ansible.noarch : Curated set of Ansible collections included in addition to ansible-core

7.自建软件仓库的方法

bash 复制代码
#为了把网络软件仓库中的软件下载下来后分享给本地主机,或者直接把网上下载下来的rpm加入到软件仓库中
[root@localhost ~]# dnf install httpd -y		#通过http共享自建软件仓库
[root@localhost ~]# systemctl enable --now httpd
[root@localhost ~]# mkdir  /var/www/html/software		#建立共享目录
[root@localhost ~]# dnf install docker-ce --downloadonly  --destdir /mnt/
[root@localhost mnt]# mv /mnt/* /var/www/html/software/		#将下载下来的软件存放到共享目录
[root@localhost software]# dnf install createrepo -y    #此软件用来扫描rpm软件包信息并记录生成
													    #软件包信息库
[root@localhost ~]# ls /var/www/html/software/
containerd.io-2.2.1-1.el9.x86_64.rpm          docker-ce-cli-29.1.4-1.el9.x86_64.rpm
docker-buildx-plugin-0.30.1-1.el9.x86_64.rpm  docker-ce-rootless-extras-29.1.4-1.el9.x86_64.rpm
docker-ce-29.1.4-1.el9.x86_64.rpm             docker-compose-plugin-5.0.1-1.el9.x86_64.rpm

[root@localhost ~]# createrepo -v /var/www/html/software/		#采集软件包信息
														#注意在目录中不能有不是rpm类的文件

#测试:
[root@localhost dnf]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
docker.repo  epel.repo  redhat.repo  rhel.repo
[root@localhost yum.repos.d]# vim software.repo
[software]
name = software
baseurl = http://172.25.254.129/software/
gpgcheck = 0

[root@localhost yum.repos.d]# dnf info docker-ce.x86_64
名称         : docker-ce
时期         : 3
版本         : 29.1.4
发布         : 1.el9
架构         : x86_64
大小         : 22 M
源           : docker-ce-29.1.4-1.el9.src.rpm
仓库         : software      #软件仓库信息
概况         : The open-source application container engine
URL          : https://www.docker.com
协议         : Apache-2.0
描述         : Docker is a product for you to build, ship and run any application as a
             : lightweight container.
             :
             : Docker containers are both hardware-agnostic and platform-agnostic. This means
             : they can run anywhere, from your laptop to the largest cloud compute instance
             : and everything in between - and they don't require you to use a particular
             : language, framework or packaging system. That makes them great building blocks
             : for deploying and scaling web apps, databases, and backend services without
             : depending on a particular stack or provider.

八.Linux下的网络管理

1.网络ip通信原理

IP(互联网协议)是TCP/IP 协议簇的核心 ,作用是给网络中的每一台设备(计算机、手机、虚拟机等)分配唯一的逻辑地址(IP 地址) ,实现不同设备之间的跨网络数据传输 ,核心是寻址 + 路由转发,简单理解为 "网络世界的门牌号 + 快递配送规则"。

核心通信流程(以 A 设备访问 B 设备为例)

  1. 寻址判断 :A 设备先判断 B 设备的 IP 是否和自己在同一网段(通过子网掩码计算);
  2. 同网段通信:若在同一网段,通过 ARP 协议解析出 B 设备的物理地址(MAC 地址),直接通过局域网传输数据;
  3. 跨网段通信 :若不在同一网段,A 设备会将数据发送给本网段网关,由网关通过路由器的路由表,将数据转发到下一个网段,直到送达 B 设备的网关,最后由 B 的网关将数据传给 B 设备;
  4. 数据封装 / 解封装 :整个过程中,IP 协议会给数据加上IP 头(包含源 IP、目的 IP),到达目标后再解封装,保证数据精准投递。

关键补充

  • IP 地址分为IPv4 (32 位,如 192.168.1.100,目前主流)和IPv6(128 位,解决 IPv4 地址枯竭);
  • 通信的核心是源 IP 不可变,路由转发靠目的 IP,MAC 地址仅在局域网内有效,跨网段会被网关替换。

2.网络ip的配置方法

P 配置分为静态 IP动态 IP(DHCP) 两种,动态 IP 由路由器 / DHCP 服务器自动分配,适合普通家用 / 办公;静态 IP 需手动设置,适合服务器、虚拟机、网关等需要固定地址的设备,以下讲解WindowsLinux两大系统的实操配置,同时包含 VMware 虚拟机(桥接 / NAT 模式)核心配置逻辑。

bash 复制代码
[root@localhost ]# ls /sys/class/net/   | grep eth1     #判定网卡是否存在
[root@localhost ~]# nmcli connection show				#拍档网卡是否被使用
NAME  UUID                                  TYPE      DEVICE
eth0  7ba00b1d-8cdd-30da-91ad-bb83ed4f7474  ethernet  eth0
lo    a2a842f6-cc9c-445d-945e-6c969a2707f4  loopback  lo


#如果要配置的网卡已经被使用了。那么修改配置文件后一定要刷新网络并重启连接
[root@localhost ~]# nmcli connection modify eth0  ipv4.addresses 172.25.254.100/24  
[root@localhost ~]# nmcli connection  reload
[root@localhost ~]# nmcli connection up eth0

#如果没有被系统使用那么直接可以设定或者编辑配置文件激活
[root@localhost ~]# cd /etc/NetworkManager/system-connections/
[root@localhost system-connections]# vim eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
method=manual
address1=172.25.254.100/24
gateway=172.25.254.2
dns=114.114.114.114;

[root@localhost system-connections]# chmod  600 eth1.nmconnection

#检测
[root@localhost system-connections]# ip a s eth1			#查看ip
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:67:23:80 brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    altname ens224
    inet 172.25.254.100/24 brd 172.25.254.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::b7e8:d88a:6485:552a/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

[root@localhost system-connections]# route  -n			#网关
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.25.254.2    0.0.0.0         UG    100    0        0 eth0
0.0.0.0         172.25.254.2    0.0.0.0         UG    101    0        0 eth1
172.25.254.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
172.25.254.0    0.0.0.0         255.255.255.0   U     101    0        0 eth1

[root@localhost system-connections]# cat /etc/resolv.conf		#查看dns
# Generated by NetworkManager
search localdomain
nameserver 172.25.254.2
nameserver 114.114.114.114

3.网关的作用及配置方式

网关的核心作用

网关(Gateway)是不同网段之间的 "中转站 / 出入口",本质是一台具备路由功能的设备(路由器、交换机、服务器),拥有两个及以上不同网段的 IP 地址,核心作用有 3 个:

  1. 跨网段转发数据:是本地设备访问其他网段 / 外网的唯一通道,本地设备无法直接跨网段通信,必须通过网关转发;
  2. 地址转换(NAT):家用路由器的网关会将内网私有 IP(如 192.168.1.xxx)转换为外网公有 IP,实现内网设备访问互联网(核心作用,解决公有 IP 枯竭);
  3. 网络隔离与安全:网关可设置防火墙、访问规则,限制内网和外网的互访,提升网络安全性。

关键补充

  • 默认网关:本地设备配置的 "首选网关",当设备需要跨网段通信时,会默认将数据发送到该网关,是最常用的网关配置;
  • 内网私有 IP 段(无需公有 IP,全网通用):
    • A 类:10.0.0.0 ~ 10.255.255.255
    • B 类:172.16.0.0 ~ 172.31.255.255
    • C 类:192.168.0.0 ~ 192.168.255.255外网无法直接访问私有 IP,需网关做 NAT 转换。
  1. 网关的配置方式

网关配置分为设备端配置 (给电脑 / 虚拟机配置默认网关,指向路由设备)和路由端配置 (路由器 / 网关设备自身的网关设置,对接上层网络),以下讲解常用的设备端默认网关配置(Windows/Linux),以及路由器网关的基础配置。

方式 1:设备端默认网关配置(和 IP 配置同步,最常用)

  • Windows :在静态 / 动态 IP 配置界面,"默认网关" 栏填写网关 IP(如 192.168.1.1),动态 DHCP 会自动获取网关,无需手动填;
  • Linux(CentOS) :在网卡配置文件中,通过GATEWAY=192.168.1.1指定网关,和静态 IP 一起配置;
  • Linux(Ubuntu) :在 netplan 配置文件中,通过gateway4=192.168.1.1指定网关;
  • 验证 :Windows 通过cmd→tracert 8.8.8.8,Linux 通过traceroute 8.8.8.8,第一跳即为配置的网关 IP,说明配置生效。

方式 2:路由器 / 网关设备自身的网关配置(上层网关,对接外网)

  1. 打开浏览器,输入路由器的管理 IP(如 192.168.1.1,默认在路由器背面),输入管理员账号密码;

  2. 进入上网设置 / WAN 口设置,若为宽带拨号(PPPoE),输入宽带账号密码,路由器会自动获取运营商的上层网关;

  3. 若为静态 IP 上网(运营商分配固定公网 IP),手动填写运营商提供的公网 IP、子网掩码、上层网关、DNS,保存后即可;

  4. 路由器的 LAN 口网关(如 192.168.1.1)就是内网设备的默认网关,可在LAN 口设置中修改(如改为 192.168.0.1)。

  5. 常见问题

若设备配置网关后无法访问外网,大概率是网关 IP 填写错误 (需和设备 IP 同一网段)或网关设备(路由器)未正常联网

4.dns的作用及配置方式

DNS(域名系统,Domain Name System)是 **"域名和 IP 地址的翻译器",解决了 "人类记不住复杂 IP,电脑只识别 IP" 的问题,核心作用是将 域名(如www.baidu.com)解析为对应的 IP 地址(如 180.101.50.188)**,让设备能通过 IP 访问互联网服务。

  1. DNS 的核心作用

  2. 域名解析:正向解析(域名→IP)是最常用的,反向解析(IP→域名)主要用于服务器验证(如邮件服务器);

  3. 解析缓存:DNS 服务器会缓存解析结果,减少重复解析,提升访问速度;

  4. 负载均衡:大型网站的 DNS 服务器会将域名解析为多个不同的服务器 IP,实现流量分摊,保证网站访问稳定;

  5. 域名管理:通过 DNS 服务器实现域名的解析指向修改,如将域名解析到新的服务器 IP。

关键补充

  • DNS 解析是分层的:根 DNS 服务器→顶级 DNS 服务器(如.com/.cn)→权威 DNS 服务器(网站专属),本地设备会先查询本地 DNS 缓存,再查询配置的 DNS 服务器;
  • 本地 DNS 缓存:Windows/Linux 都会缓存近期的解析结果,若域名解析异常,可清空缓存解决。
  1. DNS 的配置方式

DNS 配置和 IP 配置联动,分为自动获取(由 DHCP 服务器 / 路由器分配)手动配置(自定义公共 DNS / 私有 DNS),支持 Windows/Linux/ 路由器多端配置,以下讲解实操步骤,同时包含缓存清空方法。

bash 复制代码
[root@node10 ~]# vim /bin/vmset.sh
#!/bin/bash
[ "$#" -lt "3" ] && {
  echo "error!!"
  exit
}
CONNECTION=`nmcli connection show | awk "/$1/"'{print $1}'|grep $1`
[ "$?" -ne "0" ] && {
  echo "$1" is in used !!
  nmcli connection delete  $CONNECTION
}
[ "$4" = "noroute" ] && {
cat >>  /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1


[ipv4]
method=manual
address1=$2/24
EOF
}||{
cat >>  /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1


[ipv4]
method=manual
address1=$2/24,172.25.254.2
dns=8.8.8.8;
EOF
}

chmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1
hostnamectl hostname $3

cat > /etc/hosts<< EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
$2     $3
EOF

ip a s $1
hostname

[root@node10 ~]# chmod  +x /bin/vmset.sh

九.Linux下的本地存储管理

以下内容围绕磁盘分区表、分区命令、文件系统、RAID、LVM、find 命令、软硬连接 七大核心点讲解,以 RHEL/CentOS/Ubuntu 等主流 Linux 发行版为基准,兼顾原理理解实操命令,适配运维日常操作和学习备考,逻辑从磁盘底层到上层应用逐步推进。

1.磁盘分区表原理

磁盘分区表是硬盘的 "分区目录" ,存储在硬盘的主引导记录(MBR)GUID 分区表(GPT) 区域,作用是告诉操作系统硬盘被划分成了几个分区、每个分区的起始 / 结束扇区、文件系统类型、活动分区等信息,操作系统通过分区表识别和管理磁盘分区。硬盘的第一个扇区(0 扇区)是核心,包含主引导程序(446 字节)+ 分区表(64 字节)+ 结束标志(2 字节) ,分区表的格式决定了分区的数量、大小限制,主流分为MBRGPT两种,是所有磁盘操作的底层基础。

主流分区表类型对比(MBR vs GPT)

特性 MBR 分区表 GPT 分区表
支持磁盘大小 最大 2TB 无限制(支持 18EB 以上)
支持分区数量 最多 4 个主分区 / 3 主 + 1 扩展(扩展分区可分多个逻辑分区) 最多 128 个主分区(无需扩展 / 逻辑分区)
分区表存储 仅存于 0 扇区,无备份 存于多个扇区,有备份,容错性高
启动模式 BIOS 启动 UEFI 启动(兼容 BIOS)
分区标识 分区类型 ID(如 83=ext4、82=swap) GUID 唯一标识,更规范

核心补充

  1. 主分区 / 扩展分区 / 逻辑分区(仅 MBR):主分区可直接格式化使用,扩展分区仅作为 "容器" 存放逻辑分区,本身不可用;逻辑分区是扩展分区内的实际可用分区,解决 MBR 主分区数量限制。
  2. 分区编号 :Linux 中磁盘设备名如/dev/sda(第一块 SATA 硬盘),主分区编号为 1-4(如sda1/sda2),逻辑分区从 5 开始(如sda5/sda6),GPT 分区无此编号限制。
  3. 分区表损坏:MBR 分区表损坏会导致硬盘分区无法识别,GPT 因有备份分区表,可通过备份恢复,安全性更高。

2.磁盘分区命令

Linux 中常用的磁盘分区命令有fdiskgdiskparted ,其中fdisk仅支持 MBR 分区表,gdisk专为 GPT 分区表设计,parted支持 MBR/GPT 且可在线调整分区(无需重启),实操中按分区表类型选择即可。

前置准备:查看磁盘设备

先通过以下命令确认磁盘名称和现有分区,避免误操作:

bash

运行

复制代码
lsblk  # 简洁查看磁盘/分区/挂载信息
fdisk -l  # 详细查看磁盘分区表、扇区大小等

示例:fdisk -l /dev/sdb 仅查看第二块硬盘的信息。

  1. fdisk(MBR 分区专用,最常用)

适用于 2TB 以下磁盘,交互式分区命令,核心步骤为进入分区→创建分区→保存分区表→刷新分区表

核心实操步骤(以/dev/sdb为例)

bash

运行

复制代码
fdisk /dev/sdb  # 进入sdb磁盘的分区界面,输入m查看帮助
# 交互指令(核心)
n  # 新建分区(主分区p/扩展分区e)
p  # 查看现有分区表
d  # 删除分区(输入分区编号即可)
t  # 修改分区类型ID(如83=ext4、82=swap、8e=LVM)
a  # 设置活动分区(仅MBR,BIOS启动用)
w  # 保存分区表并退出(生效)
q  # 放弃修改并退出

关键:刷新分区表(让系统识别新分区)

分区保存后,需刷新内核分区表缓存,否则系统无法识别:

bash

运行

复制代码
partprobe /dev/sdb  # 推荐,无需重启
# 若partprobe无效,执行以下命令
echo "- - -" > /sys/class/scsi_host/host0/scan  # 扫描SCSI总线,host0可替换为host1/host2
  1. gdisk(GPT 分区专用)

适用于 2TB 以上磁盘,交互逻辑和fdisk一致,仅指令和分区类型标识不同,核心步骤:

bash

运行

复制代码
gdisk /dev/sdb  # 进入GPT分区界面,输入?查看帮助
n  # 新建分区(直接创建主分区,无需扩展)
p  # 查看分区表
d  # 删除分区
t  # 修改分区类型(如8300=ext4、8200=swap、8e00=LVM)
w  # 保存(需输入Y确认)
q  # 退出

刷新分区表 :同 fdisk,使用partprobe /dev/sdb

  1. parted(MBR/GPT 通用,支持在线调整)

非交互式 + 交互式均可,支持 2TB 以上磁盘,可在线修改分区大小(无需卸载),适合批量脚本和动态调整,核心分为交互模式命令行模式

示例 1:交互模式(GPT 分区,/dev/sdb)

bash

运行

复制代码
parted /dev/sdb  # 进入交互界面
mklabel gpt      # 设置分区表为GPT(mklabel msdos为MBR)
mkpart primary 0% 50%  # 新建主分区,占磁盘0-50%
mkpart primary 50% 100% # 新建第二个主分区,占50-100%
print            # 查看分区表
rm 1             # 删除编号为1的分区
quit             # 退出

示例 2:命令行模式(直接执行,无需交互)

bash

运行

复制代码
parted -s /dev/sdb mklabel gpt mkpart primary 0% 200G  # 非交互创建200G GPT主分区

分区后验证

bash

运行

复制代码
lsblk /dev/sdb  # 查看新分区是否生成(如sdb1、sdb2)

3.文件系统的作用及制作方式

  1. 文件系统的核心作用

文件系统是操作系统对磁盘分区的 "管理规则" ,建立了文件和磁盘扇区之间的映射关系,解决了如何在磁盘上存储、读取、删除文件,如何管理文件属性(权限、所有者、修改时间),如何分配磁盘空间 等问题。如果说分区表是 "硬盘分块",那文件系统就是给每个分块制定 **"文件存储规则",无文件系统的分区是裸分区 **,操作系统无法识别和使用。

核心功能

  1. 管理文件的存储位置 :通过inode(索引节点) 记录文件的存储扇区、大小、权限等,文件名仅存于目录项,和 inode 关联;
  2. 管理磁盘空间:通过块(block) 分配磁盘空间(默认 4KB,可自定义),避免磁盘碎片;
  3. 提供文件操作接口:让用户通过cp/rm/mv等命令操作文件,无需直接操作扇区;
  4. 记录文件元数据:所有者、所属组、权限(rwx)、访问 / 修改 / 改变时间等。

Linux 主流文件系统

文件系统 适用场景 特点
ext4 系统盘、数据盘(最常用) 兼容 ext3,支持大文件(16TB),日志型,稳定性高
xfs 大存储、高 IO 场景(RHEL7 + 默认) 支持 EB 级文件,读写速度快,日志型,适合 RAID/LVM
swap 交换分区 虚拟内存,当物理内存不足时使用
vfat Linux/Windows 双系统共享 兼容 Windows,无权限管理
btrfs 高性能、容错场景 支持快照、RAID、动态扩容,新一代文件系统
  1. 文件系统的制作方式(格式化)

制作文件系统即格式化分区 ,通过mkfs系列命令实现,核心是给裸分区写入对应的文件系统规则,格式化后才可挂载使用。注意:格式化会清除分区所有数据,操作前务必确认分区无误!

前置准备

确认已创建分区(如/dev/sdb1),且未被挂载(用df -h检查,若挂载需先umount)。

核心命令:mkfs(通用格式化命令)

格式:

bash

运行

复制代码
mkfs.文件系统类型 分区设备名
# 或 mkfs -t 文件系统类型 分区设备名(两种写法等效)

常用示例:

bash

运行

复制代码
mkfs.ext4 /dev/sdb1  # 将sdb1格式化为ext4文件系统(最常用)
mkfs.xfs /dev/sdb2   # 将sdb2格式化为xfs文件系统(RHEL7+推荐)
mkfs.vfat /dev/sdb3  # 将sdb3格式化为vfat,用于双系统共享
mkswap /dev/sdb4     # 制作交换分区(swap文件系统专用命令)

格式化 swap 分区后需激活

bash

运行

复制代码
swapon /dev/sdb4  # 临时激活
echo "/dev/sdb4 swap swap defaults 0 0" >> /etc/fstab  # 永久激活(写入开机挂载)

格式化后验证

bash

运行

复制代码
blkid /dev/sdb1  # 查看分区的文件系统类型、UUID(唯一标识)

扩展:挂载文件系统(格式化后必须挂载才能使用)

  1. 临时挂载(重启失效):

bash

运行

复制代码
mkdir /data  # 创建挂载点(空目录)
mount /dev/sdb1 /data  # 将sdb1挂载到/data
  1. 永久挂载(重启生效,写入/etc/fstab):

bash

运行

复制代码
echo "/dev/sdb1 /data ext4 defaults 0 0" >> /etc/fstab
mount -a  # 刷新挂载,无需重启生效
  1. 查看挂载结果:

bash

运行

复制代码
df -h  # 查看已挂载的文件系统、磁盘使用率

4.raid磁盘阵列

  1. RAID 核心原理

RAID(独立磁盘冗余阵列,Redundant Array of Independent Disks)是将多块物理硬盘通过硬件 / 软件方式组合成一个逻辑磁盘 ,目的是提升磁盘读写速度、提高数据容错性(冗余)、扩大存储容量 ,核心是分条(Striping)、镜像(Mirroring)、校验(Parity) 三种技术的组合。

  • 分条:将数据分散存储到多块硬盘,并行读写,提升速度;
  • 镜像:将数据同时复制到多块硬盘,一块损坏可从另一块恢复,提升容错;
  • 校验:存储校验信息,某块硬盘损坏时,通过校验信息恢复数据。

RAID 分为硬件 RAID (通过 RAID 卡实现,性能高,适合企业级服务器)和软件 RAID (通过 Linux 系统自带工具mdadm实现,无需硬件,适合个人 / 小型服务器),常用 RAID 级别为RAID0、RAID1、RAID5、RAID6、RAID10 ,无最优级别,需根据速度、容错、成本需求选择。

  1. 常用 RAID 级别特性对比
RAID 级别 最少硬盘数 核心技术 读写速度 数据容错性 磁盘利用率 适用场景
RAID0 2 块 仅分条,无校验 / 镜像 最快(并行读写) 无(一块损坏全量丢失) 100%(n 块则 n/n) 临时存储、对速度要求高无容错需求(如缓存)
RAID1 2 块 仅镜像,无校验 / 分条 和单盘一致 有(一块损坏,另一块完整) 50%(n 块则 1/n) 系统盘、重要数据存储(如数据库日志)
RAID5 3 块 分条 + 分布式校验 快(读远大于写) 有(单块损坏,通过校验恢复) (n-1)/n 通用存储(如文件服务器、数据库),平衡速度 / 容错 / 成本
RAID6 4 块 分条 + 双分布式校验 比 RAID5 稍慢 有(两块损坏可恢复) (n-2)/n 大容量、高容错需求(如企业级数据中心)
RAID10 4 块(2 的倍数) RAID1+RAID0(先镜像再分条) 快(并行读写 + 镜像) 有(每组镜像可坏一块,整体最多坏 n/2 块) 50%(n 块则 n/2) 高速度 + 高容错需求(如核心数据库、高性能服务器)
  1. Linux 软件 RAID 实操(mdadm 命令)

核心命令:mdadm

bash

运行

复制代码
# 1. 创建RAID5(3块硬盘:sdb/sdc/sdd,逻辑设备/dev/md0)
mdadm -C /dev/md0 -l 5 -n 3 /dev/sdb /dev/sdc /dev/sdd
# -C:创建RAID;-l:RAID级别;-n:硬盘数量;最后跟物理硬盘

# 2. 查看RAID状态
mdadm -D /dev/md0  # 详细信息
cat /proc/mdstat   # 简洁状态

# 3. 格式化RAID逻辑盘(和普通分区一致)
mkfs.xfs /dev/md0

# 4. 挂载使用
mkdir /raid5
mount /dev/md0 /raid5

# 5. 硬盘损坏替换
mdadm /dev/md0 -f /dev/sdb  # 标记sdb为故障
mdadm /dev/md0 -r /dev/sdb  # 移除故障硬盘
mdadm /dev/md0 -a /dev/sde  # 添加新硬盘sde,自动同步数据

核心补充

  1. RAID不能替代备份 :RAID 解决的是硬盘硬件故障,无法解决人为删除、病毒、磁盘阵列整体损坏等问题,重要数据仍需定期备份;
  2. 软件 RAID 性能略低于硬件 RAID,企业级场景优先选择硬件 RAID 卡;
  3. RAID5 写入速度较慢,因每次写入都要计算校验信息。

5.lvm逻辑卷

  1. LVM 核心原理

LVM(Logical Volume Manager,逻辑卷管理)是 Linux 的磁盘动态管理技术 ,打破了物理磁盘 / 分区的边界,将多块物理磁盘 / 分区封装为逻辑卷 ,实现磁盘空间的动态扩容 / 缩容、跨磁盘分配空间、快照备份 等功能,解决了传统分区大小固定、扩容需重启、无法跨磁盘 的痛点。传统分区格式化后大小固定,若空间不足,需重新分区、格式化,数据易丢失;LVM 将物理存储抽象为逻辑层,用户操作逻辑卷即可,无需关注底层物理磁盘,是 Linux 运维中磁盘管理的首选方式

  1. LVM 的核心组件(从底层到上层)

LVM 分为 4 个层级,层层封装,所有组件均为逻辑概念,底层依赖物理磁盘 / 分区:

  1. 物理卷(PV,Physical Volume) :LVM 的最底层,将物理磁盘 / 分区格式化为 LVM 格式,成为 LVM 的 "原料",如/dev/sdb1/dev/sdc

  2. 卷组(VG,Volume Group) :将多个 PV 合并为一个 "存储池",池内空间可自由分配,卷组名自定义,如vg_data

  3. 逻辑卷(LV,Logical Volume) :从 VG 中划分出的可用空间,相当于 "虚拟分区",可格式化、挂载使用,如lv_data,大小可动态调整;

  4. 物理扩展(PE,Physical Extent):VG 的最小分配单位,默认 4MB,PV 被划分为多个 PE,VG 将 PE 分配给 LV,是 LVM 空间分配的基础。

  5. LVM 实操步骤(创建→使用→扩容 / 缩容)

前置准备:将磁盘 / 分区转为 PV(以/dev/sdb1/dev/sdc1为例)

bash

运行

复制代码
pvcreate /dev/sdb1 /dev/sdc1  # 创建PV
pvs  # 查看PV状态(简洁)
pvdisplay  # 查看PV详细信息

步骤 1:创建卷组 VG(将 PV 加入 VG,命名为 vg_data)

bash

运行

复制代码
vgcreate vg_data /dev/sdb1 /dev/sdc1  # 创建VG,包含sdb1和sdc1
vgs  # 查看VG状态
vgdisplay  # 查看VG详细信息(剩余空间、PE大小等)

步骤 2:创建逻辑卷 LV(从 VG 中划分 200G,命名为 lv_data,挂载到 /data)

bash

运行

复制代码
lvcreate -L 200G -n lv_data vg_data
# -L:指定LV大小(可用G/M/T);-n:LV名;最后跟VG名
lvs  # 查看LV状态
lvdisplay  # 查看LV详细信息

步骤 3:格式化 + 挂载 LV(和普通分区一致)

bash

运行

复制代码
mkfs.xfs /dev/vg_data/lv_data  # 格式化为xfs
mkdir /data
mount /dev/vg_data/lv_data /data
# 永久挂载:写入/etc/fstab
echo "/dev/vg_data/lv_data /data xfs defaults 0 0" >> /etc/fstab
mount -a

步骤 4:LV 动态扩容(最常用,无需卸载,不丢失数据)

若 /data 空间不足,从 VG 中再划分 100G 给 lv_data:

bash

运行

复制代码
lvextend -L +100G /dev/vg_data/lv_data  # 扩容LV(+表示追加,直接写300G表示总大小)
xfs_growfs /data  # 刷新文件系统(xfs文件系统用此命令)
# ext4文件系统刷新:resize2fs /dev/vg_data/lv_data
df -h /data  # 验证扩容结果

步骤 5:LV 缩容(需卸载,谨慎操作,建议先备份)

bash

运行

复制代码
umount /data
e2fsck -f /dev/vg_data/lv_data  # 检查文件系统(ext4)
resize2fs /dev/vg_data/lv_data 200G  # 缩容文件系统
lvreduce -L 200G /dev/vg_data/lv_data  # 缩容LV
mount /data

扩展:删除 LVM(需先卸载)

bash

运行

复制代码
umount /data
lvremove /dev/vg_data/lv_data  # 删除LV
vgremove vg_data  # 删除VG
pvremove /dev/sdb1 /dev/sdc1  # 删除PV

核心补充

  1. LVM 可和 RAID 结合使用:先做 RAID 提升容错 / 速度,再将 RAID 逻辑盘创建为 PV,实现 "容错 + 动态扩容";
  2. LVM 快照:可创建 LV 的快照,用于临时备份,如lvcreate -s -L 10G -n lv_snap /dev/vg_data/lv_data
  3. RHEL7 + 默认使用 xfs 文件系统,xfs 仅支持扩容,不支持缩容,若需缩容建议用 ext4。

6.find命令详细用法

find 是 Linux最强大的文件查找命令 ,支持按文件名、大小、权限、时间、所有者、类型 等多条件精准查找,还能对查找结果执行后续操作 (删除、复制、执行命令),是运维日常查找文件、清理垃圾、批量操作的核心命令,实时遍历磁盘查找,结果精准但速度略慢(和 locate 对比,locate 基于数据库,速度快但非实时)。

1. find 命令基本格式

bash

运行

复制代码
find 查找路径 查找条件 动作
# 查找路径:默认为当前目录(.),可指定绝对路径(如/root、/var)
# 查找条件:核心,如文件名、大小、时间等,支持多条件组合(与-a/或-o/非!)
# 动作:对查找结果执行的操作,默认为-print(打印结果)

2. 核心查找条件(按类别划分,最常用)

(1)按文件名 / 正则查找(-name/-iname/-regex)

bash

运行

复制代码
find /etc -name "passwd"  # 精准查找/etc下名为passwd的文件(区分大小写)
find /etc -iname "PassWd" # 精准查找,不区分大小写
find /root -name "*.sh"   # 查找/root下所有.sh后缀的文件(通配符*:任意字符;?:单个字符;[]:指定范围)
find /var -regex ".*\.log[0-9]$"  # 按正则查找/var下以.log+数字结尾的文件

(2)按文件类型查找(-type)

常用文件类型:f(普通文件)、d(目录)、l(软链接)、b(块设备)、c(字符设备)、s(套接字文件)、p(管道文件)

bash

运行

复制代码
find /dev -type b  # 查找/dev下所有块设备(如磁盘/dev/sda)
find /root -type f -name "*.txt"  # 查找/root下所有.txt普通文件(多条件与)
find /tmp -type d  # 查找/tmp下所有目录

(3)按文件大小查找(-size)

单位:k(KB)、M(MB)、G(GB);+:大于指定大小;-:小于指定大小;无符号:等于指定大小

bash

运行

复制代码
find / -size +10G  # 查找根目录下大于10G的文件(清理大文件常用)
find /var/log -size -100k  # 查找/var/log下小于100KB的文件
find /root -size 2M  # 查找/root下等于2MB的文件

(4)按时间查找(-atime/-mtime/-ctime,单位:天;-amin/-mmin/-cmin,单位:分钟)

  • atime :文件访问时间(查看、读取文件内容)
  • mtime :文件修改时间(修改文件内容,最常用)
  • ctime :文件改变时间 (修改文件属性,如权限、所有者、重命名)+n:超过 n 天 / 分钟;-n:少于 n 天 / 分钟;n:正好 n 天 / 分钟

bash

运行

复制代码
find /var/log -type f -mtime +7  # 查找/var/log下7天前修改的普通文件(日志清理常用)
find /root -type f -atime -1  # 查找/root下1天内访问过的文件
find /etc -type f -cmin -30  # 查找/etc下30分钟内属性改变的文件

(5)按权限查找(-perm)

格式:数字权限(如 755、644)或符号权限(如 u=rwx);-perm 755:精准匹配;-perm -755:至少包含该权限(常用)

bash

运行

复制代码
find /root -type f -perm 777  # 查找/root下权限为777的普通文件(危险权限,需整改)
find /usr/bin -type f -perm -4755  # 查找/usr/bin下有SUID权限的文件(4为SUID,2为SGID,1为粘滞位)
find /home -type d -perm 1777  # 查找/home下有粘滞位的目录

(6)按所有者 / 所属组查找(-user/-group/-nouser/-nogroup)

bash

运行

复制代码
find /home -user zhangsan  # 查找/home下所有者为zhangsan的文件
find /data -group dev      # 查找/data下所属组为dev的文件
find / -nouser  # 查找系统下无所有者的文件(孤儿文件,需清理)
find / -nogroup # 查找系统下无所属组的文件

3. 条件组合(与 / 或 / 非)

  • -a:与(默认,可省略),多个条件同时满足
  • -o:或,满足其中一个条件即可
  • !:非,取反

bash

运行

复制代码
find /root -type f -name "*.sh" -o -name "*.py"  # 查找/root下.sh或.py的普通文件
find /var -type f ! -name "*.log"  # 查找/var下不是.log后缀的普通文件
find / -size +1G -a -type f -a -mtime +30  # 查找根目录下大于1G、30天前修改的普通文件

4. 对查找结果执行动作(-exec/-ok/xargs,核心)

(1)-exec:直接执行后续命令,无需确认(常用)

格式-exec 命令 {} \; ({} 表示查找结果,; 是命令结束符,缺一不可)

bash

运行

复制代码
# 查找/var/log下7天前的log文件并删除(日志清理经典命令)
find /var/log -type f -mtime +7 -name "*.log" -exec rm -rf {} \;
# 查找/root下的sh文件并复制到/data/scripts
find /root -type f -name "*.sh" -exec cp {} /data/scripts \;
# 查找/root下的txt文件并查看详细信息
find /root -type f -name "*.txt" -exec ls -l {} \;

(2)-ok:执行命令前需人工确认(安全,适合删除 / 修改操作)

bash

运行

复制代码
find /tmp -type f -mtime +3 -exec rm -rf {} \;  # 查找/tmp下3天前的文件,删除前确认

(3)xargs:管道配合,处理大量文件(避免参数过长)

find 查找结果过多时,-exec 可能因参数过长报错,xargs 可分批次处理:

bash

运行

复制代码
find /root -type f -name "*.txt" | xargs ls -l
find /var/log -type f -name "*.log.bak" | xargs rm -rf
  1. 常用高级组合示例

bash

运行

复制代码
# 1. 查找系统中所有大于5G的日志文件并记录到日志
find / -type f -name "*.log" -size +5G -exec ls -lh {} \; > /tmp/big_log.txt
# 2. 查找/home下所有权限为777的文件并修改为644
find /home -type f -perm 777 -exec chmod 644 {} \;
# 3. 查找/opt下所有者为root的文件并改为zhangsan
find /opt -type f -user root -exec chown zhangsan {} \;
# 4. 查找当前目录下所有软链接并查看原文件
find . -type l -exec ls -l {} \;

7.软硬连接原理

软硬连接是 Linux 中文件的两种引用方式 ,通过创建链接文件实现对原文件的快速访问 ,核心区别在于是否依赖原文件的 inode,理解 inode 和目录项的关系是掌握软硬连接的关键。

前置基础:inode 与目录项

  1. inode(索引节点) :每个文件对应唯一的 inode,存储文件的元数据 (大小、权限、所有者、存储扇区、时间等),无文件名,inode 号是文件的唯一标识;

  2. 目录项 :目录是特殊的文件,存储文件名 + 对应的 inode 号,即 "文件名→inode 号" 的映射关系;

  3. 文件访问流程 :用户输入cat /root/test.txt → 系统先查 /root 目录的目录项,找到 test.txt 对应的 inode 号 → 通过 inode 号找到文件的存储扇区 → 读取内容。

  4. 硬链接(Hard Link)原理

硬链接是给原文件的 inode 号新增一个文件名映射 ,即多个文件名指向同一个 inode 号,相当于给文件起了 "多个别名"。

核心特性

  1. inode 号相同:硬链接文件和原文件的 inode 号一致,ls -i 可查看;
  2. 依赖原文件的 inode :硬链接基于 inode 创建,不能跨文件系统 (不同文件系统的 inode 号不唯一),不能给目录创建硬链接(避免目录循环);
  3. 删除原文件不影响硬链接 :删除原文件只是删除了一个 "文件名→inode" 的映射,只要还有硬链接指向该 inode,文件数据就不会被删除;只有当所有硬链接(包括原文件)都被删除,inode 的链接数变为 0,系统才会释放文件的磁盘空间;
  4. 无独立文件属性:硬链接文件的属性和原文件完全一致,修改其中一个的内容 / 权限,其他所有硬链接都会同步变化。

硬链接创建命令:ln

bash

运行

复制代码
ln 原文件 硬链接文件
# 示例
touch test.txt  # 创建原文件
ln test.txt test_hard.txt  # 创建硬链接文件test_hard.txt
ls -i test.txt test_hard.txt  # 查看inode号,两者一致
  1. 软链接(Symbolic Link / 符号链接)原理

软链接是一个独立的文件 ,自身有唯一的 inode 号,文件内容存储的是原文件的绝对 / 相对路径,相当于 Windows 的 "快捷方式",系统访问软链接时,会根据路径跳转到原文件。

核心特性

  1. inode 号不同 :软链接是独立文件,inode 号和原文件不同,文件大小为原文件路径的字符数
  2. 依赖原文件的路径 :软链接基于路径创建,可跨文件系统可给目录创建软链接(最常用,如给大目录创建快捷方式);
  3. 删除原文件,软链接失效:原文件被删除后,软链接会变成 "断链"(红色闪烁),访问时提示 "没有那个文件或目录";
  4. 有独立文件属性 :软链接的权限始终为lrwxrwxrwx(l 表示软链接),权限不影响原文件,修改软链接的权限无意义;修改原文件内容,软链接访问的内容会同步变化,修改软链接的路径,会指向新的文件。

软链接创建命令:ln -s

bash

运行

复制代码
ln -s 原文件/原目录 软链接文件/软链接目录
# 示例1:给文件创建软链接
ln -s test.txt test_soft.txt
# 示例2:给目录创建软链接(常用)
mkdir /data/bigdata
ln -s /data/bigdata /root/bigdata_soft  # 在/root创建软链接,指向/data/bigdata
  1. 软硬链接核心对比(必记)
特性 硬链接(Hard Link) 软链接(Symbolic Link)
inode 号 和原文件一致 和原文件不同,独立 inode
跨文件系统 不支持 支持
给目录创建 不支持 支持
原文件删除后 仍可访问(链接数 > 0) 失效(断链)
文件属性 和原文件完全一致 独立,权限固定为 lrwxrwxrwx
文件大小 和原文件一致 为原文件路径的字符数
本质 原文件的多个文件名(别名) 指向原文件的快捷方式(独立文件)
  1. 实用场景

  2. 硬链接 :适合对重要文件做 "别名备份",如系统配置文件/etc/fstab,创建硬链接后,即使原文件被误删,仍可通过硬链接恢复;

  3. 软链接 :适合日常快捷访问,如将大目录挂载到其他位置、将程序的可执行文件链接到/usr/bin(实现全局命令)、给版本更新的软件创建固定链接(如python3链接到python3.10)。

相关推荐
郭庆汝2 小时前
FastAPI使用笔记
笔记·fastapi
爱讲故事的2 小时前
计算机网络第七章:无线与移动网络复习笔记
网络·笔记·计算机网络
小陈phd2 小时前
Text2SQL智能体学习笔记(一)——NL2SQL及执行流程介绍
笔记·学习
问心无愧05132 小时前
ctf sow web入门112
android·前端·笔记
稷下元歌2 小时前
系统学习plc 基础指令上篇,官方资料课程笔记整 理
笔记·学习
超人不会飞_Jay3 小时前
26.6.8LangChain笔记
笔记
xian_wwq4 小时前
【学习笔记】「大模型安全:攻击面演化史」第 02 篇-越狱攻防战
笔记·学习
xieliyu.4 小时前
MySQL 全套入门笔记:基础、库操作、数据类型
数据库·笔记·mysql
XGeFei4 小时前
【Fastapi学习笔记(7)】—— Fastapi 中间件、前端跨域请求
笔记·学习·fastapi
问心无愧05134 小时前
ctf show web入门109
android·前端·笔记