用户管理

基础概要

        在互联网中,几乎所有的软件级别的解决方案,只要涉及到安全操作,基本上都是按照如下的流程进行处理的:    

  1. Authentication:认证,验证用户身份    
  2. Authorization:授权,不同的用户设置不同权限    
  3. Accouting|Audition:审计(准入控制)

用户和用户组

        Linux是多用户多任务操作系统,具有很好的稳定性和安全性。既然是多用户,那就意味着多个用户可以同时使用同一个Linux操作系统,因此就会涉及用户的添加、修改、删除等管理工作以及权限分配问题。

        当用户登录成功时,系统会自动分配令牌 token,包括:用户标识和组成员等信息。在Linux中每个用户 是通过 User Id (UID)来唯一标识的。Linux可分为以下几类:

        在Linux系统中,为了方便批量对一个或多个用户进行快捷的操作,我们一般会将用户加入用户组中,通过对用户组的操作,从而实现对普通用户的属性的批量操作能力。用户组是通过Group ID(GID) 来唯一标识的。

        用户和用户组的关系:

        用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,做为用户的主要组, 由于此组中只有一个用户,又称为私有组。

        一个用户可以属于零个或多个辅助组,附属组。

配置文件

用户和组的主要配置文件:

/etc/passwd                包含名称、UID、GID、家目录等属性信息

hong:x:1000:1000:hong:/home/hong:/bin/bash

/etc/shadow                包含用户密码及其相关属性

nihao:$y$j9T$qJ42t55X4WIcklID.fmhQ/$IZlRJ9F4KEwy0mQncP6Px5hszrd04mEXsjARiTDfF98:20557:0:99999:7:::

/etc/group                     包含组及其属性信息

nihao:x:1004:

/etc/gshadow                包含组密码及其相关属性

nihao:!::

用户管理

groupadd [选项] 组        #添加组
groupmod [选项] 组        #修改组的属性
groupdel [选项] 组        #删除组
id [选项]...[用户]...        #打印指定用户的用户和组信息
useradd [选项] 登录名        #创建用户,ubuntu系统创建用户默认是不创建用户组的,需要加-m选项
userdel [选项] 登录名        #删除用户
passwd [选项] 登录名         #更改指定用户的密码
chpasswd [选项]             #扩展,批量更改用户密码
gpasswd [选项] 组           #扩展,更改组成员或密码
groupmens [选项] [动作]      #扩展,管理附加组的成员关系

权限管理

        Linux系统下的文件权限体系是控制对文件和目录访问权限的重要机制,它决定了谁可以读取、修改或执行文件。

权限解读

        Linux文件权限主要分为三种类型:

  1. 可读(Readable): 允许用户读取文件内容或查看目录中的文件列表。 简写:r、4
  2. 可写(Writable): 允许用户修改文件内容或在目录中创建、删除或重命名文件。 简写:w、2
  3. 可执行(eXcutable): 对于文件,表示该文件是可执行的程序;对于目录,表示用户可以进入该目录。 简写:x、1

        文件用户属性,分别对应三个用户群体:

  1. 所有者(Owner): 文件或目录的创建者,拥有对文件或目录的最高权限。 简写:u
  2. 所属组(Group): 文件或目录被分配到的用户组,组内的所有成员将继承该组对该文件或目录的权限。 简写:g
  3. 其他用户(Others): 既不是文件所有者也不是所属组成员的所有其他用户。 简写:o
字符表示 八进制数字表示 备注
rwxr-xr-x 755 属主可读写,可执行,属组可读可执行,其它用户可读可执行
rw-r--r-- 644 属主可读写,属组可读,其它用户可读

默认情况下,创建的文件权限是644,创建的目录权限是755。

属性操作

chown [选项]... [所有者]:[组] 文件...        #修改文件的所有者或所属组
chgrp [选项]... 组 文件...                #修改文件的所属组
chmod [选项]... 模式... 文件...        #模式(ugo[+-=][rwx],644三个数字)

特殊权限(扩展)

        用s表示,没有权限则大写。当SUID权限设置在可执行文件上时,执行该文件的用户将暂时获得该文件所有者的权限。这意味着,即使执行者不是文件的所有者,他们也能以文件所有者的身份执行文件,并可能因此访问或修改只有文件所有者才能访问的资源。

        用s表示,没有权限则大写。SGID权限可以应用于可执行文件或目录。对于可执行文件,它与执行SUID文件类似,但影响的是执行者的组身份。然而,在实际应用中,SGID更多地被用于目录,以便在该目录下创建的新文件自动继承目录的组身份。

        粘滞位,Sticky Bit权限仅对目录有效,用t表示,没有权限则大写。当一个目录被设置为Sticky Bit时,只有该目录的所有者、文件的所 有者或root用户才能删除或重命名该目录下的文件。这有助于防止其他用户删除或移动他们不拥有但可能有权访问的文件。

文本管理

VIM编辑器

VIM基础

        在Linux中我们经常编辑修改文本文件,即由ASCII, Unicode 或其它编码的纯文字的文件。实际工作中我们会使用更为专业,功能强大的文本编辑工具。这些常见的文本编辑工具主要有两大类:

  1. 全屏编辑器:nano(字符工具), gedit(图形化工具),vi,vim
  2. 行编辑器:sed

正常模式(Normal Mode)- 默认模式

进入方式:

打开Vim时自动进入命令模式,或者从其他模式(如插入模式或底行模式)通过按Esc键返回命令模式。

操作快捷键:

  1. 光标移动:使用h、j、k、l键分别向左、下、上、右移动光标(或使用方向键)。
  2. 删除字符:按x删除光标所在位置的字符,按dd删除整行。
  3. 复制粘贴:使用yy复制当前行,p粘贴到光标所在位置。

编辑模式(Insert Mode)

在编辑模式,有些人叫插入模式下,用户可以像在其他编辑器中一样直接输入文本。这是进行文字编辑的主要模式。

进入方式: 从命令模式通过如下按键进入插入模式

  1. 按 i 在当前光标位置插入
  2. 按 a 在当前光标位置的下一个字符处插入
  3. 按 o 在当前光标所在行的下一行插入新行

命令模式

命令模式允许用户执行一些高级的编辑和搜索操作,如文件保存、退出、搜索替换、设置选项等。

进入方式: 从命令模式通过按:(冒号)或/(表示查找)进入命令模式。

操作命令:

  1. 保存文件:输入:w保存当前文件,:wq或:x保存并退出Vim
  2. 查找替换:输入:/搜索词进行查找,:s/原词/新词/g进行全局替换。
  3. 设置选项:输入:set nu显示行号,:set nonu取消显示行号。

