(1)

命令解释器 - shell

shell 译为壳,是 Linux 命令解释器,作用:接收用户输入指令,解析后传递给内核执行,实现人机交互。

命令两大分类
内置命令(shell 内建)
shell 自身自带指令,无需磁盘文件,执行速度快;不同 shell 内置命令略有差异。
示例:cdechoexit
外置命令
磁盘中存在独立二进制可执行文件,执行时需读取文件,速度较慢。
示例:treepingwget

type命令

区分命令类型
查询命令归属:内置命令 / 外置文件 / 别名 alias。
type -参数 命令名
参数说明
-a:列出该命令所有可用执行方式(内置 + 外部文件)
-t:仅输出类型标识(builtin/file/alias)

type -a cd
(注释: 查看cd全部执行形式)

cd 是 shell 内建
cd 是 /usr/bin/cd

type -t cd
( 注释:只看类型)

builtin 代表内置命令

type -t tree
(注释:tree是外部文件命令)

file

type ls
(注释:ls默认是别名;ls 是“ls --color=auto”的别名)

type -t ls
(注释:type 命令搭配 -t 参数,仅输出 ls 命令的类型;ls 属于 shell 内置命令,执行后会输出 builtin)

ls --color=auto
(注释:手动指定参数 ls --color=auto,和默认别名效果完全一致)

alias 别名演示

命令执行原理 & PATH 环境变量

外置命令查找规则:系统通过 PATH 环境变量存储所有可执行文件目录;
执行外部命令时,shell 按顺序遍历 PATH 内路径,匹配同名二进制文件,找到则执行,找不到提示 command not found。

vim .bash_profile
(注释:使用vim编辑器打开家目录下的登录环境配置文件)

PATH=$PATH:$HOME/bin:/opt/bin
扩充PATH环境变量
在原有路径后追加 $HOME/bin(用户家目录bin)、/opt/bin

source
(注释:立即加载 .bash_profile 里的环境变量,不用重新登录生效)
source .bash_profile
.bash_profile 是登录 shell 专属配置文件,用户 SSH 登录系统时会自动读取;修改后执行source可实时生效。
echo $PATH
(注释:打印当前系统PATH环境变量,验证自定义路径是否添加成功)
输出结果:可以看到末尾出现 /root/bin:/opt/bin,配置生效

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/root/bin:/opt/bin

profile 与 bashrc 区别(登录 shell / 交互式非登录 shell 区分)
Shell 启动类型

profile 系列(登录 Shell 专属)
系统全局:/etc/profile
用户私有:~/.bash_profile
触发场景:登录时(SSH 远程登录、本机输入账号密码登录)

bashrc 系列(交互式非登录 Shell 专属)
系统全局:/etc/bashrc
用户私有:~/.bashrc
触发场景:登录后新开终端窗口、执行bash命令新开子 shell(不用重新输密码登录)

加载顺序(SSH 登录完整流程)

先读全局登录配置 /etc/profile
再读用户登录配置 ~/.bash_profile
文件内自带代码会主动加载 ~/.bashrc
~/.bashrc 内部代码加载全局交互式配置 /etc/bashrc
加载链:
/etc/profile → ~/.bash_profile → ~/.bashrc → /etc/bashrc

profile(登录专用,仅登录执行 1 次)
作用:全局环境变量、PATH 路径、开机自启脚本
典型内容:
定义系统全局PATH、USER、HOSTNAME等长期生效环境变量
pathmunge函数,规范 PATH 追加逻辑
加载/etc/profile.d/目录下所有自定义环境脚本
执行次数:一次登录仅执行一遍,新开终端不会重复运行

bashrc(交互式终端,每次开终端都执行)
作用:命令别名 alias、自定义函数、终端交互配置
典型内容:
rm=‘rm -i’、ping=‘ping -c3’ 这类命令别名
终端颜色、补全、提示符样式配置
仅当前终端生效的临时自定义函数
执行次数:每打开一个新终端窗口 / 新开 bash 子进程都会重新加载

在这里插入图片描述
/etc/profile -> ~/.bash_profile -> ~/.bashrc -> /etc/bashrc
(注释:shell登录配置加载顺序:系统profile→用户bash_profile→用户bashrc→系统bashrc)

实操使用建议
要配置永久环境变量、系统路径 → 写到 ~/.bash_profile
要配置rm/cp/ping 别名、终端配色 → 写到 ~/.bashrc
修改后快速生效:
修改 profile:source ~/.bash_profile
修改 bashrc:source ~/.bashrc

Linux Shell 特殊符号

Linux 中的特殊符号对照表

多条命令同行
pwd; ls -l; date

通配符批量匹配
ls test*
(注释:) # 匹配test开头所有文件
ls test?
(注释:) # test后跟1个字符
ls [0-9].txt
(注释:) # 匹配1.txt、2.txt等
rm [!a-z].log
(注释:) # 删除非小写字母开头的日志
touch file{1,2,3}.txt
(注释:) # 批量创建文件

转义 \ 换行长命令
find /etc -name passwd \
-type f 2>/dev/null

引号区别对比

