一.命令行使用技巧
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 系统根目录/下的二级目录是标准化的,每个目录有明确的用途,核心目录及作用如下:
/bin :存放所有用户可执行的基本命令 (如ls、cat、mv),/bin 目录中的命令在单用户模式下也能使用,文件通常为二进制可执行文件。
/etc :存放系统的配置文件 (如用户配置、服务配置、网络配置等),例如/etc/passwd(用户信息)、/etc/profile(系统环境变量)、/etc/nginx(Nginx 服务配置),该目录通常只有 root 用户有修改权限。
/home :普通用户的家目录(主目录) ,每个普通用户会在这里有一个以用户名命名的子目录(如/home/lee),用户对自己的家目录有完全操作权限,用于存放个人文件、配置等。
/root :超级用户root的家目录,普通用户无访问权限。
/usr :存放系统软件资源 (相当于 Windows 的Program Files),核心子目录有/usr/bin(非基本命令,如高级工具)、/usr/lib(软件库文件)、/usr/share(帮助文档、字体等)。
/var :存放可变数据文件 (内容会随系统运行动态变化),例如/var/log(系统日志)、/var/www(网站根目录)、/var/spool(邮件、打印队列)。
/dev :存放设备文件 (Linux 中一切皆文件,硬件设备被抽象为文件),例如/dev/sda(硬盘)、/dev/tty(终端)、/dev/null(空设备,相当于 "黑洞")。
/tmp :存放临时文件,所有用户都可读写,系统重启后该目录下的文件会被自动清除。
/boot :存放系统启动相关文件(如 Linux 内核、启动引导程序 GRUB),如果该目录损坏,系统将无法正常启动。
/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/lee,root用户下~等价于/root)
- 示例 (假设当前工作目录为
/home/lee):
- 访问当前目录下的
test.txt:./test.txt(可简写为test.txt)
- 访问当前目录下
config子目录的test.conf:config/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`)。