VIM操作实践

M,N             #从左侧M表示起始行,到右侧N表示结尾行 
$               #最后一行
%               #全文, 相当于1,$
/pat1/,/pat2/   #从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
:%s/原内容/替换后内容/g             #从全文替换,g代表全局替换
:,$s/原内容/替换后内容/g            #从当前行到最后一行进行替换
:/关键字/,$s/原内容/替换后内容/g     #正则匹配内容进行全文替换
:3,6s/原内容/替换后内容/g            #从第3到第6行内容进行替换
vim 文件 +[n]        #+默认尾行行首,n表示第几行行首
+/PATTERN            #让光标处于第一个被PATTERN匹配到的行行首
-d file1 file2       #同时打开多个文件,相当于 vimdiff,使用快捷键 Ctrl-w + w切换文件


在正常模式下

H        #快速定位到页首
M        #快速定位到页中间
L        #快速定位到页尾
d        #删除当前行
p        #小写,则粘贴当前光标所在行的下方;大写,则粘贴当前光标所在行的上方
y        #复制当前行,yy前面加数字,表示从当前处往后复制多少行
u        #撤回操作
0                   #正常模式下,跳转至行首
$                   #正常模式下,跳转至行尾
G                   #正常模式下,跳转到最后一行
gg                  #正常模式下,跳转到第一行

在命令行模式下

:n                  #命令模式下,跳转到第n行
/关键字              #命令模式下,从当前光标所在处向文件尾部查找        
?关键字              #命令模式下,从当前光标所在处向文件首部查找
:2d              #删除第2行             
:2,4d            #删除第2到第4行           
:2;+3y           #复制第2到第5行,总共4行
:2;+4w test      #将第2到第6行,总共5行内容写入新文件
:set number|set nu            #显示行号
:set nonumber|set nonu        #取消显示行号
:set paste                    #复制时保留格式
:set expandtab|set et         #使用空格代替Tab,默认8个空格
:set tabstop=N|set ts=N       #指定N个空格代替Tab
:set key=password             #加密
:set key=                     #取消加密


文件管理

内容处理

cut命令
cut OPTION... [FILE]...
常用选项:
-c, --characters=列表            #只选中指定的这些字符
-d, --delimiter=分界符           #使用指定分界符代替制表符作为区域分界
sort命令
sort [选项]... [文件]...        #将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

常见选项:
-u :去除重复行
-r :降序排列,默认是升序
-n :以数字排序,默认是按字符排序
uniq命令
uniq [选项]... 文件        #从文件中过滤内容相同的相邻的行
命令扩展
paste命令
paste [选项]... 文件...        #将各个文件里相同行号的行合并成一行,中间用制表符分隔

-d        #循环使用自定义的字符代替制表符作为分隔符
xargs命令
xargs [选项]... 命令 [起始参数]...

文件查找

locate命令
locate [选项]... 模式        #用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录

工作特点:
非实时查找:索引的构建是在系统较为空闲时自动进行(周期任务),执行updatedb可以更新数据库;
查找速度比find快:locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db;
模糊查找;
可能只搜索用户具备读取和执行权限的目录;
由于locate命令依赖于数据库,因此它可能无法立即反映出文件系统的最新变化(如最近添加或删除的文
件)。此外,locate命令的搜索结果还可能受到数据库更新频率和系统配置的影响;
find命令
find [路径] [选项] 表达式        #在指定目录下查找文件和目录。

工作特点:
查找速度略慢
精确查找
实时查找
查找条件丰富
只搜索用户具备读取和执行权限的目录

选项:
-name pattern:按文件名查找,支持使用通配符 * 和 ?。
-type type:按文件类型查找,可以是 f(普通文件)、d(目录)、l(符号链接)等。
-size [+-]size[cwbkMG]:按文件大小查找,支持使用 + 或 - 表示大于或小于指定大小,单位可以是 c(字节)、w(字数)、b(块数)、k(KB)、M(MB)或 G(GB)。
-mtime days:按修改时间查找,支持使用 + 或 - 表示在指定天数前或后,days 是一个整数表示天数。
-user username:按文件所有者查找。
-group groupname:按文件所属组查找。

动作: 可选的,用于对匹配到的文件执行操作,比如删除、复制等。
-amin n:查找在 n 分钟内被访问过的文件。
-atime n:查找在 n*24 小时内被访问过的文件。
-cmin n:查找在 n 分钟内状态发生变化的文件(例如权限)。
-ctime n:查找在 n*24 小时内状态发生变化的文件(例如权限)。
-mmin n:查找在 n 分钟内被修改过的文件。
-mtime n:查找在 n*24 小时内被修改过的文件。

n 可以是一个正数、负数或零。正数表示在指定的时间内修改或访问过的文件,负数表示在指定的时间之前修改或访问过的文件,零表示在当前时间点上修改或访问过的文件。

打包压缩

常见打包工具
gzip [选项]... 文件...        #压缩解压文件
tar [选项]... 文件        #用于归档文件和目录的强大命令行工具,广泛用于在文件系统中打包和压缩文件

常用选项:
-A, --catenate, --concatenate   追加 tar 文件至归档
-c, --create               创建一个新归档
    --delete               从归档(非磁带!)中删除
-d, --diff, --compare      找出归档和文件系统的差异
-r, --append               追加文件至归档结尾
    --test-label           测试归档卷标并退出
-t, --list                 列出归档内容
-u, --update               仅追加比归档中副本更新的文件
-x, --extract, --get       从归档中解出文件

常用实例:
tar -zcvf archive.tar foo bar  # Create archive.tar from files foo and bar.
tar -tvf archive.tar         # List all files in archive.tar verbosely.
tar -xf archive.tar          # Extract all files from archive.tar.
zip [选项]... 文件        #可以压缩多个文件或整个目录,并保留文件的目录结构

三剑客

grep和sed

grep [选项]... 文件        #用于查找文件里符合条件的字符串或正则表达式

常用选项:
-i: 不区分大小写
-n: 显示行号
-r: 逐层遍历目录查找
-v: 查找不包含指定内容的行,反向选择
-E: 使用扩展正则匹配
^key: 以关键字开头
key$: 以关键字结尾
^$: 匹配空行