echo '$PATH'
(注释:单引号:原样输出$PATH
echo "$PATH"
(注释:双引号:解析变量,打印路径)
echo date
(注释:反引号执行date命令输出时间)
\
(注释:在命令前加反斜杠 \,会绕过当前 shell 设置的 alias 别名,直接执行系统原始二进制程序,临时关闭别名效果。)
ls
(注释:使用ls别名(系统默认ls --color=auto,文件区分彩色))

输出文件,带颜色区分目录/压缩包
etc  etc.tar.bz2  etc.tar.gz

\ls
(注释:反斜杠\作用——临时取消ls别名,直接调用原始ls二进制命令,无彩色)

 输出纯黑白文件列表
etc  etc.tar.bz2  etc.tar.gz

touch file 1
(注释:touch后空格分隔两个参数,创建名为file、1的两个独立文件)
ll
(注释:ll是ls -l的别名,查看文件详细属性:权限、属主、大小、修改时间)

total 19088
-rw-r--r-- 1 root root        0 Jun 27 09:25 1
(注释:普通文件1,权限644,文件大小0字节)
-rw-r--r-- 1 root root        0 Jun 27 09:25 file
(注释:普通文件file,大小0字节)

touch file\ 1
(注释:反斜杠\转义空格,将"file 1"识别为单个文件名,创建带空格的文件)
ll
(注释:再次列出目录,新增带空格名称的文件file 1)

-rw-r--r-- 1 root root        0 Jun 27 09:25 file 1
(注释:带空格文件名file 1创建完成)

echo hostname
(注释:无特殊符号,直接原样输出文本字符串hostname)

hostname

hostname
(注释:执行hostname系统命令,输出本机主机名server1)

server1

(https://i-blog.csdnimg.cn/direct/9dd1e02f2d084e199f6703c89b1db8c2.png)
(注释:反引号实现命令替换,先执行hostname命令,再打印命令返回结果)

echo $PATH
(注释:无引号,shell解析变量$PATH,打印PATH环境变量实际内容)

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/

echo "$PATH"
(注释:双引号保留变量解析功能,输出PATH完整内容,支持换行等特殊字符)

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/

echo '$PATH'
(注释:单引号完全屏蔽变量、转义符解析,原样输出字符
串$PATH)

$PATH

(3)

Linux 命令别名 alias

alias 是命令快捷方式,简化冗长高频指令,减少重复输入,提升运维效率。

alias 别名='原命令 + 参数'
查看当前所有别名
直接输入 alias,系统会输出预设 + 自定义别名:
alias ll='ls -l --color=auto'
alias rm='rm -i'
alias ping='ping -c 5'
l.
(注释:l.是ls -d .*别名,列出所有隐藏文件)
. .bash_history .bash_profile .cshrc .pki .viminfo
… .bash_logout .bashrc .lesshst .tcshrc
实用自定义别名

alias untar='tar -zxvf '
(注释:解压统一命令 untar)
alias wget='wget -c '
(注释:wget 断点续传下载)
alias getpass="openssl rand -base64 20"
(注释:一键生成随机密码 getpass)
alias ping='ping -c 5'
(注释:限制 ping 仅发送 5 次包)
alias ipe='curl shturl.cc/jE'
(注释:一键查看公网 IP ipe)
alias c='clear'
(注释:极简清屏 c)

alias rar='tar zcf'
(注释:自定义别名rar,等价tar zcf,用于创建gzip压缩包)
alias unrar='tar zxf'
(注释:自定义别名unrar,等价tar zxf,用于解压gzip压缩包)
rar etc.tar.gz /etc
(注释:调用rar别名,将/etc目录打包写入etc.tar.gz)
ll
(注释:查看打包后的压缩文件详情)

total 10160
-rw-r--r-- 1 root root 10401102 Jun 27 09:31 etc.tar.gz

unrar etc.tar.gz
(注释:调用unrar别名,解压etc.tar.gz至当前目录)
ll
(注释:解压完成,目录生成etc文件夹)

total 10172
drwxr-xr-x 74 root root     8192 Jun 27 09:16 etc
-rw-r--r-- 1 root root 10401102 Jun 27 09:31 etc.tar.gz

alias ping='ping -c 5'
(注释:自定义ping别名,默认发5个数据包)
type ping
(注释:ping 是“ping -c 5”的别名)
ping www.qq.com
(注释:执行时自动携带参数 ping -c 5 www.qq.com)

删除别名
unalias 别名名

unalias ping

临时别名 vs 永久别名
临时生效
终端直接执行 alias xxx=‘xxx’,仅当前登录会话有效,重启 Shell / 重登后失效。
永久生效两种方案
用户级(仅当前 root / 普通用户生效):写入 ~/.bashrc
全局级(所有系统用户生效):写入 /etc/bashrc

永久配置步骤
vim ~/.bashrc
(注释:编辑配置文件写入alias)
source ~/.bashrc
(注释:重载配置,立即生效无需重启终端)
cat .bashrc
(注释:查看当前用户家目录下交互式shell配置文件.bashrc完整内容)
vim编辑.bashrc文件内容
vim .bashrc
(注释:使用vim编辑用户交互式shell配置文件)

# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ping='ping -c3'
# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

source .bashrc
(注释:重新加载.bashrc,使新增别名无需重登立即生效)

(4)

history 命令

history 用于查看当前用户执行过的所有命令历史记录,支持快速重放历史指令、管理历史记录条数。

history [参数/数字]
数字(如 history 5):只输出最近 N 条历史命令
-c:清空当前终端内存中的全部命令历史

history 5
(注释:查看最近5条执行记录)

输出示例

   13  vim ~/.bashrc
   14  ping www.baidu.com
   15  source ~/.bashrc
   16  ping www.baidu.com
   17  history 5

!序号 快速重复执行对应编号的历史命令
!16
(注释:重新执行第16行 ping www.baidu.com)

修改历史记录最大保存条数
系统默认通过 HISTSIZE 控制可记录的命令行数,默认值通常为 1000。

永久修改全局配置

vim /etc/profile
(注释:编辑全局环境变量配置文件)

找到配置项 HISTSIZE=1000,修改数字自定义上限
HISTSIZE=2000
(注释:最多保存2000条历史命令)

生效方式二选一
重启服务器:reboot
重载配置(无需重启):source /etc/profile

历史文件持久化:用户所有历史会存入 ~/.bash_history,退出终端时写入;
!字符串 快速执行最近一条匹配开头的命令:!ping 执行上一次 ping 命令;
用户单独配置:仅修改当前用户可编辑 ~/.bash_profile,不用改 /etc/profile。

(5)

Linux 用户与用户组

用户分类(三类)
超级用户 root
UID=0,拥有系统全部权限;仅系统维护时使用,日常尽量避免直接登录,降低安全风险。
系统用户
UID 范围 1~999,服务后台进程专用(bin、daemon、sshd 等),禁止登录系统。
普通用户
UID ≥1000,日常操作人员使用,权限受限,保护系统安全。

用户组两类
基本组(私有组)
新建用户不指定组时,自动创建与用户名同名的组,作为该用户默认主组。
附加组(公有组)
可容纳多个用户,组内成员共享该组文件权限。

四大核心账户配置文件

/etc/passwd
(注释:用户基础信息库,所有用户可读,仅存账号不存明文密码)
/etc/shadow
(注释:用户加密密码影子文件,仅 root 可读,保障密码安全)
/etc/group
(注释:用户组基础信息)
/etc/gshadow
(注释:用户组加密密码)

/etc/passwd
格式:账号:x:UID:GID:注释:家目录:登录Shell
示例:root:x:0:0:root:/root:/bin/bash

7 个字段拆分:
登录用户名
密码占位符x,代表密码存在 shadow 中
UID 用户唯一身份编号:root=0、系统用户 1-999、普通用户≥1000
GID 用户默认基本组 ID
备注信息(姓名、电话等)
用户家目录,普通用户默认/home/用户名
登录 Shell,/bin/bash可登录,/sbin/nologin禁止登录

id root
(注释:id 查看用户 ID 信息)

用户id=0(root) 组id=0(root)=0(root)

/etc/shadow 影子密码文件
权限严格----------,仅 root 可读,存放加密密码,一行 9 段用:分隔:

登录名:加密密码:上次改密码天数:最小间隔:最大有效期:警告天数:闲置锁定:过期时间:保留
fox:$6$Jx9.nyHl$Tmb3MQGXkLY0M7ZFG/LVoHIKSuUX70DTLuQGDMpAGZNxi3NpJqipLzONFuuT9IlLS6VaN3FRlsLHXLiQGJTPZ1:20618:0:99999:7:::

/etc/group 用户组文件
格式:组名:x:GID:附加用户列表
示例:root:x:0:
四字段:组名、组密码占位符、GID、逗号分隔的附加组成员

(6)

Linux 用户管理 useradd/usermod/passwd/userdel/su

添加用户 useradd

useradd [参数] 用户名

-c添加用户注释信息(姓名、备注)
-d 指定自定义家目录,默认/home/用户名
-e YYYY-MM-DD 设置账号失效日期
-f密码过期后闲置多少天锁定账号
-g 指定基本组(组必须提前存在)
-G指定附加组,多组逗号分隔
-M不自动创建用户家目录
-N不自动创建同名私有基本组
-s指定登录 Shell,/sbin/nologin禁止登录
-u自定义 UID,搭配-o可重复 UID

useradd test1
(注释:最简新建用户 test1(自动生成家目录、同名基本组、bash 登录 shell))

tail -1 /etc/passwd
tail -1 /etc/shadow
ls -ld /home/test1
(注释:查看用户信息)

useradd -u 2001 -s /bin/bash -e -1 test2
(注释:指定 UID、永不过期账号)
useradd -M -s /sbin/nologin test3
(注释:FTP 专用账号,禁止登录、不创建家目录)
useradd -u 3001 -g test1 -d /test test4
(注释:指定 UID、基础组、自定义家目录)

修改用户信息 usermod

usermod [参数] 用户名

-c/-d/-g/-G/-s/-u:用法和useradd完全一致
-l 新用户名:修改登录名(用户不能处于登录状态)
-L 锁定账号,禁止登录
-U 解锁锁定账号

usermod test1 -l TEST1 -L
(注释:修改用户名并锁定账号)

mkdir /home/test4
(注释:在 /home 目录下创建名为 test4 的文件夹,一般用作 test4 用户的家目录)
usermod test4 -d /home/test4
(注释:迁移用户家目录到/home/test4)
tail -1 /etc/passwd
(注释:读取 /etc/passwd 用户配置文件,仅打印文件最后一行内容,常用于查看最后创建的系统用户信息)

设置 / 管理用户密码 passwd

Linux 用户必须设置密码才能登录;仅 root 可指定其他用户修改密码,普通用户只能改自身密码。

passwd [参数] 用户名

-d清空密码,空密码可登录
-e强制下次登录修改密码
-l锁定账号
-u解锁账号
-n/-x密码最短 / 最长有效期

批量免交互设置密码

echo "密码" | passwd --stdin test5
(注释:标准输出提示)

echo "密码" | passwd --stdin test5 > /dev/null
(注释:屏蔽输出信息)

passwd -l test2
(注释:锁定账号示例)

删除用户

userdel [-r] 用户名
-r:删除用户同时删除家目录、邮件数据;不加仅删账号,保留家目录
注意
用户正在登录 / 有进程占用时无法删除,需退出登录后再执行

userdel -r TEST1
userdel -r test2
(注释:删除用户同时删除家目录、邮件数据)

用户切换

su 用户名
su - 用户名
核心区别
su 用户名:仅切换身份,不加载完整登录环境,仅加载局部配置~/.bashrc /etc/bashrc
su - 用户名:完整登录模式,重新加载全部环境变量(/etc/profile、用户个人 profile),生产环境推荐使用

切换密码规则
root 切换任意普通用户:无需密码
普通用户切换 root / 其他用户:必须输入目标用户密码

Linux sudo 权限提权

sudo 作用
普通用户临时获取管理员权限执行受限命令,避免长期使用 root 登录降低安全风险;
权限需要 root 提前在 /etc/sudoers 配置授权,未授权用户执行 sudo 会提示不在 sudoers 文件。

无权限报错演示

su fox
(注释:切换普通用户fox)
cd /root
(注释:直接访问root目录权限不足)
sudo cd /root
(注释:尝试sudo提权访问)

报错:fox 不在 sudoers 文件中。此事将被报告。

sudo 完整执行流程
普通用户执行sudo 命令,输入自身登录密码验证;
root 执行 sudo 无需输密码;
系统读取 /etc/sudoers 配置文件,匹配当前用户授权规则;
匹配到合法权限:以授权身份执行目标命令;
无匹配权限:拒绝执行并记录系统日志。

sudo 权限配置方法
推荐编辑命令:visudo
自带语法校验,写错配置会提示,避免直接vim /etc/sudoers改错导致 sudo 失效。

visudo

root     ALL=(ALL)              ALL
字段拆分:用户名  主机范围=(可切换身份)  允许执行的命令
ALL通配含义:任意主机 / 任意用户身份 / 全部系统命令

授权普通用户示例
给 fox 用户授予完整管理员权限:

visudo
(注释:编辑 sudoers 文件)
添加规则
:100
(注释:跳转到第100行)
fox ALL=(ALL) ALL
保存退出(visudo 正常 wq 即可;直接 vim 编辑需 wq! 强制保存)

授权后验证
su - fox
(注释:切换为fox用户)
cd /root
(注释:直接cd /root依旧权限不足(内置命令无法被sudo提权))
sudo bash -c "cd /root && pwd"
(注释:sudo提权执行)
补充说明:cd是 shell 内置命令,不能直接sudo cd,需用sudo bash -c嵌套执行。

fox ALL=(ALL) /usr/bin/systemctl restart nginx,/usr/bin/ls
(注释:仅允许执行指定命令(最小权限原则))
fox ALL=(ALL) NOPASSWD: ALL
(注释:免密 sudo,无需输入密码)

tail -1 /etc/passwd
(注释:查看passwd文件最后一行用户wxh信息)

wxh:x:1000:1000::/home/wxh:/bin/bash

ll /etc/shadow
(注释:查看密码影子文件权限,仅root可读)

---------- 1 root root 608 Jun 27 10:09 /etc/shadow

tail -1 /etc/shadow
(注释:查看wxh用户影子密码行,!!代表无有效密码)

wxh:!!:20631:0:99999:7:::

man shadow
(注释:查看shadow配置手册页)
man 5 shadow
(注释:查看第5章节shadow文件格式手册)
tail -1 /etc/group
(注释:查看用户组文件最后一行,wxh组GID1000)

wxh:x:1000:

id wxh
(注释:查看wxh用户UID、GID、附属组)

uid=1000(wxh) gid=1000(wxh) groups=1000(wxh)

passwd wxh
(注释:修改wxh用户登录密码)

Changing password for user wxh.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
(注释:密码长度不足8位警告,但root可强制设置,密码更新完成)

tail -1 /etc/shadow
(注释:修改密码后,shadow内wxh行生成加密密码串)

wxh:$6$KghATs9G$YWENGNx8byWQDLsG8Z4MCuld1jpJe7kdvKITMDMQB0PDEHSqsQJpwu8krk70PdneKSIIIItjorJG1hrr4CGc9k.:20631:0:99999:7:::

passwd --help
(注释:打印passwd命令全部参数帮助文档)
passwd -l wxh
(注释:-l锁定wxh用户密码,shadow密码字段前添加!!禁止登录)

Locking password for user wxh.
passwd: Success

tail -1 /etc/shadow
(注释:锁定后wxh密码字段开头变为!!,禁止登录验证)

wxh:!!:$6$KghATs9G$YWENGNx8byWQDLsG8Z4MCuld1jpJe7kdvKITMDMQB0PDEHSqsQJpwu8krk70PdneKSIIIItjorJGthr4CGc9k.:20631:0:99999:7:::

ssh wxh@localhost
(注释:本地ssh登录wxh用户,主机指纹确认

wxh@localhost's password:
Permission denied, please try again.
wxh@localhost's password:

(注释:密码正确但账户被锁定,登录校验失败)
passwd -u wxh
(注释:-u解锁wxh用户密码,移除密码前!!,恢复登录权限)

Unlocking password for user wxh.
passwd: Success

tail -1 /etc/shadow
(注释:解锁后shadow中wxh恢复完整加密密码串,无!!前缀)

wxh:$6$KghATs9G$YWENGNx8byWQDLsG8Z4MCuld1jpJe7kdvKITMDMQB0PDEHSqsQJpwu8krk70PdneKSIIIItjorJG1hr4CGc9k.:20631:0:99999:7:::

ssh wxh@localhost
(注释:ssh登录wxh,提示上次登录失败记录)

wxh@localhost's password:
Last failed login: Sat Jun 27 10:27:56 CST 2026 from localhost on
There was 1 failed login attempt since the last successful login.
[wxh@server1 ~]$ logout
Connection to localhost closed.

last
(注释:查看系统用户登录历史记录)
cat /var/log/
(注释:查看/var/log日志目录下所有日志文件)
cat /var/log/secure
(注释:读取ssh、用户认证安全日志,记录登录成功/失败事件)

vim /etc/shadow
(注释:编辑shadow文件,查看所有系统用户影子条目,锁定用户密码前带!!)

wxh:!!:$6$KghATs9G$YWENGNx8byWQDLsG8Z4MCr4CGc9k.:20631:0:99999:7:::

:wq!
(注释:vim强制保存并退出命令)

usermod -s /sbin/nologin wxh
(注释:修改wxh用户登录shell为nologin,禁止交互式登录)
tail -1 /etc/passwd
(注释:查看passwd最后一行wxh条目,shell已变为/sbin/nologin)

wxh:x:1000:1000::/home/wxh:/sbin/nologin

ssh wxh@localhost
(注释:本地ssh尝试登录wxh,密码输入后提示账户不可用,登录阻断)
vim /etc/passwd
(注释:编辑用户配置文件passwd,修改用户shell字段)

wxh:x:1000:1000::/home/wxh:/bin/bash

(注释:手动将wxh的shell改回/bin/bash,shell为可登录bash)
:wq
(注释:保存passwd修改并退出编辑器)

ssh wxh@localhost
(注释:wxh shell恢复为bash,ssh输入密码正常登入)
[wxh@server1 ~]$ logout

vim /etc/passwd
(注释:再次编辑passwd)

test:x:1001:1001::/home/test:/bin/bash

(注释:passwd 内新增 test 用户条目,shell 为可登录 bash)
:wq
(注释:保存 passwd 修改并退出编辑器)
vim /etc/shadow
(注释:编辑影子密码文件shadow)

wxh:$6$KghATs9G$YWENGNx8byWQDLsG8Z4MCuld1jpJeCGc9k.:20631:0:99999:7:::
test:$6$KghATs9G$YWENGNx8byWQDLsG8Z4MCuld1jp4CGc9k.:20631:0:99999:7:::

(注释:添加test,其余复制wxh的内容)
:wq
(注释:保存shadow修改退出vim)

vim /etc/group
(注释:编辑用户组配置文件group)

wxh:x:1000:
test:x:1001:

(注释:group文件记录各用户对应私有组ID)
:wq
(注释:保存group文件并退出vim)
tail -1 /etc/passwd
(注释:查看最后一行test用户配置,家目录/home/test,登录shell bash)

test:x:1001:1001::/home/test:/bin/bash

ssh test@localhost
(注释:ssh登录test用户,家目录不存在,报错无法切换家目录,进入根目录受限shell)

test@localhost's password:
Could not chdir to home directory /home/test: No such file or directory
-bash-4.2$ pwd
/
-bash-4.2$ ls
bin  dev  home  lib64  mnt  proc  run  srv  tmp  var
boot etc  lib   media  opt  root  sbin  sys  usr
-bash-4.2$ logout
Connection to localhost closed.

mkdir /home/test
(注释:创建test用户专属家目录)
ll -d /home/test/
(注释:查看家目录权限,当前属主属组为root)
drwxr-xr-x 2 root root 6 Jun 27 10:37 /home/test/
chown test.test /home/test/
(注释:修改家目录属主、属组为test用户与test组)
ssh test@localhost
(注释:家目录权限修复后,ssh登录正常进入/home/test)

test@localhost's password:
Last login: Sat Jun 27 10:36:58 2026 from localhost
-bash-4.2$ ls
-bash-4.2$ pwd
/home/test
-bash-4.2$ l .

logout
(注释:退出当前ssh登录会话,断开与本机的连接)
cd /home/
(注释:切换工作目录到/home目录,存放所有普通用户家目录)
ll
(注释:长格式列出当前/home目录下所有文件与目录,展示权限、属主、大小、时间、名称)
chmod 700 test/
(注释:修改test目录权限为700,仅目录属主拥有读写执行权限,同组和其他用户无任何权限)
cd wxh/
(注释:切换到wxh用户的家目录/home/wxh)
l.
(注释:等价ls -A,查看当前目录所有隐藏文件,展示bash环境配置文件)
cd /etc/default/
(注释:切换到/etc/default目录,存放系统服务默认配置文件)
ls
(注释:列出/etc/default内文件:grub、nss、useradd)
cd /
(注释:切换到Linux根目录/)
cd /home/
(注释:回到/home用户家目录总目录)
cp wxh/.* test/
(注释:复制wxh目录下所有隐藏文件到test目录,系统忽略.和…两个特殊目录,输出提示omitting directory)
cd test/
(注释:进入test用户家目录)
l.
(注释:查看test目录所有隐藏bash配置文件)
ll .*
(注释:长格式查看所有隐藏文件,展示文件权限、属主、修改时间)
chown test.test .*
(注释:修改当前目录所有隐藏文件的属主、属组为test用户、test组)
ssh test@localhost
(注释:通过ssh协议本地登录test用户,输入密码完成登录)
pwd
(注释:打印当前工作目录,输出/home/test)
id
(注释:查看当前登录用户test的uid、gid、所属附加组)
usermod -L test
(注释:锁定test用户,在/etc/shadow密码字段添加!,禁止登录)
tail -1 /etc/shadow
(注释:查看shadow文件最后一行,查看test用户密码加密字段,锁定后开头带!)
usermod -U test
(注释:解锁test用户,移除shadow密码字段前的!,恢复登录权限)
passwd test
(注释:交互式修改test用户登录密码,手动输入新旧密码)
echo testpass | passwd --stdin test
(注释:管道非交互式修改test用户密码,stdstdin标准输入模式,脚本批量改密码专用)
userdel test
(注释:删除test用户,仅删除passwd/shadow/group内用户记录,默认不删除/home/test家目录)
tail -1 /etc/passwd
(注释:查看passwd最后一行,验证test用户已删除,仅剩wxh用户记录)
tail -1 /etc/shadow
(注释:查看shadow最后一行,验证test密码记录已删除)
tail -1 /etc/group
(注释:查看group最后一行,验证test私有用户组已删除)
ll -d /home/test/
(注释:查看test用户遗留家目录,用户删除后目录仍保留)
rm -fr /home/test/
(注释:强制递归删除test用户家目录,释放文件资源)
id
(注释:查看当前root用户uid=0、gid=0,超级管理员身份)

chattr +i /etc/passwd
(注释:给passwd添加不可变i属性,禁止删除、修改、重命名文件)
lsattr /etc/passwd
(注释:查看文件扩展属性,显示i属性已开启)

----i----------- /etc/passwd

useradd test
(注释:添加用户test,passwd带i锁无法写入,创建失败)

useradd: cannot open /etc/passwd

ll /etc/shadow
(注释:查看影子密码文件权限)

---------- 1 root root 608 Jun 27 10:09 /etc/shadow

rm -f /etc/passwd
(注释:强制删除passwd,i属性保护拒绝删除操作)

rm: cannot remove ‘/etc/passwd’: Operation not permitted

ll /etc/passwd
(注释:查看passwd基础权限)

-rw-r--r-- 1 root root 883 Jun 27 10:09 /etc/passwd

stat /etc/passwd
(注释:查看文件完整元数据:大小、inode、权限、时间戳)

File: ‘/etc/passwd’
Size: 883        Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 33561545    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/   root)   Gid: (    0/   root)
Access: 2026-06-27 10:15:01.882097415 +0800
Modify: 2026-06-27 10:09:48.027902305 +0800
Change: 2026-06-27 10:14:50.969021079 +0800
Birth: -

file /etc/passwd
(注释:判断文件类型,passwd是纯ASCII文本文件)

/etc/passwd: ASCII text

rm -f /etc/passwd
(注释:尝试删除带i锁的passwd,操作被拒绝)
rm: cannot remove ‘/etc/passwd’: Operation not permitted
lsattr /etc/passwd
(注释:查看扩展属性,i标记代表不可变锁开启)
----i----------- /etc/passwd
chattr -i /etc/passwd
(注释:移除/etc/passwd文件的不可变i扩展属性,允许修改删除该文件)
lsattr /etc/passwd
(注释:查看文件扩展属性,输出显示无i锁)
------------- /etc/passwd

su wxh
(注释:仅切换用户身份,不加载wxh用户环境变量,工作目录不变)
pwd
(注释:切换后仍停留在/root目录,普通用户无root目录访问权限)
ls
(注释:wxh用户无/root目录读取权限,提示Permission denied)
exit
(注释:退出su切换的wxh会话,回到root)
su - wxh
(注释:完整切换wxh用户,加载用户环境变量,自动进入wxh家目录)
su
(注释:无参数su,交互式输入root密码切换为root)
su -
(注释:完整切换root,加载root环境变量,进入/root目录)
logout
(注释:退出当前登录会话,回到上一层用户终端)

ll /etc/sudoers
(注释:查看sudo权限配置文件/etc/sudoers的基础权限,输出-r–r-----. 1 root root 4328 Sep 30 2020 /etc/sudoers,文件仅root可读,防止普通用户篡改提权配置)
vim /etc/sudoers
(注释:直接使用vim编辑sudo配置文件,风险操作,无语法校验,写错会导致sudo全部失效,不推荐)
visudo
(注释:官方专用编辑sudoers工具,自带语法检测,保存前校验配置语法,错误会提示,推荐修改sudo权限时使用)

/etc/sudoers 配置语法片段逐行注释

## Syntax:
(注释:注释行,说明文件语法格式)
##        user    MACHINE=COMMANDS
(注释:标准授权格式:用户名 在哪台主机=(以哪个身份执行) 允许执行的命令)
## The COMMANDS section may have other options added to it.
(注释:命令段可以附加额外控制参数,比如免密NOPASSWD)
 ## Allow root to run any commands anywhere
(注释:注释说明,允许root用户在所有主机执行全部命令)
  root    ALL=(ALL)       ALL
(注释:root授权规则,ALL代表所有主机、(ALL)代表可切换任意用户、最后ALL代表所有系统命令)
  wxh     ALL=(ALL)       ALL
(注释:给普通用户wxh授予完整sudo权限,等同于root,执行sudo任意命令需要输入wxh自身密码)

su - wxh
(注释:完整切换登录wxh用户,加载wxh用户全部环境变量、家目录配置)
[wxh@server1 ~]$ fdisk -l
(注释:普通wxh用户直接执行磁盘查看命令fdisk -l)
fdisk: cannot open /dev/sda: Permission denied
fdisk: cannot open /dev/sr0: Permission denied
fdisk: cannot open /dev/mapper/centos-root: Permission denied
fdisk: cannot open /dev/mapper/centos-swap: Permission denied
(注释:普通用户无磁盘设备读写权限,直接执行fdisk全部报错权限不足)
[wxh@server1 ~]$ sudo fdisk -l
(注释:使用sudo临时提升root权限执行磁盘查看命令)

We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:
  #1) Respect the privacy of others.
  #2) Think before you type.
  #3) With great power comes great responsibility.
(注释:sudo默认安全提示文案,提醒谨慎使用高权限)
  [sudo] password for wxh:
(注释:需要输入wxh用户自身密码验证,验证通过后执行fdisk)

[wxh@server1 ~]$ logout
(注释:退出wxh普通用户,返回root管理员终端)
[root@server1 ~]# visudo
(注释:root再次打开sudo配置编辑器,修改wxh免密权限)

wxh     ALL=(ALL)       NOPASSWD: ALL

(注释:修改后的wxh授权规则,NOPASSWD代表wxh执行sudo任意命令无需输入密码)
[root@server1 ~]# su - wxh
(注释:重新登录wxh用户测试免密sudo)
[wxh@server1 ~]$ sudo fdisk -l
(注释:免密执行磁盘查看,无需输入密码直接输出磁盘信息)

[wxh@server1 ~]$ systemctl status sshd
(注释:普通wxh用户查看ssh服务运行状态,查询类操作无需root权限,直接执行)

[wxh@server1 ~]$ systemctl restart sshd
(注释:普通用户尝试重启ssh服务,修改服务需要root权限,触发sudo身份校验)

==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: root
Password:

(注释:系统提示需要root身份验证,无对应sudo授权则无法执行重启服务)
[wxh@server1 ~]$ which systemctl
(注释:查询systemctl命令的真实路径)
/bin/systemctl
(注释:输出systemctl完整执行路径/bin/systemctl,用于精细化sudo授权)
[wxh@server1 ~]$ nmcli c s
(注释:普通用户查看网卡连接配置,查询网络信息无需root权限)
输出本机网卡连接名称、UUID、硬件设备名

NAME                UUID                                  TYPE      DEVICE
 Wired connection 1  e531f9b4-c775-320f-adea-e691bae5e98b  ethernet  eth0
 ens32               7974eb33-a279-4fc1-86a1-92a8850280ea  ethernet  --

[root@server1 ~]# logout
(注释:root用户退出终端会话)
[root@server1 ~]# visudo
(注释:root再次编辑sudoers,精细化授权wxh仅能执行systemctl命令)

root    ALL=(ALL)       ALL
(注释:root用户sudo全权限,无需密码,可执行全部系统命令)
wxh     ALL=(ALL)       NOPASSWD: /bin/systemctl
(注释:精细化免密授权,wxh仅能免密执行/bin/systemctl一条命令,无法使用fdisk、rm等其他root命令,最小权限原则)
root    ALL=(ALL)       ALL
(注释:root用户拥有完整无限制sudo权限)
wxh     ALL=(ALL)       NOPASSWD: /bin/systemctl restart sshd
(注释:细化权限,wxh仅免密执行systemctl重启sshd这一条指令,不能操作其他服务)

[wxh@server1 ~]$ sudo fdisk -l
(注释:普通用户wxh尝试免密执行磁盘查看命令fdisk,权限未生效,系统拒绝执行)
;Sorry, user wxh is not allowed to execute ‘/sbin/fdisk -l’ as root
(注释:sudo报错提示,wxh没有执行fdisk的sudo权限)
[wxh@server1 ~]$ sudo systemctl restart sshd
(注释:wxh执行授权范围内的systemctl重启sshd命令,免密执行成功无报错)
[wxh@server1 ~]$ ip
(注释:直接执行ip命令,仅输出命令帮助,未提权,普通用户权限有限)

[wxh@server1 ~]$ ip a s
(注释:普通用户执行ip查看网卡地址,无需sudo即可读取网络信息)
[wxh@server1 ~]$ ip link set down dev eth0
(注释:wxh尝试关闭网卡,修改网络硬件状态需要root权限,未加sudo直接执行失败)

RTNETLINK answers: Operation not permitted

(注释:内核网络接口返回报错,操作权限不足)

[wxh@server1 ~]$ which ip
(注释:查询ip命令的完整系统路径)

/usr/sbin/ip

(注释:输出ip命令存放路径,后续visudo授权需填写完整路径才能生效)
[wxh@server1 ~]$ logout
(注释:退出wxh普通用户登录,回到root管理员终端)
[root@server1 ~]# visudo
(注释:root执行visudo编辑sudo权限配置文件/etc/sudoers)

root    ALL=(ALL)       ALL=(ALL)               
wxh     ALL=(ALL)       NOPASSWD: /bin/systemctl, /usr/sbin/ip, /sbin/fdisk

(注释:修改后的sudo权限配置,给wxh免密授权三条完整路径命令:系统服务管理、网络操作、磁盘分区查看)

(7)

Linux 用户组管理 groupadd/groupmod/gpasswd/groupdel

创建用户组

groupadd [参数] 组名

参数说明
-g GID:手动指定组 ID,不指定则自动取现有最大 GID+1
-r:创建系统组,自动分配 1~999 区间 GID,多用于服务后台

groupadd grop1
(注释:普通组,自动分配GID)
groupadd -g 2000 group2
(注释:指定GID=2000创建组group2)
tail -2 /etc/group
(注释:查看组文件验证)

修改用户组

groupmod [参数] 旧组名
(注释:修改用户组 groupmod)

参数
-g GID:修改组的 GID
-n 新组名:修改组名称

groupmod -g 3000 -n group11 group1
(注释:将 group1 改名为 group11,同时修改 GID 为 3000)
tail -1 /etc/group
(注释:读取存放用户组信息的 /etc/group 文件,只输出末尾最后一行,用于查看最后新增的用户组条目)

管理组内成员 gpasswd

gpasswd [参数] 用户名 组名

-a 将单个用户加入附加组
-d 将用户从组中移除
-M 批量添加多个用户,逗号分隔
-A 指定组管理员(管理员可自行增减组员,无需 root)
-r 删除组密码

gpasswd -a temp1 group2
gpasswd -a temp2 group2
(注释:将 temp1、temp2 加入 group2)

gpasswd -A temp1 group2
(注释:指定 temp1 为 group2 的组管理员)
权限说明
仅 root 和该组指定管理员,可执行 gpasswd 增减组员。

删除用户组

groupdel 组名

groupdel group1
(注释:删除名称为 group1 的用户组)
重要限制
如果该组是某个用户的基本组(私有组),无法直接删除;
必须先删除对应用户,或修改用户的基本组,再执行删除。

tail -1 /etc/group
(注释:查看group文件最后一行,查看用户组信息)
groupadd -g 2000 demo
(注释:新建组demo,指定GID为2000)
tail -1 /etc/group
(注释:验证demo组创建成功)
useradd -g demo test
(注释:创建用户test,指定主组为demo)
id test
(注释:查看test用户的UID、GID、附属组信息)
useradd -G demo user1
(注释:创建用户user1,将demo设为附属附加组)
id user1
(注释:查看user1用户的UID、GID、附属组信息)
groupmod -g 3000 demo
(注释:修改demo组的GID为3000)
id user1
(注释:验证组GID修改后,user1附属组同步更新)
tail -1 /etc/group
(注释:查看group文件最后一行,确认demo组GID变更)
tail -2 /etc/group
(注释:查看group文件最后两行)
groupdel demo
(注释:尝试删除demo用户组)

groupdel: cannot remove the primary group of user 'test'
(注释:报错提示,test用户主组是demo,无法直接删除)

id test
(注释:查看test用户当前组信息,GID已同步为3000)
usermod -g user1 test
(注释:修改test用户的主组为user1)
id test
(注释:验证test主组修改完成)
id user1
(注释:查看user1的组信息,仍附属demo组)
groupdel demo
(注释:删除demo用户组,此时无用户以它为主组)
userdel -r user1
(注释:删除user1用户并同步删除家目录)

userdel: group user1 is the primary group of another user and is not removed

系统成功删除了 user1 这个用户账号,但是同名组 user1 没有被删除。
原因:存在其他用户(图里是 test)把 user1 组设为自己的主组(gid),系统不允许删除正在被他人当作主组的用户私有组。
groupdel user1
(注释:删除user1私有用户组)
tail -2 /etc/group
(注释:验证user1组已被删除)

(8)

Linux 用户登录查看命令

users 极简查看当前在线用户
仅输出当前登录的用户名,无额外信息,输出最简洁

users
示例输出:root

w 综合在线用户详情(运维最常用)
同时展示系统负载、在线用户、空闲时长、当前执行进程、CPU 占用

输出字段解析

11:19:38 up 1 day, 17:48,  2 users,  load average: 0.07, 0.04, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      Wed18    6:50m  0.40s  0.40s -bash
root     pts/0    192.168.52.1     04:29    2.00s  1.34s  1.32s -bash

首行:当前时间、开机时长、在线总用户、1/5/15 分钟系统负载
用户列表字段:
USER:登录用户名
TTY:终端类型(pts 远程终端 /tty 本地终端)
LOGIN@:登录时间
IDLE:终端空闲时长
JCPU:该终端全部进程累计 CPU 耗时
PCPU:当前前台进程 CPU 耗时
WHAT:用户正在运行的命令

w
快速只看用户行
w -h
(注释:(注释:w 命令用于查看当前登录系统的所有用户及进程负载,-h 参数隐藏命令头部标题行,只展示纯登录用户信息))

who:查看在线登录终端信息
数据源:/var/run/utmp(实时在线记录)

who
(注释:基础:用户名、终端、登录时间、登录IP)
who -b
(注释: 查看系统上次开机时间)
who -r
(注释:查看当前系统运行级别)
who -q
(注释:只打印用户名+在线总人数)
who am i
(注释:查看自己当前终端登录信息)
who -u
(注释:附带终端空闲时间、进程PID)
字段:用户名、终端、登录时间、来源 IP、终端读写权限标记

last 历史登录记录(含重启日志)
数据源:/var/log/wtmp(持久化历史登录日志)
查看历史所有登录记录,包含正常登出、异常崩溃、服务器重启记录
常用参数

last
(注释:全部历史登录)
last -2
(注释:只展示最近2条记录)
last -n 3
(注释:最近3条登录日志)
last -f /var/log/wtmp
(注释:指定日志文件读取)
关键字段:用户名、终端、来源 IP、登录时段、still logged in(仍在线)、reboot(开机记录)

lastlog:查看每个账号最后一次登录时间
数据源:/var/log/lastlog
遍历系统全部账号,输出每个账号最近一次登录记录;系统账号大多显示「从未登录过」,适合巡检闲置账号、审计异常登录。
lastlog

在这里插入图片描述

ll /var/log/wtmp
(注释:查看wtmp登录日志文件的权限、大小、修改时间,wtmp记录所有用户登录、重启记录)
file /var/log/wtmp
(注释:识别文件类型,输出data代表二进制数据文件,不能直接cat读取)
echo > /var/log/wtmp
(注释:清空wtmp二进制登录日志,覆盖原有全部登录记录)
last
(注释:读取/var/log/wtmp二进制文件,输出所有历史登录、系统重启记录,清空后日志起始时间更新)
lastlog
(注释:读取/var/log/lastlog,展示系统每个用户最后一次登录时间、终端、来源IP)
ll /var/log/lastlog
(注释:查看lastlog文件属性,lastlog单独记录每个用户末次登录信息)
file /var/log/lastlog
(注释:识别lastlog文件类型,是特殊格式化文本,无法直接cat正常阅读)
cat /var/log/lastlog
(注释:直接读取lastlog二进制格式化文件,输出乱码,无可读性)
echo > /var/log/lastlog
(注释:清空lastlog文件,清除所有用户末次登录记录)
lastlog
(注释:再次执行查看所有用户末次登录,清空后所有用户均显示从未登录:Never logged in)

(9)

Linux 文件系统基础权限

查看文件权限
使用 ls -l / ll 查看文件完整权限信息
一条记录分为:文件类型、9 位权限、硬链接数、属主 u、属组 g、大小、修改时间、文件名。

权限三大对象
u (owner) 属主 / 所有者:文件创建者
g (group) 属组:归属用户组内全部成员
o (other) 其他人:不属于前两类的所有用户
a (all)等价 u+g+o,全部三类用户

三种基础权限 r w x
在这里插入图片描述

组合计算示例:
rwx = 4+2+1 = 7
rw- = 4+2 = 6
r-x = 4+1 = 5
r-- = 4

权限对文件 / 目录的不同作用
在这里插入图片描述

关键注意点
root 用户不受 r/w 读写权限限制,但执行 x 权限依然生效;
目录仅给 w 不给 x,无法新建 / 删除文件,必须同时具备 wx。

数字转字符
764 → rwxrw-r--
642 → rw-r---w-
字符转数字
rw-r--r-- → 644
r-xrw-r-- → 564

修改权限

chmod 命令
两种语法格式
格式 1:字符方式 chmod [ugoa][+-=][rwx] 文件
+:增加权限
-:移除权限
=:直接赋值权限,清空原有权限

chmod +x t1.txt
(注释:给所有用户增加执行权限)

chmod o+w t1.txt
(注释:给其他用户增加写权限)

格式 2:数字方式 chmod 三位数字 文件

chmod 777 t2.txt
(注释:全部用户最高权限)
chmod 000 t2.txt
(注释: 所有权限全部清空)

核心参数 -R 递归修改
批量修改目录及内部所有子目录、文件权限

chmod -R 755 m1
(注释:递归将m1目录下全部内容权限改为755)

修改文件属主、属组

chown
修改文件 / 目录的所有者 (u) 和所属组 (g),仅 root 有权执行。

同时修改属主+属组
chown [-R] 用户名:组名 文件/目录

只改属主
chown [-R] 用户名 文件

只改属组
chown [-R] :组名 文件
-R:递归修改目录下所有文件、子目录的归属
实操示例

touch t4.txt
(注释:创建空文件 t4.txt,若文件已存在则更新文件时间戳)
ll t4.txt
(注释:长格式查看 t4.txt 文件的权限、属主、大小、修改时间等详细属性)

chown fox:fox t4.txt
(注释:修改所有者和组都为fox)
ll t4.txt
(注释:长格式查看 t4.txt 文件的权限、属主、大小、修改时间等详细属性)

Linux 三种特殊权限总览

普通 rwx 是基础 9 位权限,额外存在 3 种特殊权限,用于精细化权限控制:
SUID:属主位 s 权限
SGID:属组位 s 权限
Sticky Bit:其他位 t 粘滞位

四位数字权限规则

四位权限 = 第 1 位特殊权限位 + 后 3 位常规 rwx 权限位
第一位是特殊权限标识:
在这里插入图片描述
大小写 s/t 区别
小写s/t:原本该位自带 x 执行权限,特殊权限生效
大写S/T:原本没有 x 执行权限,特殊权限无法生效

举例对照
0777
(注释:)首位 0 = 无特殊权限;后三位 777 = 所有者、组、其他人全部读写执行

等价简写 chmod 777 文件名

1777
(注释:首位 1 = 开启粘滞位;后三位 777 全员 rwx,就是 /tmp 目录标准权限)
4755
(注释:首位 4=SUID 权限;属主 rwx,组和其他只读可执行,passwd 命令默认权限)
2755
(注释:首位 2=SGID 权限,目录下新建文件自动继承目录的用户组)

SUID 就是:谁写的这个程序,别人运行它的时候,就临时变成「这个程序主人」的身份去跑程序,跑完立刻变回自己原本身份。

/etc/shadow 存放用户加密密码
这个文件只允许 root 超级用户读写,普通用户任何权限都没有。
你登录密码就存在这里,普通用户本来完全没有资格修改它。

/usr/bin/passwd 改密码命令
执行 ll /usr/bin/passwd
得到权限:-rwsr-xr-x root root

拆解权限字符串 -rwsr-xr-x:
最开头 -:这是普通二进制可执行文件
前三位 rws:文件所有者(root 用户) 的权限
r 读、w 写、s = SUID 特殊权限 + x 执行权限
中间三位 r-x:所属组用户 可读可执行
最后三位 r-x:其他所有人 可读可执行
这个程序文件本身是 root 创建、归属 root。
三、普通用户改密码的完整流程(不带 SUID 会直接报错)
你是普通用户wxh,想执行passwd改自己密码;
目标是把新密码写入/etc/shadow,但 shadow 不让普通用户碰;
因为 passwd 带了SUID:
✅ 你一运行passwd这条命令,系统自动临时把你的身份临时替换成 root;
✅ 以 root 权限打开 shadow 文件,修改你账号对应的密码字段;
✅ 命令执行完毕、程序退出,临时 root 身份直接回收,你变回普通 wxh 用户。
如果删掉 SUID(把 s 改成 x,权限变成 - rwxr-xr-x)
普通用户再输 passwd 改密码,会直接提示权限不足,修改失败,因为没有临时 root 权限去写 shadow。
四、两条硬性限制(为什么不能随便乱用 SUID)
只对编译好的二进制程序生效
shell 脚本、目录文件夹加 SUID 完全没用,系统不会识别这个特殊权限,防止权限滥用漏洞。
权限是临时的,不是永久提权
只有程序正在运行的那几秒是文件所有者身份,程序关闭,特权立刻消失,不会一直持有 root 权限。

-rwsr-xr-x 四位数字权限是 4755
首位4 专门代表开启 SUID 权限;
后面 755 就是常规 rwx r-x r-x 基础权限。

假设一个文件test所有者是 root,权限 4755 带 SUID:
普通用户 tom 执行./test
→ 运行期间 tom=root
→ test 跑完关闭
→ tom 变回普通 tom 用户。

显示规则:
原 x 权限存在:显示小写 s (-rwsr-xr-x)
原 x 权限缺失:显示大写 S,代表 SUID 失效

chmod u+s test.bin
(注释:字符方式)
chmod 4755 test.bin
(注释: 数字方式(4开头,基础755))

SGID (Set GID)

分文件、目录两种场景:

作用在二进制文件
用户执行程序时,进程所属组变为该文件的属组。

作用在目录(常用)
目录下新建的所有文件 / 子目录,自动继承该目录的属组,多用于多人协作项目目录。

显示规则
组位原有 x 权限:小写 s
无 x 权限:大写 S,SGID 失效

chmod g+s project_dir
(注释:字符添加SGID)

chmod 2775 project_dir
(注释:数字 2775)

Sticky Bit 粘滞位

仅对目录生效,文件无效
目录配置 Sticky Bit 后:
目录内用户即使拥有 w/x 权限,只能删除 / 改名自己创建的文件,无法删除他人文件;root 不受限制。
典型系统目录:/tmp
所有用户都可读写 tmp,加粘滞位防止互相删除临时文件

ls -ld /tmp

drwxrwxrwt. 17 root root 4096 /tmp
(注释:末尾t代表Sticky Bit)

chmod o+t /tmp_test
(注释: 字符方式)
chmod 1777 /tmp_test
(注释:数字 1777)

字符赋值
chmod u+s file
(注释:加SUID)
chmod u-s file
(注释:移除SUID)
chmod g+s dir
(注释:加SGID
chmod g-s dir
(注释:移除SGID)
chmod o+t dir
(注释:加粘滞位)
chmod o-t dir
(注释: 移除粘滞位)

四位数字示例
chmod 4755 passwd_test
(注释:SUID + rwxr-xr-x)
chmod 2770 team_dir
(注释:SGID + rwxrwx—)
chmod 1777 public_dir
(注释:Sticky + rwxrwxrwx)
chmod 6755 tool
(注释:SUID+SGID 755)

ACL 访问控制列表

突破传统 u/g/o 三类权限限制,单独给指定用户 / 用户组分配独立权限,适用于精细化多人权限管控;
文件 / 目录权限末尾出现 + 标识,代表该对象配置了 ACL 权限。

查看 ACL 权限 getfacl
getfacl 文件名/目录

输出字段说明:

user::rw-:文件属主默认权限
user:pt:r-x:单独给 pt 用户设置的 ACL 权限
group::rwx:文件属组默认权限
mask::rwx:ACL 权限掩码,限制所有 ACL 用户 / 组最大可用权限
other::---:其他用户普通权限

设置 ACL setfacl 核心参数
在这里插入图片描述

需求:创建/project目录,组 QQgroup 包含 zhangsan、lisi;旁听用户 pt 仅拥有 r-x 只读权限,无法写入。

环境准备
mkdir /project
(注释:创建项目目录/project)
useradd zhangsan
useradd lisi
(注释:创建两个普通用户 zhangsan、lisi)
groupadd QQgroup
(注释:创建用户组QQgroup)
gpasswd -M zhangsan,lisi QQgroup
(注释: -M 批量把zhangsan、lisi加入QQgroup附加组)
chown root:QQgroup /project
(注释:修改目录属主root,属组QQgroup)
chmod 770 /project
(注释:目录权限770:仅属主root、属组QQgroup内成员可读可写可进入;其他用户完全无权限)

此时权限现状:
root:rwx 完全控制
zhangsan、lisi(QQgroup 组员):rwx,可在 /project 创建 / 删除文件
其他所有用户(包括 pt):--- 无任何权限,连进入目录都做不到

setfacl -m u:pt:r-x /project
(注释: 给pt用户单独配置ACL只读权限)

-m:修改 ACL 规则
u:pt:指定用户 pt
r-x:分配读、执行权限,没有 w 写权限
作用:打破原本 770 对 other 的限制,单独给 pt 放行权限:
r:能 ls 查看目录内文件
x:能 cd 进入 /project
缺少 w:不能新建、删除、修改目录内文件

ll -d /project
(注释:验证ACL标识(末尾带+);末尾的 + 号代表:该文件 / 目录配置了 ACL 访问控制列表,存在额外单独用户权限。)

drwxrwx---+ 2 root QQgroup 6 /project

查看完整 ACL 规则

getfacl
getfacl /project

输出解读:

plaintext
 file: project
owner: root
group: QQgroup
user::rwx          # 属主root权限 rwx
user:pt:r-x        # ACL单独给pt用户 r-x
group::rwx         # 属组QQgroup默认权限 rwx
mask::rwx          # ACL最大权限掩码,限制所有ACL用户最高权限
other::---         # 其他普通用户默认无权限

su - pt
(注释:切换到旁听用户pt)
cd /project
(注释:能成功进入目录(有x权限))
touch test.txt
(注释: 尝试新建文件,报错权限不足(缺少w写权限))
setfacl -x u:pt /project
(注释:删除pt这条单独ACL权限)
setfacl -b /project
(注释:清空目录全部ACL规则)

核心逻辑总结
传统 ugo 权限中 pt 属于 other,本来完全进不去目录;
通过 ACL 单独给 pt 分配 r-x,实现只读访问;
只给 r-x 不给 w,所以只能查看,不能增删改文件;
该场景适合「项目旁听、只读查看,不允许修改」的业务需求。

ACL 删除操作

setfacl -x u:pt /project
(注释:删除pt用户单独ACL权限)
setfacl -b /project
(注释:删除目录全部ACL规则)

umask 新建文件 / 目录默认权限掩码

计算规则
系统新建对象的原始最大权限:
普通文件默认最大权限:0666(无执行权限,安全机制)
目录默认最大权限:0777(必须带 x 才能进入目录)
实际权限计算公式:
新文件权限 = 0666 - umask
新目录权限 = 0777 - umask

查看

umask
(注释:系统默认root为 0022)

示例计算(umask=0022):
文件:666 - 022 = 644 → -rw-r–r–
目录:777 - 022 = 755 → drwxr-xr-x

修改

umask
临时修改(当前终端生效,重启失效)
umask 000
(注释:新建文件666,目录777)
touch file2
mkdir dir2

永久修改
编辑用户环境配置 ~/.bashrc,末尾添加 umask 0022,执行 source ~/.bashrc 生效;
全局修改所有用户编辑 /etc/profile。

useradd user1
(注释:创建user1用户,自动生成同名私有组user1,分配UID/GID)
id user1
(注释:查看user1用户UID、GID、所属全部组)

uid=1001(user1) gid=1001(user1) groups=1001(user1)

useradd -g user1 user2
(注释:创建user2,指定主组为已有组user1,不新建user2私有组)
id user2
(注释:查看user2信息,主组GID=1001(user1))

uid=1002(user2) gid=1001(user1) groups=1001(user1)

userdel -r user1
(注释:删除user1并删除家目录;user1是user2主组,组无法删除,系统提示)

userdel: group user1 is the primary group of another user and is not removed.

id user1
(注释:查询user1,用户已删除,提示不存在)

id: user1: no such user

tail -1 /etc/group
(注释:查看组文件最后一行,user1组仍保留)

user1:x:1001:

id user2
(注释:user2仍存在,主组依旧是user1)
uid=1002(user2) gid=1001(user1) groups=1001(user1)
userdel -r user2
(注释:删除user2并清除家目录,无其他用户占用user1组)
id user2
(注释:user2已删除,查询无此用户)

id: user2: no such user

tail -1 /etc/group
(注释:查看组文件末尾,user1组仍存在)

user1:x:1001:

groupdel user1
(注释:删除无用户占用的user1用户组)
tail -1 /etc/group
(注释:查看组文件最后一行,仅剩wxh组)

wxh:x:1000:

useradd user1
(注释:重新创建user1,自动新建user1私有组)
id user1
(注释:查看新建user1的UID、GID、附属组)

uid=1001(user1) gid=1001(user1) groups=1001(user1)

userdel -r user1
(注释:彻底删除user1,同步删除家目录与私有组)
id user1
(注释:user1已删除,查询提示无此用户)

id: user1: no such user

tail -1 /etc/group
(注释:组文件末尾依旧只有wxh组)

wxh:x:1000:

ll /etc/passwd
(注释:查看用户配置文件passwd的权限、大小、修改时间)
-rw-r–r-- 1 root root 883 Jun 27 14:08 /etc/passwd
cd /usr/
(注释:切换工作目录到/usr)
ls
(注释:列出/usr下所有子目录)
bin etc games include lib lib64 libexec local sbin share src tmp
ll -Z sysctl.conf
(注释:查看sysctl.conf文件权限与SELinux安全上下文)
-rw-r–r–. root system_u:object_r:system_conf_t:s0 sysctl.conf

chown -R wxh dir1/
(注释:-R递归修改dir1及内部所有文件属主为wxh,属组不变root)
ll
(注释:查看dir1目录权限,属主wxh、属组root)

total 0
drwx------ 2 wxh root 19 Jun 27 14:17 dir1

ll dir1/
(注释:查看dir1内file1,属主wxh、属组root)

total 0
-rwx------ 1 wxh root 0 Jun 27 14:04 file1

chown -R wxh.wxh dir1/
(注释:递归修改dir1及内部文件属主wxh、属组wxh)
ll
(注释:dir1属主属组均变为wxh)

total 0
drwx------ 2 wxh wxh 19 Jun 27 14:17 dir1

ll dir1/
(注释:内部file1属主属组同步变为wxh)

total 0
-rwx------ 1 wxh wxh 0 Jun 27 14:04 file1

chgrp root dir1/
(注释:修改dir1目录属组为root,仅目录,内部文件不变)
ll
(注释:dir1属主wxh、属组变回root)

total 0
drwx------ 2 wxh root 19 Jun 27 14:17 dir1

ll -d /tmp/
(注释:查看/tmp目录权限,默认带粘滞位t)

drwxrwxrwt. 8 root root 172 Jun 27 14:22 /tmp/

chmod o-x /tmp/
(注释:移除other用户的执行权限,粘滞位变为T大写)
ll -d /tmp/
(注释:权限变为drwxrwxrwT.)

drwxrwxrwT. 8 root root 172 Jun 27 14:22 /tmp/

chmod o+x /tmp/
(注释:恢复other执行权限,粘滞位变回小写t)
ll -d /tmp/
(注释:权限恢复drwxrwxrwt.)

drwxrwxrwt. 8 root root 172 Jun 27 14:22 /tmp/

ls
(注释:列出当前目录)
dir1
ll
(注释:查看dir1原始权限)

total 0
drwx------ 2 wxh root 19 Jun 27 14:17 dir1

chmod 1777 dir1/
(注释:设置权限1777,开启全部读写执行+粘滞位t)
ll
(注释:dir1权限drwxrwxrwt)

total 0
drwxrwxrwt 2 wxh root 19 Jun 27 14:17 dir1

chmod 2777 dir1/
(注释:设置权限2777,开启全部读写执行+SGID组置位)
ll
(注释:dir1权限drwxrwsrwx)

total 0
drwxrwsrwx 2 wxh root 19 Jun 27 14:17 dir1

chown -R root.wxh dir1/
(注释:递归修改dir1目录及其内部所有文件的属主为root,属组为wxh)
ll
(注释:长格式列出当前目录下文件/目录,展示权限、属主、属组、大小、时间等信息)
cd dir1/
(注释:切换工作目录到dir1文件夹内)
ll
(注释:长格式查看dir1内file1文件详细权限信息)
cd ..
(注释:返回上一级工作目录,回到/root)
ll
(注释:再次长格式查看/root目录内容,确认dir1目录权限)
useradd user1
(注释:创建普通用户user1,自动生成同名私有组user1与家目录)
useradd user2
(注释:创建普通用户user2,自动生成同名私有组user2与家目录)
usermod -G wxh user1
(注释:将user1追加加入wxh附属组,-G代表附加附属组)
usermod -G wxh user2
(注释:将user2追加加入wxh附属组)
id user1
(注释:查看user1用户的uid、gid、全部所属组信息)
id user2
(注释:查看user2用户的uid、gid、全部所属组信息)
mv dir1/ /mnt/
(注释:将dir1目录移动到/mnt目录下,完成目录迁移)
ll -d /mnt/
(注释:仅查看/mnt挂载目录自身权限)
cd /mnt/
(注释:切换工作目录到/mnt)
ll
(注释:长格式查看/mnt内dir1目录权限)
chmod g-s dir1/
(注释:移除dir1目录的SGID(组置位)权限)
ll
(注释:查看移除SGID后dir1目录的权限变化)
chmod 770 dir1/
(注释:修改dir1目录权限为770,属主、属组拥有全部权限,其他用户无权限)
ll
(注释:查看修改数字权限后的dir1目录权限)
id user1
(注释:再次查看user1的用户ID与所属组)
id user2
(注释:再次查看user2的用户ID与所属组)
su - user1
(注释:完整登录切换至user1,加载用户环境变量并进入user1家目录)
cd /mnt/dir1/
(注释:user1身份切换到/mnt/dir1目录)
ll
(注释:user1身份长格式查看dir1内file1文件权限)
touch user1file
(注释:user1身份创建空文件user1file,文件默认属主属组为user1)
ll
(注释:查看新建user1file的权限、属主属组信息)
id user1
(注释:查看当前登录user1的用户ID、所属组)
logout
(注释:退出user1会话,切回root用户终端)
su - user2
(注释:完整登录切换至user2,加载用户环境变量)
cd /mnt/dir1/
(注释:user2身份进入/mnt/dir1目录)
ll
(注释:user2身份长格式查看目录内所有文件)
touch user2file
(注释:user2身份创建空文件user2file,属主属组默认user2)
ll
(注释:查看新增user2file后的全部文件列表)
logout
(注释:退出user2会话,切回root终端)
ll
(注释:root身份长格式查看/mnt下dir1目录)
chmod g+s dir1/
(注释:给dir1目录添加SGID组置位权限,目录内新建文件自动继承目录属组wxh)
ll
(注释:查看添加SGID后dir1目录权限,组权限位出现s标识)
su - user1
(注释:完整登录切换user1用户)
ll
(注释:user1查看自身家目录,无文件输出)
cd /mnt/dir1/
(注释:user1进入/mnt/dir1目录)
ll
(注释:user1长格式查看目录内所有文件权限)
touch file2
(注释:user1在带SGID的dir1内新建file2,文件属组自动继承目录组wxh)
ll
(注释:查看新建file2的属主user1、属组wxh)
logout
(注释:退出user1会话,回到root)
su - user2
(注释:完整登录切换user2用户)
cd /mnt/dir1/
(注释:user2进入/mnt/dir1目录)
ll
(注释:user2长格式查看目录内所有文件)
touch file3
(注释:user2在SGID目录内新建file3,属主user2、属组自动继承wxh)
ll
(注释:查看新增file3的权限、属主、属组信息)
logout
(注释:退出user2会话,切回root)
which mount
(注释:查找mount命令的可执行文件路径,输出/usr/bin/mount)
ll /usr/bin/mount
(注释:长格式查看mount命令文件权限,可见SUID权限位s)

gpasswd -a user1 test
(注释:-a参数,将user1用户添加到test附加组,输出提示Adding user user1 to group test)
gpasswd -a user1 demo
(注释:将user1用户添加到demo附加组,输出提示Adding user user1 to group demo)
id user1
(注释:查看user1用户UID、GID、所有归属组,输出uid=1001(user1) gid=1001(user1) groups=1001(user1),1000(wxh),1003(test),1004(demo),可见user1同时属于user1、wxh、test、demo四个组)
gpasswd -d user1 test
(注释:-d参数,从test组中移除user1用户,输出提示Removing user user1 from group test)
id user1
(注释:再次查看user1归属组,test组已消失,仅剩user1、wxh、demo)
usermod -G test user1
(注释:-G 覆盖式附加组,直接将user1的附加组仅设置为test,会清空原有wxh、demo附加组)
id user1
(注释:查看结果,user1附加组只剩test,wxh、demo被覆盖清除)
usermod -aG demo user1
(注释:-aG 追加附加组,保留原有test组,额外添加demo组,不会覆盖原有附加组)
id user1
(注释:user1附加组恢复为test、demo两组)
usermod -G "" user1
(注释:-G后传入空字符串,清空用户所有附加组)
id user1
(注释:user1无任何附加组,仅保留自身私有主组user1)
ll
(注释:查看/mnt目录下dir1文件夹基础权限,输出drwxrws— 2 root wxh 79 Jun 27 14:30 dir1,组位带s代表开启SGID特殊权限)
chmod g-s dir1/
(注释:移除dir1目录的SGID特殊权限,清除组位s标记)
ll
(注释:再次查看dir1权限,变为drwxrwx—,s标记消失)
id user1
(注释:user1无附加组,仅自身主组user1)
id user2
(注释:user2主组user2,附加组wxh)
su - user1
(注释:完整切换登录user1用户,加载用户环境变量)
cd /mnt/dir1/
(注释:user1尝试进入dir1目录,目录组权限rwx,但user1不属于wxh组,other权限—,报错-bash: cd: /mnt/dir1/: Permission denied)
ls
(注释:查看user1家目录内容,无输出)
cd /mnt/
(注释:进入/mnt上级目录,/mnt默认other有x权限,可正常进入)
ls
(注释:列出/mnt内文件,仅显示dir1)
cd dir1/
(注释:再次尝试进入dir1,无对应权限,依旧提示Permission denied)
logout
(注释:退出user1用户,返回root终端)
su - user2
(注释:切换登录user2用户,user2属于wxh附加组)
cd /mnt/dir1/
(注释:user2属于wxh组,目录组权限rwx,可正常进入dir1目录)
ls
(注释:列出目录内原有文件file1 file2 file3 user1file user2file)
rm -fr *
(注释:wxh组拥有w权限,可删除目录内全部文件)
ll
(注释:目录内文件全部清空,无输出)
touch file1
(注释:在dir1新建file1文件)
ll
(注释:查看新建文件权限-rw-rw-r-- 1 user2 user2 0 Jun 27 15:11 file1,无SGID时文件属组为创建者user2自身主组)
logout
(注释:退出user2,回到root)
ll
(注释:查看dir1目录基础权限drwxrwx— 2 root wxh 19 Jun 27 15:11 dir1)
id user2
(注释:确认user2归属组uid=1002(user2) gid=1002(user2) groups=1002(user2),1000(wxh))
chmod 750 dir1/
(注释:修改dir1数字权限750,对应字符rwxr-x—,组权限变为r-x,other无任何权限)
ll
(注释:查看dir1权限更新为drwxr-x— 2 root wxh 19 Jun 27 15:11 dir1)
getfacl dir1/
(注释:查看dir1默认ACL规则,无自定义用户ACL,仅基础ugo权限:user::rwx group::r-x other::—)
setfacl -m u:user1:rwx dir1/
(注释:-m 设置ACL,单独给user1用户分配rwx完整权限,突破基础ugo权限限制)
ll
(注释:dir1权限末尾出现+标记,代表该目录存在ACL权限)
getfacl dir1/
(注释:查看完整ACL配置,新增user:user1:rwx规则,自动生成mask::rwx限制ACL最大权限)
su - user1
(注释:切换user1用户测试ACL权限)
cd /mnt/dir1/
(注释:ACL赋予user1 rwx,拥有x权限可正常进入目录)
ls
(注释:可读取目录内file1文件)
touch file2
(注释:ACL赋予w权限,可新建file2文件)
ll
(注释:查看两个文件,file1属主user2,file2属主user1)
logout
(注释:退出user1,返回root)
su - user2
(注释:切换user2用户,user2属于wxh组,目录组权限r-x)
cd /mnt/dir1/
(注释:组权限r-x,可正常进入目录)
ls
(注释:列出file1、file2两个文件)
ll
(注释:查看文件归属与权限)
id user2
(注释:确认user2归属wxh附加组)
touch file3
(注释:目录组权限仅r-x,无w写权限,无法新建文件,报错touch: cannot touch ‘file3’: Permission denied)
ll
(注释:目录内文件无变化)
logout
(注释:退出user2,回到root)
setfacl -m u:user2:--- dir1/
(注释:给user2单独设置ACL权限为无任何权限—,覆盖原有组权限带来的访问能力)
getfacl dir1/
(注释:查看更新后的ACL,新增user:user2:—规则,user2无任何访问权限)
su - user2
(注释:切换user2用户测试ACL限制)
id
(注释:user2依旧属于wxh组,但ACL优先级高于普通ugo权限)
cd /mnt/
(注释:/mnt目录other有x权限,可进入上级目录)
ll
(注释:能看到dir1目录)
cd dir1/
(注释:ACL设置user2无任何权限,无法进入目录,报错Permission denied)
ls
(注释:仅能查看/mnt下dir1目录名,无法进入内部)
logout
(注释:退出user2,返回root)
setfacl -x u:user2 dir1/
(注释:-x 删除指定用户user2的ACL权限规则)
getfacl dir1/
(注释:ACL中user:user2规则消失,仅保留user1的ACL配置)
setfacl -b dir1/
(注释:-b 删除目录下全部ACL权限,清空所有自定义用户ACL规则)
ll
(注释:dir1末尾的+标记消失,ACL全部清除,恢复普通ugo权限drwxr-x—)

mkdir dir1
(注释:创建名为dir1的目录)
ll
(注释:再次查看目录详细信息,验证dir1创建完成)
drwxr-xr-x 2 root root 6 Jun 27 15:38 dir1
(注释:dir1目录权限755,属主root、属组root)
touch file1
(注释:创建空文件file1)
ll
(注释:查看当前目录所有文件、目录权限)
drwxr-xr-x 2 root root 6 Jun 27 15:38 dir1
(注释:dir1目录权限、归属、创建时间信息)
-rw-r–r-- 1 root root 0 Jun 27 15:38 file1
(注释:file1文件权限644,属主root、属组root,文件大小0字节)
umask
(注释:查看当前系统默认权限掩码)
0022
(注释:root用户默认掩码为0022,新建目录默认755、文件644)
su - wxh
(注释:完全切换至wxh普通用户,加载wxh环境变量)
Last login: Sat Jun 27 21:42 CST 2026 on pts/0
(注释:wxh用户上一次登录记录)
mkdir dir2
(注释:wxh用户创建dir2目录)
touch file2
(注释:wxh用户创建空文件file2)
ll
(注释:wxh查看家目录文件权限)
drwxrwxr-x 2 wxh wxh 6 Jun 27 15:38 dir2
(注释:dir2目录权限775,属主wxh、属组wxh)
-rw-rw-r-- 1 wxh wxh 0 Jun 27 15:38 file2
(注释:file2文件权限664,属主wxh、属组wxh)
cd /mnt
(注释:切换工作目录到/mnt)
getfacl dir1/
(注释:查看dir1目录的ACL访问控制权限)

 # file: dir1/
(注释:标识当前查看的对象为dir1目录)
 # owner: root
(注释:dir1目录属主用户为root)
 # group: wxh
(注释:dir1目录属组为wxh)
 user::rwx
(注释:文件属主root拥有读、写、执行全部权限)
 group::r-x
(注释:文件属组wxh拥有读、执行权限,无写权限)
 other::---
(注释:其他所有用户无任何读写执行权限)

cd
(注释:切换到当前登录用户的家目录,root执行即回到/root)
mkdir /project
(注释:在根目录下创建project目录)
ll -d /project/
(注释:仅查看/project目录自身详细属性,不展开内部文件)
drwxr-xr-x 2 root root 6 Jun 27 15:18 /project/
(注释:/project目录权限755,属主root、属组root)
cat /etc/group
(注释:读取用户组配置文件,查看系统所有用户组)
chgrp test /project/
(注释:修改/project目录的所属组为test组)
ll -d /project/
(注释:查看/project目录,验证属组修改生效)
drwxr-xr-x 2 root test 6 Jun 27 15:18 /project/
(注释:/project属主root,属组已修改为test)
id user1
(注释:查看user1用户UID、GID、全部附属组)
uid=1001(user1) gid=1001(user1) groups=1001(user1)
(注释:user1主组user1,无其他附加组)
id user2
(注释:查看user2用户UID、GID、全部附属组)
uid=1002(user2) gid=1002(user2) groups=1002(user2),1000(wxh)
(注释:user2主组user2,附加组wxh)
usermod -G test user1
(注释:修改user1附加组,添加test组,覆盖原有附加组)
usermod -G test user2
(注释:修改user2附加组,添加test组,覆盖原有附加组)
id user2
(注释:验证user2附属组更新结果)
uid=1002(user2) gid=1002(user2) groups=1002(user2),1003(test)
(注释:user2主组user2,附加组test)
id user1
(注释:验证user1附属组更新结果)
uid=1001(user1) gid=1001(user1) groups=1001(user1),1003(test)
(注释:user1主组user1,附加组test)
chmod 770 /project/
(注释:修改/project目录权限为770,仅属主、属组可读写执行)
ll -d /project/
(注释:查看/project权限修改结果)
drwxrwx— 2 root test 6 Jun 27 15:18 /project/
(注释:/project权限770,属主root、属组test,其他用户无权限)
id wxh
(注释:查看wxh用户UID、GID、附属组)
uid=1000(wxh) gid=1000(wxh) groups=1000(wxh)
(注释:wxh主组wxh,无附加组)
su - wxh
(注释:切换wxh用户,加载用户环境)
Last failed login: Sat Jun 27 10:30:57 CST 2026 from localhost on ssh:notty
(注释:wxh此前存在登录失败记录)
There were 2 failed login attempts since the last successful login.
(注释:距离上次成功登录,共2次登录失败)
cd /project/
(注释:wxh尝试进入/project目录)
-bash: cd: /project/: Permission denied
(注释:权限拒绝,wxh不在test组,无进入/project的权限)
logout
(注释:退出wxh用户,返回root终端)
setfacl -m u:wxh:rx /project/
(注释:为/project目录添加ACL权限,单独赋予wxh用户读、执行权限)
su - wxh
(注释:再次切换wxh用户)
Last login: Sat Jun 27 15:21:21 CST 2026 on pts/0
(注释:wxh本次登录时间记录)
cd /project/
(注释:wxh进入/project目录,ACL赋予rx权限可进入浏览)
ls
(注释:wxh查看/project目录内文件)
touch file1
(注释:wxh尝试在/project创建新文件file1)
touch: cannot touch ‘file1’: Permission denied
(注释:权限不足,ACL仅给rx,无w写权限,无法新建文件)
logout
(注释:退出wxh,回到root)
getfacl /project/
(注释:查看/project完整ACL权限配置)

  getfacl: Removing leading '/' from absolute path names
(注释:工具提示,自动去除路径开头斜杠,不影响查看)
  file: project/
(注释:当前查看对象为project目录)
  owner: root
(注释:目录属主root)
  group: test
(注释:目录属组test)
 user::rwx
(注释:属主root拥有完整rwx权限)
 user:wxh:r-x
(注释:ACL单独配置wxh用户,拥有读、执行权限,无写)
 group::rwx
(注释:属组test用户拥有完整rwx权限)
 mask::rwx
(注释:ACL权限掩码上限为rwx,不限制现有权限)
 other::---
(注释:其他普通用户无任何权限)

su - wxh
(注释:切换至wxh用户)
Last login: Sat Jun 27 15:21:42 CST 2026 on pts/0
(注释:wxh最新登录记录)
umask
(注释:查看当前普通用户wxh默认权限掩码,输出0002,控制新建文件/目录默认权限)
touch file1
(注释:root用户创建空文件file1)
ll
(注释:列出当前目录文件详细属性,可见dir1目录、新建file1文件权限)
umask
(注释:查看root用户权限掩码,输出0022)
777 - 022 = 755 - 111 = 644
(注释:权限计算逻辑:目录基准777减掩码0022得755,文件基准666减0022得644,对应file1权限-rw-r–r–)
touch file2
(注释:wxh普通用户创建空文件file2)
ll
(注释:查看wxh家目录文件,dir2目录权限drwxrwxr-x,file2文件权限-rw-rw-r–,由umask0002生成)
umask
(注释:查看wxh用户当前掩码0002)
vim .bash_profile
(注释:编辑wxh用户个人登录配置文件,仅当前用户登录加载)

umask 077
(注释:在用户配置文件写入永久修改掩码命令,登录后umask变为0077)

logout
(注释:退出当前wxh用户会话)
su - wxh
(注释:完整登录切换至wxh用户,加载.bash_profile配置)
umask
(注释:切换用户后查看掩码,已永久变为0077)

777 - 077 = 700 - 111 = 600

(注释:掩码0077权限计算:目录777-077=700,文件666-077=600)
ll
(注释:查看wxh目录原有文件,是修改umask前创建,权限不变)
rm -fr *
(注释:强制递归删除当前目录下所有文件与目录)
ll
(注释:删除后目录为空,无任何文件)
mkdir dir2
(注释:新建目录dir2,受umask0077控制)
touch file2
(注释:新建空文件file2,受umask0077控制)
ll
(注释:查看新建文件权限,dir2为drwx------,file2为-rw-------,匹配掩码0077计算结果)
vim .bash_profile
(注释:再次编辑用户个人登录配置文件)
删除刚才加的umask 770
logout
(注释:退出当前wxh普通用户登录会话,回到root管理员终端)
su - wxh
(注释:完全切换至wxh普通用户,加载用户完整环境变量)
umask
(注释:查看当前用户默认权限掩码,输出0002,新建文件默认权限664、目录775)
logout
(注释:退出wxh用户,返回root管理员终端)

(10)

nmcli 命令

查看网卡 / 连接信息
nmcli connection show

nmcli c show
(注释:查看所有网络连接配置)

nmcli con show ens160
(注释:查看单网卡详细连接信息)

nmcli dev status

nmcli device show
(注释:查看物理网卡硬件设备状态)

启停网络连接(重启网卡)
nmcli c up ens160
(注释:激活/启用网卡)
nmcli c down ens160
(注释: 关闭网卡)

新建静态 IP 连接
nmcli c add type ethernet ifname ens160 con-name ens161 autoconnect yes ipv4 192.168.48.135/24 gw4 192.168.48.2
(注释:创建ens161网卡静态连接,自动开机、IP/网关同步配置)

nmcli c up ens161
(注释:激活新连接)

修改现有网卡为静态 IP
nmcli c modify ens160 ipv4.method manual ipv4.addresses '192.168.48.134/24' ipv4.gateway '192.168.48.2' ipv4.dns '114.114.114.114'
(注释:manual=手动静态IP,配置地址、网关、DNS)

重载生效
nmcli c up ens160
(注释:
读取 ens160 这套网络配置(IP、网关、DNS)
给物理网卡加载该配置,启用网卡;
等同于重启网卡,修改 IP 后执行这条命令让新配置生效。)

使用场景
用 nmcli modify 修改完静态 IP、DNS 后,执行 up 重载配置;
网卡掉线,重新激活恢复网络;
切换多套网卡连接配置时,切换激活。

补充注意点
如果你是 Xshell 远程 SSH 服务器:
修改当前正在使用的网卡 IP 后执行 nmcli c up ens160,会直接断开当前 SSH 连接,需要用新 IP 重新连接;
修改配置文件(.nmconnection)后,建议先重载再激活:
nmcli c reload
(注释:c 是 connection 的缩写,该命令重载 NetworkManager 网卡连接配置,刷新 /etc/sysconfig/network-scripts/ 下网卡配置文件,修改网卡配置后执行此命令让配置生效,无需重启服务)
nmcli c up ens160
(注释:启用名为 ens160 的网卡连接,激活该网卡,等同于拉起 ens160 网卡使其联网;对应重启网卡的操作,down 可以断开网卡)

ip a
(注释:查看IP验证)
ipv4.method manual
(注释:关闭 DHCP,手动静态配置;auto 为 DHCP 自动获取。)

单网卡增加多个 IP(多 IP 网卡)
nmcli c mod ens160 +ipv4.addresses 192.168.48.136/24
(注释:+ 代表追加地址,不覆盖原有IP)
nmcli c up ens160
(注释:使用 NetworkManager 工具激活 ens160 网卡连接,加载网卡配置并启用该网口,使其接入网络)
ip a
(注释:全称 ip address,查看系统所有网卡设备、IP 地址、MAC 地址、网卡启用状态等网络接口详细信息,等价于老旧命令 ifconfig)

如果你是用 nmcli c modify 改配置(命令改 IP/DNS)
只执行 nmcli c up ens160 就够了,不需要 reload
原因:nmcli 修改时会直接同步写入配置文件 + 更新内存,不需要重载

如果你是手动 vim 编辑 .nmconnection 文件
只敲 up 不够,必须先 reload
直接 vim 改文件,NetworkManager 内存里还是旧配置;
nmcli c up 只会读取内存里的旧参数,你的修改不会生效;
必须先 nmcli c reload 把磁盘新配置读进内存,再 up。

删除网络连接配置

nmcli c show
(注释: 查看所有连接名)
nmcli c del ens161
(注释: 删除指定连接)

RHEL9 直接修改 nmconnection 配置文件
配置文件路径
/etc/NetworkManager/system-connections/ens160.nmconnection

标准文件模板

[connection]
id=ens160
uuid=d97d603d-5bb5-3d11-bfeb-11fbc8cb867d
type=ethernet
autoconnect-priority=-999
interface-name=ens160
timestamp=1682493359

[ethernet]

[ipv4]
address1=192.168.48.134/24,192.168.48.2
dns=114.114.114.114;
method=manual

[ipv6]
addr-gen-mode=eui64
method=auto

修改后重载生效

nmcli c reload
(注释:重新加载 NetworkManager 管理的所有网卡连接配置,修改完 ifcfg 网卡配置文件后执行,让新配置生效,不用重启 NetworkManager 服务)
nmcli c up ens160
(注释:手动激活名称为 ens160 的网卡连接,拉起该网卡,读取配置分配 IP 并开启网络连通)

ping 连通性测试工具

检测本机与目标 IP / 域名之间网络是否通;
查看数据包往返延迟(time),判断网络快慢;
通过返回 TTL 值,粗略判断目标主机操作系统;
反向解析域名对应的 IP 地址。

ping [参数] IP/域名

-c 数字 发送指定数量数据包后自动停止,不加则无限发包(Ctrl+C 终止)
-s 字节 自定义数据包载荷大小,默认 56 字节,最大 65507
-i 秒 两次发包间隔,默认 1 秒,禁止小于 0.2 秒(防洪水攻击)
-t TTL 手动设置数据包生存时间(路由跳数)

ping -c 2 www.baidu.com
(注释:仅发送2个数据包,测试百度连通性)
输出字段解读

bytes=64:ICMP 数据包总大小(56 数据 + 8 协议头);
time=XXms:往返延迟,数值越小网络质量越好;
TTL:数据包存活跳数,可判断系统:
Linux 默认 TTL:64 / 255
Windows 默认 TTL:128
类 Unix 设备:255

域名静态解析

/etc/hosts
本地静态域名映射,优先级高于 DNS 服务器,不用走 DNS 解析,直接绑定 IP 与域名。
适用场景:内部测试、自定义域名、屏蔽恶意网站。

vim /etc/hosts
格式:IP地址 域名1 域名2
192.168.48.134 www.openlab.com
保存后直接生效,无需重启服务:
ping www.openlab.com
(注释:会直接解析到192.168.48.134)

优先级逻辑
主机解析域名顺序:先查/etc/hosts → 再去 DNS 服务器查询

文件下载工具

wget
命令行专用下载工具,支持 HTTP/HTTPS/FTP,后台下载、断点续传、递归整站下载。

wget [参数] 资源URL

-P 目录 指定文件下载保存目录
-t 次数 下载失败最大重试次数
-b 后台静默下载,日志输出到 wget-log
-c 断点续传,中断后下次接着下载
-r 递归下载整个网站目录
-p 下载网页全部资源(图片、css、js)

wget https://dldir1.qq.com/qqfile/qq/QQNT/2355235c/linuxqq_3.1.1-11223_x86_64.rpm
(注释:直接下载Linux QQ安装包到当前目录)

网络请求 / 上传下载工具

curl
多功能网络传输工具,支持 HTTP/HTTPS/FTP,既能访问网页、调试接口,也能下载 / 上传文件。

curl www.baidu.com -o index.html
(注释:访问百度首页,将返回页面保存为index.html)

-o:指定输出文件名

对比 wget
wget:侧重批量、文件下载;
curl:侧重接口调试、网页访问、数据交互,运维测试接口更常用。

VMware 三种虚拟机网络模式

VMware 提供 3 种虚拟网卡模式,在顶部菜单「编辑 → 虚拟网络编辑器」中配置:
Bridged 桥接模式(VMnet0)
NAT 地址转换模式(VMnet8,默认)
Host-Only 仅主机模式(VMnet1)

Bridged 桥接模式

原理
虚拟网桥把物理主机网卡和虚拟机虚拟网卡接入同一台虚拟交换机,虚拟机和物理主机处于同一个局域网,相当于局域网内一台独立真实电脑。

网络特点
虚拟机 IP 网段、网关、DNS 和物理主机完全一致;
局域网内其他电脑、手机都能直接访问这台虚拟机;
虚拟机也能正常访问外网。

优缺点
优点:局域网互通、配置简单、内外网全通
缺点:占用局域网真实 IP,公司 / 校园网 IP 管控严格时容易冲突

配置注意
桥接网卡不要选「自动」,手动选中本机正在上网的物理网卡(无线 / 有线)。

NAT 网络地址转换模式

(最常用默认)
原理
内置虚拟 NAT 网关 + 虚拟 DHCP 服务器,宿主机生成一块虚拟网卡 VMware Network Adapter VMnet8;
虚拟机走虚拟网关转发流量,通过宿主机 IP 访问外网。

网络特点
虚拟机独立网段(和宿主机物理网卡网段不同);
虚拟机 ↔ 物理主机 互通;
虚拟机可以访问外网;
局域网其他设备无法直接访问虚拟机(默认隔离)。

适用场景
个人学习、测试服务器,IP 资源有限,不想占用局域网 IP,日常练习 Linux 首选。

Host-Only

仅主机模式

原理
移除 NAT 转发设备,仅依靠 VMnet1 虚拟网卡搭建隔离内网,完全切断外网通路。

网络特点
只能实现「虚拟机 ↔ 物理主机」互相访问;
虚拟机无法访问互联网、局域网其他设备;
多台同 VMnet1 虚拟机之间可以互相通信。

适用场景
纯本地内网测试、隔离环境开发、安全演练,完全不需要外网的场景。

在这里插入图片描述

systemctl status NetworkManager
(注释:查看NetworkManager网络管理服务运行状态,确认服务已开机自启且正在运行)
nmcli connection show
(注释:列出系统全部网络连接配置,展示连接名称、UUID、类型、绑定网卡设备)
nmcli c s
(注释:nmcli connection show简写,功能同上,快速查看网络连接列表)
ip a
(注释:查看服务器所有网卡设备、硬件地址、IP地址、网卡运行状态)
nmcli connection
(注释:进入connection网络连接管理子命令,展示增删改查等可用操作)
nmcli connection delete ens32
(注释:删除名为ens32的旧有线网络连接配置,执行成功)
nmcli connection show
(注释:完整写法查看全部网络连接配置,等同于简写 nmcli c s)

Wired connection 1 e531f9b4-c775-320f-adea-e691bae5e98b ethernet eth0

(注释:仅剩有线连接 1,以太网类型,绑定 eth0 网卡,ens32 已被删除不再显示)
nmcli connection modify Wired\ connection\ 1 con-name eth0
(注释:修改网络连接配置名称,将Wired connection 1重命名为eth0)
nmcli connection show
(注释:重新查看网络连接列表,验证连接名称已修改为eth0)
ip a
(注释:再次查看网卡信息,确认eth0网卡IP地址192.168.36.173/24,网卡正常UP运行)
nmcli device status
(注释:查看网卡硬件设备状态,eth0设备已连接,绑定名为eth0的连接配置,lo本地回环未被NetworkManager管理)
nmcli connection down eth0
(注释:关闭名为eth0的网络连接,断开网卡IP)

转到VMware输入指令
nmcli c s
(注释:nmcli connection show简写,查看系统内所有网络连接配置列表)
nmcli connection delete eth0
(注释:删除名为eth0的网络连接配置文件)
nmcli c s
(注释:再次查看连接列表,验证eth0连接配置已删除)
nmcli connection add type ethernet ifname eth0 con-name eth0 autoconnect yes
(注释:新建以太网连接,网卡设备eth0,连接名eth0,开机自动启用)
nmcli c s
(注释:查看新建后的eth0连接配置UUID与绑定网卡)
ip a
(注释:查看网卡信息,此时eth0无IPv4地址,仅保留MAC与IPv6链路本地地址)
ip r s
(注释:查看系统内核完整路由表,用来确认默认网关、网段路由、网卡出口设备,排查静态 IP 配置后能否正常上网)
cat /etc/resolv.conf
(注释:查看DNS解析配置文件,当前无nameserver记录)
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.36.173/24 ipv4.gateway 192.168.36.2 ipv4.dns 114.114.114
(注释:修改eth0连接为静态IP模式,配置IP地址、网关、DNS服务器)
nmcli connection down eth0
(注释:下线eth0连接,使修改的配置生效)
nmcli connection up eth0
(注释:重新上线eth0连接,加载静态IP配置)
nmcli c s
(注释:查看eth0连接配置状态,确认已绑定eth0网卡)
ip a
(注释:查看网卡,eth0成功加载静态IPv4地址192.168.36.173/24)
ip r s
(注释:查看系统内核完整路由表,用来确认默认网关、网段路由、网卡出口设备,排查静态 IP 配置后能否正常上网)
cat /etc/resolv.conf
(注释:查看DNS文件,NetworkManager自动写入nameserver 114.114.114)
cd /etc/systemd/
(注释:切换到systemd系统管理主目录)
ls
(注释:列出systemd目录下所有配置文件与文件夹)
cd /etc/NetworkManager/
(注释:切换到NetworkManager网络管理程序配置目录)
ls
(注释:列出NetworkManager目录下所有子文件夹与主配置文件)
cd conf.d/
(注释:进入NetworkManager自定义配置子目录)
cd ..
(注释:返回上一级/etc/NetworkManager目录)
cd system-connections/
(注释:进入存储网络连接配置文件的目录,nmcli创建的连接存于此)
pwd
(注释:打印当前所在完整路径)
ls
(注释:查看system-connections目录内的连接配置文件)
cd ..
(注释:返回/etc/NetworkManager主目录)
cat NetworkManager.conf
(注释:查看NetworkManager主全局配置文件)
cd /etc/sysconfig/network-scripts/
(注释:切换到传统CentOS7网卡脚本目录,本环境使用nmcli,该目录无生效配置)
systemctl status NetworkManager
(注释:查看NetworkManager服务运行状态,服务active(running)正常运行,PID666)
systemctl status network
(注释:查看传统network脚本服务状态,该服务failed启动失败,与NetworkManager冲突)
cd /etc/sysconfig/network-scripts/
(注释:切换到CentOS传统网卡配置文件目录)
ls
(注释:列出目录内网卡启停脚本与网卡配置文件)
cat ifcfg-eth0
(注释:读取eth0网卡静态IP配置文件全部参数)

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=1c5bbf96-610a-4fa0-b109-8ec0cc502fb5
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.36.173
PREFIX=24
GATEWAY=192.168.36.2
DNS1=114.114.114.114

systemctl disable --now network
(注释:立刻停止network服务,同时设置开机不自启,兼容sysvinit脚本提示重定向chkconfig)
cd /etc/NetworkManager/
(注释:切换到NetworkManager网络管理服务主配置目录)
ls
(注释:列出NetworkManager目录下配置文件夹与主配置文件)
conf.d dispatcher.d dnsmasq.d dnsmasq-shared.d NetworkManager.conf system-connections
cd system-connections/
(注释:进入NetworkManager存放网卡连接配置的目录)
ls
(注释:查看system-connections内网卡连接配置文件)
cd -
(注释:快速切回上一级目录/etc/NetworkManager)
ls
(注释:再次列出NetworkManager目录内容)
conf.d dispatcher.d dnsmasq.d dnsmasq-shared.d NetworkManager.conf system-connections
cd /etc/sysconfig/network-scripts/
(注释:切回传统网卡配置目录)
ls
(注释:列出网卡启停脚本与ifcfg配置文件)
systemctl disable --now NetworkManager
(注释:立即停止NetworkManager服务,删除开机自启软链接,关闭图形化网络管理工具)
ls
(注释:列出network-scripts目录全部网卡脚本)
ifdown-ippp ifdown-sit ifup-bnep ifup-plusb ifup-TeamPort
vim ifcfg-eth0
(注释:使用vim编辑器修改eth0网卡静态网络配置文件)
nmcli c s
(注释:使用NetworkManager工具查看网络连接,报错NetworkManager未运行,当前系统使用传统network网络服务,不支持nmcli)
ls
(注释:列出/etc/sysconfig/network-scripts目录下所有网卡脚本、启停工具文件)
vim ifcfg-eth0
(注释:vim编辑eth0网卡静态IP配置文件)
systemctl enable --now network
(注释:设置network服务开机自启并立即启动,提示network不是原生systemd服务,自动重定向到chkconfig工具)
ip a
(注释:查看所有网卡设备信息,lo本地回环、eth0网卡已启用,IP为192.168.36.173/24)
systemctl restart network
(注释:重启传统network网络服务,加载ifcfg-eth0配置)
ip a
(注释:再次查看网卡,确认eth0 IP仍为192.168.36.173)
ls
(注释:再次列出network-scripts目录下全部网络脚本文件)
vim ifcfg-eth0
(注释:再次打开eth0网卡配置文件,修改静态IP地址为192.168.36.180)
systemctl restart network
(注释:重启network服务,应用修改后的新IP配置)
ip a
(注释:查看网卡信息,eth0已更新IP为192.168.36.180/24)
vim ifcfg-eth0
(注释:再次编辑网卡配置,将BOOTPROTO从none静态改为dhcp自动获取,保留静态IP字段但不生效)
systemctl restart network
(注释:CentOS7传统网络服务重启命令,读取/etc/sysconfig/network-scripts/ifcfg-eth0配置文件,重载网卡)
ip a
(注释:查看本机所有网卡完整信息,包含回环lo、物理网卡eth0的MAC、IP、状态)

vim ifcfg-eth0
(注释:编辑CentOS7传统网卡配置文件,路径/etc/sysconfig/network-scripts/ifcfg-eth0)

 BOOTPROTO=none
(注释:网卡协议none代表静态IP,dhcp为自动获取)
; DEVICE=eth0
(注释:绑定物理网卡设备名eth0)
; ONBOOT=yes
(注释:开机自动启用该网卡)
; IPADDR=192.168.36.173
(注释:静态IPv4地址)
; PREFIX=24
(注释:子网掩码24位,等同于NETMASK=255.255.255.0)
; GATEWAY=192.168.36.2
(注释:网关地址)
; DNS1=114.114.114.114
(注释:主DNS服务器地址)

ip r s
(注释:ip route简写,查看本机全部路由表)

default via 192.168.36.2 dev eth0 proto dhcp metric 1002
(注释:默认路由,所有外网流量转发至网关192.168.36.2,metric路由优先级1002)
; 192.168.36.0/24 dev eth0 proto kernel scope link src 192.168.36.173
(注释:直连网段路由,访问同192.168.36.x网段直接走eth0网卡)

cat /etc/resolv.conf
(注释:查看DNS解析配置文件,系统域名解析读取此文件)

 # generated by /usr/sbin/dhclient-script
(注释:注释行,当前DNS文件由dhclient自动生成)
search localdomain
(注释:域名搜索后缀,访问短域名自动补全localdomain)
nameserver 114.114.114
(注释:生效DNS服务器地址)

ping baidu.com
(注释:向目标主机发送探测数据包,等待对方回包,用来检测两台设备之间网络连通性、延迟、丢包)
; ^C
(注释:Ctrl+C快捷键终止ping命令)

systemctl disable --now network
(注释:–now立即停止传统network服务,disable禁止开机自启,切换至NetworkManager)

 network.service is not a native service, redirecting to /sbin/chkconfig.
(注释:提示network为兼容脚本服务,自动跳转chkconfig管理)

systemctl enable --now NetworkManager
(注释:–now立即启动NM服务,enable设置开机自启,切换为nmcli管理网络)

ls
(注释:列出network-scripts目录下所有网卡脚本工具文件)

ip a
(注释:再次执行查看网卡IP信息)

nmcli connection modify eth0 ipv4.method manual ipv4.addresses192.168.36.173/24 ipv4.gateway 192.168.36.2 ipv4.dns 114.114.114
(注释:nmcli修改eth0连接,设置静态IP模式,配置地址、网关、DNS)

Connection 'eth0' successfully deactivated
(注释:修改配置后自动断开原有eth0网卡连接)

nmcli c down eth0
(注释:nmcli简写,手动关闭eth0网卡连接)
ip a
(注释:关闭网卡后查看网卡信息,eth0仍保留IP标记noprefixroute)

nmcli c up eth0
(注释:nmcli简写,激活eth0网卡,加载新静态网络配置)

Connection successfully activated
(注释:网卡激活成功,新IP配置生效)

ip a
(注释:激活后再次查看eth0网卡IP地址信息)

ls
(注释:再次列出network-scripts目录下传统网卡脚本文件)

ls
(注释:列出当前目录所有网络脚本文件)
cat ifcfg-eth0
(注释:读取网卡eth0传统网络配置文件内容)

 BOOTPROTO=none
(注释:IP获取方式为静态手动配置,不使用DHCP自动获取)
; DEVICE=eth0
(注释:绑定的物理网卡设备名为eth0)
; ONBOOT=yes
(注释:开机自动启用该网卡)
; IPADDR=192.168.36.173
(注释:网卡静态IPv4地址)
; PREFIX=24
(注释:子网掩码255.255.255.0,24位前缀长度)
; GATEWAY=192.168.36.2
(注释:默认网关地址)
; DNS1=114.114.114.114
(注释:首选DNS服务器地址)

nmcli c s
(注释:nmcli工具查看所有NetworkManager网络连接)

NAME        UUID                                  TYPE      DEVICE
(注释:输出表头:连接名、UUID、网络类型、绑定网卡)
; eth0         1a88b4ef-7282-4309-b33f-0a937bb3189f  ethernet  eth0
(注释:第一条以太网连接eth0,绑定网卡eth0)
; System eth0  5fb06bdd-0bb0-7ffb-45f1-d6edd65f3e03  ethernet  --
(注释:系统旧以太网连接,无绑定网卡)

systemctl disable --now NetworkManager
(注释:立即停止NetworkManager服务,并设置开机不自启)
ls
(注释:查看当前network-scripts目录文件列表)
rm -fr ifcfg-eth0
(注释:强制删除传统网卡配置文件,无提示)
ls
(注释:再次查看目录,验证配置文件已删除)
ip a
(注释:查看本机所有网卡完整IP地址、硬件信息)
systemctl enable --now NetworkManager
(注释:enable 设置 NetworkManager 服务开机自动启动,–now 参数表示立即启动该服务,一步完成即时开启 + 开机自启两项操作,NetworkManager 是 CentOS7 主流的网络管理服务)
reboot
(注释:执行系统重启命令)
ls
(注释:查看root家目录文件)
cd /etc/sysconfig/network-scripts/
(注释:正确切换到网卡脚本目录)
ls
(注释:列出目录下所有网络脚本工具文件)
cd /etc/NetworkManager/
(注释:切换到NetworkManager服务主配置目录)
ls
(注释:列出NetworkManager目录内子目录与配置文件)
cd system-connections/
(注释:进入NetworkManager持久化连接配置文件夹)
pwd
(注释:打印当前完整工作路径)
ls
(注释:查看连接配置文件列表)
nmcli c s
(注释:查看所有网络连接)
nmcli c down Wired\ connection\ 1
(注释:停用名为Wired connection 1的网络连接)
nmcli c delete Wired\ connection\ 1
(注释:永久删除这条有线连接配置)
ip a
(注释:查看当前网卡IP信息)
nmcli connection add type ethernet ifname eth0 con-name eth0 ipv4.method manual ipv4.addresses 192.168.36.173/24 ipv4.gateway 192.168.36.2 ipv4.dns 114.114.114
(注释:新建静态以太网连接,绑定eth0,配置静态IP、网关、DNS)
nmcli c up eth0
(注释:启用新建的eth0网络连接)

 Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
(注释:连接启用成功提示)

ls
(注释:查看目录内网络脚本工具文件)
cd /etc/sysconfig/network-scripts/
(注释:切回传统网卡配置目录)
ls
(注释:列出目录内所有网卡管理脚本、网卡配置文件ifcfg-eth0、ifcfg-lo等)
cat ifcfg-eth0
(注释:读取eth0网卡配置文件内容,查看静态IP、网关、DNS、开机自启等参数)

TYPE=Ethernet
(注释:网卡类型为以太网)
; PROXY_METHOD=none
(注释:不启用代理方式)
; BROWSER_ONLY=no
(注释:关闭仅浏览器网络模式)
; BOOTPROTO=none
(注释:IP获取方式为静态,不使用DHCP自动分配)
; IPADDR=192.168.36.173
(注释:网卡静态IPv4地址)
; PREFIX=24
(注释:子网掩码对应24位,即255.255.255.0)
; GATEWAY=192.168.36.2
(注释:网关地址)
; DNS1=114.114.114.114
(注释:首选DNS服务器地址)
; DEFROUTE=yes
(注释:将此网卡设为默认路由出口)
; IPV4_FAILURE_FATAL=no
(注释:IPv4配置失败不阻断网卡启动)
; IPV6INIT=yes
(注释:开启IPv6协议支持)
; IPV6_AUTOCONF=yes
(注释:开启IPv6自动配置)
; IPV6_DEFROUTE=yes
(注释:启用IPv6默认路由)
; IPV6_FAILURE_FATAL=no
(注释:IPv6配置失败不阻断网卡启动)
; IPV6_ADDR_GEN_MODE=stable-privacy
(注释:IPv6地址生成模式,稳定隐私地址)
; NAME=eth0
(注释:网卡显示名称)
; UUID=f811b071-97fd-484a-891e-22bc4db7b5e1
(注释:网卡唯一识别UUID)
; DEVICE=eth0
(注释:硬件网卡设备名eth0)
; ONBOOT=yes
(注释:开机自动启用该网卡)

切换为MobaXterm
pwd
(注释:查看当前所在工作目录,输出 /root)
ls
(注释:列出 root 家目录下文件,显示 dir1、file1)
cd /etc/sysconfig/
(注释:切换工作目录到系统 sysconfig 配置目录)
ls
(注释:列出 sysconfig 目录内所有文件与文件夹,包含 network-scripts 网络脚本目录)
cd network-scripts/
(注释:进入网卡配置脚本存放目录)
ls
(注释:列出目录内所有网卡管理脚本、网卡配置文件 ifcfg-eth0、ifcfg-lo 等)
vim ifcfg-eth0
(注释:使用 vim 编辑器编辑 eth0 网卡配置文件)
nmcli connection reload
(注释:重载 NetworkManager 网络配置,加载修改后的网卡参数)
ip a
(注释:查看本机所有网卡完整信息,包含 IP、硬件地址、网卡状态)
nmcli connection up eth0
(注释:激活名为eth0的网络连接,应用刚重载的网卡配置,生效IP参数)

切换到VMware
vim ifcfg-eth0
(注释:编辑 eth0 网卡的传统网络配置文件,写入静态 IP、网关、DNS 等网络参数)
nmcli connection reload
(注释:让 NetworkManager 重新读取 /etc/sysconfig/network-scripts/ 下所有网卡配置文件,加载新修改的 ifcfg-eth0)
nmcli c up eth0
(注释:手动启用 eth0 这条网络连接,加载配置文件里的 IP、网关、DNS 信息,让网卡配置立即生效)
ip a
(注释:查看本机所有网卡硬件、MAC 地址、IP 地址、网卡运行状态)

切换MobaXterm
ping www.westos.org
(注释:发送ICMP报文测试服务器与域名shturl.cc/r95b连通性,首次通过DNS解析出公网IP 154.39.121.167,数据包无丢失,往返延迟94.111ms)
vim /etc/hosts
(注释:用vim编辑本地静态域名解析文件,该文件解析优先级高于DNS服务器)
ping www.westos.org
(注释:修改hosts写入192.168.36.173 server1 shturl.cc/r95b后再次ping域名,本地解析为本机内网IP,延迟极低)
vim /etc/hosts
(注释:再次编辑hosts,将shturl.cc/r95b映射修改为不存在的内网IP 192.168.36.100)
ping www.westos.org
(注释:修改hosts映射后重新测试,目标IP不存在,返回目标主机不可达,100%数据包丢失)
curl -I jd.com
(注释:curl -I仅获取HTTP响应头部,jd.com返回301永久重定向,跳转https://www.jd.com)
curl -I www.jd.com
(注释:访问完整域名www.jd.com,返回302临时重定向,跳转加密HTTPS京东站点)
curl -I www.taobao.com
(注释:查询淘宝域名HTTP响应头,返回301永久重定向至HTTPS淘宝官网,后端服务为Tengine)
curl -I www.163.com
(注释:请求网易域名头部信息,服务器返回403 Forbidden,拒绝当前客户端访问)
curl -I www.baidu.com
(注释:发送HEAD请求访问带www的百度域名,仅获取响应头,返回200 OK表示访问正常)
curl -I baidu.com
(注释:发送HEAD请求访问裸域名baidu.com,返回301永久重定向,跳转至https://www.baidu.com)

wget https://nginx.org/download/nginx-1.30.3.tar.gz
(注释:使用wget工具下载Nginx稳定版1.30.3源码压缩包)
ll
(注释:列出当前目录文件详细权限、大小、修改时间,确认源码包已下载完成)
tar zxf nginx-1.30.3.tar.gz
(注释:解压nginx源码gz压缩包,z代表gzip解压,x提取文件,f指定压缩包文件)
ll
(注释:再次查看目录,验证解压后生成nginx-1.30.3源码文件夹)
cd nginx-1.30.3/
(注释:切换进入Nginx源码根目录)
ls
(注释:列出源码目录内全部文件与子文件夹)
ll configure
(注释:查看configure脚本的权限,确认具备可执行权限)
yum install pcre-devel openssl-devel zlib-devel gcc gcc-c++ make -y
(注释:(注释:yum 批量安装 Nginx 编译必需的依赖包,-y 自动确认安装;pcre-devel 提供正则库、openssl-devel 提供 SSL 加密库、zlib-devel 提供压缩库,gcc/gcc-c++ 是 C/C++ 编译器,make 用于编译安装))
./configure --with-http_ssl_module --with-http_stub_status_module
(注释:(注释:在 Nginx 源码目录执行配置检测,生成编译所需 Makefile;–with-http_ssl_module 开启 HTTPS 加密模块,–with-http_stub_status_module 开启网页状态监控模块))

make
(注释:执行编译,生成 nginx 二进制程序)

make install
(注释:执行安装,将编译好的程序复制到 /usr/local/nginx)

cd /usr/local/nginx
(注释:切换工作目录到 nginx 默认编译安装根目录 /usr/local/nginx)
ls
(注释:列出 nginx 安装目录下所有文件夹,一般包含 conf、html、logs、sbin)
pwd
(注释:打印当前所在的完整路径,确认目录位置)
cd /sbin
(注释:切换到系统 /sbin 系统二进制命令目录)
pwd
(注释:打印当前路径,查看是否成功进入 /sbin)
ls
(注释:列出 /sbin 目录下系统管理类可执行命令)
cd
(注释:不带参数执行 cd,直接切换到当前登录用户的家目录,root 用户即回到 /root)
vim .bash_profile
(注释:将 nginx 程序目录追加到系统 PATH 变量)

PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin

:wq
(注释:vim 保存并退出编辑)
source .bash_profile
(注释:重载环境变量文件,使 PATH 修改立即生效)
which nginx
(注释:重新查找 nginx 命令)

/usr/local/nginx/sbin/nginx

(注释:成功找到 nginx 程序路径)
nginx -t
(注释:检测 nginx 配置文件语法是否正确)

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
(注释:配置文件语法无错误)
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
(注释:完整配置校验通过)

nginx
(注释:后台启动 nginx 服务)
curl localhost
(注释:curl 访问本机 80 端口,验证网页服务)

浏览器访问,输入IP 地址
页面内容:Welcome to nginx,代表 nginx 启动成功

(11)

Linux 源码包编译安装

源码包基础概念
源码包:C/C++ 原始代码,一般打包为 .tar.gz / .tar.bz2 压缩包;
对比 RPM/YUM 二进制包:源码需要本机编译,二进制包直接解压运行。

源码包优缺点
优点
性能高:根据当前服务器硬件、系统环境编译,适配本机,运行效率更高;
高度自定义:./configure 可自定义开启 / 关闭软件功能、指定安装路径;
跨平台兼容:可在任意 Linux 发行版编译安装,不受 rpm/deb 包限制;
卸载简单:无系统数据库记录,直接 rm -rf 安装目录 即可,无残留。

缺点
安装流程繁琐,步骤多;
编译依赖复杂,缺库、缺编译器会报错,需要手动 yum 补依赖;
升级、管理麻烦,没有 yum 统一管理,无法一键更新。

源码安装标准四步流程
解压源码压缩包
./configure 环境检测、生成 Makefile
make 编译源码,生成二进制程序
make install 复制程序到系统目录完成安装

一键合并写法(无报错才执行下一步):
./configure && make && make install

Apache httpd 源码安装实操
前置依赖:安装编译工具链
编译必须 gcc C 语言编译器、gcc-c++ C++ 编译器

yum install gcc gcc-c++ -y
(注释:yum 安装 C 语言与 C++ 语言编译工具链,-y 自动确认所有安装提示,用于后续源码编译 httpd 服务)
wget https://dlcdn.apache.org/httpd/httpd-2.4.57.tar.gz
(注释:下载源码包)

tar xzvf httpd-2.4.57.tar.gz
(注释:解压 gz 格式的 tar 源码包,x 解压、z 处理 gzip 压缩、v 显示过程、f 指定操作文件)
cd httpd-2.4.57
(注释:进入解压完成的 httpd 源码根目录,准备执行 configure 配置编译)

./configure 环境检测(核心步骤)
作用:
检查系统是否有 gcc、make、依赖库(apr、pcre 等);
根据参数生成 Makefile 编译配置文件;
可加 --prefix=/路径 指定自定义安装目录。

示例报错修复:
报错缺少apr库
yum install apr* -y
(注释:通配符匹配所有 apr 开头软件包,批量安装 apr 运行库与 apr-devel 开发依赖,解决 httpd 编译提示缺少 apr 库的报错,-y 自动确认安装)
重新执行检测
(注释:在 httpd 源码目录执行配置脚本,自动检测系统编译环境、依赖项,生成 Makefile 编译文件)

报错缺少pcre正则库
yum install pcre* -y
(注释:批量安装 pcre 正则表达式库以及对应的开发包 pcre-devel,补齐 httpd 编译所需正则依赖)
./configure
(注释:再次执行配置检查,依赖补齐后正常生成编译配置文件,可后续执行 make 编译)

make 编译

读取 Makefile 规则,将源码编译为可执行二进制文件,耗时视服务器性能而定。

make
(注释:读取 configure 生成的 Makefile 文件,调用 gcc 编译器对 httpd 源码进行批量编译,生成可执行程序,该步骤仅编译不安装到系统目录)

报错缺少redhat-rpm-config,安装后重新编译
yum install redhat-rpm-config -y
(注释:安装 rpm 打包相关配置工具与编译环境组件,补充编译时缺失的系统编译宏与头文件配置,-y 自动确认安装)
make
(注释:依据前文 configure 生成的 Makefile 规则,调用编译器完成源码编译,生成 httpd 服务可执行程序与相关模块文件,仅编译不写入系统目录)

安装

make install
把编译好的程序、配置文件、手册复制到系统目录,默认安装路径 /usr/local/软件名

make install

关键补充知识点
卸载源码软件
没有专用卸载命令,直接删除安装目录即可:

rm -rf /usr/local/httpd
(注释:递归强制删除 /usr/local/httpd 整个目录,清空旧版本 Apache 安装文件,避免新旧文件冲突)

自定义安装路径
./configure 通过 --prefix 指定目录,方便管理:
./configure --prefix=/usr/local/apache24
(注释:执行 Apache 编译前环境检测配置,–prefix 用于指定程序最终安装根目录为 /usr/local/apache24,后续 make install 会把程序、配置、网页文件统一安装到此路径,便于后续运维查找与管理)

报错通用思路

configure 阶段报错:缺开发库,用 yum install xxx-devel 安装;
make 阶段报错:头文件缺失、编译器版本过低,按提示安装对应开发包。

Linux RPM 软件包管理

RPM 基础概念
定义
RPM(Redhat Package Manager)红帽软件包管理器,是 RHEL/CentOS/Fedora 系列标准二进制软件包格式;
Debian/Ubuntu 对应格式为 .deb。

二进制包特点
软件厂商提前在标准系统编译打包,用户直接安装,无需本地编译;
限制:
打包环境与本机系统版本、架构必须匹配;
安装有严格依赖校验,缺依赖直接报错;
卸载顺序不能颠倒,底层基础包不能先删。

RPM 包命名规则
示例:zsh-5.0.2-14.el7.x86_64.rpm

在这里插入图片描述

RPM 资源查询网站
rpmfind.netrpm.pbone.net,用于查找缺失的 rpm 依赖包。

rpm

核心安装 / 升级 / 卸载参数
基础命令格式:rpm [参数] rpm包文件/软件名

-i install 安装软件
-v verbose 输出详细过程
-h 显示 #进度条,组合 -ivh 最常用
-U upgrade 升级软件,无旧版则直接安装
-e erase 卸载软件
--nodeps 忽略依赖强制安装 / 卸载(不推荐,易破坏系统)
--force 强制覆盖安装,重复安装同一包时使用

离线安装 nginx 本地 rpm 包

下载rpm包
wget http://nginx.org/packages/rhel/9/x86_64/RPMS/nginx-1.24.0-1.el9.ngx.x86_64.rpm
(注释:使用 wget 命令从 Nginx 官方软件源下载适配 RHEL9 系统、x86_64 架构的 1.24.0 版本 RPM 离线安装包)

标准安装 ivh
rpm -ivh nginx-1.24.0-1.el9.ngx.x86_64.rpm
(注释:rpm 命令离线安装 RPM 软件包;i 代表安装,v 显示详细安装过程,h 以 #号打印安装进度条)

安装 LinuxQQ,处理依赖报错
直接 rpm 安装会检测缺少依赖库libXScrnSaver,先 yum 补依赖再安装:

rpm -ivh linuxqq_3.1.1-11223_x86_64.rpm
(注释:使用 rpm 命令离线安装 Linux 版 QQ 的 rpm 安装包,i 安装、v 输出详细信息、h 显示安装进度;rpm 不会自动解决依赖关系,缺少依赖会直接终止安装并报错)

报错依赖缺失,执行yum安装依赖
yum install libXScrnSaver -y
(注释:yum 工具自动查找并安装 QQ 运行所缺失的 libXScrnSaver 屏幕保护相关依赖库,-y 自动确认安装选项,安装完成后可再次执行 rpm 安装 QQ 安装包)

再次执行安装
rpm -ivh linuxqq_3.1.1-11223_x86_64.rpm
(注释:此前已手动补齐缺失依赖库,再次使用 rpm 命令离线安装 Linux QQ RPM 安装包;i 为安装,v 打印详细安装日志,h 展示 #进度条,依赖无异常即可完成安装)

直接在线 URL 安装 rpm
rpm 支持直接传入网络地址,无需先下载到本地:

rpm -ivh https://wps-linux-personal.wpscdn.cn/wps/download/ep/Linux2019/11698/wps-office-11.1.0.11698-1.x86_64.rpm
(注释:rpm 支持直接跟网络 URL 在线下载并安装 rpm 包;i 安装、v 显示详细过程、h 显示安装进度。rpm 本身不会自动处理依赖,如果安装过程提示缺少依赖包,建议改用 yum install -y 该网络链接 进行安装,yum 会自动下载并补齐所有依赖)

卸载软件

-evh 卸载并打印详情
rpm -evh tree
(注释:e 代表卸载软件包,v 打印卸载详细信息,h 显示卸载进度条;本条命令用于卸载 tree 目录树查看工具,仅针对 rpm 方式安装的 tree 软件生效)

rpm 查询功能(-q 系列)

查询语法:rpm -q [辅助参数] 软件名

-q 软件名 查询单个软件是否已安装
-qa 查询系统全部已安装 rpm 包
-ql 软件名 列出该软件安装后生成的所有文件、目录路径
-qf 文件路径 反向查询:这个文件属于哪个 rpm 包
-qi 软件名 查看软件详细介绍、版本、开发商

查询示例

rpm -q httpd
(注释: 查询httpd是否安装)
rpm -qa
(注释: 列出所有已安装包)
rpm -ql gcc
(注释:查看gcc安装生成的所有文件)
rpm -qf /usr/bin/ls
(注释:查找/usr/bin/ls命令来自哪个软件包)
输出

 coreutils-8.30-12.el8.x86_64

rpm 优缺点总结
优点
预编译二进制包,安装速度快,无需 gcc 编译环境;
自带数据库记录所有文件,可查询文件归属、软件清单;
自带依赖校验,保障系统完整性。

缺点
离线安装必须手动处理依赖,缺包就要手动下载 rpm;
跨系统 / 跨架构不兼容,el7 包不能装在 el9;
强制忽略依赖(–nodeps)极易导致系统损坏。

rpm -qa|wc -l
(注释:rpm -qa 列出所有安装包,管道交给 wc 统计行数,即软件包总数)

356
(注释:系统共安装 356rpm 软件包)

rpm -qa
(注释:列出系统全部已安装 rpm 包名称)
rpm -q sshd
(注释:精确查询 sshd 包是否安装)
package sshd is not installed
(注释:无单独 sshd 包,服务包名为 openssh-server)
rpm -q openssh
(注释:查询 openssh 基础包)

openssh-7.4p1-21.el7.x86_64

rpm -qa|grep openssh
(注释:过滤所有带 openssh 关键词的已安装包)

openssh-clients-7.4p1-21.el7.x86_64
;openssh-7.4p1-21.el7.x86_64
;openssh-server-7.4p1-21.el7.x86_64

rpm -ql openssh-clients-7.4p1-21.el7.x86_64
(注释:列出 openssh 客户端包安装生成的所有文件)
rpm -qf /etc/ssh/sshd_config
(注释:查询 sshd_config 配置文件属于哪个 rpm 包)

openssh-server-7.4p1-21.el7.x86_64

rpm -qf /etc/passwd
(注释:查询 passwd 用户文件所属 rpm 包)

setup-2.8.71-11.el7.noarch

which wget
(注释:查找 wget 命令路径)

/usr/bin/wget

rpm -qf /usr/bin/wget
(注释:查询 wget 程序所属软件包)

wget-1.14-18.el7_6.1.x86_64

which netstat
(注释:查找 netstat 命令路径)

/usr/bin/netstat

rpm -qf /usr/bin/netstat
(注释:查询 netstat 工具所属 rpm 包)

net-tools-2.0-0.25.20131004git.el7.x86_64

yum install -y net-tools
(注释:yum 安装 net-tools 工具包,-y 自动确认)
rpm -q --scripts openssh-server
(注释:查看 openssh-server 包内置的安装、卸载前后执行脚本)

Linux YUM/DNF 软件仓库管理

YUM & DNF 关系
YUM:RHEL7 及更早版本包管理器;
DNF(Dandified YUM):RHEL8/RHEL9 默认工具,速度更快、性能更强;
RHEL9 中 yum 只是 dnf-3 的软链接,两条命令功能完全互通。

ll `which yum`
 lrwxrwxrwx. 1 root root 5 /usr/bin/yum -> dnf-3

核心优势(对比 rpm)
rpm 仅能本地安装,无法自动解决依赖;
yum/dnf 可连接软件仓库,自动下载软件 + 所有依赖一键安装,无需手动处理依赖报错。

YUM 工作原理
服务端搭建 YUM 仓库,存放 rpm 包 + 记录依赖信息的数据库;
客户端读取 /etc/yum.repos.d/*.repo 仓库配置;
联网拉取仓库依赖清单,对比本机 rpm 数据库;
一次性下载目标软件 + 全部依赖,自动完成安装。

RHEL8/9 两大官方仓库
BaseOS:底层系统核心基础包(内核、命令、系统工具);
AppStream:应用程序、开发库、运行环境、中间件;
RHEL7 只有单一仓库,8/9 强制分两个仓库,本地光盘源必须同时配置两段。

yum/dnf 仓库 & 包查询

yum repolist all
(注释:查看所有启用/禁用软件源)
yum list all
(注释:列出仓库全部可安装软件)
yum list installed
(注释:查看本机已安装软件)
yum info nginx
(注释:查看软件详细版本、介绍、依赖)
yum grouplist
(注释:查看所有软件包组(开发工具、图形界面等))
yum groupinfo "Development Tools"
(注释:查看包组内包含哪些软件)

安装 / 升级软件

yum install -y tree nginx
(注释:-y 自动确认所有交互提示,无需手动输入yes)
yum update -y
(注释: 升级本机全部软件)
yum update -y nginx
(注释:仅升级指定软件)
yum groupinstall -y "Development Tools"
(注释:批量安装开发工具组)

卸载软件

yum remove -y linuxqq
(注释:卸载软件,自动移除无用依赖)

文件 / 包搜索

yum search httpd
(注释:模糊搜索含httpd的软件包)
yum whatprovides /usr/bin/ls
(注释: 反向查询:该文件来自哪个rpm包)
yum provides /etc/fstab
(注释:和whatprovides完全等价)

缓存清理

yum clean all
(注释:清空本地下载的rpm缓存、仓库元数据)
yum makecache
(注释:重新拉取仓库信息,生成本地缓存)

配置 YUM 本地光盘源

先确认当前目录存在的 repo 文件
ls /etc/yum.repos.d/
(注释:列出 yum 软件源配置目录下所有 repo 源配置文件,查看系统现有 yum 源)
CentOS7 系统默认只有 CentOS-Base.repo、CentOS-Media.repo,不会自带 redhat.repo,该文件是 RHEL 系统才会存在,CentOS 环境无需备份。

cd /etc/yum.repos.d
(注释:切换到 yum 源配置文件所在目录)
mv CentOS-Base.repo CentOS-Base.repo.bak
(注释:将系统默认的网络在线 yum 源文件重命名备份,后缀.bak 标记为备份文件,yum 不会识别带 bak 后缀的源,后续会优先使用新建的本地光盘源)
这一步成功把网络源备份完毕,redhat.repo 不存在,不用处理,直接进入新建本地 dvd.repo步骤。

CentOS7 适配的本地光盘源配置
执行编辑命令:
vim /etc/yum.repos.d/dvd.repo
(注释:使用 vim 编辑器新建并打开 dvd.repo 本地光盘源配置文件,写入对应参数即可搭建基于系统镜像光盘的离线 yum 仓库,断网环境下可正常使用 yum 安装软件)

[dvd-local]
;name=CentOS7 DVD Local Source
;baseurl=file:///media
;gpgcheck=0
;enabled=1
保存退出:按 Esc → 输入 :wq 回车

重建缓存 + 验证源

yum makecache
(注释:生成本地仓库缓存)
yum repolist
(注释:查看可用仓库)

yum install -y tree
(注释:测试安装软件验证可用性)

网络源 & EPEL 扩展源

网络源:RHEL9 无官方免费源,可使用 CentOS Stream9 阿里云 / 清华镜像源,上传 .repo 文件到 /etc/yum.repos.d/,执行 yum makecache 生效。
EPEL 扩展源:官方仓库没有的第三方软件(htop、nmap 等),安装 epel-release 启用:

yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
(注释:直接通过 yum 在线安装 RHEL9 系统对应的 EPEL 软件源配置包,yum 会自动下载该 rpm 并处理依赖;EPEL 源是官方额外软件仓库,能提供系统默认源里没有的大量常用扩展软件,-y 自动确认安装交互)

下载creatrepo

mkdir -p /etc/yum.repos.d/bak
(注释: 创建备份目录)
-p 参数自动判断目录是否存在,不存在则创建,避免报错。

备份全部旧源
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
(注释:执行后原目录只剩 bak 文件夹,无任何 repo 源文件)

联网使用阿里国内源(推荐,能正常安装 createrepo)

CentOS7 下载阿里Base源
wget -O /etc/yum.repos.d/CentOS-Base.repo
(注释:-O 指定下载文件的保存路径与文件名,该命令本意是把阿里云 / 网易等镜像站的 CentOS 官方源文件下载并覆盖到 yum 源目录,这条命令缺少后面的源下载链接,补全链接后才能正常执行替换默认在线 yum 源)
yum clean all && yum makecache
(注释:&& 代表前一条命令执行成功后再执行后一条;yum clean all 清空本地旧的 yum 软件包元数据缓存;yum makecache 根据当前 /etc/yum.repos.d/ 下所有 repo 源重新下载索引信息并生成新缓存,后续 yum 安装软件就能快速检索软件列表)

yum install -y createrepo
(注释:安装createrepo)

yum repolist
(注释:查看系统当前启用的yum软件仓库,统计仓库总软件包数量)
yum list wget
(注释:查询wget软件包状态,显示是否已安装、所属仓库)
yum search mysql
(注释:搜索名称/简介含mysql的软件包,CentOS7中mysql由mariadb替代)
cd /etc/yum.repos.d/
(注释:切换到yum仓库配置文件存放目录)
ls
(注释:列出目录内所有文件,当前只有阿里云源配置CentOS-Base.repo)
cat CentOS-Base.repo
(注释:读取并打印阿里云yum源配置文件全部内容)
pwd
(注释:打印当前所在工作目录,确认处于/etc/yum.repos.d/)
cd /var/lib/yum/
(注释:切换至yum本地数据库存放目录)
ls
(注释:查看yum数据库目录下的子文件夹)
cd /var/cache/
(注释:切换到系统缓存根目录)
ls
(注释:列出cache目录内所有缓存文件夹)
cd yum/
(注释:进入yum专用缓存目录)
pwd
(注释:打印当前路径/var/cache/yum)
ls
(注释:查看yum缓存目录,存在x86_64架构文件夹)
cd x86_64/
(注释:进入64位系统架构缓存目录)
cd 7/
(注释:进入CentOS7版本专属缓存文件夹)
ls
(注释:查看缓存,base、extras、updates对应三个基础软件仓库缓存)
cd /etc/yum.repos.d/
(注释:切换到 YUM 软件源配置文件所在目录,所有后缀为.repo 的文件都是 yum 可用仓库配置)
ls
(注释:(注释:列出该目录下全部文件,查看现有 yum 源文件,确认 CentOS-Base.repo 在线基础源是否存在))
CentOS-Base.repo

vim CentOS-Base.repo
(注释:使用vim编辑器打开阿里云yum源配置文件)

# [base] 仓库段落
; name=CentOS-$releasever - Base - mirrors.aliyun.com
(注释:base仓库名称,$releasever自动识别系统主版本号7)
; failovermethod=priority
(注释:多镜像访问策略,按书写顺序优先访问靠前镜像地址)
; baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
(注释:第一个阿里云镜像下载地址,存放系统基础软件包)
; http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
(注释:备用阿里云内网镜像地址)
; http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
(注释:阿里云云服务器专属镜像地址)
; gpgcheck=1
(注释:开启软件包gpg校验,验证安装包完整性、防篡改)
; gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
(注释:指定校验用的官方密钥文件地址)
; `enabled=0`
(注释:仓库禁用,0=关闭,1=开启,当前阿里云源全部关闭导致repolist为0)
# [updates] 更新仓库段落
; name=CentOS-$releasever - Updates - mirrors.aliyun.com
(注释:updates仓库名称,存放系统安全更新、补丁包)
; failovermethod=priority
(注释:多镜像访问策略,按书写顺序优先访问靠前镜像地址)
; baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
(注释:更新包阿里云主镜像地址)
; http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
(注释:更新包备用内网镜像)
; http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
(注释:阿里云服务器专属更新镜像)
; gpgcheck=1
(注释:开启软件包gpg校验)
; gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
(注释:校验密钥地址)
; `enabled=0`
(注释:更新仓库禁用)
# [extras] 扩展软件仓库段落
; name=CentOS-$releasever - Extras - mirrors.aliyun.com
(注释:extras仓库名称,存放官方额外扩展工具包)
; failovermethod=priority
(注释:多镜像访问策略,按书写顺序优先访问靠前镜像地址)
; baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
(注释:扩展包阿里云主镜像地址)
; http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
(注释:扩展包备用内网镜像)
; http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
(注释:阿里云服务器专属扩展镜像)
; gpgcheck=1
(注释:开启软件包gpg校验)
; gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
(注释:校验密钥地址)
; `enabled=0`
(注释:扩展仓库禁用)

yum repolist
(注释:查看启用仓库,输出repolist: 0,所有仓库enabled=0无可用源)
cd
(注释:无参数cd,直接切回root用户家目录/root)
mount /dev/cdrom /media/
(注释:挂载光驱设备到/media目录,提示光盘只读保护)
df
(注释:查看系统全部挂载分区,确认/dev/sr0光盘挂载至/media,占用100%)
cd /media/
(注释:进入光盘挂载目录/media)
ls
(注释:列出光盘内全部目录文件,Packages存放rpm安装包)

cd Packages/
(注释:进入光盘里存放rpm软件包的Packages文件夹)
ls *.rpm | wc -l
(注释:列出所有rpm文件并统计行数,光盘内共447个rpm安装包)
cd ..
(注释:切换到上一级目录,当前从Packages目录回到/media目录)
ls
(注释:列出/media光盘挂载根目录下所有文件与文件夹,包含repodata软件仓库元数据目录、Packagesrpm包目录等)
cd repodata/
(注释:进入/media下的repodata仓库元数据文件夹)
ls
(注释:查看repodata内所有仓库索引文件,xml、sqlite压缩包,yum依靠这些文件识别仓库软件)
cd /etc/yum.repos.d/
(注释:切换到yum仓库配置文件存放目录)
ls
(注释:查看目录内原有repo文件,默认CentOS-Base.repo为官方网络源)
vim local.repo
(注释:新建并编辑本地光盘yum仓库配置文件local.repo)

[local]
(注释:仓库唯一标识ID,yum识别仓库名称)
;name=local repo
(注释:仓库自定义显示名称,仅展示用)
;baseurl=file:///media
(注释:本地仓库路径,file://代表本地文件,/media是光盘挂载目录)
;gpgcheck=0
(注释:关闭rpm包校验,0关闭,1开启校验密钥)

yum repolist
(注释:加载yum仓库,列出可用软件仓库,local仓库读取成功,共447个软件包)
cd
(注释:无参数cd,直接切换到root用户家目录/root)
ls
(注释:查看root家目录文件,存在nginx压缩包与解压文件夹)
cd /media/
(注释:切换到光盘挂载目录/media)
ls
(注释:查看光盘根目录文件)
cd Packages/
(注释:进入rpm包存放目录Packages)
mkdir /registry
(注释:在根目录创建/registry文件夹,用于存放rpm包搭建本地仓库)
cp tuned-2.11.0-9.el7.noarch.rpm zip-3.0-11.el7.x86_64.rpm zlib-1.2.7-18.el7.x86_64.rpm /registry/
(注释:复制三个rpm软件包到/registry目录下,作为本地仓库的安装包资源)
cd /registry/
(注释:切换当前工作目录到存放rpm包的/registry文件夹)
ls
(注释:列出当前/registry目录内所有文件,验证rpm包是否复制成功)
yum repolist
(注释:读取系统所有yum仓库配置,统计并输出每个仓库可用的软件包总数)
yum install createrepo
(注释:执行yum在线安装createrepo工具,该工具用于生成本地yum仓库元数据)
cd /etc/yum.repos.d/
(注释:切换目录到yum仓库配置文件存放目录,所有*.repo仓库配置文件都在此处)
ls
(注释:列出目录内仓库配置文件,当前存在CentOS-Base.repo官方网络源、local.repo本地源两个文件)
vim local.repo
(注释:使用vim编辑器打开本地仓库配置文件local.repo,修改仓库参数)

 [local]
(注释:yum仓库唯一标识id,方括号包裹,不可重复)
; name=local repo
(注释:仓库的名称描述,仅用于展示,无实际功能限制)
; baseurl=file:///media/
(注释:本地仓库资源路径,file://代表本地磁盘,指向/media光盘挂载目录,此处和实际/registry包目录不匹配,是报错根源)
; gpgcheck=0
(注释:关闭rpm包gpg签名校验,0关闭,1开启,本地测试仓库一般关闭)
; enabled=0
(注释:仓库启用开关,0=禁用该仓库,yum不会读取此仓库资源;1=启用)

vim CentOS-Base.repo
(注释:使用vim编辑器打开阿里云网络yum源配置文件)

[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1

#released updates
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1

yum makecache fast
(注释:快速重新拉取所有启用仓库的元数据,生成本地缓存,刷新yum包列表)
yum repolist
(注释:重新读取仓库配置,统计网络源内所有可用rpm包数量,此时阿里云源正常加载)
yum install createrepo
(注释:yum 安装 createrepo 工具,该软件用于在指定目录生成 repodata 仓库索引文件,以此把普通文件夹制作成 YUM 本地软件仓库,可搭配 repo 配置文件实现离线 yum 安装软件)
ls
(注释:列出当前工作目录下的文件与文件夹,一般用来查看准备制作仓库的 rpm 安装包是否都在当前目录中)
cd /registry/
(注释:切回存放rpm包的/registry目录)
createrepo .
(注释:在当前目录执行createrepo,扫描目录下所有rpm包,自动生成repodata仓库元数据文件夹)

ls
(注释:列出当前目录文件,可见自动生成的repodata元数据文件夹和原有rpm包)
cd repodata/
(注释:进入createrepo生成的元数据目录repodata)
ls
(注释:查看repodata内所有仓库索引、数据库、xml元数据文件)
cd ..
(注释:返回上一级/registry目录)
pwd
(注释:打印当前所在完整路径,确认目录为/registry)

再开启一个虚拟机
hostnamectl set-hostname server2
(注释:永久修改主机名为server2,重新登录终端前缀才会更新)

vim /etc/hosts
(注释:编辑本地域名解析文件,配置主机名与IP映射)
logout
(注释:退出当前root登录会话,重新连接后主机名生效)

切换为第一个虚拟机
yum install -y httpd
(注释:yum自动确认安装Apache网页服务httpd)
systemctl enable --now httpd
(注释:立刻启动httpd服务,同时设置开机自启)

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

cd /usr/local/nginx/sbin
(注释:进入编译安装版 Nginx 的可执行程序目录,nginx 主程序存放在该 sbin 文件夹)
./nginx -s stop
(注释:执行 nginx 程序并发送 stop 停止信号,强制立即终止 Nginx 进程,关闭 Web 服务)
ss -lntp | grep 80
(注释:ss 替代 netstat 查看本机监听端口,筛选出 80 端口占用进程,确认 Nginx 是否彻底关闭)
cd /registry
(注释:切换工作目录到 /registry 目录,一般用于存放本地 yum 仓库 rpm 包或镜像仓库文件)
netstat -antlp|grep :80
(注释:查看80端口监听状态,验证httpd是否正常运行)
curl localhost
(注释:本地访问httpd默认页面,测试web服务连通性)

浏览器网址 IP 地址

ls
(注释:列出当前目录下文件,显示本地yum仓库rpm包)
cd ..
(注释:切换到上一级根目录/)
ls
(注释:查看根目录下所有系统文件夹)
mv registry/ /var/www/html
(注释:将本地yum仓库目录registry移动到httpd网页根目录)
cd /var/www/html/
(注释:进入Apache网站根目录)
ls
(注释:查看网站根目录内容,确认registry仓库文件夹已移入)
pwd
(注释:打印当前所在完整路径/var/www/html)
浏览器网址 IP 地址+/registry/

切换为第二个虚拟机
cd /etc/yum.repos.d/
(注释:切换目录到yum软件源配置存放目录)
ls
(注释:列出当前目录下所有repo源配置文件,显示CentOS-Base.repo)
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
(注释:在线拉取阿里云 yum 源,下载CentOS-Base.repo 文件)
vim CentOS-Base.repo
(注释:使用vim编辑器编辑阿里云公网yum源配置文件)

[updates]
(注释:yum源仓库段名,系统更新包仓库)
; name=CentOS-$releasever - Updates - mirrors.aliyun.com
(注释:仓库显示名称,$releasever自动读取系统CentOS版本)
; failovermethod=priority
(注释:镜像故障切换策略,按地址优先级访问)
; baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch
(注释:更新包仓库的阿里云镜像下载地址)
; gpgcheck=1
(注释:开启rpm包GPG校验,验证安装包完整性安全)
; gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
(注释:GPG校验密钥下载地址)
; enabled=0
(注释:0代表禁用该仓库,1为启用)
; [extras]
(注释:额外扩展软件仓库段名)
; name=CentOS-$releasever - Extras - mirrors.aliyun.com
(注释:扩展仓库展示名称)
; failovermethod=priority
(注释:镜像切换优先级策略)
; baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch
(注释:扩展包阿里云镜像地址)
; gpgcheck=1
(注释:开启rpm包校验)
; gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
(注释:校验密钥地址)
; enabled=0
(注释:禁用该扩展仓库)
; "CentOS-Base.repo" 65L, 2553C written
(注释:vim保存文件后的系统提示,65行、2553字符写入完成)

yum makecache fast
(注释:快速生成yum软件源本地缓存,读取仓库包信息)
yum repolist
(注释:只查看当前启用状态的yum仓库列表)

;ls
(注释:查看yum.repos.d目录文件,存在CentOS-Base.repo)
vim local.repo
(注释:新建并编辑本地私有仓库配置文件local.repo)

[registry]
(注释:本地私有yum仓库标识段名)
; name=local repo
(注释:仓库自定义展示名称)
; baseurl=http://192.168.36.173/registry/
(注释:私有仓库http访问地址,server1的httpd共享目录)
; gpgcheck=0
(注释:关闭rpm包安全校验,内网仓库无需验证)

yum repolist
(注释:再次查看已启用仓库列表)

 Loading mirror speeds from cached hostfile
(注释:加载镜像测速缓存)
; registry
(注释:识别到启用的registry本地仓库)
; registry/primary_db
(注释:读取仓库元数据数据库文件)
; repo id                  repo name            status
; registry                 local repo           3
(注释:仓库ID、名称、可用rpm包数量3个)
; repolist: 3
(注释:当前启用仓库总数量为1,共3个软件包)

切换为第一个虚拟机
ls
(注释:查看server1 /var/www/html/registry目录,显示rpm包和repodata仓库元数据文件夹)
cd /media/
(注释:切换到光驱挂载目录media)
ls
(注释:列出CentOS镜像光盘内所有目录文件:Packages、repodata等)

cd Packages/
(注释:进入光盘Packages目录,存放系统全部rpm安装包)
ls
(注释:列出当前目录下全部 rpm 安装包文件,确认软件包资源)
cp *.rpm /var/www/html/registry/
(注释:复制Packages目录下所有rpm包到http网站共享目录,搭建本地仓库)
^C
(注释:Ctrl+C中断复制操作)
cd /var/www/html/registry/
(注释:进入httpd网页共享目录,私有仓库根目录)
ls
(注释:查看仓库目录内已复制的rpm软件包)
ls | wc -l
(注释:统计当前目录下文件总行数,即rpm包数量)

124
(注释:统计结果,目录内共124个rpm包文件)

createrepo .
(注释:在当前目录生成yum仓库元数据,创建私有软件源索引)

; Spawning worker 0 with 62 pkgs
(注释:创建索引进程0处理62个rpm包)
; Spawning worker 1 with 61 pkgs
(注释:创建索引进程1处理61个rpm包)
; Workers Finished
(注释:两个索引进程处理完成)
; Saving Primary metadata
(注释:保存软件包主要元数据信息)
; Saving file lists metadata
(注释:保存rpm包内文件清单元数据)
; Saving other metadata
(注释:保存额外仓库配置元数据)
; Generating sqlite DBs
(注释:生成sqlite数据库文件,yum读取的仓库数据库)
; Sqlite DBs complete
(注释:仓库数据库文件生成完毕,本地yum仓库搭建完成)

cd repodata/
(注释:进入仓库元数据目录repodata,该目录存放本地yum仓库索引文件)
ls
(注释:列出repodata目录下所有文件,包含哈希命名的数据库文件与repomd.xml仓库描述主文件)

切换为第二个虚拟机
yum makecache fast
(注释:快速生成yum仓库元数据缓存,读取本地registry仓库文件并创建缓存)
yum repolist
(注释:列出系统所有可用yum软件仓库,显示仓库ID registry、仓库名称local repo,共123个可用软件包)

切换为第一个虚拟机
ls *.rpm | wc -l
(注释:匹配当前目录下所有 rpm 安装包,管道交给 wc -l 统计行数,最终输出 123 代表共 123 个 rpm 包)

rpm -qf /etc/hosts
(注释:查询/etc/hosts这个系统文件隶属于哪一个rpm软件包,查询结果为setup-2.8.71-11.el7.noarch)
yum provides /etc/hosts
(注释:通过yum仓库检索,查询提供/etc/hosts文件的软件包,可在线查询未安装文件归属包)
yum clean all
(注释:清空yum本地缓存,清除所有仓库元数据、下载包缓存,释放磁盘空间)
cd /var/cache/yum/
(注释:切换目录到yum缓存存放根目录)
ls
(注释:列出当前目录下的文件与文件夹,显示x86_64架构目录)
cd x86_64/
(注释:进入64位系统架构对应的yum缓存目录)
ls
(注释:列出x86_64目录内容,显示7(CentOS7)文件夹)
cd 7/
(注释:进入CentOS7版本专属yum缓存目录)
ls
(注释:列出7目录下所有软件仓库缓存文件夹,包含AppStream、base、local等)
cd local/
(注释:进入本地local仓库缓存目录)
ls
(注释:查看local仓库缓存文件,包含sqlite数据库、cachecookie、packages目录等)
cd packages/
(注释:进入local仓库存放rpm包的packages文件夹)
ls
(注释:查看packages目录内文件,无输出代表当前无缓存rpm包)
cd ..
(注释:返回上一级local目录)

双虚拟机 管理资源
完整挂载光盘操作

;mkdir -p /mnt/cdrom
(注释:创建挂载目录)
;mount /dev/cdrom /mnt/cdrom
(注释:挂载光驱设备)

说明:CentOS7 虚拟机光驱设备名通常是 /dev/sr0,/dev/cdrom 是软链接。

;ls /mnt/cdrom/Packages
(注释:验证挂载成功)
能看到大量 .rpm 文件,代表挂载正常。

;cp /mnt/cdrom/Packages/*.rpm /yumrepo/packages/
(注释:执行复制 rpm 包命令)

挂载后制作本地 YUM 仓库完整流程

  1. 确认 rpm 仓库元数据生成
    之前拷贝光盘 rpm 包后,需要执行这条命令生成 yum 索引:
    ;createrepo /yumrepo/packages
    后续新增 rpm 包时,用增量更新:createrepo --update /yumrepo/packages

搭建 http 共享(给 server2 客户端使用)

;yum install -y httpd
(注释:安装网页服务)

;systemctl start httpd
(注释: 启动Apache网页服务,对外提供yum仓库http访问)
;systemctl enable httpd
(注释:设置httpd开机自启,服务器重启后自动运行网页服务)
(出现报错时:
;systemctl start firewalld
(注释:立即启动firewalld防火墙服务,当前服务器会话生效)
;systemctl enable firewalld
(注释:设置firewalld防火墙开机自启,系统重启后自动运行防火墙))

;firewall-cmd --add-service=http --permanent
(注释:防火墙永久放行http(80)服务,–permanent代表写入永久配置,重启不失效)
;firewall-cmd --reload
(注释:重载防火墙规则,让上面放行http的配置立即生效)

;ln -s /yumrepo/packages /var/www/html/yumrepo
(注释:软链接仓库目录到网页根目录)

必须完成的前置校验(否则客户端无法使用源)
本机自测仓库访问

;ls /var/www/html/
(注释:查看软链接是否存在)
;ls /yumrepo/packages
(注释: 查看仓库内rpm文件)
;systemctl status httpd
(注释:查看httpd运行状态)

客户端 server2 配置远程源

;cat > /etc/yum.repos.d/server1.repo <<EOF
[server1]
name=server1 local repo
baseurl=http://192.168.137.101/yumrepo
gpgcheck=0
enabled=1
EOF
(注释:192.168.137.101 为查看sever1 虚拟机 IP 地址(ip a))

;yum clean all && yum makecache
(注释:清空yum旧缓存,重新读取本地/远程yum仓库元数据,生成新缓存)

:http://192.168.137.101/yumrepo 网址查看

Linux 进程管理

基础三大概念:程序、进程、线程

程序 Program
静态二进制可执行文件,存放在磁盘中,仅包含代码与数据,不占用 CPU、内存等运行资源。
示例:/usr/bin/ls、编译好的 nginx/httpd 可执行文件。

进程 Process
程序被加载到内存运行后的动态实例,是操作系统资源分配最小单位(独立内存空间、PID、文件描述符)。
一个程序可以启动多个进程(同程序读取不同数据,PID 不同就是独立进程);
系统用 PID(进程编号)唯一标识每一个进程。

线程 Thread
CPU调度执行的最小单位,依附于进程存在;
一个进程可创建多条线程,同进程内所有线程共享进程内存、文件句柄,仅独有寄存器与栈;
线程无法脱离进程单独运行,单进程单线程 = 单任务,多线程可并发执行多项任务。

进程分类

按归属主体
系统进程:系统内核自带进程,负责内存调度、硬件管理,开机自启,用户无法随意关闭;
用户进程:由用户手动执行命令 / 软件生成,权限受登录用户限制,可手动启停。
按运行环境
交互式进程:依托终端 shell 启动,需要人机交互,分前台、后台运行;
批处理进程:批量任务队列执行,无需实时交互;
守护进程(Daemon):脱离终端、常驻后台,开机启动、关机销毁,周期性等待事件(如 nginx、sshd、systemd)。

按亲缘关系

父进程:创建派生其他进程的进程;
子进程:由父进程 fork 复制生成,父进程退出未回收子进程会产生僵尸进程 Z。
按终端占用
前台进程:占用当前终端窗口,执行期间无法输入新命令;
后台进程:释放终端,终端可继续操作;Ctrl+Z可将前台进程挂起至后台。

ps 命令

静态截取进程快照(某一瞬间进程列表)

ps [选项]
在这里插入图片描述

ps -l 输出字段详解

F S  UID  PID  PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
F:进程权限标记
4:root 权限进程;1:仅 fork 复制、未执行 exec 加载程序
S:进程核心状态(最常用)
R:Running 运行 / 就绪,正在使用 CPU 或排队等待调度
S:Sleep 可中断睡眠,等待 IO / 信号,可被唤醒(绝大多数后台进程)
D:不可中断睡眠,阻塞硬件 IO(磁盘读写卡死),无法被 kill 终止
T:Stopped 暂停挂起,被调试 /Ctrl+Z后台冻结
Z:Zombie 僵尸进程,子进程已结束、父进程未回收 PID 资源
+:属于前台进程组
UID:进程执行者用户 ID;PID:进程唯一 ID;PPID:父进程 PID
C:CPU 占用百分比;PRI/NI:进程优先级,数值越小优先级越高
SZ:占用虚拟内存;WCHAN:进程休眠时等待的内核事件;-代表正在运行
TTY:进程绑定终端,?表示无终端(守护进程)
TIME:累计占用 CPU 总时长;CMD:启动该进程的原始命令

ps aux
(注释:采用 BSD 风格参数,一次性列出系统内所有用户全部进程,展示进程所属用户、PID、CPU / 内存占用、内存使用量、终端、运行状态、启动时间、累计 CPU 耗时与执行命令,是查看进程最常用基础命令)
ps aux | less
(注释:管道符|将 ps 输出结果传递给 less 分页工具;当进程数量过多一屏显示不下时,可上下翻页浏览、搜索查找内容,避免终端内容一次性刷屏溢出,按 q 退出分页查看)

字段释义:
USER:运行进程的用户名
PID:进程 ID
% CPU:瞬时 CPU 占用率
% MEM:物理内存占用百分比
VSZ:总虚拟内存大小
RSS:实际驻留物理内存(排查内存泄漏核心参考)
TTY:关联终端
STAT:进程状态(附加标识:s进程组长、<高优先级、N低优先级、l多线程)
START:进程启动时间
TIME:CPU 累计耗时
COMMAND:启动命令

ps -ef
(注释:System V 风格参数,e 代表显示所有进程,f 代表完整格式化输出,会清晰列出 PID 与父进程 PPID,层级分明,多用于追踪父子进程创建关系)

自定义指定列输出:
ps axo user,pid,ppid,%mem,command
(注释:o 参数用于自定义 ps 命令需要打印的字段,本条只筛选输出用户名、进程 ID、父进程 ID、内存占用百分比、执行命令,精简无关信息,按需查看进程关键信息)

pstree

进程树查看
以树形层级展示父子进程派生关系,直观查看进程起源;

pstree
(注释:基础树形)
pstree -p
(注释:同时打印每个进程PID)
五、根据进程名快速查找 PID
pgrep -l 进程名:按名称匹配查找 PID,-l同时显示进程命令
pidof 进程名:精准匹配程序名,返回对应 PID
读取进程 PID 文件:如 sshd 默认记录/run/sshd.pid

ps aux|grep httpd
(注释:ps aux查看全量进程,管道过滤httpd相关进程,查看Apache服务运行状态,末尾grep为过滤自身进程)
pstree
(注释:以树形结构展示系统全部进程父子关系,命令未安装,提示command not found)
yum provides */pstree
(注释:查询pstree命令由哪个rpm软件包提供,自动拉取仓库文件列表数据库检索)
yum provides /usr/bin/pstree
(注释:精准查询/usr/bin/pstree程序文件所属安装包,检索结果显示属于psmisc包)
yum install -y psmisc
(注释:-y自动确认,安装包含pstree工具的psmisc进程管理软件包)
pstree
(注释:安装完成后执行,树形打印系统进程树,可见systemd为1号主进程,包含httpd、sshd等服务子进程)

ps aux | grep sshd
(注释:过滤sshd远程连接服务所有相关进程,查看sshd主进程与客户端连接子进程)
cat /run/sshd.pid
(注释:读取sshd服务记录PID的文件,输出sshd主进程ID683)
pgrep -l sshd
(注释:pgrep检索sshd进程,-l参数同时输出进程PID与进程名称)
pgrep -l httpd
(注释:检索Apache httpd所有工作进程,打印每个进程PID和进程名)
pidof sshd
(注释:pidof直接输出sshd服务全部进程PID,无额外文字)
pidof httpd
(注释:直接输出所有httpd Apache工作进程的PID编号)
md5sum /dev/zero &
(注释:后台运行md5sum计算空设备校验和,持续消耗CPU,&代表放入后台执行)

 [1] 4996
(注释:后台任务编号1,进程PID为4996)

top 命令

动态实时监控进程(Linux 任务管理器)

top [-d 刷新秒数] [-bnp]

-d n 设置界面刷新间隔,默认 5 秒,例top -d 1每秒刷新
-b 批量输出,配合-n 次数可将结果导出文件
-p PID 仅监控单个指定进程
-c 显示完整程序路径而非简写命令

界面分区: 前 5= 系统全局统计区
第 1 行: 系统整体概况
top - 17:21:03 up 4:32, 5 users, load average: 0.19, 0.08, 0.06
当前时间 | 开机总时长 | 登录用户数 | 1/5/15 分钟系统平均负载(单核满负载为 1)
第 2 行:进程总览
Tasks: 483 total, 3 running, 480 sleeping, 0 stopped, 0 zombie
总进程数 | 正在运行 | 休眠进程 | 暂停进程 | 僵尸进程
第 3 行:CPU 整体占用拆分
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us:用户态进程 CPU 占比
sy:内核系统进程 CPU 占比
ni:修改过 nice 优先级的进程占比
id:空闲 CPU 占比(越高系统越空闲)
wa:IO 等待耗时(磁盘读写阻塞越高,wa 越大)
hi/si:硬中断、软中断 CPU 开销
st:虚拟机被宿主机抢占的 CPU 资源
第 4、5 行:内存与交换分区
plaintext
MiB Mem : 总内存, 空闲内存, 已用内存, 缓冲缓存
MiB Swap: 交换分区总大小, 空闲swap, 已用swap | 可分配剩余内存
下方列表:单进程详情
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
VIRT:虚拟内存;RES:实际物理内存;SHR:共享内存
S:进程状态;TIME+:精确到百分秒的 CPU 累计耗时

top 常用交互快捷键
1 展开多核 CPU,单独查看每颗核心负载
P 按 CPU 使用率降序排序
M 按内存使用率降序排序
k 输入 PID,直接在 top 内杀死进程
q 退出 top 监控界面

增强工具 htop

RHEL9/CentOS 需先装 epel 源再安装:yum install htop -y
彩色界面、鼠标支持、操作更直观,是 top 的升级版进程监控工具。

进程终止命令 kill /killall

kill 语法

kill [信号编号] PID
不加信号默认发送15(SIGTERM):优雅终止,允许进程收尾保存数据、释放资源;
kill -9 PID 发送 9 (SIGKILL):强制暴力杀死,无法被程序捕获拦截,极端卡死场景使用,慎用易丢数据。

killall
直接按进程名称批量杀死同名所有进程,无需查 PID

killall nginx
(注释:按进程名称批量向所有 nginx 进程发送默认 15 号终止信号,优雅关闭 Nginx 服务,进程会完成现有连接处理、释放端口与资源后退出)
killall -9 httpd
(注释:-9 代表强制杀死信号 SIGKILL,直接强行终止全部 httpd 进程,不会留给程序收尾保存数据的时间,一般在正常关闭失效、进程卡死时使用)

补充易错点
ps 是静态快照,执行一次只抓取一瞬间数据;top 是持续动态刷新;
D 不可中断睡眠进程无法用 kill -9 结束,只能等待 IO 完成或重启服务器;
僵尸进程 Z 本身不占用 CPU,仅残留 PID 条目,根源需要父进程正常退出回收子进程。

kill
(注释:单独输入kill无参数,报错提示命令格式)

 kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or
(注释:kill命令使用说明,必须跟PID或任务号才能杀死进程)

md5sum /dev/zero &
(注释:再次后台启动CPU压力进程)

 [1] 4998
(注释:新后台任务1,PID4998)

ps ax
(注释:查看系统所有进程,包括无终端后台进程)
pidof md5sum
(注释:查询所有md5sum程序的进程PID)

4998
(注释:当前md5sum进程PID为4998)

kill 4998
(注释:杀死PID4998的压力进程)
pidof md5sum
(注释:查询所有md5sum程序的进程PID)

[1]+ Terminated md5sum /dev/zero
(注释:进程成功终止提示)

md5sum /dev/zero &
(注释:多次后台创建压力进程)

[1] 5002

md5sum /dev/zero &

 [2] 5003

md5sum /dev/zero &

 [3] 5004

md5sum /dev/zero &

 [4] 5005

md5sum /dev/zero &

 [5] 5006

pidof md5sum
(注释:批量查询全部md5sum进程PID)

5006 5005 5004 5003 5002
(注释:5个CPU压力进程PID列表)

killall md5sum
(注释:按程序名批量杀死所有md5sum进程,无需逐个PID)

; [1] Terminated md5sum /dev/zero
; [2] Terminated md5sum /dev/zero
; [3] Terminated md5sum /dev/zero
; [4]- Terminated md5sum /dev/zero
; [5]+ Terminated md5sum /dev/zero

(注释:全部后台md5sum进程批量终止)

Linux 进程管理(ps /pstree/top /kill)

基础概念:程序、进程、线程

程序
存放在磁盘上的静态二进制文件(如 /usr/bin/sshd),无运行状态、不占用内存 CPU。

进程
程序加载到内存运行后的动态实例,占用 CPU、内存资源;同一个程序多次运行会生成多个独立进程(PID 不同)。

线程
进程内最小调度单元,一个进程可包含多条线程共享进程资源;线程不能独立存在,必须依附进程。

进程状态标识(STAT)

在这里插入图片描述

查看进程命令

ps 静态快照(仅抓取一瞬间进程)
常用参数
-a 所有用户进程
-u 显示用户名、CPU / 内存占用
-x 展示无终端后台守护进程
-e 等价所有进程
-f 完整格式化输出
-l 长格式,展示优先级、PID/PPID

ps -l
(注释:查看当前终端进程)

ps aux
(注释:最常用:全量进程,带CPU内存占用)

ps axo user,pid,ppid,%mem,command
(注释:自定义只显示指定字段:用户、PID、父PID、内存、命令)

ps aux | grep sshd
(注释:过滤指定进程(例sshd))

ps aux 字段逐行注释

USER       PID %CPU %MEM    VSZ   RSS TTY     STAT START   TIME COMMAND


# USER:启动进程的用户
# PID:进程唯一ID
# %CPU:CPU占用百分比
# %MEM:物理内存占用百分比
# VSZ:虚拟内存总占用
# RSS:实际常驻物理内存
# TTY:绑定终端,? 代表无终端后台进程
# STAT:进程状态
# START:进程启动时间
# TIME:累计占用CPU总时长
# COMMAND:启动进程的完整命令

pstree 进程树

直观展示父子进程层级关系
pstree

pstree -p
(注释:带PID显示)
根据程序名查 PID

pgrep -l sshd
(注释:pgrep -l 同时输出PID和进程名)

pidof sshd
(注释:pidof 直接输出程序所有PID)

cat /run/sshd.pid
(注释:读取程序固定PID文件(部分服务生成))

top 动态实时进程监控

top -d 1
(注释:每1秒刷新一次,默认5秒)
top -p 1234
(注释: 只监控PID=1234的进程)
top -b -n 3
(注释:批处理模式,输出3次后退出,适合写入日志)

上半区:系统全局统计(逐段注释)

top - 17:21:03 up 4:32, 5 users, load average: 0.19, 0.08, 0.06

# 17:21:03 当前系统时间
# up 4:32 服务器开机运行时长
# 5 users 当前登录用户总数
# load average: 1min、5min、15分钟系统平均负载,1代表CPU满载

Tasks: 483 total,  3 running, 480 sleeping,  0 stopped,  0 zombie
# total 全部进程数量
# running 正在CPU运行进程
# sleeping 休眠进程
# stopped 暂停进程
# zombie 僵尸进程

%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
# us 用户程序CPU占用
# sy 系统内核CPU占用
# ni 调整过Nice优先级的进程占用
# id 空闲CPU占比(越高负载越低)
# wa IO等待占用(磁盘读写瓶颈时升高)
# hi 硬件中断、si软件中断、st虚拟机抢占CPU

MiB Mem :   1790.0 total,   1278.5 free,    240.5 used,    271.0 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   1393.8 avail Mem
# Mem:物理内存 总/空闲/已使用/缓存
# Swap:交换分区虚拟内存
# avail Mem:可分配给新程序的剩余内存

下半区:进程列表字段注释

PID USER   PR  NI    VIRT    RES    SHR S  %CPU  %MEM   TIME+    COMMAND
# PID 进程ID
# USER 运行用户
# PR 系统优先级
# NI Nice值,负数=高优先级,正数=低优先级
# VIRT 虚拟内存总量
# RES 实际占用物理内存
# SHR 共享内存
# S 进程状态
# %CPU / %MEM 占用率
# TIME+ 累计CPU运行时间
# COMMAND 执行命令

补充工具
RHEL9 安装 epel 源后可安装 htop,top 图形化升级版,操作更直观:

yum install htop -y

kill /killall 终止进程

kill 语法:通过 PID 发送信号

kill [信号] PID

常用信号
kill -15 PID 默认信号,优雅终止,允许程序保存数据、清理资源(推荐)
kill -9 PID 强制杀死,直接销毁进程,不释放资源,容易产生僵尸 / 文件损坏,万不得已使用
kill -1 PID 平滑重启进程(重载配置)

kill 2345
(注释:优雅关闭PID 2345)
kill -9 2345
(注释:强制杀死进程)

killall 语法:通过进程名批量杀进程
无需 PID,直接匹配程序名,一次性结束所有同名进程

killall sshd
(注释:优雅关闭所有sshd进程)

killall -9 nginx
(注释:强制杀死所有nginx进程)

补充拓展知识点
父进程 PPID
PID=1(systemd)是系统所有进程的祖进程;进程的父进程为 PPID,父进程退出后子进程会被 systemd 接管。

僵尸进程 Z
子进程执行完毕退出,但父进程未调用接口回收它的资源,残留 Z 状态;正常重启父进程即可清理。

不可中断 D 进程
进程卡在磁盘 IO 读写,kill -9 无法终止,只能等待 IO 完成或重启服务器。

磁盘管理

磁盘简介
硬盘基础概念
硬盘是大容量永久外部存储设备,由多片带磁性金属盘片组成,断电数据不会丢失,用于存放系统、文件、业务数据。
硬盘硬件组成(逐行注释)
盘片:实际存储数据的圆形磁性金属片,一块硬盘可有多张盘片堆叠
马达驱动:带动盘片高速旋转,提供读写基础
缓存:硬盘自带高速缓冲区,临时缓存读写数据,提升磁盘速度
控制电路:硬盘主控芯片,负责和主板传输数据、调度读写
接口:SATA/NVMe/SAS,连接主板,负责数据传输

磁盘逻辑存储结构(底层寻址单位)
磁道(Track)
盘片上一圈圈同心圆,从外圈到内圈分层划分,是基础环形存储轨道。
扇区(Sector)
一条磁道被径向切分成多个扇形小块,标准单个扇区 512 字节,是磁盘最小物理读写单位。
柱面(Cylinder)
硬盘多张盘片,所有盘片同一半径位置的磁道组合称为一个柱面;传统分区工具以柱面为单位划分分区。

磁盘设备命名规则(Linux 识别硬盘)
传统机械硬盘 SATA/SAS/IDE
命名格式:sd+字母
第一块硬盘:sda
第二块硬盘:sdb
第三块硬盘:sdc
分区后缀:数字
sda1:第一块硬盘第一个主分区
sda2:第一块硬盘第二个分区
sdb1:第二块硬盘第一个分区

VMware 虚拟机添加新硬盘完整流程

前置注意事项
虚拟机必须关机才能添加硬盘;挂起 / 开机状态无法新增硬件

本次案例演示新增一块 20G 磁盘,若重复操作可添加多块,示例最多添加 3 块,系统原有 1 块,最终总计 4 块硬盘(sda、sdb、sdc、sdd)
分步操作拆解
关闭虚拟机电源,选中虚拟机 → 点击【编辑虚拟机设置】
作用:进入硬件配置面板,管理内存、CPU、硬盘、网卡等硬件
窗口右侧点击【添加】按钮
作用:启动硬件添加向导,新增硬盘、光驱、USB 设备等硬件
硬件类型选择【硬盘】,点击下一步
作用:指定本次要添加的硬件为虚拟磁盘
磁盘类型选择 SATA(推荐虚拟机默认)

补充:还有 NVMe、IDE 类型,SATA 兼容性最好,学习环境首选
选择【创建新虚拟磁盘】
区分选项:
创建新虚拟磁盘:全新空白硬盘(实验学习用)
使用现有虚拟磁盘:挂载之前建好的磁盘文件
磁盘容量设置 20GB,勾选【将虚拟磁盘存储为单个文件】
单个文件:整块硬盘只生成一个 vmdk 文件,复制迁移虚拟机更方便
拆分多个文件:自动拆分成多个小文件,老旧主机兼容
不勾选 “立即分配所有空间”:薄置备,文件占用随数据增长,节省宿主机磁盘空间
磁盘文件路径使用默认名称,直接点击【完成】
向导自动生成虚拟磁盘文件,硬件列表出现新硬盘,开机后 Linux 可识别

补充拓展知识点
硬盘添加完成开机后,系统不会自动识别分区,需要执行:分区(fdisk/gdisk)→格式化(mkfs)→挂载(mount)三步才能使用;
不重启识别新硬盘命令(无需关机重启):

虚拟机软件添加新硬盘

(VMware Workstation / CentOS7 虚拟机)

关闭当前 server1 虚拟机(必须关机,无法热添加磁盘)
虚拟机设置 → 硬件 → 添加 → 硬盘 → 下一步
磁盘类型选 SCSI(默认推荐)
创建新虚拟磁盘,自定义磁盘大小(如 20G)
选择「将虚拟磁盘存储为多个文件」,自定义磁盘文件名,完成添加
启动虚拟机,登录系统

Linux 系统识别新硬盘、分区、格式化、永久挂载

lsblk
(注释:查看磁盘,确认新硬盘)
原有系统盘 sda,新硬盘会显示为 sdb(无分区,无挂载点)

给新硬盘分区(fdisk)

fdisk /dev/sdb
(注释:操作新硬盘/dev/sdb)
交互操作步骤:
输入 n → 新建分区
输入 p → 主分区
分区号默认回车,起始扇区默认回车,结束扇区默认回车(占用整块硬盘)
输入 w → 保存分区表并退出

fdisk /dev/sdb 完整分步讲解(每一步含义 + 操作)
前置说明
/dev/sdb 是你新加的 20G 虚拟硬盘,磁盘空白无分区表,fdisk 是 Linux 磁盘分区工具。

执行命令进入工具
fdisk /dev/sdb
含义:对第二块硬盘sdb进行分区操作

提示:

Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
翻译:所有分区改动只存在内存,输入 w 才会真正写入磁盘,中途输 q 可以放弃所有修改。
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x75d5ad2a.
含义:这块硬盘没有分区表,程序自动新建 MBR (DOS) 分区表。
  1. Command (m for help): n
    输入 n 回车
    含义:new 新建分区
  2. Partition type:
    plaintext
    p primary(主分区)
    e extended(扩展分区)
    输入 p 回车
    含义:创建主分区,一块磁盘最多 4 个主分区,数据盘直接用主分区即可。
  3. Partition number (1-4, default 1):
    直接回车
    含义:分区编号默认 1,创建 /dev/sdb1
  4. First sector (2048-41943039, default 2048):
    直接回车
    含义:分区起始扇区,默认 2048 是 4K 对齐,硬盘读写性能最优,不要修改。
  5. Last sector … default 41943039:
    直接回车
    含义:分区结束扇区,默认占满整块 20G 硬盘,不分多个分区就直接回车。
    输出提示:Partition 1 of type Linux and of size 20 GiB is set
    代表:20G 主分区sdb1创建完成,仅保存在内存,还没写入磁盘。
  6. Command (m for help): w
    输入 w 回车
    含义:write 写入分区表到磁盘,生效并退出 fdisk
    plaintext
    The partition table has been altered!
    Calling ioctl() to re-read partition table.
    Syncing disks.
    翻译:分区表已修改,系统重新读取磁盘分区信息,同步硬盘数据,操作结束退回 root 命令行。

硬盘分区

MBR 分区

markdown
MBR(Master Boot Record,主引导记录)包含硬盘一系列参数和一段引导程序
注释:MBR全称主引导记录,是老式硬盘分区标准,存储硬盘基础硬件参数+开机引导代码

MBR(Master Boot Record,主引导记录)包含硬盘一系列参数和一段引导程序,
硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序
注释:开机流程:硬件自检完成→执行MBR里的引导代码→校验分区表→找到标记为【激活/可启动】的分区→加载该分区内的系统内核
硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序

MBR是由分区程序(如Fdisk.exe)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存
注释:Windows的fdisk、Linux的fdisk工具都能生成MBR;MBR独立于系统,修改引导代码可以同时装Windows+Linux双系统
MBR是由分区程序(如Fdisk.exe)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存

MBR位于整个硬盘的0磁道0柱面1扇区
注释:老式磁盘寻址方式(磁道/柱面/扇区CHS),硬盘最开头第一个扇区存放MBR,硬件开机优先读取这个位置
MBR位于整个硬盘的0磁道0柱面1扇区
主引导扇区总大小固定512字节,是硬盘最小读写单位
主引导扇区512B
446字节:存放开机引导代码,系统启动的核心程序
MBR=446B
64字节:硬盘分区表MPT,记录4个分区的起止位置、类型、激活状态
MPT(Disk Partition Table硬盘分区表)=64B
末尾2个固定字节0x55 0xAA,是合法MBR分区的校验标识;没有这两个字节系统会判定硬盘无分区表
最后两个字节“55,AA”是分区的结束标志

MBR 分区类型

主分区(primary partition)
主分区:可以直接装系统、格式化存放数据的分区
主分区(primary partition)
分区表只有64字节,每16字节存1个分区信息,最多4条记录,因此整块硬盘最多4个主分区
一块硬盘最多4个主分区,主分区不可以再进行二次分区
主分区可直接格式化(ext4/ntfs),直接读写文件,无需额外嵌套分区
主分区可以直接建立文件系统,存放数据
只有主分区能设置【激活启动标记】,只有激活的主分区能引导操作系统开机
可以用来引导、启动操作系统

扩展分区(extended partition)
扩展分区:仅作为“容器”,不能直接格式化,用来容纳多个逻辑分区
扩展分区(extended partition)
4条分区记录里最多占用1条做扩展分区,剩余3条留给主分区;总和不能超过4
一块硬盘最多一个扩展分区,加主分区最多4个
扩展分区本身不能创建文件系统,不能直接存文件,只是逻辑分区的外壳
不能创建文件系统
扩展分区内部可以无限划分逻辑分区,解决最多4个分区的限制
可以划分逻辑分区

逻辑分区(logical partition)
逻辑分区:放在扩展分区内部,用来存放普通数据的分区
逻辑分区(logical partition)
可直接格式化创建文件系统,存放日常文件、程序
可以创建文件系统,存放数据
MBR标准下逻辑分区数量无硬性上限,不受4个分区限制
逻辑分区的数量没有限制。

MBR两种合法分区组合方案:
方案1:4个全主分区,无扩展/逻辑分区
方案2:3个主分区 + 1个扩展分区,扩展分区内可分无数逻辑分区
支持的分区数量:4个主分区或者3个主分区1个扩展分区

原理解释:分区表MPT总大小64B,单个分区条目占用16B,64/16=4,最多记录4个分区条目,因此上限4个主分区
为什么MBR最多只能有4个主分区: 因为分区表占据64个字节,其中每个分区的信息占用16个字节,分区表里面可以记录四个分区信息描述。

GPT 分区

MBR三大致命缺陷,因此推出GPT新标准
产生原因
缺陷1:MBR寻址上限2.2TB,超过2.2TB的硬盘无法完整识别使用
MBR分区表中最高支持磁盘容量为2.2TB
缺陷2:MBR分区表只有1份,无备份;分区表损坏,整块硬盘所有数据全部无法读取
MBR分区表中,没有备份机制,分区表被干掉则磁盘全部死光光
缺陷3:MBR引导代码仅446字节,空间太小,无法存放复杂开机引导程序
MBR中存储开机管理程序的容量只有446B,无法存储较多内容

GPT全称全局唯一标识分区表,新一代分区标准,弥补MBR所有缺陷
概念
GPT(GUID Partition Table,全局唯一标识分区表)是一种比MBR分区更先进、更灵活的磁盘分区模式
GPT抛弃老式CHS寻址,改用LBA逻辑区块寻址,统一按块编号读写硬盘
GPT分区表使用LBA(Logical Block Address)逻辑区块地址来记录磁盘引导、分区的相关信息
LBA单个区块大小可选512字节~4KB,行业默认512B
LAB区块大小(512B-4KB),默认为512B
GPT总占用68个LBA块:前34块存分区表头、分区记录;后34块完整备份前面所有数据,防止分区表损坏丢失数据
LAB区块共68个,前34个记录分区信息,后34个进行备份

GPT取消主/扩展/逻辑分区的区分,所有分区平等,默认预留128条分区记录,最多128个分区,无需扩展分区
不在区分主分区与其它分区,默认情况下,GPT最多可支持128个分区
容量上限极大:支持单块硬盘、单个分区都超过2.2TB,最大18EB,满足超大存储需求
支持大于2.2TB的总容量及大于2.2TB的分区,最大支持18EB(1EB=1024PB,1PB=1024TB,1TB=1024GB)
硬件适配:老旧BIOS固件不识别GPT,因此配套推出UEFI固件替代传统BIOS;UEFI用C语言开发,跨平台、功能更强,原生支持GPT大硬盘
GPT分区机制在较老的BIOS中不能识别,则提供了一个UEFI (Unified Extensible Firmware Interface)统一的可扩展固件接口,来取代传统的BISO,又称为UEFI BIOS,UEFI使用C语言编写,支持较多的平台

补充易混点注释
MBR 限制总结
容量上限:2.2TB
分区上限:最多 4 个主分区,或 3 主 1 扩展 + 无数逻辑
无分区表备份,引导代码仅 446B
GPT 优势总结
容量上限 18EB,支持超大硬盘
原生最多 128 个分区,不分主 / 逻辑
分区表前后双份备份,容错性高
必须搭配 UEFI 固件启动(老式 BIOS 无法引导 GPT 系统盘)

lsblk 命令

作用
lsblk = list block devices,列出系统所有块设备(硬盘、光盘、分区、LVM逻辑卷)
查看磁盘信息
固定语法:命令 + 可选参数 + 指定硬盘设备(不写设备默认列出全部)
lsblk 参数 设备名

-d 只展示整块硬盘disk,屏蔽下面的分区part层级,只看磁盘本体
-f 显示分区对应的文件系统类型、UUID、挂载目录,格式化后才能看到
-i 纯ASCII字符绘图,不会出现树形特殊符号,适配老旧终端
-t 汇总磁盘硬件详细统计:读写、IO、扇区大小等底层数据

-p 打印设备完整绝对路径,如/dev/nvme0n1,不会省略/dev/

直接执行lsblk,无参数,列出全部块设备树形结构
lsblk

 显示内容分析
# NAME:设备简写,完整路径为 /dev/NAME
NAME :设备名称,默认省略前导/dev 目录名
# MAJ主设备号区分硬件类型,MIN次设备号区分同类型下不同设备
MAJ:MIN :主要:次要 设备代码
# RM=1:U盘/光驱可弹出;RM=0:服务器内置硬盘不可移除
RM :是否可以卸载
# 分区/磁盘总容量
SIZE : 容量
# RO=1:只读光盘;RO=0:可读写普通硬盘
RO :是否为 只读 
# disk整块硬盘、part硬盘分区、rom光驱、lvm逻辑卷
TYPE : 设备类别(磁盘、分区、光盘等)
# 文件系统挂载路径,系统访问分区的入口
MOUNTPOINT :挂载点

fdisk 硬盘分区工具

使用 fdisk 管理分区

fdisk默认创建DOS分区表,也就是MBR分区格式,单盘最多4个主分区
fdisk命令工具默认将磁盘划分为MBR格式的分区
标准语法,操作哪块硬盘就填写对应设备名/dev/sdX
fdisk 设备名
fdisk是交互式工具,输入指令按回车执行,不会一条命令直接完成分区
fdisk命令以交互方式进行操作的,在菜单中选择相应功能键即可
fdisk 交互指令对照表

a 调整磁盘的启动分区(设置激活可启动分区)
p 显示当前磁盘的分区信息(打印分区表)
d 删除磁盘指定分区
t 更改分区类型 ID(83Linux/82swap 等)
l 列出所有支持的分区类型 ID 对照表
u 切换容量显示单位(扇区 / MB/G)
m 查看所有指令的帮助菜单
n 创建新分区(主 / 扩展 / 逻辑)
q 不保存任何修改,直接退出 fdisk
w 将内存中的分区表写入硬盘,保存并退出
g 清空原有表,新建空 GPT 分区表
o 清空原有表,新建空 DOS (MBR) 分区表

实操示例 1:/dev/sda 3 主分区 + 1 扩展分区 + 3 逻辑分区
对/dev/sda硬盘进行分区,方式:P+P+P+E(l+l+l),容量自定
fdisk /dev/sda
(注释:进入/dev/sda磁盘交互分区界面)

程序版本提示:所有修改临时存内存,不执行w写入硬盘不会生效
欢迎使用 fdisk (util-linux 2.37.4)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
该硬盘暂无任何分区表,自动创建DOS(MBR)分区标识
设备不包含可识别的分区表。
创建了一个磁盘标识符为 0x4cd88da9 的新 DOS 磁盘标签。

m查看帮助,n新建分区
命令(输入 m 获取帮助):n  #输入n表示新建
选择分区类型:p主分区 / e扩展分区
分区类型   
   p   主分区 (0 primary, 0 extended, 4 free)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):p   #输入p或直接回车,创建主分区
主分区编号1-4,默认1
分区号 (1-4, 默认  1):   # 默认回车
分区起始扇区,默认使用磁盘空闲最开头位置,直接回车
第一个扇区 (2048-41943039, 默认 2048):    
分区结束位置,+2G代表分配2GB容量给该分区
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} 
(2048-41943039, 默认 41943039): +2G  

提示:1号主分区创建完成,默认Linux类型83
创建了一个新分区 1,类型为“Linux”,大小为 2 GiB。
再次n新建第二个主分区
命令(输入 m 获取帮助):n   # 同上
分区类型
   p   主分区 (1 primary, 0 extended, 3 free)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):

将使用默认回应 p。
分区号 (2-4, 默认  2): 
第一个扇区 (4196352-41943039, 默认 4196352): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} 
(4196352-41943039, 默认 41943039): +3G

创建了一个新分区 2,类型为“Linux”,大小为 3 GiB。

# 第三个主分区
命令(输入 m 获取帮助):n  # 同上
分区类型
   p   主分区 (2 primary, 0 extended, 2 free)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):

将使用默认回应 p。
分区号 (3,4, 默认  3): 
第一个扇区 (10487808-41943039, 默认 10487808): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (10487808-41943039, 默认 41943039): +2G

创建了一个新分区 3,类型为“Linux”,大小为 2 GiB。

# 第四个分区只能选e扩展分区(3主分区已占用3条分区记录)
命令(输入 m 获取帮助):n   
分区类型  
   p   主分区 (3 primary, 0 extended, 1 free)   
   e   扩展分区 (逻辑分区容器)
选择 (默认 e):e   # 选择e新建扩展分区

# 扩展分区固定占用分区号4
已选择分区 4
第一个扇区 (14682112-41943039, 默认 14682112): 
# 不写容量,回车把磁盘剩余全部空间分给扩展分区
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} 
(14682112-41943039, 默认 41943039):   

创建了一个新分区 4,类型为“Extended”,大小为 13 GiB。

# 扩展分区内新建逻辑分区5
命令(输入 m 获取帮助):n
所有主分区都在使用中。
添加逻辑分区 5      # 新建逻辑分区
第一个扇区 (14684160-41943039, 默认 14684160): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} 
(14684160-41943039, 默认 41943039): +2G

