一.命令行使用技巧
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强制删除,谨慎使用)
- 示例 1:删除单个文件
(3) . 文件 / 目录复制类
cp:复制文件或目录 ,将源文件 / 目录复制到目标路径。- 示例 1:复制单个文件到目标目录
cp test.txt dir1/ - 示例 2:复制目录及所有内容(递归复制)
cp -r dir1 dir2/(-r递归处理目录) - 示例 3:保留文件属性(权限、时间)复制
cp -a file1.txt dir1/(-a等价于-dpr,适合备份)
- 示例 1:复制单个文件到目标目录
(4) . 文件 / 目录移动 / 重命名类
mv:有两个核心功能,移动文件 / 目录 、给文件 / 目录重命名 。- 示例 1:移动文件到目标目录
mv test.txt dir1/ - 示例 2:给文件重命名
mv file1.txt file2.txt - 示例 3:移动目录到目标路径
mv dir1 dir2/
- 示例 1:移动文件到目标目录
(5) . 文件内容查看类
cat:一次性显示文件的全部内容 ,适合查看小型文件(大文件内容会刷屏)。- 示例 1:查看文件内容
cat test.txt - 示例 2:查看文件并显示行号
cat -n test.txt - 示例 3:拼接多个文件内容并输出
cat file1.txt file2.txt
- 示例 1:查看文件内容
head:查看文件的前 N 行内容 ,默认显示前 10 行。- 示例 1:默认查看前 10 行
head test.txt - 示例 2:指定查看前 5 行
head -n 5 test.txt(可简写为head -5 test.txt)
- 示例 1:默认查看前 10 行
less:分页查看大型文件内容 ,支持上下滚动、搜索,交互性更强(相比more功能更全)。- 示例 1:打开文件进行分页查看
less test.txt - 常用交互操作:
↑/↓上下滚动、/关键词向下搜索、q退出查看
- 示例 1:打开文件进行分页查看
vim:一款功能强大的全屏幕文本编辑器 ,支持编辑、查找、替换等多种操作,有三种核心模式(命令模式、插入模式、末行模式)。- 示例 1:打开 / 创建文件进行编辑
vim test.txt - 核心操作流程:打开文件(命令模式)→ 按
i进入插入模式(编辑内容)→ 按Esc返回命令模式 → 输入:wq保存并退出(末行模式)
- 示例 1:打开 / 创建文件进行编辑
(6) . 文件属性 / 统计类
file:识别文件的类型 (不是通过后缀名,而是通过文件内部格式 / 编码)。- 示例 1:识别文件类型
file test.txt(可能返回 "ASCII text" 纯文本文件) - 示例 2:识别可执行文件
file /bin/ls(可能返回 "ELF 64-bit LSB executable")
- 示例 1:识别文件类型
wc:统计文件的行号、单词数、字节数 (Word Count)。- 示例 1:完整统计文件(行、词、字节)
wc test.txt - 示例 2:仅统计行数
wc -l test.txt(最常用,用于统计日志行数等) - 示例 3:仅统计字节数
wc -c test.txt、仅统计单词数wc -w test.txt
- 示例 1:完整统计文件(行、词、字节)
ls:列出目录中的文件 / 目录信息 ,是最常用的查看命令之一。- 示例 1:列出当前目录的简易列表
ls - 示例 2:列出详细信息(权限、所有者、大小、时间)
ls -l(简写为ll,部分系统需配置) - 示例 3:显示隐藏文件(以
.开头的文件)ls -a - 示例 4:递归列出所有子目录内容
ls -R
- 示例 1:列出当前目录的简易列表
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 解析,适用于大部分命令)
- 基础通配符
-
*:匹配任意长度的任意字符(包括 0 个字符),是最常用的批量匹配符号。- 示例 1:匹配当前目录下所有
.txt后缀的文件*.txt(如test.txt、file1.txt、a.txt) - 示例 2:匹配当前目录下所有以
file开头的文件file*(如file1、file2.log、fileabc) - 示例 3:匹配当前目录下所有文件(隐藏文件除外)
*
- 示例 1:匹配当前目录下所有
-
?:匹配单个任意字符(仅 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)
- 示例 1:匹配当前目录下文件名长度为 5(4 个字符 +
- 字符类通配符(
[[: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:]]*
- 示例:匹配文件名中包含空格的文件
- 自定义字符集
[]
- 定义 :手动指定一组字符,匹配其中任意单个字符 ,支持范围表示(
-),也支持排除(^或!,放在[]开头)。 - 示例 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)是按 "字符流" 方式逐字节 / 逐字符读写数据的硬件设备,具有两个关键特征:
- 无缓冲(或极简缓冲):数据传输不经过系统大缓存,直接在设备和应用程序之间传递,延迟低;
- 顺序访问:数据只能按先后顺序读写,无法随机定位(与块设备的 "按块随机访问" 形成对比)。
说明:字符设备在系统中对应/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 脚本中,一次性输入多行文本作为程序的标准输入,无需创建额外的文件。
关键规则
- 分界符可以是任意自定义字符串(常用
EOF、EOT、END等),前后分界符必须完全一致(大小写敏感); - 开头的分界符(
<< 分界符)后不能有多余空格; - 结尾的分界符必须单独一行,且行首不能有任何空格、制表符等字符;
- 多行内容中可以包含变量、命令替换等(如需关闭变量替换,可将分界符用单引号包裹,如
<< 'EOF')。
关键特点
无需创建临时文件,直接在命令行 / 脚本中编写多行输入,适合编写简单配置、批量生成文本内容、自动化脚本中的多行输入场景。
7.管道
核心定义
管道(Pipe,符号为|)是Linux 中实现 "命令之间数据传递" 的核心机制 ,它的作用是将前一个命令的标准输出(FD=1) ,直接作为后一个命令的标准输入(FD=0),实现多个命令的 "串联执行、数据流水线处理"。
关键特点
-
管道是 "单向数据流":只能从左到右传递数据(前一个命令的输出→后一个命令的输入);
-
管道仅传递标准输出(FD=1) ,不传递标准错误输出(FD=2)(错误信息仍会输出到屏幕);
-
管道中的每个命令都是独立的进程,并行执行,数据实时传递,无需创建临时文件存储中间结果。
-
补充说明
管道是 Linux "组合命令" 的核心,通过简单命令的串联,可以实现复杂的功能,这也是 Linux 命令行的强大之处。
8.错误输出通过管道
核心背景
默认情况下,管道(|)仅传递标准输出(FD=1),而 ** 标准错误输出(FD=2)** 会直接输出到终端屏幕,不会参与管道传递,导致如果前一个命令执行出错,错误信息无法被后一个命令处理。
核心解决思路
要让错误输出通过管道传递,需要先将 "标准错误输出(FD=2)重定向到标准输出(FD=1)",让错误信息和正常输出合并,再通过管道传递给后一个命令。
补充说明
2>&1不仅可以用于管道,还可以用于输出重定向,实现 "将正常输出和错误输出同时写入同一个文件
9.输出复制
核心定义
输出复制是指将程序的标准输出(FD=1)同时发送到两个目标 :一是 "终端屏幕"(正常显示),二是 "指定文件"(保存备份),实现 "一边查看结果,一边记录结果" 的需求,核心通过tee命令实现。
核心命令:tee
tee命令的作用类似于 "三通管",将输入数据分流到两个方向:标准输出(屏幕)和指定文件,这也是其名称的由来。
关键特点
-
实时分流:数据一边输出到屏幕,一边写入文件,无需等待命令执行完成;
-
支持多个文件:可以同时写入多个文件,格式为
tee 文件1 文件2 文件3; -
支持管道串联:
tee的输出(屏幕)还可以继续通过管道传递给后续命令。 -
补充说明
tee命令默认会覆盖目标文件,使用-a参数(append)可改为追加模式,这与输出重定向的>和>>对应,在日志记录、自动化脚本调试中非常常用。
bash
#实验步骤
#1.建立实验环境
[root@localhost mnt]# chmod 777 /mnt/
[root@localhost mnt]# watch -n 1 cat *
#2.在另外一个shell中
[root@localhost mnt]# useradd lee
[root@localhost mnt]#
[root@localhost mnt]# su - lee
[lee@localhost ~]$
#3.实验过程
[lee@localhost ~]$ find /etc/ -name passwd 2> /mnt/lee
/etc/pam.d/passwd
/etc/passwd
[lee@localhost ~]$ find /etc/ -name passwd &> /mnt/lee
[lee@localhost ~]$ > /mnt/lee
[lee@localhost ~]$
[lee@localhost ~]$ echo hello linux > lee
[lee@localhost ~]$ echo hello linux > lee^C
[lee@localhost ~]$ cd /mnt/
[lee@localhost mnt]$ echo hello linux > lee
[lee@localhost mnt]$ echo hello linux > lee
[lee@localhost mnt]$ find /etc/ -name passwd >> /mnt/lee
find: '/etc/sudoers.d': 权限不够
find: '/etc/pki/rsyslog': 权限不够
find: '/etc/sssd': 权限不够
find: '/etc/nftables': 权限不够
find: '/etc/sos/cleaner': 权限不够
find: '/etc/ssh/sshd_config.d': 权限不够
find: '/etc/lvm/archive': 权限不够
find: '/etc/lvm/backup': 权限不够
find: '/etc/lvm/cache': 权限不够
find: '/etc/lvm/devices': 权限不够
find: '/etc/polkit-1/rules.d': 权限不够
find: '/etc/polkit-1/localauthority': 权限不够
find: '/etc/grub.d': 权限不够
find: '/etc/audit': 权限不够
find: '/etc/firewalld': 权限不够
[lee@localhost mnt]$ find /etc/ -name passwd ^C /mnt/lee
[lee@localhost mnt]$
[lee@localhost mnt]$ tr ''
tr: "" 后缺少操作数
当进行替换操作时必须给定两组字符串。
请尝试执行 "tr --help" 来获取更多信息。
[lee@localhost mnt]$ cat lee | tr 'a-z' 'A-Z'
HELLO LINUX
/ETC/PAM.D/PASSWD
/ETC/PASSWD
[lee@localhost mnt]$
[lee@localhost mnt]$ tr 'a-z' 'A-Z' <lee
HELLO LINUX
/ETC/PAM.D/PASSWD
/ETC/PASSWD
[lee@localhost mnt]$ echo haha | tr 'a-z' 'A-Z'
HAHA
[lee@localhost mnt]$ echo -e "haha\nhehe" | tr 'a-z' 'A-Z'
HAHA
HEHE
[lee@localhost mnt]$ tr 'a-z' 'A-Z' <<EOF
> hehe
> haha
> xixi
> EOF
HEHE
HAHA
XIXI
[lee@localhost mnt]$
[lee@localhost mnt]$ echo haha | tr 'a-z' 'A-Z' ^C
[lee@localhost mnt]$ find /etc/ -name passwd | wc -l
find: '/etc/sudoers.d': 权限不够
find: '/etc/pki/rsyslog': 权限不够
find: '/etc/sssd': 权限不够
find: '/etc/nftables': 权限不够
find: '/etc/sos/cleaner': 权限不够
find: '/etc/ssh/sshd_config.d': 权限不够
find: '/etc/lvm/archive': 权限不够
find: '/etc/lvm/backup': 权限不够
find: '/etc/lvm/cache': 权限不够
find: '/etc/lvm/devices': 权限不够
find: '/etc/polkit-1/rules.d': 权限不够
find: '/etc/polkit-1/localauthority': 权限不够
find: '/etc/grub.d': 权限不够
find: '/etc/audit': 权限不够
find: '/etc/firewalld': 权限不够
2
[lee@localhost mnt]$ find /etc/ -name passwd 2>&1 | wc -l
17
[lee@localhost mnt]$ find /etc/ -name passwd 2>&1 | wc -l
17
[lee@localhost mnt]$ find /etc/ -name passwd 2>&1 | tee file | wc -l
17
[lee@localhost mnt]$ rm -fr /mnt/*
[lee@localhost mnt]$ find /etc/ -name passwd 2>&1 | tee file | wc -l
[lee@localhost mnt]$ find /etc/ -name passwd 2>&1 | tee file | wc -l
17
总结
- 字符设备是按字符流无缓冲读写的硬件抽象,对应
/dev目录下的c类型文件; - Linux I/O 的核心是文件描述符,默认 3 个 FD(0 = 输入、1 = 正常输出、2 = 错误输出);
- 重定向用于改变 FD 的默认指向,
>/>>操作 FD=1,<操作 FD=0,2>&1合并错误与正常输出; - 管道实现命令间数据传递,默认仅传递 FD=1,需合并输出才能传递错误信息;
- 多行录入(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 的优势
- 安全可控:细粒度分配权限,普通用户只能执行授权命令,避免误操作。
- 审计追溯 :所有 sudo 操作会记录到
/var/log/secure或/var/log/auth.log,便于审计。 - 无需共享 root 密码:普通用户用自己的密码即可获取临时权限,无需知道 root 密码。
bash
/etc/sudoers #不建议直接编写,因为没有语法检测
visudo
sudo command
五.Linux系统中的权限管理
1.权限读取
元数据?
文件的元数据是描述文件属性的 "数据的数据",不包含文件的实际内容,用于系统识别和管理文件。
元数据包含的内容:
- 基本属性:文件类型、权限、硬链接数
- 归属属性:所有者(UID)、所属组(GID)
- 时间属性:最后访问时间(atime)、最后修改时间(mtime)、最后元数据修改时间(ctime)
- 存储属性:文件大小、占用磁盘块数、inode 编号
- 文件类型与权限 :第一位是文件类型,后 9 位是普通权限(如
-rw-r--r--)- 文件类型标识:
-:普通文件d:目录l:软链接文件c:字符设备文件b:块设备文件
- 文件类型标识:
- 硬链接数 :表示指向该文件 inode 的文件数量(示例中为
1) - 所有者 :文件的属主用户(示例中为
root) - 所属组 :文件的属组用户组(示例中为
root) - 时间与大小:文件大小、最后修改时间
(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)权限的两种表示方式
- 符号表示 :分 3 段,对应
u、g、o,如rw-r--r--表示:- 所有者(u):读 + 写(rw-)
- 所属组(g):只读(r--)
- 其他用户(o):只读(r--)
- 数字表示 :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
-
查看 umask 值
bash
运行
umask # 显示数字模式(如0022) umask -S # 显示符号模式(如u=rwx,g=rx,o=rx) -
临时修改 umask(仅当前 Shell 生效)
bash
运行
umask 002 # 设置umask为002 -
永久修改 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)
进程是操作系统进行资源分配和调度的基本单位,是一个正在运行的程序实例。
- 核心特征:
- 每个进程拥有独立的地址空间、内存、文件描述符等系统资源,进程之间资源相互隔离,互不干扰。
- 进程是 "重量级" 的,创建、销毁、切换进程的开销较大(需要分配 / 释放大量资源)。
- 进程有自己独立的 PID(进程 ID),操作系统通过 PID 唯一标识进程。
- 简单理解:一个运行中的
QQ、一个正在执行的Shell脚本、一个nginx服务,都对应一个或多个进程,进程是程序运行的 "容器"。
(2)线程(Thread)
线程是进程内的执行单元,是操作系统进行调度的最小单位,也被称为 "轻量级进程"。
-
核心特征:
- 线程隶属于进程,一个进程可以包含多个线程(至少有一个主线程),所有线程共享该进程的全部资源(地址空间、内存、文件描述符等)。
- 线程有自己独立的栈空间和线程 ID(TID),切换线程的开销远小于进程(无需分配 / 释放资源,仅切换执行上下文)。
- 线程之间通信更高效(直接共享进程资源,无需额外的跨进程通信机制),但也存在线程安全问题(多个线程同时操作共享资源可能导致数据混乱)。
-
简单理解:一个
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:静态查看进程(快照式,仅显示当前时刻进程状态)
最常用的进程查看命令,支持多种参数组合,核心用法:
-
基础查看:
ps aux(BSD 风格,显示所有用户的所有进程,最常用)bash
运行
ps aux输出字段说明:
USER:进程所属用户PID:进程 ID%CPU:进程占用 CPU 百分比%MEM:进程占用内存百分比COMMAND:启动进程的命令
-
树形查看:
ps -efH(System V 风格,显示进程父子关系,树形结构)bash
运行
ps -efH -
过滤指定进程:结合管道
grepbash
运行
# 查看nginx相关进程 ps aux | grep nginx
(2)top:动态查看进程(实时刷新,默认每 3 秒刷新一次)
交互式进程监控工具,可实时查看进程资源占用情况,核心用法:
-
启动
top:bash
运行
top -
核心交互操作(启动后输入):
P:按 CPU 占用率从高到低排序M:按内存占用率从高到低排序p:输入 PID,查看指定进程详情k:输入 PID,终止指定进程q:退出top
-
补充:
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)前台进程切换到后台(暂停后转入后台)
-
先按
Ctrl+Z:暂停当前前台进程(进程进入T停止态),终端释放。 -
执行
bg命令:将暂停的进程转入后台运行(可选指定作业号,bg %作业号):bash
运行
# 将最近一个暂停的进程转入后台 bg # 将作业号为1的进程转入后台 bg %1
(4)后台进程切换到前台
执行fg命令:将后台运行的进程转回前台(可选指定作业号,fg %作业号):
bash
运行
# 将最近一个后台进程转回前台
fg
# 将作业号为1的后台进程转回前台
fg %1
(5)查看后台作业列表
执行jobs命令:查看当前终端的所有后台作业(作业号、状态、命令):
bash
运行
jobs
(6)终止后台进程
-
先通过
jobs获取作业号,再执行kill %作业号:bash
运行
# 终止作业号为1的后台进程 kill %1 -
直接通过
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)核心概念
- Nice 值(NI) :用户可调整的优先级值,范围为
-20~19(共 40 个级别)。- Nice 值越小,进程优先级越高(
-20为最高优先级,仅root可设置)。 - Nice 值越大,进程优先级越低(
19为最低优先级)。 - 默认新建进程的 Nice 值为
0。
- Nice 值越小,进程优先级越高(
- PR 值(优先级值) :CPU 调度器实际使用的优先级值,由系统根据 Nice 值计算得出(
PR = 20 + NI),用户无法直接修改,只能通过调整 Nice 值间接影响。
(2)查看进程优先级
-
top命令:输出中NI列(Nice 值)、PR列(优先级值)。 -
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)核心特征
- 脱离终端:守护进程不与任何终端关联,即使启动它的终端关闭,守护进程仍继续运行(不会被终端信号影响)。
- 后台运行 :始终处于后台(状态多为
S可中断睡眠态,等待客户端请求)。 - 以
root或专用用户运行 :通常拥有较高权限(如root),或为了安全,以专用系统用户运行(如nginx、mysql用户)。 - 进程名末尾通常带
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管理守护进程,核心命令:
-
启动守护进程(服务): bash
运行
sudo systemctl start nginx -
停止守护进程: bash
运行
sudo systemctl stop nginx -
重启守护进程: bash
运行
sudo systemctl restart nginx -
设置开机自启(系统启动时自动运行守护进程): bash
运行
sudo systemctl enable nginx -
查看守护进程状态: bash
运行
sudo systemctl status nginx
(5)补充说明
- 守护进程的核心价值是提供 "持续可用" 的服务,无需人工干预,是 Linux 系统稳定运行的基础。
- 传统 Linux 系统(CentOS 6 及以下)通过
service、chkconfig命令管理守护进程,现已被systemctl替代。
总结
- 进程是资源分配单位(重量级),线程是调度执行单位(轻量级),线程共享进程资源。
- 进程核心状态有
R(运行)、S(睡眠)、T(停止)、Z(僵尸),可通过ps/top查看。 - 进程前后台切换依赖
&、bg、fg、jobs命令,灵活释放终端资源。 - 进程优先级通过 Nice 值调整(
-20最高,19最低),nice/renice实现优先级配置。 - 进程信号用于控制进程行为,
kill -9是强制终止无响应进程的终极手段。 - 守护进程是后台长期运行的服务进程,通过
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 设备为例)
- 寻址判断 :A 设备先判断 B 设备的 IP 是否和自己在同一网段(通过子网掩码计算);
- 同网段通信:若在同一网段,通过 ARP 协议解析出 B 设备的物理地址(MAC 地址),直接通过局域网传输数据;
- 跨网段通信 :若不在同一网段,A 设备会将数据发送给本网段网关,由网关通过路由器的路由表,将数据转发到下一个网段,直到送达 B 设备的网关,最后由 B 的网关将数据传给 B 设备;
- 数据封装 / 解封装 :整个过程中,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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:67:23:80 brd ff:ff:ff:ff:ff:ff
altname enp19s0
altname ens224
inet 172.25.254.100/24 brd 172.25.254.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::b7e8:d88a:6485:552a/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost system-connections]# route -n #网关
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.25.254.2 0.0.0.0 UG 100 0 0 eth0
0.0.0.0 172.25.254.2 0.0.0.0 UG 101 0 0 eth1
172.25.254.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
172.25.254.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
[root@localhost system-connections]# cat /etc/resolv.conf #查看dns
# Generated by NetworkManager
search localdomain
nameserver 172.25.254.2
nameserver 114.114.114.114
3.网关的作用及配置方式
网关的核心作用
网关(Gateway)是不同网段之间的 "中转站 / 出入口",本质是一台具备路由功能的设备(路由器、交换机、服务器),拥有两个及以上不同网段的 IP 地址,核心作用有 3 个:
- 跨网段转发数据:是本地设备访问其他网段 / 外网的唯一通道,本地设备无法直接跨网段通信,必须通过网关转发;
- 地址转换(NAT):家用路由器的网关会将内网私有 IP(如 192.168.1.xxx)转换为外网公有 IP,实现内网设备访问互联网(核心作用,解决公有 IP 枯竭);
- 网络隔离与安全:网关可设置防火墙、访问规则,限制内网和外网的互访,提升网络安全性。
关键补充
- 默认网关:本地设备配置的 "首选网关",当设备需要跨网段通信时,会默认将数据发送到该网关,是最常用的网关配置;
- 内网私有 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 转换。
- 网关的配置方式
网关配置分为设备端配置 (给电脑 / 虚拟机配置默认网关,指向路由设备)和路由端配置 (路由器 / 网关设备自身的网关设置,对接上层网络),以下讲解常用的设备端默认网关配置(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:路由器 / 网关设备自身的网关配置(上层网关,对接外网)
-
打开浏览器,输入路由器的管理 IP(如 192.168.1.1,默认在路由器背面),输入管理员账号密码;
-
进入上网设置 / WAN 口设置,若为宽带拨号(PPPoE),输入宽带账号密码,路由器会自动获取运营商的上层网关;
-
若为静态 IP 上网(运营商分配固定公网 IP),手动填写运营商提供的公网 IP、子网掩码、上层网关、DNS,保存后即可;
-
路由器的 LAN 口网关(如 192.168.1.1)就是内网设备的默认网关,可在LAN 口设置中修改(如改为 192.168.0.1)。
-
常见问题
若设备配置网关后无法访问外网,大概率是网关 IP 填写错误 (需和设备 IP 同一网段)或网关设备(路由器)未正常联网。
4.dns的作用及配置方式
DNS(域名系统,Domain Name System)是 **"域名和 IP 地址的翻译器",解决了 "人类记不住复杂 IP,电脑只识别 IP" 的问题,核心作用是将 域名(如www.baidu.com)解析为对应的 IP 地址(如 180.101.50.188)**,让设备能通过 IP 访问互联网服务。
-
DNS 的核心作用
-
域名解析:正向解析(域名→IP)是最常用的,反向解析(IP→域名)主要用于服务器验证(如邮件服务器);
-
解析缓存:DNS 服务器会缓存解析结果,减少重复解析,提升访问速度;
-
负载均衡:大型网站的 DNS 服务器会将域名解析为多个不同的服务器 IP,实现流量分摊,保证网站访问稳定;
-
域名管理:通过 DNS 服务器实现域名的解析指向修改,如将域名解析到新的服务器 IP。
关键补充
- DNS 解析是分层的:根 DNS 服务器→顶级 DNS 服务器(如.com/.cn)→权威 DNS 服务器(网站专属),本地设备会先查询本地 DNS 缓存,再查询配置的 DNS 服务器;
- 本地 DNS 缓存:Windows/Linux 都会缓存近期的解析结果,若域名解析异常,可清空缓存解决。
- DNS 的配置方式
DNS 配置和 IP 配置联动,分为自动获取(由 DHCP 服务器 / 路由器分配) 和手动配置(自定义公共 DNS / 私有 DNS),支持 Windows/Linux/ 路由器多端配置,以下讲解实操步骤,同时包含缓存清空方法。
bash
[root@node10 ~]# vim /bin/vmset.sh
#!/bin/bash
[ "$#" -lt "3" ] && {
echo "error!!"
exit
}
CONNECTION=`nmcli connection show | awk "/$1/"'{print $1}'|grep $1`
[ "$?" -ne "0" ] && {
echo "$1" is in used !!
nmcli connection delete $CONNECTION
}
[ "$4" = "noroute" ] && {
cat >> /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1
[ipv4]
method=manual
address1=$2/24
EOF
}||{
cat >> /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1
[ipv4]
method=manual
address1=$2/24,172.25.254.2
dns=8.8.8.8;
EOF
}
chmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1
hostnamectl hostname $3
cat > /etc/hosts<< EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
$2 $3
EOF
ip a s $1
hostname
[root@node10 ~]# chmod +x /bin/vmset.sh
九.Linux下的本地存储管理
以下内容围绕磁盘分区表、分区命令、文件系统、RAID、LVM、find 命令、软硬连接 七大核心点讲解,以 RHEL/CentOS/Ubuntu 等主流 Linux 发行版为基准,兼顾原理理解 和实操命令,适配运维日常操作和学习备考,逻辑从磁盘底层到上层应用逐步推进。
1.磁盘分区表原理
磁盘分区表是硬盘的 "分区目录" ,存储在硬盘的主引导记录(MBR) 或GUID 分区表(GPT) 区域,作用是告诉操作系统硬盘被划分成了几个分区、每个分区的起始 / 结束扇区、文件系统类型、活动分区等信息,操作系统通过分区表识别和管理磁盘分区。硬盘的第一个扇区(0 扇区)是核心,包含主引导程序(446 字节)+ 分区表(64 字节)+ 结束标志(2 字节) ,分区表的格式决定了分区的数量、大小限制,主流分为MBR 和GPT两种,是所有磁盘操作的底层基础。
主流分区表类型对比(MBR vs GPT)
| 特性 | MBR 分区表 | GPT 分区表 |
|---|---|---|
| 支持磁盘大小 | 最大 2TB | 无限制(支持 18EB 以上) |
| 支持分区数量 | 最多 4 个主分区 / 3 主 + 1 扩展(扩展分区可分多个逻辑分区) | 最多 128 个主分区(无需扩展 / 逻辑分区) |
| 分区表存储 | 仅存于 0 扇区,无备份 | 存于多个扇区,有备份,容错性高 |
| 启动模式 | BIOS 启动 | UEFI 启动(兼容 BIOS) |
| 分区标识 | 分区类型 ID(如 83=ext4、82=swap) | GUID 唯一标识,更规范 |
核心补充
- 主分区 / 扩展分区 / 逻辑分区(仅 MBR):主分区可直接格式化使用,扩展分区仅作为 "容器" 存放逻辑分区,本身不可用;逻辑分区是扩展分区内的实际可用分区,解决 MBR 主分区数量限制。
- 分区编号 :Linux 中磁盘设备名如
/dev/sda(第一块 SATA 硬盘),主分区编号为 1-4(如sda1/sda2),逻辑分区从 5 开始(如sda5/sda6),GPT 分区无此编号限制。 - 分区表损坏:MBR 分区表损坏会导致硬盘分区无法识别,GPT 因有备份分区表,可通过备份恢复,安全性更高。
2.磁盘分区命令
Linux 中常用的磁盘分区命令有fdisk 、gdisk 、parted ,其中fdisk仅支持 MBR 分区表,gdisk专为 GPT 分区表设计,parted支持 MBR/GPT 且可在线调整分区(无需重启),实操中按分区表类型选择即可。
前置准备:查看磁盘设备
先通过以下命令确认磁盘名称和现有分区,避免误操作:
bash
运行
lsblk # 简洁查看磁盘/分区/挂载信息
fdisk -l # 详细查看磁盘分区表、扇区大小等
示例:fdisk -l /dev/sdb 仅查看第二块硬盘的信息。
- 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
- 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。
- 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.文件系统的作用及制作方式
- 文件系统的核心作用
文件系统是操作系统对磁盘分区的 "管理规则" ,建立了文件和磁盘扇区之间的映射关系,解决了如何在磁盘上存储、读取、删除文件,如何管理文件属性(权限、所有者、修改时间),如何分配磁盘空间 等问题。如果说分区表是 "硬盘分块",那文件系统就是给每个分块制定 **"文件存储规则",无文件系统的分区是裸分区 **,操作系统无法识别和使用。
核心功能
- 管理文件的存储位置 :通过inode(索引节点) 记录文件的存储扇区、大小、权限等,文件名仅存于目录项,和 inode 关联;
- 管理磁盘空间:通过块(block) 分配磁盘空间(默认 4KB,可自定义),避免磁盘碎片;
- 提供文件操作接口:让用户通过
cp/rm/mv等命令操作文件,无需直接操作扇区; - 记录文件元数据:所有者、所属组、权限(rwx)、访问 / 修改 / 改变时间等。
Linux 主流文件系统
| 文件系统 | 适用场景 | 特点 |
|---|---|---|
| ext4 | 系统盘、数据盘(最常用) | 兼容 ext3,支持大文件(16TB),日志型,稳定性高 |
| xfs | 大存储、高 IO 场景(RHEL7 + 默认) | 支持 EB 级文件,读写速度快,日志型,适合 RAID/LVM |
| swap | 交换分区 | 虚拟内存,当物理内存不足时使用 |
| vfat | Linux/Windows 双系统共享 | 兼容 Windows,无权限管理 |
| btrfs | 高性能、容错场景 | 支持快照、RAID、动态扩容,新一代文件系统 |
- 文件系统的制作方式(格式化)
制作文件系统即格式化分区 ,通过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(唯一标识)
扩展:挂载文件系统(格式化后必须挂载才能使用)
- 临时挂载(重启失效):
bash
运行
mkdir /data # 创建挂载点(空目录)
mount /dev/sdb1 /data # 将sdb1挂载到/data
- 永久挂载(重启生效,写入
/etc/fstab):
bash
运行
echo "/dev/sdb1 /data ext4 defaults 0 0" >> /etc/fstab
mount -a # 刷新挂载,无需重启生效
- 查看挂载结果:
bash
运行
df -h # 查看已挂载的文件系统、磁盘使用率
4.raid磁盘阵列
- RAID 核心原理
RAID(独立磁盘冗余阵列,Redundant Array of Independent Disks)是将多块物理硬盘通过硬件 / 软件方式组合成一个逻辑磁盘 ,目的是提升磁盘读写速度、提高数据容错性(冗余)、扩大存储容量 ,核心是分条(Striping)、镜像(Mirroring)、校验(Parity) 三种技术的组合。
- 分条:将数据分散存储到多块硬盘,并行读写,提升速度;
- 镜像:将数据同时复制到多块硬盘,一块损坏可从另一块恢复,提升容错;
- 校验:存储校验信息,某块硬盘损坏时,通过校验信息恢复数据。
RAID 分为硬件 RAID (通过 RAID 卡实现,性能高,适合企业级服务器)和软件 RAID (通过 Linux 系统自带工具mdadm实现,无需硬件,适合个人 / 小型服务器),常用 RAID 级别为RAID0、RAID1、RAID5、RAID6、RAID10 ,无最优级别,需根据速度、容错、成本需求选择。
- 常用 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) | 高速度 + 高容错需求(如核心数据库、高性能服务器) |
- 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,自动同步数据
核心补充
- RAID不能替代备份 :RAID 解决的是硬盘硬件故障,无法解决人为删除、病毒、磁盘阵列整体损坏等问题,重要数据仍需定期备份;
- 软件 RAID 性能略低于硬件 RAID,企业级场景优先选择硬件 RAID 卡;
- RAID5 写入速度较慢,因每次写入都要计算校验信息。
5.lvm逻辑卷
- LVM 核心原理
LVM(Logical Volume Manager,逻辑卷管理)是 Linux 的磁盘动态管理技术 ,打破了物理磁盘 / 分区的边界,将多块物理磁盘 / 分区封装为逻辑卷 ,实现磁盘空间的动态扩容 / 缩容、跨磁盘分配空间、快照备份 等功能,解决了传统分区大小固定、扩容需重启、无法跨磁盘 的痛点。传统分区格式化后大小固定,若空间不足,需重新分区、格式化,数据易丢失;LVM 将物理存储抽象为逻辑层,用户操作逻辑卷即可,无需关注底层物理磁盘,是 Linux 运维中磁盘管理的首选方式。
- LVM 的核心组件(从底层到上层)
LVM 分为 4 个层级,层层封装,所有组件均为逻辑概念,底层依赖物理磁盘 / 分区:
-
物理卷(PV,Physical Volume) :LVM 的最底层,将物理磁盘 / 分区格式化为 LVM 格式,成为 LVM 的 "原料",如
/dev/sdb1、/dev/sdc; -
卷组(VG,Volume Group) :将多个 PV 合并为一个 "存储池",池内空间可自由分配,卷组名自定义,如
vg_data; -
逻辑卷(LV,Logical Volume) :从 VG 中划分出的可用空间,相当于 "虚拟分区",可格式化、挂载使用,如
lv_data,大小可动态调整; -
物理扩展(PE,Physical Extent):VG 的最小分配单位,默认 4MB,PV 被划分为多个 PE,VG 将 PE 分配给 LV,是 LVM 空间分配的基础。
-
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
核心补充
- LVM 可和 RAID 结合使用:先做 RAID 提升容错 / 速度,再将 RAID 逻辑盘创建为 PV,实现 "容错 + 动态扩容";
- LVM 快照:可创建 LV 的快照,用于临时备份,如
lvcreate -s -L 10G -n lv_snap /dev/vg_data/lv_data; - 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
- 常用高级组合示例
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 与目录项
-
inode(索引节点) :每个文件对应唯一的 inode,存储文件的元数据 (大小、权限、所有者、存储扇区、时间等),无文件名,inode 号是文件的唯一标识;
-
目录项 :目录是特殊的文件,存储文件名 + 对应的 inode 号,即 "文件名→inode 号" 的映射关系;
-
文件访问流程 :用户输入
cat /root/test.txt→ 系统先查 /root 目录的目录项,找到 test.txt 对应的 inode 号 → 通过 inode 号找到文件的存储扇区 → 读取内容。 -
硬链接(Hard Link)原理
硬链接是给原文件的 inode 号新增一个文件名映射 ,即多个文件名指向同一个 inode 号,相当于给文件起了 "多个别名"。
核心特性
- inode 号相同:硬链接文件和原文件的 inode 号一致,ls -i 可查看;
- 依赖原文件的 inode :硬链接基于 inode 创建,不能跨文件系统 (不同文件系统的 inode 号不唯一),不能给目录创建硬链接(避免目录循环);
- 删除原文件不影响硬链接 :删除原文件只是删除了一个 "文件名→inode" 的映射,只要还有硬链接指向该 inode,文件数据就不会被删除;只有当所有硬链接(包括原文件)都被删除,inode 的链接数变为 0,系统才会释放文件的磁盘空间;
- 无独立文件属性:硬链接文件的属性和原文件完全一致,修改其中一个的内容 / 权限,其他所有硬链接都会同步变化。
硬链接创建命令:ln
bash
运行
ln 原文件 硬链接文件
# 示例
touch test.txt # 创建原文件
ln test.txt test_hard.txt # 创建硬链接文件test_hard.txt
ls -i test.txt test_hard.txt # 查看inode号,两者一致
- 软链接(Symbolic Link / 符号链接)原理
软链接是一个独立的文件 ,自身有唯一的 inode 号,文件内容存储的是原文件的绝对 / 相对路径,相当于 Windows 的 "快捷方式",系统访问软链接时,会根据路径跳转到原文件。
核心特性
- inode 号不同 :软链接是独立文件,inode 号和原文件不同,文件大小为原文件路径的字符数;
- 依赖原文件的路径 :软链接基于路径创建,可跨文件系统 ,可给目录创建软链接(最常用,如给大目录创建快捷方式);
- 删除原文件,软链接失效:原文件被删除后,软链接会变成 "断链"(红色闪烁),访问时提示 "没有那个文件或目录";
- 有独立文件属性 :软链接的权限始终为
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
- 软硬链接核心对比(必记)
| 特性 | 硬链接(Hard Link) | 软链接(Symbolic Link) |
|---|---|---|
| inode 号 | 和原文件一致 | 和原文件不同,独立 inode |
| 跨文件系统 | 不支持 | 支持 |
| 给目录创建 | 不支持 | 支持 |
| 原文件删除后 | 仍可访问(链接数 > 0) | 失效(断链) |
| 文件属性 | 和原文件完全一致 | 独立,权限固定为 lrwxrwxrwx |
| 文件大小 | 和原文件一致 | 为原文件路径的字符数 |
| 本质 | 原文件的多个文件名(别名) | 指向原文件的快捷方式(独立文件) |
-
实用场景
-
硬链接 :适合对重要文件做 "别名备份",如系统配置文件
/etc/fstab,创建硬链接后,即使原文件被误删,仍可通过硬链接恢复; -
软链接 :适合日常快捷访问,如将大目录挂载到其他位置、将程序的可执行文件链接到
/usr/bin(实现全局命令)、给版本更新的软件创建固定链接(如python3链接到python3.10)。