案例:
:grep -i root passwd        #忽略大小写匹配包含root的行
:grep bash$ passwd          #匹配以bash结尾的行
:grep ^# /etc/vsftpd/vsftpd.conf        #匹配以#号开头的行
:grep -n ^$ passwd          #匹配空行并打印行号

        sed(Stream EDitor) 属于一种数据流式的行文件编辑工具。因为它编辑文件的时候,在内存中开辟一块额外的模式空间(pattern space),然后以行为单位读取文件内容到该空间中,接着sed命令处理该空间中的内容,默认在当前终端界面打印内容,然后清空模式空间内容,再来读取第二行内容,依次循环下去。

sed [选项]... '<匹配条件> [动作]' 文件名
注意:
匹配条件和动作两侧有'
动作可以有多个,彼此间使用;隔开,比如 '2p;4p'

案例:
root@rocky10:~/zip# cat sed.txt 
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed7 sed8 sed9

root@rocky10:~/zip# sed '2p' sed.txt 
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed4 sed5 sed6        # 这一行才是操作的内容,其他的都是缓存区自动输出
nihao sed7 sed8 sed9

root@rocky10:~/zip# sed -n '2p' sed.txt         # 打印第1,3行,不输出缓存区默认的其他信息
nihao sed4 sed5 sed6

root@rocky10:~/zip# sed -n '1p;3p' sed.txt 
nihao sed1 sed2 sed3
nihao sed7 sed8 sed9

root@rocky10:~/zip# ifconfig ens160 | sed -n '2p'
        inet 10.0.0.12  netmask 255.255.255.0  broadcast 10.0.0.255

root@rocky10:~/zip# sed -n '1~2p' sed.txt         # 打印奇数行
nihao sed1 sed2 sed3
nihao sed7 sed8 sed9

root@rocky10:~/zip# sed -n '0~2p' sed.txt         # 打印偶数行
nihao sed4 sed5 sed6
sed替换
sed -i [替换格式] 文件
替换格式:'s###'  --->  's#原内容##' ---> 's#原内容#替换后内容#',隔离符号 / 可以更换成 @、#、!等符号

案例:
sed -i 's/sed/SED/g' sed.txt        #sed 'y/sed/SED/' sed.txt 效果一样,直接替换

替换第二行的首个SED为sed
root@rocky10:~/zip# sed -i '2s/SED/sed/' sed.txt

root@rocky10:~/zip# cat sed.txt 
nihao SED1 SED2 SED3
nihao sed4 SED5 SED6        # 替换第二行的首个SED为sed
nihao SED7 SED8 SED9

替换每行的第2个SED为sed
root@rocky10:~/zip# sed -i 's/SED/sed/2' sed.txt         # 替换每行第二个SED为sed

root@rocky10:~/zip# cat sed.txt 
nihao SED1 sed2 SED3
nihao sed4 SED5 sed6
nihao SED7 sed8 SED9

替换第3行的第2个SED为sed
root@rocky10:~/zip# sed -i '3s/SED/sed/2' sed.txt 

root@rocky10:~/zip# cat sed.txt 
nihao SED1 sed2 SED3
nihao sed4 SED5 sed6
nihao SED7 sed8 sed9

awk

        awk 认为文件中的每一行是一条记录,记录与记录的分隔符为换行符,每一列是一个字段,字段与字段的分隔符默认是一个或多个空格或tab制表符.。

        awk的工作方式是逐行读取文本数据,将每一行数据视为一条记录(record)每条记录以字段分隔符分成若干字段,然后输出各个字段的值。然后以查找匹配某个特定模式的文本行,并对这些文本执行制定动作。

awk [参数] '[动作]' [文件名]
awk [选项] -f 脚本文件 var=value 文件


常见参数:
-F                  # 指定列的分隔符,默认一行数据的列分隔符是空格
-f file             # 指定读取程序的文件名
-v var=value        # 自定义变量
常见动作:
print               # 显示内容
$0                  # 显示当前行所有内容
$NF                 # 显示最后一列信息
$n                  # 显示当前行的第n列内容,如果存在多个$n,它们之间使用逗号(,)隔开

常见内置变量:
NR                  # 指定显示行的行号
FS                  # 输入文件的列分隔符,缺省是连续的空格和Tab
RS                  # 输入记录分隔符,指定输入时的换行符,原换行符($)仍有效

案例:
awk '{print $NF}' awk.txt              # 打印最后一列信息
awk '{print $1,$3}' awk.txt            # 如果打印多列信息,需要使用逗号隔开,否则是内容合并
awk '{print $1"\t"$3}' awk.txt         # 使用\t实现内容的分割,需要用""扩住
awk '{print NR, $NR}' awk.txt          # 按照行号打印对应列的内容
awk -F ':' '{print $1}' passwd.txt     # 以冒号为列分隔符,打印第一列
awk -v FS=':' '{print $1}' passwd.txt  # 虽然-v FS 和 -F 都可以设定入口数据的列分隔符,如果混用的话,-F的优先级高一点
awk 'NR==1 {print NR,$1,$3}' awk.txt   # 打印第一行第1和第3列并输出行号

磁盘存储和文件系统

存储管理

常用命令

fdisk [选项]... disk        # 查看分区效果

lsblk [选项]... [<device> ...]        # 用于查看设备信息

df [选项]... 文件           # 文件系统查看工具
df -Th                     # T,显示文件系统类型;h,以1024大小为单位

du [选项]... 文件           # 文件系统目录信息统计工具
du -sh /etc                # s,输出一个使用总量;h,以可读性好的格式输出大小

dd if=/PATH/FROM/SRC of=/PATH/TO/DEST  bs=N count=N        # if=file,从所命名文件读取数据;of=file将读取到的数据写到所命名的文件;bs=size,指定块大小;count指定块数量

分区类型

        磁盘分区是指将一个硬盘划分为多个独立的存储区域,每个区域都拥有自己的文件系统和卷标。这种划分方式使得用户可以更方便地管理和存储不同类型的文件。磁盘分区是计算机存储管理的重要基础,对于提高数据存储的效率和安全性具有重要意义。