创建了一个新分区 5,类型为“Linux”,大小为 2 GiB。

# 第二个逻辑分区6
命令(输入 m 获取帮助):n
所有主分区都在使用中。
添加逻辑分区 6
第一个扇区 (18880512-41943039, 默认 18880512): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} 
(18880512-41943039, 默认 41943039): +3G

创建了一个新分区 6,类型为“Linux”,大小为 3 GiB。

# 第三个逻辑分区7,剩余所有空间
命令(输入 m 获取帮助):n
所有主分区都在使用中。
添加逻辑分区 7
第一个扇区 (25174016-41943039, 默认 25174016): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P}
 (25174016-41943039, 默认 41943039):   # 回车,剩余全部分配

创建了一个新分区 7,类型为“Linux”,大小为 8 GiB。

# p打印完整分区表核对
命令(输入 m 获取帮助):p   # 显示分区列表
# 磁盘总容量、扇区、分区表类型dos=MBR
Disk /dev/sda:20 GiB,21474836480 字节,41943040 个扇区
磁盘型号:VMware Virtual S
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4cd88da9

# 分区列表字段:设备名、启动标记、起始扇区、结束扇区、总扇区、容量、分区ID、分区类型
设备       启动     起点     末尾     扇区 大小 Id 类型
/dev/sda1           2048  4196351  4194304   2G 83 Linux
/dev/sda2        4196352 10487807  6291456   3G 83 Linux
/dev/sda3       10487808 14682111  4194304   2G 83 Linux
/dev/sda4       14682112 41943039 27260928  13G  5  扩展
/dev/sda5       14684160 18878463  4194304   2G 83 Linux
/dev/sda6       18880512 25171967  6291456   3G 83 Linux
/dev/sda7       25174016 41943039 16769024   8G 83 Linux

