运维高级课笔记(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.txt`、`file1.txt`、`a.txt`) * 示例 2:匹配当前目录下所有以`file`开头的文件 `file*`(如`file1`、`file2.log`、`fileabc`) * 示例 3:匹配当前目录下所有文件(隐藏文件除外) `*` * **`?`** :匹配**单个任意字符(仅 1 个,不能多也不能少)**。 * 示例 1:匹配当前目录下文件名长度为 5(4 个字符 +`.txt`)的`.txt`文件 `????.txt`(如`abcd.txt`,不匹配`abc.txt`、`abcde.txt`) * 示例 2:匹配当前目录下以`f`开头、后面跟 1 个任意字符、以`.log`结尾的文件 `f?.log`(如`f1.log`、`fa.log`,不匹配`f12.log`) 2. 字符类通配符(`[[:xxx:]]`,匹配指定类别中的单个字符) 这类通配符用于精准匹配某一类字符,仅匹配**单个字符**,常见类别如下: * **`[[:alpha:]]`** :匹配单个**字母字符** (包括大小写,a-z、A-Z) * 示例:`file[[:alpha:]].txt`(匹配`filea.txt`、`fileB.txt`,不匹配`file1.txt`) * **`[[:digit:]]`** (注意:你输入的`aigit`是笔误,正确为`digit`):匹配单个**数字字符** (0-9) * 示例:`file[[:digit:]].txt`(匹配`file1.txt`、`file9.txt`,不匹配`filea.txt`) * **`[[:lower:]]`** :匹配单个**小写字母字符** (a-z) * 示例:`file[[:lower:]].txt`(匹配`filea.txt`、`filez.txt`,不匹配`fileA.txt`) * **`[[:upper:]]`** :匹配单个**大写字母字符** (A-Z) * 示例:`file[[:upper:]].txt`(匹配`fileA.txt`、`fileZ.txt`,不匹配`filea.txt`) * **`[[:alnum:]]`** :匹配单个**字母或数字字符** (a-z、A-Z、0-9) * 示例:`file[[:alnum:]].txt`(匹配`filea.txt`、`file1.txt`、`fileZ.txt`) * **`[[:punct:]]`** :匹配单个**标点符号 / 特殊字符** (如`!`、`@`、`#`、`.`、`,`等) * 示例:`file[[:punct:]].txt`(匹配`file!.txt`、`file@.txt`) * **`[[:space:]]`** :匹配单个**空白字符** (如空格、制表符`Tab`) * 示例:匹配文件名中包含空格的文件 `*[[:space:]]*` 3. 自定义字符集`[]` * **定义** :手动指定一组字符,匹配其中**任意单个字符** ,支持范围表示(`-`),也支持排除(`^`或`!`,放在`[]`开头)。 * 示例 1:匹配`file1.txt`、`file2.txt`、`file3.txt` → `file[123].txt` 或 `file[1-3].txt`(`-`表示范围) * 示例 2:匹配`filea.txt`、`fileb.txt`、`filec.txt` → `file[a-c].txt` * 示例 3:匹配除了 1、2、3 之外的单个字符 → `file[^123].txt` 或 `file[!123].txt`(排除 1、2、3) * 注意:`[]`内仅匹配单个字符,多个字符需多个`[]`或结合`*`使用。 大括号表达式`{}` * **定义** :`{}`用于**生成一组符合规则的字符串(批量生成 / 匹配)** ,与通配符不同,`{}`是 "预先生成" 字符串,再传递给命令,不依赖于实际存在的文件。 * **核心作用**:1. 批量生成文件名 / 路径;2. 批量匹配已知的固定字符串。 * 示例 1:批量创建文件`file1.txt`、`file2.txt`、`file3.txt` → `touch file{1,2,3}.txt`(`,`分隔多个值) * 示例 2:批量创建文件`file1.txt`到`file10.txt` → `touch file{1..10}.txt`(`..`表示连续范围,支持数字、字母) * 示例 3:批量复制文件,将`test1.txt`、`test2.txt`分别复制为`test1.bak`、`test2.bak` → `cp test{1,2}.txt test{1,2}.bak` * 示例 4:批量创建嵌套目录`dir1/sub1`、`dir1/sub2`、`dir2/sub1`、`dir2/sub2` → `mkdir -p {dir1,dir2}/{sub1,sub2}` * 注意:`{}`内的内容是 "固定 / 预定义" 的,不会匹配未知字符,与`*`(匹配任意字符)的区别在于:`*.txt`匹配所有已存在的`.txt`文件,而`{a,b,c}.txt`生成`a.txt`、`b.txt`、`c.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.txt`、`sort data.txt`),其底层逻辑与输入重定向一致,都是从文件中读取数据,输入重定向更适合用于 "不支持直接传入文件名" 的命令。 #### 6.多行录入 核心定义 多行录入(又称 Here Document,简称 Heredoc)是**一种特殊的输入重定向方式**,用于在命令行或 Shell 脚本中,一次性输入多行文本作为程序的标准输入,无需创建额外的文件。 关键规则 1. 分界符可以是任意自定义字符串(常用`EOF`、`EOT`、`END`等),前后分界符必须完全一致(大小写敏感); 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' 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`表示所有主机,指定主机名则仅在该主机生效。 * **可切换的用户** :通常为`root`,`ALL`表示可切换到任意用户。 * **可执行的命令** :命令的绝对路径(`which 命令`查看),`ALL`表示所有命令,多个命令用逗号分隔。 常用配置示例 | 配置内容 | 作用 | |------------------------------------------------------|------------------------------------------------------| | `lee ALL=(root) ALL` | 允许用户`lee`在所有主机上,以 root 身份执行所有命令 | | `lee ALL=(root) /usr/sbin/useradd,/usr/sbin/userdel` | 允许`lee`仅执行`useradd`和`userdel`命令 | | `%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 编号查找元数据和文件内容 * **查看文件 inode** :`ls -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 | 可以查看文件内容(如 `cat`、`less`) | 可以列出目录内文件(如 `ls`) | | `w` | 写权限 | 2 | 可以修改文件内容(如 `vim`、`echo`) | 可以增删目录内文件(如 `touch`、`rm`) | | `x` | 执行权限 | 1 | 可以运行文件(如脚本、二进制程序) | 可以进入目录(如 `cd`) | | `-` | 无权限 | 0 | 无法操作文件 | 无法进入目录 | (2)权限的两种表示方式 1. **符号表示** :分 3 段,对应 `u`、`g`、`o`,如 `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`(所有身份,默认) * 操作:`+`(添加权限)、`-`(移除权限)、`=`(设置权限) * 权限:`r`、`w`、`x` 示例: 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 种:**SUID** 、**SGID** 、**Sticky 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 中进程运行时会处于不同的状态,通过`ps`、`top`等命令可查看,核心状态分为以下几种(以`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) | 死亡态 | 进程已完全终止,资源被全部回收,该状态仅为过渡状态,无法通过命令捕获 | 补充说明: * 常见状态为`R`、`S`、`T`,`D`态较少见(仅磁盘 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. 补充:`htop`(`top`的增强版,界面更友好,需额外安装) (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 PID`(`pgrep`获取 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`),或为了安全,以专用系统用户运行(如`nginx`、`mysql`用户)。 4. **进程名末尾通常带`d`** :约定俗成的命名方式,用于区分普通进程(如`sshd`、`nginx`、`mysqld`、`crond`)。 (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 及以下)通过`service`、`chkconfig`命令管理守护进程,现已被`systemctl`替代。 *** ** * ** *** 总结 1. 进程是资源分配单位(重量级),线程是调度执行单位(轻量级),线程共享进程资源。 2. 进程核心状态有`R`(运行)、`S`(睡眠)、`T`(停止)、`Z`(僵尸),可通过`ps`/`top`查看。 3. 进程前后台切换依赖`&`、`bg`、`fg`、`jobs`命令,灵活释放终端资源。 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 需手动设置,适合服务器、虚拟机、网关等需要固定地址的设备,以下讲解**Windows** 和**Linux**两大系统的实操配置,同时包含 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: 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 转换。 2. 网关的配置方式 网关配置分为**设备端配置** (给电脑 / 虚拟机配置默认网关,指向路由设备)和**路由端配置** (路由器 / 网关设备自身的网关设置,对接上层网络),以下讲解**常用的设备端默认网关配置**(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)。 3. 常见问题 若设备配置网关后无法访问外网,大概率是**网关 IP 填写错误** (需和设备 IP 同一网段)或**网关设备(路由器)未正常联网**。 ### 4.dns的作用及配置方式 DNS(域名系统,Domain Name System)是 \*\*"域名和 IP 地址的翻译器"**,解决了 "人类记不住复杂 IP,电脑只识别 IP" 的问题,核心作用是将** 域名(如[www.baidu.com](https://www.baidu.com "www.baidu.com"))解析为对应的 IP 地址(如 180.101.50.188)\*\*,让设备能通过 IP 访问互联网服务。 1. DNS 的核心作用 1. **域名解析**:正向解析(域名→IP)是最常用的,反向解析(IP→域名)主要用于服务器验证(如邮件服务器); 2. **解析缓存**:DNS 服务器会缓存解析结果,减少重复解析,提升访问速度; 3. **负载均衡**:大型网站的 DNS 服务器会将域名解析为多个不同的服务器 IP,实现流量分摊,保证网站访问稳定; 4. **域名管理**:通过 DNS 服务器实现域名的解析指向修改,如将域名解析到新的服务器 IP。 关键补充 * DNS 解析是**分层的**:根 DNS 服务器→顶级 DNS 服务器(如.com/.cn)→权威 DNS 服务器(网站专属),本地设备会先查询本地 DNS 缓存,再查询配置的 DNS 服务器; * **本地 DNS 缓存**:Windows/Linux 都会缓存近期的解析结果,若域名解析异常,可清空缓存解决。 2. 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 <> /etc/NetworkManager/system-connections/$1.nmconnection < /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 字节)** ,分区表的格式决定了分区的数量、大小限制,主流分为**MBR** 和**GPT**两种,是所有磁盘操作的底层基础。 主流分区表类型对比(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 中常用的磁盘分区命令有**fdisk** 、**gdisk** 、**parted** ,其中`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 2. 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`。 3. 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、动态扩容,新一代文件系统 | 2. 文件系统的制作方式(格式化) 制作文件系统即**格式化分区** ,通过`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** ,无最优级别,需根据**速度、容错、成本**需求选择。 2. 常用 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) | 高速度 + 高容错需求(如核心数据库、高性能服务器) | 3. 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 运维中磁盘管理的**首选方式**。 2. 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 空间分配的基础。 3. 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 5. 常用高级组合示例 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 号找到文件的存储扇区 → 读取内容。 1. 硬链接(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号,两者一致 2. 软链接(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 3. 软硬链接核心对比(必记) | 特性 | 硬链接(Hard Link) | 软链接(Symbolic Link) | |---------|----------------|---------------------| | inode 号 | 和原文件一致 | 和原文件不同,独立 inode | | 跨文件系统 | 不支持 | 支持 | | 给目录创建 | 不支持 | 支持 | | 原文件删除后 | 仍可访问(链接数 \> 0) | 失效(断链) | | 文件属性 | 和原文件完全一致 | 独立,权限固定为 lrwxrwxrwx | | 文件大小 | 和原文件一致 | 为原文件路径的字符数 | | 本质 | 原文件的多个文件名(别名) | 指向原文件的快捷方式(独立文件) | 4. 实用场景 1. **硬链接** :适合对重要文件做 "别名备份",如系统配置文件`/etc/fstab`,创建硬链接后,即使原文件被误删,仍可通过硬链接恢复; 2. **软链接** :适合日常快捷访问,如将大目录挂载到其他位置、将程序的可执行文件链接到`/usr/bin`(实现全局命令)、给版本更新的软件创建固定链接(如`python3`链接到`python3.10`)。

相关推荐
汤姆yu2 小时前
基于android的云笔记系统
笔记
代码游侠2 小时前
学习笔记——文件传输工具配置与Makefile详解
运维·前端·arm开发·笔记·学习
lkbhua莱克瓦242 小时前
Apache Maven全面解析
java·数据库·笔记·maven·apache
云边散步2 小时前
godot2D游戏教程系列一(6)
笔记·学习·音视频
hssfscv2 小时前
Javaweb学习笔记——后端实战6登录功能1
笔记·后端·学习
Yu_Lijing2 小时前
基于C++的《Head First设计模式》笔记——组合模式
c++·笔记·设计模式·组合模式
ouliten2 小时前
C++笔记:std::tuple
c++·笔记
生擒小朵拉12 小时前
ROS1学习笔记(二)
笔记·学习
Root_Hacker13 小时前
include文件包含个人笔记及c底层调试
android·linux·服务器·c语言·笔记·安全·php