类型 定义 特点
主分区 硬盘上第一个创建的分区,也是唯一一个具有引导功能的分区。 它可以安装操作系统,并用于启动电脑。对 于小于等于2TB的硬盘,最大可以创建4个主 分区;对于大于2TB的硬盘,主分区的数量不 受限制
扩展分区 将硬盘的一部分划分为一个或多个逻辑分区的集合。扩展分区本身不能直接使用, 需要将其划分为逻辑分区后才能使用。 扩展分区的最大数量不受限制,但一个物理 硬盘上最多只能有3个主分区和1个扩展分 区。
逻辑分区 扩展分区的一部分,可以单独进行格式化和使用。它们没有独立的引导块,因此不能作为启动分区。 逻辑分区用于存储数据和应用程序,逻辑分 区的数量不受限制,方便用户根据需要对硬 盘空间进行划分和管理
非引导分区 非引导分区是指不具有引导功能的分区。 它可以是主分区、扩展分区中的逻辑分区 或GPT分区表中的任何非系统分区,通常 用于存储大量数据。 非引导分区的数量不受特定限制,主要取决 于硬盘的大小和操作系统的支持。它们可以 是数据分区、备份分区、恢复分区等,用于 满足用户的不同需求。

分区实现方式

        MBR是一种传统的分区模式,它是IBM兼容机硬盘或可移动磁盘分区时,在驱动器最前端的一段引导扇区。这段扇区包含了分区表、引导加载程序代码等重要信息。

MBR特点:

  1. MBR分区表最多支持4个主分区,或者3个主分区和1个扩展分区(扩展分区下可以创建多个逻辑分区)。
  2. MBR使用32位的LBA(Logical Block Addressing)寻址方式,容量受限。

        GPT是一种现代的磁盘分区方案,由EFI(Extensible Firmware Interface,可扩展固件接口)标准提出并推广。

GPT特点:

  1. GPT旨在克服MBR所存在的一些限制,并提供更多的功能和灵活性。GPT使用64位LBA寻址方式,支持更多的容量,GPT可以支持最多128个分区(在Windows系统中),
  2. GPT在硬盘两端各保存一份分区表副本,以及CRC32校验,有助于提高数据完整性和容错性。
  3. GPT不仅支持现代的操作系统和硬件平台(如Windows 10/11、macOS、Linux等),还提供了对UEFI (Unified Extensible Firmware Interface,统一可扩展固件接口)的更好支持。
  4. GPT分区表中的每个分区项都有一个唯一的GUID(Globally Unique Identifier,全局唯一标识 符),这有助于防止分区表被恶意篡改或误操作。同时,GPT的分区表结构更加清晰和灵活,便于管理和维 护。

创建分区

查看分区信息

fdisk -l        # 查看所有分区详情
fidsk -l [<disk>...]        # 指定磁盘查看分区信息
cat /proc/partitions        # 文件查看分区信息,查看内核是否已经识别新的分区

创建流程

root@rocky10:~# fdisk /dev/nvme0n1        # 进入手动分区交互模式

Command (m for help): n        # 创建新分区
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p):         # enter直接默认主分区

Using default response p.
Partition number (1-4, default 1):         # 从1-4,默认主分区1
First sector (2048-41943039, default 2048):         # 分区起始位置
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): +1G        # 选择分区结束位置,上限即为磁盘容量

Created a new partition 1 of type 'Linux' and of size 1 GiB.

Using default response e.
Selected partition 4
First sector (6293504-41943039, default 6293504): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (6293504-41943039, default 41943039): 

Created a new partition 4 of type 'Extended' and of size 17 GiB.

Command (m for help): p
Disk /dev/nvme0n1: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual NVMe Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos        # dos类型最多四个分区
Disk identifier: 0x963224a1

Device         Boot   Start      End  Sectors Size Id Type
/dev/nvme0n1p1         2048  2099199  2097152   1G 83 Linux
/dev/nvme0n1p2      2099200  4196351  2097152   1G 83 Linux
/dev/nvme0n1p3      4196352  6293503  2097152   1G 83 Linux
/dev/nvme0n1p4      6293504 41943039 35649536  17G  5 Extended        # 扩展分区
Command (m for help): w        # 磁盘生效

删除分区

root@rocky10:~# fdisk -l        # 查看分区信息
Disk /dev/nvme0n1: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual NVMe Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 69A71743-1B2D-48A5-A678-A7219C5D8C65        # 磁盘标识符

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    2048     4095     2048   1M BIOS boot
/dev/nvme0n1p2    4096  2101247  2097152   1G Linux extended boot
/dev/nvme0n1p3 2101248 41940991 39839744  19G Linux LVM



root@rocky10:~# fdisk /dev/nvme0n1        # 进入手动分区交互模式

Command (m for help): d
Partition number (1-3, default 3):         # enter删除默认分区

root@rocky10:~# hexdump -n 512 -Cv /dev/nvme0n1 | tail        # 删除的分区还会留存
00000170  be 95 7d e8 34 00 be 9a  7d e8 2e 00 cd 18 eb fe  |..}.4...}.......|
00000180  47 52 55 42 20 00 47 65  6f 6d 00 48 61 72 64 20  |GRUB .Geom.Hard |
00000190  44 69 73 6b 00 52 65 61  64 00 20 45 72 72 6f 72  |Disk.Read. Error|
000001a0  0d 0a 00 bb 01 00 b4 0e  cd 10 ac 3c 00 75 f4 c3  |...........<.u..|
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001c0  02 00 ee ff ff ff 01 00  00 00 ff ff 7f 02 00 00  |................|
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|        
00000200

root@rocky10:~# dd if=/dev/zero of=/dev/nvme0n1 bs=512 count=1        # 写入空数据
输入了 1+0 块记录
输出了 1+0 块记录
512 字节已复制,0.00108322 s,473 kB/s

root@rocky10:~# hexdump -n 512 -Cv /dev/nvme0n1 | tail 
00000170  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000180  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000190  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000200

root@rocky10:~# fdisk -l /dev/nvme0n1        # 此时磁盘标识符消失
Disk /dev/nvme0n1: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual NVMe Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

文件系统

格式化文件系统

root@rocky10:~# mkfs.ext4 /dev/nvme0n2p1
mke2fs 1.47.1 (20-May-2024)
创建含有 2621440 个块(每块 4k)和 655360 个 inode 的文件系统
文件系统 UUID:a066861c-8822-4037-bbb2-9e8650514c8a
超级块的备份存储于下列块:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

正在分配组表:完成                            
正在写入 inode表:完成                            
创建日志(16384 个块):完成
写入超级块和文件系统账户统计信息:已完成


root@rocky10:~# lsblk -f /dev/nvme0n2
NAME        FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme0n2                                                                            
├─nvme0n2p1 ext4   1.0         a066861c-8822-4037-bbb2-9e8650514c8a          # 文件系统已格式化      
└─nvme0n2p2

文件挂载