# 退出fdisk后执行lsblk,树形查看分区层级

lsblk
(注释:list block,列出系统所有块存储设备(硬盘、分区、光驱、逻辑卷、loop 虚拟设备),以树形结构展示设备上下级从属关系、大小、类型以及已挂载点,相比 blkid、df 更直观查看磁盘整体架构,常用于确认分区是否生效、LVM 层级、光驱盘符等)

NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
# 整块sda硬盘
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part 
├─sda2          8:2    0    3G  0 part 
├─sda3          8:3    0    2G  0 part 
# 扩展分区不显示真实容量,仅作为容器标记1K占位
├─sda4          8:4    0    1K  0 part 
├─sda5          8:5    0    2G  0 part 
├─sda6          8:6    0    3G  0 part 
└─sda7          8:7    0    8G  0 part 
# 另外两块空闲硬盘sdb、sdc无分区
sdb             8:16   0   20G  0 disk 
sdc             8:32   0   20G  0 disk 
# 光驱sr0
sr0            11:0    1  8.4G  0 rom  
# 系统NVMe固态盘(原有系统盘)
nvme0n1       259:0    0   20G  0 disk 
├─nvme0n1p1   259:1    0  400M  0 part /boot
└─nvme0n1p2   259:2    0 19.6G  0 part 
  ├─rhel-root 253:0    0 15.6G  0 lvm  /
  └─rhel-swap 253:1    0    4G  0 lvm  [SWAP]

例2:对/dev/sdc,进行分区,P+P+E (l+l) P:1G P:3G L: 10G L:剩余
实操逻辑:
1.fdisk /dev/sdc
2.n → p → +1G 主分区1
3.n → p → +3G 主分区2
4.n → e 剩余全部空间 扩展分区3
5.n → +10G 逻辑分区5
6.n → 回车剩余空间 逻辑分区6
7.p核对分区表,w保存退出

fdisk 分区关键注意事项

注意
fdisk执行w写入后,内核不会自动识别新分区表,执行partprobe手动同步分区信息到内核
若无法查看,则表示分区信息还未写入内核(常见情况),输入partprobe命令 进行手动将分区信息同步到内核,再不行就重启
补充:partprobe无输出即执行成功;仍不识别则reboot重启服务器生效

gdisk 管理 GPT 分区

注意
gdisk 专门操作GPT分区表;如果硬盘原本是MBR,执行gdisk会直接清空原有分区与全部数据
注意:gdisk命令针对GPT分区格式,若在MBR分区格式下进行添加分区,则所有数据会全部丢失,切记:一块硬盘中fdisk(MBR工具)与gdisk(GPT工具)不能混用
标准语法:gdisk + 硬盘设备名
gdisk 设备名

gdisk 实操示例:

需求:对/dev/sdc使用gdisk创建3个GPT分区,容量自定义
例:对/dev/sdd进行gdisk分区,3个分区,容量自定

gdisk /dev/sdc
(注释:进入/dev/sdc的gdisk交互式操作界面)

打印gdisk工具版本
GPT fdisk (gdisk) version 1.0.7

扫描硬盘原有分区表类型
Partition table scan:
  MBR: not present  # 无MBR分区表
  BSD: not present  # 无BSD分区
  APM: not present  # 无APM苹果分区
  GPT: not present  # 无GPT分区表

# 在内存中新建空白GPT分区表(此时还未写入硬盘,重启失效)
Creating new GPT entries in memory.

# ? 查看全部帮助指令;n代表新建分区
Command (? for help): n   #新建
# GPT最多支持128个分区,默认自动分配分区号1
Partition number (1-128, default 1): 
# 分区起始扇区,默认推荐2048(对齐优化,直接回车)
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: 
# 分区结束位置,+3G 分配3GB容量
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +3G
# 默认分区类型8300 Linux文件系统
Current type is 8300 (Linux filesystem)
# L查看所有分区类型编码,回车默认8300
Hex code or GUID (L to show codes, Enter = 8300): 
# 提示分区类型修改完成
Changed type of partition to 'Linux filesystem'