root@rocky10:~# mkdir /mount/ext4 -p        # 创建挂载目录
root@rocky10:~# mount /dev/nvme0n2p1 /mount/ext4        # 将设备挂载到对应的目录
root@rocky10:~# lsblk -f /dev/nvme0n2p1
NAME      FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme0n2p1 ext4   1.0         a066861c-8822-4037-bbb2-9e8650514c8a    9.2G     0% /mount/ext4        # 已加入挂载点
root@rocky10:~# echo "mount test" > /mount/ext4/test.txt        # 测试挂载是否成功
root@rocky10:~# cat /mount/ext4/test.txt 
mount test

root@rocky10:~# df -h
文件系统             大小  已用  可用 已用% 挂载点
/dev/mapper/rl-root   17G  4.5G   13G   27% /
devtmpfs             1.3G     0  1.3G    0% /dev
tmpfs                1.4G   84K  1.4G    1% /dev/shm
tmpfs                536M  8.1M  528M    2% /run
tmpfs                1.0M     0  1.0M    0% /run/credentials/systemd-journald.service
/dev/nvme0n1p2       960M  385M  576M   41% /boot
tmpfs                268M  144K  268M    1% /run/user/0
/dev/sr0             8.7G  8.7G     0  100% /run/media/root/Rocky-10-1-x86_64-dvd
/dev/nvme0n2p1       9.8G   28K  9.3G    1% /mount/ext4

root@rocky10:~# umount /dev/nvme0n2p1        # 卸载挂载点
root@rocky10:~# umount /mount/ext4           # 卸载挂载点

持久挂载

vim /etc/fstab        # 打开配置文件
UUID=a066861c-8822-4037-bbb2-9e8650514c8a /mount/ext4             ext4    defaults        0 0        # 文件系统设备(最好使用UUID,以防设备名更改) 挂载点 文件系统类型 挂载选项 是否备份 在系统启动时是否需要进行文件系统检查

mount -a        # 生效挂载点,命令只针对文件新增行或删除行有效,如果在中间修改了挂载选项,则此命令无效
mount -o remount

root@rocky10:~# mount | grep /mount        # 验证挂载信息
/dev/nvme0n2p1 on /mount/ext4 type ext4 (rw,relatime,seclabel)

存储基础环境

RAID基础

        RAID的工作原理是在多个磁盘上分配数据,并以标准化方式促进输入/输出操作的重叠。通过将数据分布在多个磁盘上,RAID技术可以实现数据冗余,提高容错能力,并在多个磁盘上并行读写数据,从而提升数据传输速度和存储性能。

RAID分类

        RAID-0,以 chunk 单位,读写数据,因为读写时都可以并行处理,所以在所有的级别中,RAID 0的速度是最快的。 但是RAID 0既没有冗余功能,所有数据均匀分不到磁盘中,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失。

        RAID-1,也称为镜像(Mirroring),它将数据同时写入两个磁盘,实现数据的完全冗余。RAID 1提供了最高的数据安全性,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,但磁盘利用 率只有50%,且写入速度相对较慢。它适用于保存关键性重要数据的场合。

        RAID5,也称为分布式奇偶校验(Distributed Parity),它将数据和奇偶校验信息分散在多个磁盘上。RAID 5可以容错一个磁盘的故障,同时提供较高的读写速度和磁盘利用率。它是目前综合性能最佳的数据保护解决方案之一,广泛应用于数据中心等场景。

LVM

        LVM(Logical Volume Manager)即逻辑卷管理器,是Linux系统下对磁盘分区进行管理的一种机制。LVM在硬盘分区和文件系统之间添加了一个逻辑层,为文件系统屏蔽了下层的磁盘分区布局,提供了一个抽象的卷组,用户可以在这个卷组上创建文件系统。

LVM优势

  1. 提高磁盘管理的灵活性: 通过LVM,系统管理员可以轻松管理磁盘分区,如将若干个磁盘分区连接为一个整块的卷组,形成一个存储池。管理员可以在卷组上随意创建逻辑卷,并进一步在逻辑卷上创建文件系统。
  2. 动态调整存储卷组大小: 管理员通过LVM可以方便地调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配。例如,可以按照使用用途进行定义:“development”和“sales”,而不是使用物理磁盘名“sda”和“sdb”。
  3. 充分利用存储空间: 当系统添加了新的磁盘时,通过LVM,管理员不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。
  4. 支持跨分区文件系统: 文件系统可以建立在LVM上,跨多个分区使用,方便数据的存储和管理。

原理解读

  1. PV(Physical Volume,物理卷): 是LVM存储管理的最底层,可以是整个物理硬盘或实际物理硬盘上的分区。 物理卷在加入LVM之前需要经过特殊处理,以便LVM能够识别和管理。
  2. VG(Volume Group,卷组): 是建立在物理卷之上的一个逻辑层,它包含了一个或多个物理卷。 卷组将多个物理卷组合在一起,形成一个可管理的单元,类似于非LVM系统中的物理硬盘。
  3. LV(Logical Volume,逻辑卷): 是建立在卷组之上的一个逻辑层,它类似于非LVM系统中的硬盘分区。 逻辑卷可以在其上建立文件系统,并挂载到不同的挂载点,用于存储数据。
  4. PE(Physical Extent,物理区域): 是物理卷中可用于分配的最小存储单元。PE的大小是可配置的,默认为4MB。 在建立卷组时,物理区域的大小会被指定,并且一旦确定就不能更改。 同一卷组中的所有物理卷的物理区域大小必须一致。
  5. LE(Logical Extent,逻辑区域): 是逻辑卷中可用于分配的最小存储单元。 逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小,即一个LE对应一个PE。

LVM实践

创建PV

root@rocky10:~# pvcreate /dev/nvme0n2        # 创建PV
Physical volume "/dev/nvme0n2" successfully created.       
root@rocky10:~# pvcreate /dev/nvme0n3 /dev/nvme0n4 /dev/nvme0n5 /dev/nvme0n6        # 批量创建PV
Physical volume "/dev/nvme0n3" successfully created.
Physical volume "/dev/nvme@n4" successfully created.
Physical volume "/dev/nvme0n5" successfully created.
Physical volume "/dev/nvme0n6" successfully created.

[root@rocky10 ~]# pvs        # 查看当前的PV信息
  PV             VG Fmt  Attr PSize   PFree 
  /dev/nvme0n1p3 rl lvm2 a--  <19.00g     0 
  /dev/nvme0n2      lvm2 ---   20.00g 20.00g
  /dev/nvme0n3      lvm2 ---   10.00g 10.00g
  /dev/nvme0n4      lvm2 ---   10.00g 10.00g
  /dev/nvme0n5      lvm2 ---   10.00g 10.00g
  /dev/nvme0n6      lvm2 ---   10.00g 10.00g