# 新建第二个分区
Command (? for help): n
Partition number (2-128, default 2): 
First sector (34-41943006, default = 6293504) or {+-}size{KMGTP}: 
Last sector (6293504-41943006, default = 41943006) or {+-}size{KMGTP}: +2G
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

# 新建第三个分区
Command (? for help): n
Partition number (3-128, default 3): 
First sector (34-41943006, default = 10487808) or {+-}size{KMGTP}: 
Last sector (10487808-41943006, default = 41943006) or {+-}size{KMGTP}: +4G
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

# p 打印当前分区表预览
Command (? for help): p
# 硬盘总扇区、总容量
Disk /dev/sdc: 41943040 sectors, 20.0 GiB
# 硬盘硬件型号
Model: VMware Virtual S
# 扇区大小512字节
Sector size (logical/physical): 512/512 bytes
# 硬盘全局唯一GPT标识
Disk identifier (GUID): 9FCD84E9-064C-416F-8829-34D7F7BE3542
# GPT分区表最多支持128条分区记录
Partition table holds up to 128 entries
# GPT表头占用扇区2~33
Main partition table begins at sector 2 and ends at sector 33
# 硬盘第一个可用分区起始扇区34
First usable sector is 34, last usable sector is 41943006
# 分区默认2048扇区对齐,提升读写性能
Partitions will be aligned on 2048-sector boundaries
# 剩余空闲空间11GiB
Total free space is 23068605 sectors (11.0 GiB)

# 分区列表:编号、起始扇区、结束扇区、容量、类型编码、分区名称
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         6293503   3.0 GiB     8300  Linux filesystem
   2         6293504        10487807   2.0 GiB     8300  Linux filesystem
   3        10487808        18876415   4.0 GiB     8300  Linux filesystem

# w 将内存中的GPT分区表写入硬盘,永久生效
Command (? for help): w  # 保存退出

# 警告:写入会覆盖原有所有分区数据
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

# 确认是否写入,y确认,n放弃修改
Do you want to proceed? (Y/N): y   # 输入y
# 写入完成提示
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.

# 退出gdisk后,lsblk查看分区树形结构

lsblk
(注释:list block,列出系统所有块存储设备(硬盘、分区、光驱、逻辑卷、loop 虚拟设备),以树形结构展示设备上下级从属关系、大小、类型以及已挂载点,相比 blkid、df 更直观查看磁盘整体架构,常用于确认分区是否生效、LVM 层级、光驱盘符等)

NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
# MBR格式硬盘sda(之前fdisk划分)
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part 
├─sda2          8:2    0    3G  0 part 
├─sda3          8:3    0    2G  0 part 
├─sda4          8:4    0    1K  0 part 
├─sda5          8:5    0    2G  0 part 
├─sda6          8:6    0    3G  0 part 
└─sda7          8:7    0    8G  0 part 
# 空闲未分区硬盘sdb
sdb             8:16   0   20G  0 disk 
# GPT格式硬盘sdc,3个新分区sdc1/sdc2/sdc3
sdc             8:32   0   20G  0 disk 
├─sdc1          8:33   0    3G  0 part 
├─sdc2          8:34   0    2G  0 part 
└─sdc3          8:35   0    4G  0 part 

实操工作提示

生产环境分区不要把硬盘空间全部分完,预留空闲空间,后续扩容分区使用
实际工作中,硬盘分区是应保留一定的自由空间,以备将来分区空间不足时可以临时扩容

磁盘格式化

格式化的目的
类比讲解:空白硬盘=白纸;分区=裁剪纸张;格式化=画上格子(文件系统),系统才能存放读取文件
当我们拿到了一张大白纸,首先为了使用方便要裁剪,然后为了书写工整要先画格,这里的“白纸”就是原始的硬盘,而“裁剪”意味着分区,然后的“画格”就是格式化,最后写入内容

格式化本质:给分区创建文件系统,定义文件存储、读取、管理规则
格式化是对分区建立文件系统,文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法

ext2 文件系统三大核心组件

文件系统组成-ext2
Linux传统ext系列文件系统由3部分构成
组成:super block(超级块)、inode (索引块)、block(数据块)

super block超级块:全局文件系统总信息,相当于硬盘地图
super block:又称为“硬盘地图”,记录文件系统的整体信息,如:inode/block块的总量、使用量、空闲块量、文件系统格式等相关信息
inode索引节点:存储文件元数据(属性),一个文件独占1个inode,不存文件内容

inode:记录文件的属性,一个文件占用一个inode块,并且记录次文件的数据所在的block块的号码,默认为128B大小,存储:文件访问权限、文件所有者与所属组、文件大小、创建时间或修改内容时间、最有一次访问时间、特殊权限、真实数据地址

block数据块:存放文件真实内容,单块大小可选1/2/4KB,大文件占用多个block
block块:记录实际文件的内容,在EXT2文件系统中分为1KB、2KB、4KB容量,文件太大时,会占用多个数据块
查看系统支持的文件系统格式

查看文件系统格式

输入mkfs,连续按2次Tab键,自动补全列出所有格式化工具
方法:输入mkfs在键入tab(点击2次)进行命令补全,可显示支持的文件系统格式

实操示例

mkfs 连续按两次 Tab 键
(注释:mkfs 是文件系统格式化前置命令,双击 Tab 会自动补全系统所有支持的格式化子命令,列出如 mkfs.xfs、mkfs.ext4、mkfs.fat、mkfs.vfat 等可用格式化工具,用于给裸分区 / 逻辑卷指定对应文件系统)

# 所有支持的文件系统格式化命令
mkfs  mkfs.cramfs  mkfs.ext2  mkfs.ext3  mkfs.ext4  mkfs.fat  mkfs.minix   mkfs.msdos   mkfs.vfat  mkfs.xfs     
plaintext

格式化命令

mkfs.xfs -参数 硬盘分区名
(注释:为分区格式化 XFS 文件系统,RHEL7/8/9、CentOS7 及以上发行版默认根文件系统,支持大容量磁盘、在线扩容、日志机制,稳定性更适配服务器场景;常用 -f 强制覆盖已有文件系统)

mkfs.ext4 -参数 硬盘分区名
(注释:格式化 ext4 日志文件系统,兼容 CentOS6 及更早 Linux 版本,可正常缩容、扩容,老旧服务器、嵌入式设备使用较多,XFS 不支持缩容是二者核心区别)

参数
-f 强制格式化:分区已有文件系统时必须加,否则报错
-c 格式化前扫描磁盘坏道,检测磁盘硬件故障
-V 输出建立文件系统的详细信息

实操示例 1:GPT 分区后格式化 xfs/ext4

例1:恢复快照,删除之前的虚拟硬盘文件,添加新硬盘,分区后格式化

gdisk /dev/sda (2G+3G+4G)
(注释:先对sda做gdisk GPT分区 2G+3G+4G)

lsblk
(注释:查看分区)

NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part 
├─sda2          8:2    0    3G  0 part 
└─sda3          8:3    0    4G  0 part 

mkfs.xfs /dev/sda1
(注释:将/dev/sda1格式化为xfs)

# 下方输出xfs文件系统各项参数(块大小、inode、日志等)
meta-data=/dev/sda1              isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=524288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

mkfs.xfs /dev/sda2
(注释;sda2格式化为xfs)
mkfs.ext4 /dev/sda3
(注释:sda3格式化为ext4)

例2:格式化/dev/sda2 ,并使用inte的cpu多线程技术进行多数据流读写系统

grep 'processor' /proc/cpuinfo
(注释:查看CPU核心数量)

processor	: 0
processor	: 1

mkfs.xfs -d agcount=2 /dev/sda2
(注释:-d 用于指定数据段相关参数;agcount 代表分配组数量,一般建议和 CPU 核心数保持一致,开启多线程并行格式化,大幅提升大容量分区的格式化速度;本条命令将 /dev/sda2 格式化为 XFS 文件系统,设置 2 个分配组,双线程执行格式化)

-f 强制格式化
-d 指定核心数

例3:制作大文件/filedev,容量2G,格式化为xfs文件系统

dd if=/dev/zero of=/filedev count=2 bs=1G
(注释:dd 创建2G空白镜像文件:从0空设备读取,输出到/filedev,1G*2)
-f 强制格式化镜像文件

mkfs.xfs -f /filedev
-f 最好加上-f强制格式化

blkid 查看设备 UUID 与文件系统

核心作用
查看硬盘分区、光盘、逻辑卷的UUID 唯一标识与文件系统类型 TYPE,UUID 用于开机挂载更稳定(盘符名易变)

blkid
(注释:列出所有块设备信息)
blkid /dev/sda1
(注释: 只查看指定分区)

UUID 是全局唯一设备编号,不受硬盘插拔盘符顺序改变影响,推荐 fstab 挂载使用 UUID 而非 /dev/sdxx。

mount 手动挂载文件系统

挂载点:空目录作为磁盘分区的访问入口;挂载 = 建立分区与目录的映射关系。

mount [-t 文件系统] 设备 挂载目录
-t 手动指定文件系统(xfs/ext4),多数情况可省略自动识别
-a 读取/etc/fstab,挂载所有配置好且未挂载的设备,常用于写完 fstab 后测试

常用挂载示例

盘符挂载

mkdir /msda1
(注释:创建空目录作为 /dev/sda1 分区的挂载入口,挂载目录必须提前新建)
mount /dev/sda1 /msda1
(注释:使用设备盘符直接挂载分区,将 /dev/sda1 关联到 /msda1 目录,访问该目录即可读写分区内数据)

UUID 挂载(推荐)

mount UUID="xxxx-xxxx" /msda2
(注释:采用 UUID 唯一标识挂载分区,不受硬盘插拔后盘符顺序错乱影响,稳定性远高于盘符挂载,生产环境优先使用该方式)

mount /dev/sr0 /media
(注释:sr0 是系统默认光驱设备,光盘介质自带写保护,挂载后自动为只读模式,无法写入修改文件,常用于挂载系统镜像做本地 YUM 源)

挂载硬性规范
一个分区不能挂载到多个目录
一个目录不能同时挂载多个分区
挂载目录建议为空目录;非空目录原有文件会被临时隐藏,卸载后恢复

umount 卸载设备

umount 设备名
umount 挂载点
注意:当前工作目录不能处于挂载目录内,否则提示目标忙无法卸载;

强制卸载(慎用):umount -f 挂载点

/etc/fstab 开机自动挂载

文件
6 列固定格式

设备/UUID  挂载点  文件系统  挂载参数  备份标记 开机自检标记
第 1 列:设备路径 或 UUID=xxx
第 2 列:挂载目录(必须提前创建)
第 3 列:文件系统 xfs/ext4/swap
第 4 列:defaults 代表默认一组挂载权限
第 5 列:dump 备份,0 = 不备份
第 6 列:fsck 磁盘检测,xfs 不支持检测固定写 0

写完配置必做测试

mount -a
若语法错误直接报错,不测试直接重启会系统开机失败无法进入系统。

loop 回环挂载(文件模拟磁盘)

在现有分区内生成一个大文件,格式化为文件系统后挂载,充当虚拟磁盘。

dd if=/dev/zero of=/loopdev count=1 bs=1G
(注释:dd 生成虚拟磁盘文件,if 指定数据源为 /dev/zero 无限零数据流,of 指定生成文件路径 /loopdev;bs 单次写入 1G,count 写入 1 次,最终生成大小 1GB 的空白文件,用于模拟一块磁盘)
mkfs.xfs -f /loopdev
(注释:-f 强制格式化,将该文件格式化为 XFS 文件系统,使其具备分区存储能力)
mount -o loop /loopdev /mloop
(注释:-o loop 开启回环挂载模式,把普通文件虚拟成块设备挂载到 /mloop 目录,可像正常分区一样读写使用)

写入 fstab 开机挂载即可持久生效。

Swap 交换分区(虚拟内存)

作用
硬盘空间充当内存,缓解物理内存不足,读写速度远慢于物理内存。

查看总 swap

free -h

方式 1:分区制作 swap
partprobe
(注释:新建磁盘分区后执行,刷新内核分区表,无需重启就能让系统识别新增的 /dev/sda4 分区)
mkswap /dev/sda4
(注释:将指定分区格式化为 Swap 交换文件系统,生成专属 Swap UUID)
swapon /dev/sda4
(注释:临时激活该交换分区,立即生效扩充虚拟内存)
fstab 写入开机挂载,格式:

/dev/sda4  swap  swap  defaults  0 0

swapoff /dev/sda4
(注释:卸载并停用该 Swap 分区,回收硬盘空间)

方式 2:文件模拟 swap

dd if=/dev/zero of=/swapdev bs=1G count=1
(注释:生成 1G 大小空白文件,当作虚拟交换分区载体)
mkswap /swapdev
(注释:对文件执行 Swap 格式化)
chmod 600 /swapdev
(注释:仅 root 用户可读可写,杜绝普通用户篡改 Swap 文件,提升安全性)
swapon /swapdev
(注释:启用文件式 Swap)
注意:文件型 swap不能使用 UUID写入 fstab,只能写文件绝对路径。

swap 容量参考
内存<2G:swap = 内存 ×2;
内存>2G:swap 与物理内存大小一致;
数据库等高性能服务器常直接关闭 swap 避免性能抖动。

df 与 du 磁盘空间查看

df:查看整个文件系统总占用(读取超级块信息,速度快)

df -h 人性化单位G/M展示
df -i 查看inode使用情况
df -T 附带显示文件系统类型
可统计已删除但进程仍占用的文件空间,适合排查磁盘满。

du 递归遍历文件统计目录真实大小

du -sh / 目录
(注释:du 即 disk usage,-s 参数只输出目录整体总占用容量,不逐层展开子文件夹;-h 以 GB、MB 等易懂单位展示,该命令仅统计当前系统内真实存在的文件占用空间,已删除但进程仍占用的文件不会被统计)
du -ah
(注释:-a 代表包含目录下所有文件与子目录一并统计大小,逐条列出每一项占用,方便定位大体积文件)

du 与 df 核心区别

df:读取文件系统超级块数据,统计整个分区总空间,能识别已删除但被进程持有句柄的文件,排查磁盘爆满优先用 df -h
du:遍历磁盘逐个检索文件累加容量,只计算现存可见文件,适合精准定位哪个文件夹占用过高

LVM 逻辑卷管理(可弹性扩容缩容)

四大核心层级
PV 物理卷:硬盘 / 分区打上 LVM 标记,基础存储单元
VG 卷组:多个 PV 打包成一个大存储池(逻辑大硬盘)
PE:VG 最小分配单元,默认 4MiB,同 VG 不可修改
LV 逻辑卷:从 VG 池划分空间,相当于可伸缩分区,格式化挂载使用

全套基础命令汇总

新建 LVM

pvcreate /dev/sdb/dev/sdc
(注释:将两块硬盘设备初始化为PV 物理卷,打上 LVM 管理标记,成为卷组可用底层存储)
vgcreate VG1 /dev/sdb/dev/sdc
(注释:创建名为 VG1 的VG 卷组,把两个 PV 合并成一个大容量存储资源池,后续所有逻辑卷都从该池分配空间)
lvcreate -n lv1 -L 150M VG1
(注释:从 VG1 卷组中创建逻辑卷 lv1
-n 指定逻辑卷名称;
-L 直接设定最终总容量 150M;
-l 则是按 PE 个数分配,默认 1PE=4MB)
mkfs.xfs/dev/VG1/lv1
(注释:给逻辑卷格式化 XFS 文件系统,才能正常挂载读写)
mkdir /LVM1
(注释:创建挂载目录,作为逻辑卷访问入口)
mount /dev/VG1/lv1 /LVM1
(注释:临时挂载逻辑卷到指定目录,重启失效)
/dev/VG1/lv1 /LVM1 xfs defaults 0 0
(注释:写入 /etc/fstab 实现开机自动挂载,第六列填 0,XFS 不支持开机 fsck 自检)

逻辑卷 LV 扩容

第一步:扩充逻辑卷底层空间
lvextend -L 400M /dev/VG1/lv1
(注释:将 lv1 总大小直接修改为 400M)
lvextend -L +100M /dev/VG1/lv1
(注释:在现有容量基础上额外增加 100M,推荐写法,不易写错总量)

第二步:刷新文件系统识别新增空间
XFS(RHEL/CentOS7/8/9 默认,支持在线扩容,不用卸载)
xfs_growfs /dev/VG1/lv1
(注释:让 XFS 文件系统适配扩容后的 LV 空间,挂载状态下即可执行)
ext4 文件系统
resize2fs /dev/VG1/lv1
(注释:ext 系列文件系统扩容命令)

LV 缩容重要说明

XFS原生不支持缩容,只能备份数据重建逻辑卷;
仅 ext3/ext4 可缩容,流程繁琐风险大:卸载→文件系统检查→缩减文件系统→缩减 LV,生产环境一般不做缩容操作。

卷组 VG 扩容

往资源池加新硬盘

pvcreate /dev/sdd
(注释:把新硬盘 sdd 初始化为物理卷)
vgextend VG1 /dev/sdd
(注释:将新 PV 加入 VG1 卷组,扩充整个存储池总可用空间,之后就能给现有 LV 扩容或新建 LV)

补充常用查看命令
pvdisplay、vgdisplay、lvdisplay 分别查看 PV、VG、LV 详细信息;
lsblk 树形查看 LVM 设备层级关系。

swap 分区
文件式 Swap(无空闲分区,推荐你当前场景)
无需重新分区,在现有分区内创建交换文件,适配你sdb已全部占用 20G 的现状。

完整操作步骤

dd if=/dev/zero of=/yumrepo/swapfile bs=1M count=2048
(注释:创建指定大小空交换文件(示例 2G))
chmod 600 /yumrepo/swapfile
(注释:权限加固,避免安全风险)
mkswap /yumrepo/swapfile
(注释:格式化为 swap)
swapon /yumrepo/swapfile
(注释:临时激活)
free -h
(注释:验证swap扩容结果)

永久开机自动启用
添加配置行(写入 /etc/fstab)

/yumrepo/swapfile  swap  swap  defaults  0 0

校验配置
mount -a
(注释:模拟开机挂载,检查/etc/fstab语法无错误)

swapon -a
(注释:重新加载fstab里所有swap配置)

验证 Swap 是否创建成功(从临时激活到永久配置全覆盖)
快速查看总 Swap 容量(验证是否扩容生效)
free -h
(注释:验证swap扩容结果)
解读:
输出里 Swap 一行的 total 是系统全部交换空间总和;
原有系统自带 swap 是 2G,你新增 2G 交换文件后,total 会变成 4G,代表创建并激活成功。

精准查看每一个已启用的 Swap 设备(分区 / 文件都会列出)
swapon -s
解读:
列表会展示所有正在运行的 swap,包含:
系统原有 LVM 交换分区 /dev/mapper/centos-swap
你新建的 swap 文件 /yumrepo/swapfile(或 swap 分区 /dev/sdb2)
只要这里出现你的 swap 条目,代表临时激活成功。

文件 Swap 删除回收流程
关闭交换文件
swapoff /yumrepo/swapfile
(注释:删除交换文件本体)
rm -rf /yumrepo/swapfile
(注释:清理/etc/fstab内对应配置行)

LVM 三层核心结构(PV→VG→LV)

层级概念
PV 物理卷 Physical Volume
普通磁盘 / 分区经过 pvcreate 初始化,变成 LVM 可识别的物理存储单元,相当于「原材料地皮」。

VG 卷组 Volume Group
把 1 块或多块 PV 合并成一个大存储池,统一管理空闲容量,相当于「整片大仓库」。

LV 逻辑卷 Logical Volume
从 VG 空闲空间划分出的可用存储设备,系统当做普通分区使用,相当于「仓库里划分的货架」。

核心流程总览
新建:磁盘分区 → pvcreate (PV) → vgcreate (VG) → lvcreate (LV) → 格式化 (mkfs.xfs/mkfs.ext4) → 挂载

扩容分两种场景:
VG 内部有剩余空闲:lvextend 扩容 LV → 扩容文件系统
VG 无空闲、新增硬盘:新磁盘做 PV → vgextend 扩容 VG → lvextend扩容 LV → 扩容文件系统
关键区分:XFS / EXT4 扩容收尾命令

在这里插入图片描述

重要知识点汇总

LVM 扩容在线热扩容,挂载状态、业务运行不受影响,无需卸载、无需重启;
/dev/mapper/vg0-lv1 和 /dev/vg0/lv1 是同一设备软链接,操作任意一个均可;
PE:VG 最小存储块,默认 4M;扩容可用 -L 指定容量 (G/M)、-l 指定 PE 个数;
/etc/fstab 写入 UUID 实现开机自动挂载,blkid 查看分区 UUID;
一台服务器可创建多个不同 VG,不用所有磁盘合并到一个 VG;系统根分区默认就是 LVM。

全套实操练习

(磁盘:sdc、sdd、sde,分步复制执行)

前置准备
虚拟机新增 3 块空白硬盘:/dev/sdc、/dev/sdd、/dev/sde
先执行 lsblk 确认三块硬盘无任何分区。

练习 1:完整新建 LVM(PV→VG→LV→格式化→临时挂载)
步骤 1:将整块磁盘 sdc 初始化为 PV(物理卷)

pvcreate /dev/sdc
(注释:把sdc做成PV)
pvs
(注释:简洁查看所有PV)

pvdisplay
(注释:详细查看PV信息)

步骤 2:创建卷组 vg0,把 PV /dev/sdc 加入 vg0

vgcreate vg0 /dev/sdc
(注释:创建名称为 vg0 的卷组,将 /dev/sdc 这块已完成 pvcreate 初始化的物理卷加入该卷组,构建 LVM 存储资源池)
vgs
(注释:精简列表式查看所有卷组,快速列出卷组名、包含 PV 数量、LV 数量、总容量、剩余空闲空间,输出简洁适合快速查看)
vgdisplay
(注释:详细展示卷组完整参数,包含 PE 总数量、已分配 PE、空闲 PE、PE 默认大小、UUID 等详细信息,Free 空闲 PE 对应可继续划分给逻辑卷的剩余存储空间)

步骤 3:从 vg0 划分 10G 逻辑卷 lv1

lvcreate -n lv1 -L 10G vg0
(注释:-n 指定lv名称,-L 指定容量10G)

lvs
(注释:以简洁表格形式列出系统全部逻辑卷,显示所属卷组、大小、路径、挂载状态,信息精简直观,适合快速浏览)
lvdisplay
(注释:输出逻辑卷完整详细参数,包含 LV 路径、UUID、占用 PE 数量、读写权限、挂载点、所属 VG 等全部底层信息,适合排查细节问题)

生成两个等效设备:/dev/vg0/lv1 /dev/mapper/vg0-lv1

lsblk /dev/vg0/lv1
(注释:单独查看 vg0 卷组下 lv1 逻辑卷的块设备信息,以树形结构显示该逻辑卷对应的父级卷组、底层物理磁盘分区,同时展示容量、挂载点与 LVM 从属关系,精准定位单条逻辑卷设备层级)

步骤 4:格式化(二选一练习)
方案 A:XFS(CentOS 系统默认)

mkfs.xfs /dev/vg0/lv1
(注释:对 vg0 卷组里的 lv1 逻辑卷格式化 XFS 文件系统,RHEL7 及以上系统默认文件系统,支持大容量磁盘、在线扩容,不支持缩容;若该设备已有文件系统,需加 -f 参数强制格式化)

方案 B:EXT4

mkfs.ext4 /dev/vg0/lv1
(注释:(注释:将该逻辑卷格式化为 ext4 日志文件系统,兼容老版本 Linux,既可以扩容也支持缩容,老旧服务器常用,缺点是超大分区性能弱于 XFS))

步骤 5:

mkdir /mnt/lv1
(注释:新建 /mnt/lv1 空目录,作为逻辑卷的挂载入口目录,挂载前必须预先创建)
mount /dev/vg0/lv1 /mnt/lv1
(注释:把 vg0 卷组下 lv1 逻辑卷临时挂载到指定目录,挂载后可在该目录读写逻辑卷内文件;该挂载为临时生效,服务器重启后挂载会失效)

df -h
(注释:查看挂载与容量)

练习 2:VG 内部有空闲,直接在线扩容 LV(场景 1)
vg0 还剩空闲空间,给 lv1 扩容 5G
lvextend -L +5G /dev/vg0/lv1
(注释:扩容逻辑卷底层空间)

刷新文件系统(按你的格式化类型执行)

如果是XFS格式
xfs_growfs /mnt/lv1
(注释:XFS 文件系统专属扩容命令,不需要指定设备路径,直接填写挂载点即可;
lvextend 只是扩充了逻辑卷底层空间,文件系统不会自动识别新增容量,执行这条命令让 XFS 文件系统在线识别并使用扩容后的全部空间,支持挂载状态下直接操作,无需卸载分区)

如果是 EXT4 格式
resize2fs /dev/vg0/lv1
(注释:仅 ext4 文件系统使用,LV 空间扩容完成后,该命令让文件系统识别新增磁盘容量;XFS 不适用此命令)
df -h /mnt/lv1
(注释:人性化单位查看挂载分区实际可用容量,验证扩容是否真正生效)

练习 3:新增硬盘扩容 VG 再扩容 LV

步骤 1 磁盘转为 PV
pvcreate /dev/sdd
(注释:给新硬盘 /dev/sdd 打上 LVM 物理卷标记,使其能够加入卷组)
pvs
(注释:简洁查看所有物理卷,确认 /dev/sdd 已成功创建为 PV)
步骤 2 把 PV 加入原有卷组
vgextend vg0 /dev/sdd
(注释:将新物理卷 sdd 并入 vg0 卷组,扩充卷组整体存储池,卷组空闲空间增加)
vgs
vgdisplay
(注释:查看卷组总容量与 Free 空闲 PE,确认 vg0 剩余可用空间变大)

步骤 3 扩容逻辑卷 lv1
lvextend -L +8G /dev/vg0/lv1
(注释:在 lv1 原有容量基础上额外增加 8G空间,仅修改 LVM 逻辑卷底层大小,文件系统不会自动识别)

步骤 4 刷新文件系统
xfs_growfs /mnt/lv1
(注释:XFS 文件系统专用,支持在线扩容,挂载状态下直接生效,无需卸载)
resize2fs /dev/vg0/lv1
(注释:ext4 文件系统专用,刷新文件系统容量适配扩容后的 LV)

练习 4:配置 /etc/fstab 开机自动挂载
blkid /dev/vg0/lv1
(注释:查询该逻辑卷唯一 UUID 与文件系统类型,推荐用 UUID 写入 fstab,盘符变更不会导致挂载失效)
vim /etc/fstab
(注释:编辑系统开机自动挂载配置文件,该文件配置错误会导致服务器开机进入急救模式)
UUID=“复制你的 UUID” /mnt/lv1 xfs defaults 0 0
(注释:fstab 标准六列格式:UUID 挂载标识、挂载点、文件系统类型、默认挂载参数、dump 备份标记 0、开机磁盘自检标记 0)
mount -a
(注释:读取 fstab 全部配置,挂载所有未挂载项;无报错代表语法无误,是修改 fstab 后必须执行的校验步骤)

练习 5:创建多套独立卷组 VG
pvcreate /dev/sde
(注释:将单块硬盘 /dev/sde 初始化为 LVM 物理卷)
vgcreate vg1 /dev/sde
(注释:新建名称为 vg1 的独立卷组,和 vg0 完全隔离,两套存储池互不干扰)
lvcreate -n lv2 -L 5G vg1
(注释:-n 指定逻辑卷名 lv2,-L 直接分配 5GB 空间,从 vg1 卷组生成新逻辑卷)
mkfs.xfs/dev/vg1/lv2
(注释:对 lv2 格式化 XFS 文件系统)
mkdir /mnt/lv2
mount /dev/vg1/lv2 /mnt/lv2
(注释:创建挂载目录并临时挂载逻辑卷)
vgs
(注释:列出系统内所有卷组,可同时看到 vg0、vg1 两个卷组)

练习 6:LVM 全套删除、环境还原
1 卸载挂载并注释开机挂载
umount /mnt/lv1
umount /mnt/lv2
(注释:卸载正在使用的逻辑卷,必须先卸载才能删除 LV)
vim /etc/fstab
(注释:把之前添加的 UUID 挂载行注释或删除,防止开机找不到设备报错)
mount -a
(注释:校验 fstab 配置,确保无无效挂载条目)

2 删除逻辑卷 LV
lvremove /dev/vg0/lv1
lvremove /dev/vg1/lv2
(注释:删除指定逻辑卷,释放卷组内占用的 PE 空间,执行需输入 y 确认)

3 删除卷组 VG
vgremove vg0
vgremove vg1
(注释:直接删除整个卷组,卷组内无 LV 才可执行)

4 清除磁盘 LVM 标记
pvremove /dev/sdc/dev/sdd/dev/sde
(注释:擦除三块磁盘上的 PV LVM 标识,硬盘恢复为普通空白磁盘,可重新分区使用)
pvs
(注释:查看物理卷列表,无输出即代表所有 PV 清理完毕,LVM 环境完全重置)

核心命令速查表

PV 物理卷
pvcreate 磁盘路径 创建 PV
pvs /pvdisplay 查看 PV
pvremove 磁盘 删除 PV 标识

VG 卷组
vgcreate 卷组名 PV 路径 新建 VG
vgextend 卷组名 PV 路径 扩容 VG(新增磁盘)
vgs /vgdisplay 查看 VG 空闲容量
vgremove 卷组名 删除卷组

LV 逻辑卷
lvcreate -n lv 名 -L 容量 卷组名 新建 LV
lvextend -L + 容量 /dev/vg/lv 扩容 LV
lvs /lvdisplay 查看 LV
lvremove /dev/vg/lv 删除 LV

文件系统扩容
xfs_growfs 挂载点 XFS 专用扩容命令
resize2fs /dev/vg/lv EXT4 专用扩容命令

挂载 / 开机自启
mount 设备 挂载目录 临时挂载
umount 挂载目录 卸载分区

blkid 查看设备 UUID
vim /etc/fstab 配置开机自动挂载
mount -a 校验 fstab 配置合法性

论坛搭建

lamp = Linux/windows + apache/nginx + mysqld/oracle/pgsql + php/jsp

(注释:解释LAMP/LEMP架构组成,操作系统、web服务、数据库、后端编程语言)

netstat -antlp|grep :80
(注释:查看服务器监听80端口的进程,确认Nginx/Apache服务状态,图中tcp6 :::80表示80端口已监听)
yum search mysqld
(注释:yum搜索名为mysqld的软件包,CentOS7官方源无原生MySQL服务端,仅出现备份、测试相关工具包)
yum search mysql
(注释:yum模糊搜索含mysql关键词的所有软件,可查询phpMyAdmin、数据库文件等配套工具)
yum search mariadb
(注释:yum搜索mariadb相关软件,CentOS7默认数据库为MariaDB,兼容MySQL语法)
yum install -y mariadb-server
(注释:自动确认安装MariaDB数据库服务端,自动安装所有依赖组件)
systemctl enable --now mariadb
(注释:–now表示立即启动mariadb服务,同时设置开机自启,创建系统服务软链接)
mysql_secure_installation
(注释:MariaDB安全初始化脚本,用于生产环境加固数据库安全)

Enter current password for root (enter for none):
(注释:刚安装数据库root无密码,直接回车跳过输入旧密码)
; Set root password? [Y/n] Y
(注释:确认设置数据库root管理员密码,输入Y执行)
; New password:
(注释:输入自定义root数据库新密码)
; Re-enter new password:
(注释:二次确认输入root密码,两次一致则密码更新成功)
; Remove anonymous users? [Y/n] Y
(注释:删除数据库默认匿名空用户,防止无账号直接登录,输入Y确认删除)
; Disallow root login remotely? [Y/n] Y
(注释:禁止root账号从外网远程连接数据库,仅允许本地localhost登录,提升安全)
; Remove test database and access to it? [Y/n]
(注释:删除默认test测试库,清空对应访问权限,生产环境建议输入Y)

mysql -p
(注释:携带-p参数,登录时手动输入数据库root密码,成功进入MariaDB控制台)
quit
(注释:执行quit命令退出MariaDB数据库交互终端,返回系统root命令行)
yum search scl
(注释:使用yum搜索包含scl关键字的软件包,检索软件集合相关rpm包)
yum install -y centos-release-scl.noarch
(注释:静默安装CentOS SCL软件集合源配置包,自动确认安装无需交互)
yum repolist
(注释:列出本机所有已启用的yum软件仓库,加载镜像时出现域名解析警告,但成功识别base、sclo-rh、sclo、epel、extras、updates仓库)
cd /etc/yum.repos.d/
(注释:切换工作目录至yum仓库配置文件存放目录)
ls
(注释:列出当前目录下所有yum仓库配置文件,包含CentOS-Base.repo、CentOS-SCLo-scl.repo、CentOS-SCLo-scl-rh.repo)
vim CentOS-SCLo-scl.repo
(注释:使用vim编辑器编辑SCLo软件集合仓库配置文件)

 # CentOS-SCLo-scl.repo
(注释:注释行,标识当前配置文件名称)
; # Please see http://wiki.centos.org/SpecialInterestGroup/SCLo for more information
(注释:注释行,提供SCLo软件集合官方文档查询地址)
; [centos-sclo-scl]
(注释:仓库id标识,主SCL软件仓库段起始)
; name=CentOS-7 - SCLO sclo
(注释:仓库展示名称,yum列表中显示的仓库别名)
; baseurl=https://mirrors.aliyun.com/centos/7/sclo/$basearch/sclo/
(注释:仓库软件包阿里云镜像访问地址,$basearch自动匹配系统架构x86_64)

yum repolist
(注释:执行命令加载所有启用的yum仓库,统计可用软件总数)

yum search php
(注释:模糊搜索所有描述、名称包含php的软件包,包含高版本SCLo PHP)

ls
(注释:再次查看yum源目录文件,确认SCLo rh源文件存在)

yum list rh-php73-*
(注释:批量查询rh-php73开头所有PHP7.3软件包,SCLo高版本PHP)

rh-php73-php-process.x86_64 7.3.33-1.el7
(注释:PHP7.3进程管理组件包)
; rh-php73-php-pspell.x86_64 7.3.33-1.el7
(注释:PHP7.3英文拼写检查扩展)
; rh-php73-php-recode.x86_64 7.3.33-1.el7
(注释:PHP7.3字符编码转换扩展)
; rh-php73-php-snmp.x86_64 7.3.33-1.el7
(注释:PHP7.3 SNMP网络设备监控扩展)
; rh-php73-php-soap.x86_64 7.3.33-1.el7
(注释:PHP7.3 SOAP WebService接口扩展)
; rh-php73-php-xml.x86_64 7.3.33-1.el7
(注释:PHP7.3 XML解析处理扩展)
; rh-php73-php-xmlrpc.x86_64 7.3.33-1.el7
(注释:PHP7.3 XMLRPC远程调用扩展)
; rh-php73-php-zip.x86_64 7.3.33-1.el7
(注释:PHP7.3 Zip压缩包读写扩展)
; rh-php73-runtime.x86_64 1-1.el7
(注释:PHP7.3运行时环境依赖包)
; rh-php73-scldevel.x86_64 1-1.el7
(注释:PHP7.3开发编译依赖包)

yum install rh-php73.x86_64 rh-php73-php-mysqlnd.x86_64
(注释:安装PHP7.3主程序包+MySQL数据库驱动扩展包)

Loaded plugins: fastestmirror
(注释:yum加载测速插件)
; Loading mirror speeds from cached hostfile
(注释:读取本地缓存镜像测速记录)
; * base: mirrors.aliyun.com
(注释:基础源使用阿里云镜像)
; * extras: mirrors.aliyun.com
(注释:扩展源使用阿里云镜像)
; * updates: mirrors.aliyun.com
(注释:更新源使用阿里云镜像)
; Resolving Dependencies
(注释:yum自动解析安装包所需全部依赖软件)
; --> Running transaction check
(注释:启动安装事务检测,校验依赖完整性)
; ---> Package rh-php73.x86_64 0:1-1.el7 will be installed
(注释:确认即将安装rh-php73主程序包)
; ---> Processing Dependency: rh-php73-runtime(x86-64) = 1-1.el7 for package: rh-php73-1-1.el7
(注释:检测到rh-php73依赖运行时包,会自动同步安装)
; Is this ok [y/d/N]: y
(注释:询问是否确认安装,输入y确认执行安装)
; Downloading packages:
(注释:开始从阿里云镜像下载所需rpm安装包)
; (1/21): audit-libs-python-2.8.5-4.el7.x86_64.rpm
(注释:第1个下载包:审计系统python依赖库)
; (2/21): checkpolicy-2.5-8.el7.x86_64.rpm
(注释:第2个下载包:SELinux策略检测工具)
; (3/21): libcgroup-0.41-21.el7.x86_64.rpm
(注释:第3个下载包:Linux资源控制组件库)
; (4/21): libsemange-python-2.5-14.el7.x86_64.rpm
(注释:第4个下载包:SELinux python绑定库)
; (5/21): libxslt-1.1.28-6.el7.x86_64.rpm
(注释:第5个下载包:XSLT文档转换库)
; (6/21): pcre2-10.23-2.el7.x86_64.rpm
(注释:第6个下载包:新版正则表达式库)
; (7/21): python-IPy-0.75-6.el7.noarch.rpm
(注释:第7个下载包:Python IP地址处理工具)
; (8/21): policycoreutils-python-2.5-34.el7.x86_64.rpm
(注释:第8个下载包:SELinux策略管理工具)
; warning: /var/cache/yum/x86_64/7/centos-sclo-rh/packages/rh-php7
(注释:警告行,提示PHP73安装包无本地预存GPG公钥)
; RSA/SHA1 Signature, key ID f2ee9d55: NOKEY
(注释:详细警告:该rpm包签名密钥未导入系统,yum校验提示无密钥)
; Public key for rh-php73-1-1.el7.x86_64.rpm is not installed
(注释:完整警告说明:缺少对应GPG公钥,仅警告不中断安装)
; (9/21): rh-php73-1-1.el7.x86_64.rpm
(注释:第9个下载包:PHP7.3主程序包)
; (11/21): rh-php73-php-common-7.3. 23% [=====
(注释:第11个包下载进度23%,PHP公共基础组件包)
; Complete!
(注释:全部软件包下载、依赖安装完成,PHP7.3部署完毕)

cd /etc/httpd/conf.d
(注释:切换Apache httpd虚拟主机配置目录,用于配置PHP解析)
ls
(注释:列出Apache附加配置文件,无默认php解析配置)

autoindex.conf README userdir.conf welcome.conf
(注释:Apache默认自带配置文件,无PHP相关配置)

systemctl restart httpd
(注释:重启Apache Web服务,加载新环境软件)
rpm -ql rh-php73
(注释:查询rh-php73主程序包所有安装文件路径)

(contains no files)
(注释:rh-php73为元包,仅负责依赖管理,无实体文件)

rpm -ql rh-php73-php-mysqlnd
(注释:查询PHP MySQL数据库驱动包所有安装文件路径)

/etc/opt/rh/rh-php73/php.d/20-mysqlnd.ini
(注释:mysqlnd驱动php配置文件)
; /etc/opt/rh/rh-php73/php.d/30-mysqli.ini
(注释:mysqli数据库扩展配置文件)
; /etc/opt/rh/rh-php73/php.d/30-pdo_mysql.ini
(注释:pdo-mysql数据库扩展配置文件)
; /opt/rh/rh-php73/register.content/etc/opt/rh/rh-php73/php.d/20-mysqlnd.ini
(注释:SCLo环境注册对应配置软链接)
; /opt/rh/rh-php73/register.content/etc/opt/rh/rh-php73/php.d/30-mysqli.ini
(注释:mysqli扩展环境注册软链接)
; /opt/rh/rh-php73/register.content/etc/opt/rh/rh-php73/php.d/30-pdo_mysql.ini
(注释:pdo-mysql扩展环境注册软链接)
; /opt/rh/rh-php73/root/usr/lib64/php/modules/mysqli.so
(注释:mysqli扩展底层动态库文件)
; /opt/rh/rh-php73/root/usr/lib64/php/modules/mysqlnd.so
(注释:mysqlnd底层驱动动态库)
; /opt/rh/rh-php73/root/usr/lib64/php/modules/pdo_mysql.so
(注释:pdo-mysql底层驱动动态库)

systemctl restart httpd
(注释:再次重启Apache服务,尝试生效PHP环境)
yum search http
(注释:模糊搜索所有名称、描述含http的软件包,查询Apache/Nginx等web服务软件)

cd
(注释:返回root家目录)

下载Discuz_X3.5_SC_UTF8_20260504.zip
移入MobaXterm
unzip Discuz_X3.5_SC_UTF8_20260504.zip
(注释:执行unzip解压Discuz论坛压缩包,释放网站源码)
ls
(注释:解压完成后列出目录文件,出现upload源码文件夹)
cd upload
(注释:切换当前工作目录到名为 upload 的文件夹下)

ls
(注释:列出 upload 目录内包含的文件与子目录,查看该文件夹里的内容)
ls /usr/local/nginx/html/
(注释:查看Nginx默认网站根目录内原有文件)
ll -d /var/www/html/
(注释:长格式查看Apache默认网页目录的权限、归属信息)
systemctl disable --now httpd
(注释:立即停止httpd服务,并设置开机不自启,关闭Apache避免80端口冲突)
mv * /usr/local/nginx/html/
(注释:将upload目录下所有Discuz源码全部移动至Nginx网页根目录)
cd /usr/local/nginx/html/
(注释:切换到Nginx网站根目录,确认源码迁移结果)
ls
(注释:查看Nginx根目录,确认Discuz全部文件已迁移完成)
chmod -R 777 config data uc_client uc_server
(注释:递归给论坛读写关键目录赋予最高读写执行权限,解决安装权限报错)
(注释:启动Nginx Web服务,加载nginx.conf配置文件)
yum install -y rh-php73-php-fpm
(注释:使用 yum 包管理器静默安装 7.3 版本的 PHP-FPM 服务组件,-y 自动确认所有安装交互,PHP-FPM 用于配合 Nginx 处理 PHP 动态网页解析请求)

systemctl enable --now rh-php73-php-fpm
(注释:enable 设置该服务开机自启;–now 代表立即启动当前服务,一条命令完成开机自启 + 即时运行 PHP-FPM)
netstat -antlp|grep :9000
(注释:筛选查看9000端口监听状态,验证php-fpm服务正常运行)
systemctl disable --now httpd
(注释:立即停止httpd服务,并设置开机不自启httpd)
cd ..
(注释:切换到当前目录的上一级目录)
ls
(注释:列出当前目录下所有文件与文件夹)
pwd
(注释:打印输出当前所在完整工作目录路径)
vim /usr/local/nginx/conf/nginx.conf
(注释:使用vim编辑器打开nginx主配置文件nginx.conf)

location / {
(注释:匹配网站根目录所有访问请求)
; root html;
(注释:指定网站资源根目录为nginx下html文件夹)
; index index.php index.html index.htm;
(注释:定义网站默认访问首页,优先解析PHP文件)
; }
location ~ \.php$ {
(注释:匹配所有访问.php后缀文件的请求,进入该规则块处理)
;    root        html;
(注释:指定网站根目录为nginx目录下html文件夹)
;    fastcgi_pass   127.0.0.1:9000;
(注释:将php请求转发到本机9000端口运行的php-fpm服务)
;    fastcgi_index  index.php;
(注释:定义FastCGI默认首页文件为index.php)
;    #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
(注释:注释掉旧的脚本路径传递参数,旧方案路径固定为/scripts)
;    include        fastcgi.conf;
(注释:引入fastcgi.conf配置文件,内置标准php环境变量传递参数)
;}
(注释:php匹配规则块结束)

nginx -t
(注释:检测nginx主配置文件语法是否存在错误)

浏览器IP地址访问

mysql -pwestos
(注释:root 账号登录 MariaDB,密码 westos)

;Welcome to the MariaDB monitor. Commands end with ; or \g.
(注释:数据库登录成功欢迎提示)
;Your MariaDB connection id is 21
(注释:本次数据库会话 ID 为 21)
;Server version: 5.5.68-MariaDB MariaDB Server
(注释:MariaDB 版本信息)
;Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
(注释:数据库版权声明)
;Type 'help;' or '\h' for help. Type '\c' to clear the current input statement
(注释:数据库帮助命令提示)
;MariaDB [(none)]> show databases;
(注释:查询本机所有数据库)
;+--------------------+
(注释:查询表格分隔线)
;| Database |
(注释:结果表头)
;+--------------------+
(注释:表格分隔线)
;| information_schema |
(注释:系统信息库)
;| mysql |
(注释:账号权限系统库)
;| performance_schema |
(注释:性能监控库)
;| ultrax |
(注释:新增 ultrax 数据库,对应 Discuz 论坛安装所需库)
;+--------------------+
(注释:表格分隔线)
;4 rows in set (0.00 sec)
(注释:查询到 4 个数据库,执行耗时 0 秒)
;MariaDB [(none)]> Bye
(注释:输入 Bye 退出数据库客户端,等同于 quit)

cd /usr/local/nginx/html/
(注释:切换工作目录到nginx网站根目录html)
ls
(注释:列出网站根目录下全部文件与文件夹)

cd install/
(注释:进入Discuz安装程序文件夹install)
ls
(注释:列出install目录内文件)

data  include  index.php  static
(注释:安装程序数据目录、引入文件目录、安装入口、静态资源目录)

rm -f index.php
(注释:强制删除install目录下index.php安装入口文件,安装完成后删除防止重复安装)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