[root@rocky10 ~]# pvdisplay /dev/nvme0n2        # 查看对应PV的详细信息
  "/dev/nvme0n2" is a new physical volume of "20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/nvme0n2
  VG Name               
  PV Size               20.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               pbknLp-oRnJ-yP02-dJQx-C1q3-l2M8-HEece7

创建VG

[root@rocky10 ~]# vgcreate -s 16M testvg /dev/nvme0n2 /dev/nvme0n3        # 指定PE大小为16M
  Volume group "testvg" successfully created
[root@rocky10 ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  rl       1   2   0 wz--n- <19.00g      0 
  testvg   2   0   0 wz--n- <29.97g <29.97g
[root@rocky10 ~]# vgdisplay testvg         
  --- Volume group ---
  VG Name               testvg
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               <29.97 GiB
  PE Size               16.00 MiB
  Total PE              1918
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1918 / <29.97 GiB
  VG UUID               ri8jlB-tjQL-u7ad-f1Vv-1xBn-xCSZ-6fJQl8
   
[root@rocky10 ~]# pvdisplay /dev/nvme0n2
  --- Physical volume ---
  PV Name               /dev/nvme0n2
  VG Name               testvg
  PV Size               20.00 GiB / not usable 16.00 MiB
  Allocatable           yes 
  PE Size               16.00 MiB        # VG创建之后,对应PV详情里就会有PE大小
  Total PE              1279        
  Free PE               1279
  Allocated PE          0
  PV UUID               pbknLp-oRnJ-yP02-dJQx-C1q3-l2M8-HEece7

[root@rocky10 ~]# vgextend testvg /dev/nvme0n4        # 扩展VG,testvg大小
  Volume group "testvg" successfully extended
[root@rocky10 ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree 
  rl       1   2   0 wz--n- <19.00g     0 
  testvg   3   0   0 wz--n-  39.95g 39.95g        # 增加了

创建LV

[root@rocky10 ~]# lvcreate -l 100 -n lv1 testvg        # 从testvg创建lv1,大小100个PE
  Logical volume "lv1" created.
[root@rocky10 ~]# lvscan         # 找到lv1的位置
  ACTIVE            '/dev/testvg/lv1' [1.56 GiB] inherit
  ACTIVE            '/dev/rl/swap' [2.00 GiB] inherit
  ACTIVE            '/dev/rl/root' [<17.00 GiB] inherit
[root@rocky10 ~]# lvdisplay /dev/testvg/lv1 
  --- Logical volume ---
  LV Path                /dev/testvg/lv1        # 路径
  LV Name                lv1
  VG Name                testvg
  LV UUID                Y3g3xH-0Ksl-zzU6-pMpN-Du4c-jbts-h1fSLq
  LV Write Access        read/write
  LV Creation host, time rocky10, 2026-04-28 10:53:44 +0800
  LV Status              available
  # open                 0
  LV Size                1.56 GiB
  Current LE             100        # 和PE数量对应
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

[root@rocky10 ~]# lvcreate -L 5G -n lv2 testvg        # 创建lv2,大小为5G

[root@rocky10 ~]# lvcreate -l 10%free -n lv3 testvg        # 创建lv3,大小为剩下可用PE数量的 20%

[root@rocky10 ~]# lvcreate -l 10%VG -n lv4 testvg        # 创建lv4,大小为指定vg的10%

[root@rocky10 ~]# lvs
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rl     -wi-ao---- <17.00g                                                    
  swap rl     -wi-ao----   2.00g                                                    
  lv1  testvg -wi-a-----   1.56g                                                    
  lv2  testvg -wi-a-----   5.00g                                                    
  lv3  testvg -wi-a-----  <3.33g                                                    
  lv4  testvg -wi-a-----   3.98g

挂载逻辑卷

[root@rocky10 ~]# mkfs.ext4 /dev/testvg/lv1
mke2fs 1.47.1 (20-May-2024)
创建含有 409600 个块(每块 4k)和 102544 个 inode 的文件系统
文件系统 UUID:5814fa3a-c518-4013-9797-0b5975fc0aac
超级块的备份存储于下列块:
	32768, 98304, 163840, 229376, 294912

正在分配组表:完成                            
正在写入 inode表:完成                            
创建日志(8192 个块):完成
写入超级块和文件系统账户统计信息:已完成

[root@rocky10 ~]# ll /dev/testvg/lv1
lrwxrwxrwx. 1 root root 7  4月28日 10:53 /dev/testvg/lv1 -> ../dm-2
[root@rocky10 ~]# ll /dev/mapper/testvg-lv1
lrwxrwxrwx. 1 root root 7  4月28日 10:53 /dev/mapper/testvg-lv1 -> ../dm-2       # 两个链接文件指向同一个地址 

[root@rocky10 ~]# blkid /dev/testvg/lv1
/dev/testvg/lv1: UUID="5814fa3a-c518-4013-9797-0b5975fc0aac" BLOCK_SIZE="4096"        #查看设备UUID TYPE="ext4"

[root@rocky10 ~]# mkdir /mnt/lvm1        # 创建挂载的目录
[root@rocky10 ~]# mount /dev/testvg/lv1 /mnt/lvm1/        # 挂载
[root@rocky10 ~]# df -h
文件系统                大小  已用  可用 已用% 挂载点
/dev/mapper/rl-root      17G  5.1G   12G   31% /
devtmpfs                1.3G     0  1.3G    0% /dev
tmpfs                   1.4G   84K  1.4G    1% /dev/shm
tmpfs                   536M   10M  526M    2% /run
tmpfs                   1.0M     0  1.0M    0% /run/credentials/systemd-journald.service
/dev/nvme0n1p2          960M  385M  576M   41% /boot
tmpfs                   268M  128K  268M    1% /run/user/0
/dev/sr0                8.7G  8.7G     0  100% /run/media/root/Rocky-10-1-x86_64-dvd
/dev/mapper/testvg-lv1  1.6G   24K  1.5G    1% /mnt/lvm1        # 查看挂载信息
LVM扩容

方式一:先扩容逻辑卷,再扩容文件系统。

[root@rocky10 ~]# lvextend -L +1G /dev/testvg/lv1
  Size of logical volume testvg/lv1 changed from 1.56 GiB (100 extents) to 2.56 GiB (164 extents).
  Logical volume testvg/lv1 successfully resized.

[root@rocky10 ~]# lvs
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rl     -wi-ao---- <17.00g                                                    
  swap rl     -wi-ao----   2.00g                                                    
  lv1  testvg -wi-ao----   2.56g          # 增加了1G                                          
  lv2  testvg -wi-a-----   5.00g                                                    
  lv3  testvg -wi-a-----  <3.33g                                                    
  lv4  testvg -wi-a-----   3.98g
                                                    
[root@rocky10 ~]# df -h
文件系统                大小  已用  可用 已用% 挂载点
/dev/mapper/rl-root      17G  5.1G   12G   31% /
devtmpfs                1.3G     0  1.3G    0% /dev
tmpfs                   1.4G   84K  1.4G    1% /dev/shm
tmpfs                   536M   10M  526M    2% /run
tmpfs                   1.0M     0  1.0M    0% /run/credentials/systemd-journald.service
/dev/nvme0n1p2          960M  385M  576M   41% /boot
tmpfs                   268M  128K  268M    1% /run/user/0
/dev/sr0                8.7G  8.7G     0  100% /run/media/root/Rocky-10-1-x86_64-dvd
/dev/mapper/testvg-lv1  1.6G   24K  1.5G    1% /mnt/lvm1        # 文件系统容量还未改变

[root@rocky10 ~]# resize2fs /dev/testvg/lv1
resize2fs 1.47.1 (20-May-2024)
/dev/testvg/lv1 上的文件系统已被挂载于 /mnt/lvm1;需要进行在线调整大小

old_desc_blocks = 1, new_desc_blocks = 1
/dev/testvg/lv1 上的文件系统大小已经调整为 671744 个块(每块 4k)。

方式二:一步实现文件系统和逻辑卷的扩容。

[root@rocky10 ~]# lvresize -r -l +100%FREE /dev/testvg/lv1        # 将剩余自由空间的所有容量扩容到lv1逻辑卷里
  File system ext4 found on testvg/lv1 mounted at /mnt/lvm1.
  Size of logical volume testvg/lv1 changed from 2.56 GiB (164 extents) to 27.64 GiB (1769 extents).
  Extending file system ext4 to 27.64 GiB (29678895104 bytes) on testvg/lv1...
resize2fs /dev/testvg/lv1
resize2fs 1.47.1 (20-May-2024)
/dev/testvg/lv1 上的文件系统已被挂载于 /mnt/lvm1;需要进行在线调整大小

old_desc_blocks = 1, new_desc_blocks = 4
/dev/testvg/lv1 上的文件系统大小已经调整为 7245824 个块(每块 4k)。

resize2fs done
  Extended file system ext4 on testvg/lv1.
  Logical volume testvg/lv1 successfully resized.

[root@rocky10 ~]# df -h /dev/testvg/lv1
文件系统                大小  已用  可用 已用% 挂载点
/dev/mapper/testvg-lv1   28G   24K   27G    1% /mnt/lvm1
LVM缩容
[root@rocky10 ~]# umount /dev/testvg/lv1        # 取消挂载

[root@rocky10 ~]# e2fsck -f /dev/testvg/lv1        # 文件系统检测
e2fsck 1.47.1 (20-May-2024)
第 1 遍:检查 inode、块,和大小
第 2 遍:检查目录结构
第 3 遍:检查目录连接性
第 4 遍:检查引用计数
第 5 遍:检查组概要信息
/dev/testvg/lv1: 11/1751136 文件(0.0% 不连续),120299/7245824 块

[root@rocky10 ~]# resize2fs /dev/testvg/lv1 3G        # 缩减文件系统到指定大小
resize2fs 1.47.1 (20-May-2024)
将 /dev/testvg/lv1 上的文件系统调整为 786432 个块(每块 4k)。
/dev/testvg/lv1 上的文件系统大小已经调整为 786432 个块(每块 4k)。

[root@rocky10 ~]# lvreduce -L 3G /dev/testvg/lv1        # 缩减逻辑卷
  File system ext4 found on testvg/lv1.
  File system size (3.00 GiB) is equal to the requested size (3.00 GiB).
  File system reduce is not needed, skipping.
  Size of logical volume testvg/lv1 changed from 27.64 GiB (1769 extents) to 3.00 GiB (192 extents).
  Logical volume testvg/lv1 successfully resized.

[root@rocky10 ~]# mount /dev/testvg/lv1 /mnt/lvm1/        # 重新挂载
LVM删除
[root@rocky10 ~]# umount /mnt/lvm1         # 取消挂载

lvremove 设备路径
vgremove 设备路径
pvremove 设备路径

软件管理

相关概念

软件包管理

包管理器rpm

rpm [选项]... 包文件

常用选项:
-q        # 检查安装软件
-ivh        # 安装软件
-evh        # 卸载软件
-Uvh        # 有旧程序包,则升级,没有则安装
-v        # 提供更多的详细信息输出
-h        # 在软件包安装时显示由“#”符号组成的进度
-qi        # 查询包详细信息
-qf        # 查询指定的文件由哪个程序包安装生成
-ql        # 查询指定的程序包安装后生成的所有文件

包管理器yum

yum [options] COMMAND

常用选项:
autoremove            # #卸载包,同时卸载依赖
install
clean            # 清除本地缓存
list             # 列出所有包
makecache            # 重建缓存
search            # 包搜索,包括包名和描述
定制软件源

镜像文件环境

root@rocky10:~# mkdir /tmp/softs ; cd /tmp/softs
root@rocky10:/tmp/softs# yum install wget -y
root@rocky10:/tmp/softs# wget https://mirrors.aliyun.com/centos-stream/10-stream/AppStream/x86_64/os/Packages/vsftpd-3.0.5-9.el10.x86_64.rpm
root@rocky10:/tmp/softs# wget https://mirrors.aliyun.com/centos-stream/10-stream/AppStream/x86_64/os/Packages/vsftpd-3.0.5-12.el10.x86_64.rpm
root@rocky10:/tmp/softs# wget https://mirrors.aliyun.com/centos-stream/10-stream/AppStream/x86_64/os/Packages/httpd-2.4.63-1.el10.x86_64.rpm

打开阿里云镜像源网站:mirrors.aliyun.com

root@rocky10:/etc/yum.repos.d# sed -e 's|^mirrorlist=|#mirrorlist=|g' \        #将源更换成aliyun的源
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky*.repo        # 因为系统内元数据文件是rocky*.repo形式

root@rocky10:/tmp/softs# cd /etc/yum.repos.d/
root@rocky10:/etc/yum.repos.d# yum makecache        # 更新软件源
root@rocky10:/etc/yum.repos.d# cat rocky.rep        # 查看软件源信息

软件安装实践

root@rocky10:/etc/yum.repos.d# yum install nginx            # 安装Nginx

root@rocky10:/etc/yum.repos.d# systemctl start nginx        # Rocky安装软件默认不启用,需要启动

root@rocky10:/etc/yum.repos.d# netstat -tnulp            # 查看端口信息
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1216/cupsd          
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1219/sshd: /usr/sbi 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7625/nginx: master              # Nginx已启用
tcp6       0      0 ::1:631                 :::*                    LISTEN      1216/cupsd          
tcp6       0      0 :::9090                 :::*                    LISTEN      1/systemd           
tcp6       0      0 :::22                   :::*                    LISTEN      1219/sshd: /usr/sbi 
tcp6       0      0 :::80                   :::*                    LISTEN      7625/nginx: master  
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           1078/avahi-daemon:  
udp        0      0 127.0.0.1:323           0.0.0.0:*                           1099/chronyd        
udp6       0      0 :::5353                 :::*                                1078/avahi-daemon:  
udp6       0      0 ::1:323                 :::*                                1099/chronyd

root@rocky10:/etc/yum.repos.d# systemctl disable --now firewalld            # 关闭防火墙
Removed '/etc/systemd/system/multi-user.target.wants/firewalld.service'.
Removed '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'.

root@rocky10:/etc/yum.repos.d# systemctl status firewalld.service 
○ firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled)            # 防火墙已关闭
     Active: inactive (dead)
       Docs: man:firewalld(1)

5月 06 09:16:04 rocky10 systemd[1]: Starting firewalld.service - firewalld - dynamic firewall daemon...
5月 06 09:16:04 rocky10 systemd[1]: Started firewalld.service - firewalld - dynamic firewall daemon.
5月 06 10:18:43 rocky10 systemd[1]: Stopping firewalld.service - firewalld - dynamic firewall daemon...
5月 06 10:18:43 rocky10 systemd[1]: firewalld.service: Deactivated successfully.
5月 06 10:18:43 rocky10 systemd[1]: Stopped firewalld.service - firewalld - dynamic firewall daemon.

定制仓库

root@rocky10:~# cd /etc/yum.repos.d/

root@rocky10:/etc/yum.repos.d# ls
rocky-addons.repo  rocky-addons.repo.bak  rocky-devel.repo  rocky-devel.repo.bak  rocky-extras.repo  rocky-extras.repo.bak  rocky.repo  rocky.repo.bak

root@rocky10:/etc/yum.repos.d# mkdir bak

root@rocky10:/etc/yum.repos.d# mv ./* bak
mv: 无法将目录 './bak' 移动至自身的子目录 'bak/bak'

root@rocky10:/etc/yum.repos.d# ls
bak

root@rocky10:/etc/yum.repos.d# ls bak/
rocky-addons.repo  rocky-addons.repo.bak  rocky-devel.repo  rocky-devel.repo.bak  rocky-extras.repo  rocky-extras.repo.bak  rocky.repo  rocky.repo.bak

root@rocky10:/etc/yum.repos.d# head -n20 bak/rocky.repo > ustc.repo        # 将rocky.repo里的前20行配置信息写到新文件中

root@rocky10:/etc/yum.repos.d# cat ustc.repo 
# rocky.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client.  You should use this for Rocky updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.

[baseos]
name=Rocky Linux $releasever - BaseOS
#mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=BaseOS-$releasever$rltype
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
countme=1
metadata_expire=6h
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-10

root@rocky10:/etc/yum.repos.d# vim ustc.repo             # 打开ustc.repo文件进行编辑

root@rocky10:/etc/yum.repos.d# cat ustc.repo 
[ustc-appstream]
name=Rocky Linux $releasever - AppStream
baseurl=https://mirrors.ustc.edu.cn/rocky/10/AppStream/x86_64/os/        # 对应的软件源地址
gpgcheck=0            # 不校验
enabled=1

[ustc-baseos]
name=Rocky Linux $releasever - BaseOS
baseurl=https://mirrors.ustc.edu.cn/rocky/10/BaseOS/x86_64/os/
gpgcheck=0
enabled=1

root@rocky10:/etc/yum.repos.d# yum makecache             # 重建元数据缓存
Rocky Linux 10 - AppStream                                                                                                   192 kB/s | 2.4 MB     00:12    
Rocky Linux 10 - BaseOS                                                                                                      1.6 MB/s |  19 MB     00:12    
上次元数据过期检查:0:00:01 前,执行于 2026年05月06日 星期三 11时08分17秒。
元数据缓存已建立。
配置本地文件源仓库

root@rocky10:/etc/yum.repos.d# ls
bak  ustc.repo

root@rocky10:/etc/yum.repos.d# mkdir /cdrom
root@rocky10:/etc/yum.repos.d# ls /cdrom/
root@rocky10:/etc/yum.repos.d# ls /dev/sr0 
/dev/sr0
root@rocky10:/etc/yum.repos.d# ls /dev/cdrom 
/dev/cdrom
root@rocky10:/etc/yum.repos.d# ls /dev/cdrom -l
lrwxrwxrwx. 1 root root 3  5月 6日 10:25 /dev/cdrom -> sr0
root@rocky10:/etc/yum.repos.d# mount /dev/cdrom /cdrom/
mount: /cdrom: WARNING: source write-protected, mounted read-only.
root@rocky10:/etc/yum.repos.d# ls /cdrom/
AppStream  BaseOS  boot  COMMUNITY-CHARTER  EFI  EULA  extra_files.json  images  LICENSE  media.repo  RPM-GPG-KEY-Rocky-10  RPM-GPG-KEY-Rocky-10-Testing
root@rocky10:/etc/yum.repos.d# ls /cdrom/AppStream/
Packages  repodata

root@rocky10:/etc/yum.repos.d# cp ustc.repo local.repo
root@rocky10:/etc/yum.repos.d# vim local.repo
root@rocky10:/etc/yum.repos.d# cat local.repo 
[local-appstream]
name=local Rocky Linux $releasever - AppStream
baseurl=file:///cdrom/AppStrem
gpgcheck=0
enabled=1

[local-baseos]
name=local Rocky Linux $releasever - BaseOS
baseurl=file:///cdrom/BaseOS
gpgcheck=0
enabled=1

root@rocky10:/etc/yum.repos.d# yum makecache 

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