磁盘配额(Quota)与高级文件系统管理

磁盘配额(Quota)的应用与实践

什么是磁盘配额

磁盘配额(Quota)是一种在计算机系统中限制用户或组使用磁盘空间的机制。

通过设置磁盘配额,系统管理员可以确保不同用户或用户组在使用文件系统时不会超出其指定的磁盘空间限制,从而有效管理磁盘空间资源。磁盘配额能够防止个别用户占用过多磁盘空间,导致其他用户无法正常使用系统,或者系统的磁盘空间不足的情况发生。

磁盘配额的一般用途

针对网络服务

  • 针对网站服务器,例如:每个人的网页空间的容量限制
  • 针对邮件服务器,例如:每个人的邮件空间限制
  • 针对文件服务器,例如:每个人最大的可用网络硬盘空间

针对Linux系统主机

  • 限制某一用户组所能使用的最大磁盘配额(使用用户组限制)
  • 限制某一用户的最大磁盘配额(使用用户限制)
  • 限制某一目录的最大磁盘配额

磁盘配额的使用限制

  • ext文件系统仅能对整个文件系统设置磁盘配额,而无法对单个目录或用户进行细分的配额设定。
  • 内核必须支持磁盘配额功能,否则无法使用相关功能进行配额管理。
  • 磁盘配额通常只对一般身份用户有效,对于系统管理员等特殊权限用户可能不受配额限制。
  • 如果启用了SELinux(Security-Enhanced Linux),则可能会限制某些目录的磁盘配额设置,因为SELinux会增加对文件系统访问的安全验证,可能涉及到磁盘配额的一些限制。

不同文件系统在磁盘配额的处理情况不太相同,因此这里要特别注意,进行磁盘配额前,先确认你的文件系统

磁盘配额的规范设置选项

  • 可以分别针对用户、用户组或个别目录(user、group与project)进行配额设置,实现对不同实体的磁盘使用进行限制。
  • 可以设置容量限制或文件数量限制(block或inode),以控制用户的磁盘空间使用情况。
  • 限制inode使用量可以管理用户可以创建的文件数量,避免过多小文件占用磁盘资源。
  • 限制block使用量可以管理用户的磁盘容量,防止用户占用过多磁盘空间。
  • 可以设置软限制和硬限制(soft和hard):
    • hard:表示用户的使用量绝对不会超过这个限制值,如果超过这个值,则系统会锁定该用户的磁盘使用权限。
    • soft:表示用户在低于soft限值时可以正常使用磁盘,但如果超过soft但低于hard的限值,每次用户登录系统时,系统会发出磁盘容量即将耗尽的警告信息,并给予一个宽限时间。如果用户在宽限时间倒数期间将容量再次降低到soft限值以下,则宽限时间会停止。
    • 会倒计时的宽限时间:系统设计 soft 限制是为了在用户磁盘使用量接近 hard 限制时提供警告和宽限时间,让用户有机会自行管理磁盘空间。如果用户在宽限时间内没有采取任何措施来减少磁盘使用量,系统会将 soft 限制立即替换为 hard 限制,从而确保磁盘使用量不会超出限制。

image-20240320222557188

一个xfs文件系统的磁盘配额实践范例

处理磁盘配额的设置流程

  • 目的与账号:现在我想要让我的实习生五个为一组,这五个人的账号分别是myquota1、myquota2、myguota3、myquota4、myquota5,这五个用户的密码都是 password,且)五个用户所属的初始用户组都是 myquotagrp,其他的账号属性则使用默认值。
  • 账号的磁盘容量限制值:我想让这五个用户都能够获取 300MB 的磁盘使用量(hard),文件数量则不予限制。此外,只要容量使用率超过 250MB,就予以警告(sot)。
  • 用户组的配额:由于我的系统里面还有其他用户存在,因此我仅承认 myquotagrp这个用户组最多使用 1GB 的容量。这也就是说,如果 myquota1、myquota2、myquota3 都用了 280MB 的容量,那么其他两人最多只能使用(1000MB-280x3MB=160MB)的盘容量,这就是用户与用户组同时设置时会产生的结果。
  • 共享目录配额:另一种设置方式,每个用户还是具有自己独立的容量限制,但是这五个人的实习共享目录在 /home/myquota 这里,该目录设置为其他人没有任何权限的共享目录空间,仅有 myquotagrp 用户组拥有全部的权限。且无论如何该目录最多仅能够接受500MB 的容量。请注意,用户组(group)与目录(directory/project)的限制无法同时并存所以下面的流程中,我们会先以用户组来设计,然后再以目录限制来进一步说明。
  • 宽限时间的限制:最后,我希望每个用户在超过soft 限制值之后,都还能够有 14 天的宽限时间。
[root@chenshiren shelldir]# vim adduser.sh
#!/bin/bash
# 说明:使用脚本建立实验磁盘配额所需的环境
# 时间:2024/3
PATH=${PATH}:/tmp/shelldir
export PATH

# 创建五人初始用户组
groupadd myquotagrp
# 创建账号
for username in myquota1 myquota2 myquota3 myquota4 myquota5
do      
        useradd -g myquotagrp ${username}
        echo "password" | passwd --stdin ${username}
done
# 创建目录
mkdir /home/myquota
# 设置属组
chgrp myquotagrp /home/myquota
# 设置为共享目录
chmod 2770 /home/myquota

[root@chenshiren shelldir]# sh adduser.sh 

实践磁盘配额流程1:文件系统的支持与查看

不要在根目录下面进行磁盘配额设置,因为文件系统会变得太复杂

以/home这个xfs文件系统为例

[root@chenshiren shelldir]# df -hT /home/
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/nvme0n2p1 xfs   5.0G   69M  5.0G    2% /home
[root@chenshiren shelldir]# vim /etc/fstab 
/dev/nvme0n2p1         /home          xfs defaults,usrquota,grpquota  0 0
# 重点在第四栏,default后面加上的参数
[root@chenshiren shelldir]# umount /home 
[root@chenshiren shelldir]# mount -a
[root@chenshiren shelldir]# mount |grep home
/dev/nvme0n2p1 on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,usrquota,grpquota)

基本上,针对磁盘配额限制的选项主要有三项,如下所示:

  • uquota|usrquota|quota:针对用户账号的设置
  • gquota|grpquota:针对用户组的设置
  • pquota|projquota:针对单一目录的设置,但是不可与grpquota同时存在

修改/etc/fstab后,要测试一下,若发生错误要赶紧处理。因为这个文件如果修改错误,会造成无法启动的情况

实践磁盘配额流程2:查看磁盘配额报告数据

【xfs_quota】是用于管理XFS文件系统磁盘配额的命令行工具

[root@chenshiren ~]# xfs_quota -x -c "命令" [挂载点]
选项:
-x:专家模式,后续才能够加入-c的命令参数
-c:后面加的就是命令
命令:
  print :单纯地列出目前主机内的文件系统参数等数据
  df    :与原本的df一样的功能,可以加上-b( block)、-i(inode)、-h(加上单位)等
  report :列出目前磁盘配额选项,有 -ugr (user/group/project)及bi等
  state  :说明目前支持磁盘配额的文件系统的信息,有没有使用相关选项等

# 示例1 列出目前系统的各个文件系统,以及文件系统的磁盘配额挂载参数支持
[root@chenshiren ~]# xfs_quota -x -c "print"
Filesystem          Pathname
/                   /dev/mapper/rhel-root
/boot               /dev/nvme0n1p2
/home               /dev/nvme0n2p1 (uquota, gquota)  # 这里显示支持

# 示例2 列出目前/home这个支持磁盘配额的挂载点文件系统使用情况
[root@chenshiren ~]# xfs_quota -x -c "df -h" /home/ 
Filesystem     Size   Used  Avail Use% Pathname
/dev/nvme0n2p1
               5.0G  68.1M   4.9G   1% /home
        
# 示例3 列出目前/home的所有用户的磁盘配额限制值
[root@chenshiren ~]# xfs_quota -x -c "report -ubih" /home/
User quota on /home (/dev/nvme0n2p1)
                        Blocks                            Inodes              
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [------]      4      0      0  00 [------]
myquota1      12K      0      0  00 [------]      7      0      0  00 [------]
myquota2      12K      0      0  00 [------]      7      0      0  00 [------]
myquota3      12K      0      0  00 [------]      7      0      0  00 [------]
myquota4      12K      0      0  00 [------]      7      0      0  00 [------]
myquota5      12K      0      0  00 [------]      7      0      0  00 [------]
# 列出了所有用户目前的文件使用情况,并且列出设置值
# Block代表的是block容量限制,而inode则是文件数量限制。
# soft/hard为0,代表没有限制

# 示例4 列出目前支持的磁盘配额文件系统是否启动了磁盘配额功能
[root@chenshiren ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/nvme0n2p1) # 用户配额状态
  Accounting: ON   # 启用计算功能
  Enforcement: ON  # 有实际磁盘配额管理的功能
  Inode: #152 (2 blocks, 2 extents)   # 当前用户的inode使用情况
Blocks grace time: [7 days]           # block的宽限时间为7天
Blocks max warnings: 5                # block的最大警告次数为5
Inodes grace time: [7 days]           # inode的宽限时间为7天
Inodes max warnings: 5                # inode的最大警告次数为5
Realtime Blocks grace time: [7 days]  # 
Group quota state on /home (/dev/nvme0n2p1)  # 用户组配额状态
  Accounting: ON
  Enforcement: ON
  Inode: #153 (2 blocks, 2 extents)
Blocks grace time: [7 days]
Blocks max warnings: 5
Inodes grace time: [7 days]
Inodes max warnings: 5
Realtime Blocks grace time: [7 days] 
Project quota state on /home (/dev/nvme0n2p1) # project并未支持
  Accounting: OFF
  Enforcement: OFF
  Inode: N/A
Blocks grace time: [--------]
Blocks max warnings: 0
Inodes grace time: [--------]
Inodes max warnings: 0
Realtime Blocks grace time: [--------] 

实践磁盘配额流程3:限制值设置方式

每个用户250MB(soft)/300MB(hard)的容量限制,用户组共950MB/1GB的容量限制,宽限时间设置为14天

[root@chenshiren ~]# xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"
[root@chenshiren ~]# xfs_quota -x -c "timer [-ug] [-bir] Ndays"
选项:
limit :实际限制的选项,可以针对user/group来限制,限制的选项有以下内容
       bsoft/bhard :block的soft/hard限制值,可以加单位
       isoft/ihard :inode的soft/hard限制值
       name        :就是用户/用户组名称
timer:用来设置宽限时间的选项,可以针对user/group以及block/inode设置

# 示例1 设置每个用户的block限制值(题目没有要求限制inode)

[root@chenshiren ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota1" /home
[root@chenshiren ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota2" /home
[root@chenshiren ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota3" /home
[root@chenshiren ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota4" /home
[root@chenshiren ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota5" /home
[root@chenshiren ~]# xfs_quota -x -c "report -ubih" /home/                           
User quota on /home (/dev/nvme0n2p1)
                        Blocks                            Inodes              
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [------]      4      0      0  00 [------]
myquota1      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota2      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota3      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota4      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota5      12K   250M   300M  00 [------]      7      0      0  00 [------]

# 示例2 设置好myquotagrp  的block限制值
[root@chenshiren ~]# xfs_quota -x -c "limit -g bsoft=950M bhard=1G myquotagrp" /home
[root@chenshiren ~]# xfs_quota -x -c "report -gbih" /home/                           
Group quota on /home (/dev/nvme0n2p1)
                        Blocks                            Inodes              
Group ID     Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [------]      3      0      0  00 [------]
myquotagrp    60K   950M     1G  00 [------]     36      0      0  00 [------]

# 示例3 设置宽限时间为14天
[root@chenshiren ~]# xfs_quota -x -c "timer -u  -b 14days" /home  
[root@chenshiren ~]# xfs_quota -x -c "timer -g  -b 14days" /home 
[root@chenshiren ~]# xfs_quota -x -c "state" /home
User quota state on /home (/dev/nvme0n2p1)
...
Blocks grace time: [14 days]
...
Group quota state on /home (/dev/nvme0n2p1)
...
Blocks grace time: [14 days]

# 示例4 以myquota1 用户测试磁盘配额是否真的实际运行
[root@chenshiren ~]# su - myquota1
[myquota1@chenshiren ~]$ dd if=/dev/zero of=myquota1.img bs=1M count=310
dd: 写入 'myquota1.img' 出错: 超出磁盘限额
记录了300+0 的读入
记录了299+0 的写出
313524224字节(314 MB,299 MiB)已复制,0.923282 s,340 MB/s
[myquota1@chenshiren ~]$ ll -h
总用量 299M
-rw-r--r--. 1 myquota1 myquotagrp 299M  321 13:25 myquota1.img
[root@chenshiren ~]# xfs_quota -x -c "report -ubih" /home/ 
User quota on /home (/dev/nvme0n2p1)
                        Blocks                            Inodes              
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [0 days]      4      0      0  00 [------]
myquota1   299.0M   250M   300M  00 [13 days]     10      0      0  00 [------]
myquota2      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota3      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota4      12K   250M   300M  00 [------]      7      0      0  00 [------]
myquota5      12K   250M   300M  00 [------]      7      0      0  00 [------]
# 因为磁盘使用量已经达到soft限制值了,出现了宽限时间    
[root@chenshiren ~]# xfs_quota -x -c "report -gbih" /home/ 
Group quota on /home (/dev/nvme0n2p1)
                        Blocks                            Inodes              
Group ID     Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [0 days]      3      0      0  00 [------]
myquotagrp 299.1M   950M     1G  00 [------]     39      0      0  00 [------]
# 整个用户组使用量还没达到soft警告限制值

实践磁盘配额流程4:project的限制(针对目录限制)

要限制的是/home/myquota这个目录,而不是针对myquotagrp这个用户组,所以要取消grpquota挂载选项

修改/etc/fstab

[root@chenshiren ~]# umount /home 
[root@chenshiren ~]# vim /etc/fstab  
/dev/nvme0n2p1         /home          xfs defaults,usrquota,prjquota  0 0
[root@chenshiren ~]# mount -a
[root@chenshiren ~]# mount |grep home
/dev/nvme0n2p1 on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,usrquota,prjquota)
[root@chenshiren ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/nvme0n2p1)
  Accounting: ON
  Enforcement: ON
  Inode: #152 (2 blocks, 2 extents)
Blocks grace time: [14 days]
Blocks max warnings: 5
Inodes grace time: [7 days]
Inodes max warnings: 5
Realtime Blocks grace time: [7 days]
Group quota state on /home (/dev/nvme0n2p1)
  Accounting: OFF    # 已经关闭了
  Enforcement: OFF
  Inode: #153 (2 blocks, 2 extents)
Blocks grace time: [7 days]
Blocks max warnings: 5
Inodes grace time: [7 days]
Inodes max warnings: 5
Realtime Blocks grace time: [7 days]
Project quota state on /home (/dev/nvme0n2p1) # project启动了
  Accounting: ON
  Enforcement: ON
  Inode: #157 (1 blocks, 1 extents)
Blocks grace time: [7 days]
Blocks max warnings: 5
Inodes grace time: [7 days]
Inodes max warnings: 5
Realtime Blocks grace time: [7 days]

规范目录、选项名称与选项ID

目录的设置必须要指定一个所谓的【选项名称、选项标识符】来规范才行,而且需要用到两个配置文件

要规范的目录是/home/myquota其选项名称为myquotaproject的选项名称,标识符为11,这些都是自己自定义的

# 1 指定方案识别码与目录的对应在/etc/projects
[root@chenshiren ~]# echo "11:/home/myquota" >> /etc/projects
# 2 规范方案名称与标识符的对应/etc/projid
[root@chenshiren ~]# echo "myquotaproject:11" >> /etc/projid 
# 3 初始化方案名称
[root@chenshiren ~]# xfs_quota -x -c "project -s myquotaproject"
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion depth infinite (-1).
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion depth infinite (-1).
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion depth infinite (-1).
[root@chenshiren ~]# xfs_quota -x -c "print" /home/
Filesystem          Pathname
/home               /dev/nvme0n2p1 (uquota, pquota)
/home/myquota       /dev/nvme0n2p1 (project 11, myquotaproject)
[root@chenshiren ~]# xfs_quota -x -c "report -pbih" /home
Project quota on /home (/dev/nvme0n2p1)
                        Blocks                            Inodes              
Project ID   Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
myquotaproject      0      0      0  00 [------]      1      0      0  00 [------]
# 获取到了这个方案名称

实际设置规范与测试

将/home/myquota指定为500MB(hard)的容量限制,450MB为soft的限制

[root@chenshiren ~]# xfs_quota -x -c "limit -p bsoft=450M bhard=500M myquotaproject" /home
[root@chenshiren ~]# xfs_quota -x -c "report -pbih" /home                                 
Project quota on /home (/dev/nvme0n2p1)
                        Blocks                            Inodes              
Project ID   Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
#0         299.1M      0      0  00 [------]     41      0      0  00 [------]
myquotaproject      0   450M   500M  00 [------]      1      0      0  00 [------]
[root@chenshiren ~]# cd /home/myquota
[root@chenshiren myquota]# dd if=/dev/zero of=root.img bs=1M count=500
[root@chenshiren myquota]# ll -h root.img 
-rw-r--r--. 1 root myquotagrp 500M  321 14:23 root.img
# 连root在该目录创建文件,也会被阻止
[root@chenshiren myquota]# xfs_quota -x -c "report -pbih" /home        
Project quota on /home (/dev/nvme0n2p1)
                        Blocks                            Inodes              
Project ID   Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
myquotaproject   500M   450M   500M  00 [6 days]      2      0      0  00 [------]

xfs磁盘配额的管理与额外命令对照表

如果要暂停磁盘配额的限制,或重新启动磁盘配额的限制

  • disable:暂时取消磁盘配额的限制,但其实系统还是在计算磁盘配额中,只是没有管制而已
  • enable:恢复到正常的管制状态中
  • off:完全关闭磁盘配额的限制,使用了这个状态后,你只有卸载再重新挂载才能够再次启动磁盘配额
  • remove:必须要在off的状态才能够执行的命令,这个remove可以【删除】磁盘配额的限制设置,例如要取消project的设置,无须重新设置为0,只要 remove -p即可
# 1 暂时关闭xfs文件系统的磁盘配额限制功能
[root@chenshiren ~]# xfs_quota -x -c "disable -up" /home/
[root@chenshiren ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/nvme0n2p1)
  Accounting: ON    # 还在计算使用配额
  Enforcement: OFF  # 关闭了强制管制
  Inode: #152 (2 blocks, 2 extents)
Blocks grace time: [14 days]
Blocks max warnings: 5
Inodes grace time: [7 days]
Inodes max warnings: 5
Realtime Blocks grace time: [7 days]
Group quota state on /home (/dev/nvme0n2p1)
  Accounting: OFF
  Enforcement: OFF
  Inode: #153 (2 blocks, 2 extents)
Blocks grace time: [7 days]
Blocks max warnings: 5
Inodes grace time: [7 days]
Inodes max warnings: 5
Realtime Blocks grace time: [7 days]
Project quota state on /home (/dev/nvme0n2p1)
  Accounting: ON
  Enforcement: OFF
  Inode: #157 (1 blocks, 1 extents)
Blocks grace time: [7 days]
Blocks max warnings: 5
Inodes grace time: [7 days]
Inodes max warnings: 5
Realtime Blocks grace time: [7 days]
# 2 在/home/myquota写入信息
[root@chenshiren myquota]# dd if=/dev/zero of=root1.img bs=1M count=500
记录了500+0 的读入
记录了500+0 的写出
524288000字节(524 MB,500 MiB)已复制,0.089931 s,5.8 GB/s
[root@chenshiren myquota]# ll -h
-rw-r--r--. 1 root myquotagrp 500M  321 14:33 root1.img
-rw-r--r--. 1 root myquotagrp 500M  321 14:23 root.img
[root@chenshiren myquota]# xfs_quota -x -c "report -pbh" /home
Project quota on /home (/dev/nvme0n2p1)
                        Blocks              
Project ID   Used   Soft   Hard Warn/Grace   
---------- --------------------------------- 
myquotaproject  1000M   450M   500M  00 [-none-] # 超了 但是因为disable的原因没有管制

# 3 开启限制
[root@chenshiren myquota]# xfs_quota -x -c "enable -up" /home           
[root@chenshiren myquota]# dd if=/dev/zero of=root2.img bs=1M count=500 
dd: 打开'root2.img' 失败: 设备上没有空间 # 又开始了限制

# 4 完全关闭限制,同时取消project的功能
[root@chenshiren ~]# xfs_quota -x -c "remove -up" /home/  
XFS_QUOTARM: 无效的参数
# ...我这里不知道啥情况用不了remove
# 先暂时用这种方法 等我以后知道啥原因再更新
[root@chenshiren ~]# xfs_quota -x -c "limit -p bsoft=0 bhard=0 myquotaproject" /home
[root@chenshiren ~]# xfs_quota -x -c "report -pbh" /home/ 
Project quota on /home (/dev/nvme0n2p1)
                        Blocks              
Project ID   Used   Soft   Hard Warn/Grace   
---------- --------------------------------- 
myquotaproject  1000M      0      0  00 [------]

RIAD(独立冗余磁盘整列)

什么是RAID

下图来自百度百科磁盘阵列

image-20240321154619581

整个RAID由于选择的级别(level)不同,而使得整合的磁盘具有不同的功能,基本常见的level有这几种:

RAID级别最少硬盘可用容量读写性能安全性特点
02nn最求最大容量和速度;但是任何一块硬盘损坏,数据将全部异常
12n/2n追求最大安全性,只要阵列中有一块硬盘可用,数据就不受影响
53n-1n-1再控制成本的前提下,追求硬盘的最大容量、速度及安全性,允许有一块硬盘出现异常,且数据不受影响
104n/2n/2综合RAID1和RAID0的优点,追求硬盘的速度和安全性,允许有一半硬盘出现异常(不可发生在同一阵列中),且数据不受影响

RAID0

RAID 0(等量模式,stripe):性能最佳

RAID 0 它通过将数据分割并交错地存储在多个磁盘中来提高性能。数据被均匀地分配到各个磁盘上,从而提升读写速度。然而,RAID 0也存在数据丢失的风险,因为如果任何一个磁盘损坏,整个RAID中的数据都将无法访问。此外,如果使用容量不同的磁盘组成RAID 0,最小容量的磁盘将成为性能瓶颈,限制整体性能。

image-20240321172236768

RAID1

RAID 1(镜像模式,mirror):完整备份

RAID 1 数据会被完整备份在两块磁盘上,确保数据的安全性。即使一块硬盘损坏,数据依然可以完整保留。RAID 1的总容量为全部磁盘容量的一半,写入性能可能较低,但读取性能比较高,因为数据可以从两块磁盘中同时读取,提高了读取速度和平衡负载。

image-20240321173040783

RAID5

RAID5需要至少三块磁盘才能组成。数据写入时类似于RAID 0,但每个循环写入时都会加入奇偶校验数据,用于记录其他磁盘的备份数据以便在磁盘损坏时进行恢复。RAID5的容量整体磁盘数量减一块,如下图,原本的3块磁盘只会剩下(3-1)=2块磁盘容量,而且当损坏的磁盘数量大于等于两块时,整组RAID5的数据就损坏了,因为RAID5默认仅支持一块磁盘的损坏情况

在读取性能上,RAID5的性能不错,写入性能相对较差,因为写入数据需要计算奇偶校验值。

image-20240321184752664

RAID10

RAID 1+0,也称为RAID 10,结合了RAID 0和RAID 1的优点。在RAID 10中,首先将两块磁盘组成两组RAID 1,然后将这两组RAID 1再整合成一组RAID 0。这样做的好处是数据既安全又能获得较高的性能。每块磁盘只需写入其一半的容量,从而保证了数据的安全性和性能。如果任意一组RAID 1中的一块磁盘损坏,由于有镜像数据的备份,数据可以得到有效保护

image-20240321191515585

软件磁盘阵列的设置(RAID5)

使用mdadm这个命令

参数作用
-a检测设备名称
-n指定设备数量
-l指定RAID级别
-C创建
-v显示过程
-f模拟设备损坏
-r移除设备
-Q查看摘要信息
-D查看详细信息
-S停止RAID磁盘阵列
-c决定这个设备的chunk大小,一般是64K或512K
-x使用几个磁盘作为备用设备
–zero-superblock将包含合法md信息的superblock区域置为零

测试创建一个RAID5软件磁盘阵列,要求如下

  • 利用4个分区组成RAID5
  • 每个分区约为1GB大小,需确定每个分区一样大
  • 将1个分区设置为热备份磁盘
  • 每个数据块设置为256K
  • 这个热备份磁盘的大小与其他RAID所需分区一样大
  • 将此RAID5设备挂载到/srv/raid5目录下
# 磁盘分区这里就不再说明了
[root@chenshiren ~]# gdisk -l /dev/nvme0n2
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  FD00  Linux RAID
   2         2099200         4196351   1024.0 MiB  FD00  Linux RAID
   3         4196352         6293503   1024.0 MiB  FD00  Linux RAID
   4         6293504         8390655   1024.0 MiB  FD00  Linux RAID
   5         8390656        10487807   1024.0 MiB  FD00  Linux RAID
   [root@chenshiren ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0            11:0    1  8.9G  0 rom  
nvme0n1       259:0    0   50G  0 disk 
├─nvme0n1p1   259:1    0  600M  0 part /boot/efi
├─nvme0n1p2   259:2    0    1G  0 part /boot
└─nvme0n1p3   259:3    0 48.4G  0 part 
  ├─rhel-root 253:0    0 43.4G  0 lvm  /
  └─rhel-swap 253:1    0    5G  0 lvm  [SWAP]
nvme0n2       259:4    0   20G  0 disk 
├─nvme0n2p1   259:5    0    1G  0 part 
├─nvme0n2p2   259:6    0    1G  0 part 
├─nvme0n2p3   259:10   0    1G  0 part 
├─nvme0n2p4   259:11   0    1G  0 part 
└─nvme0n2p5   259:12   0    1G  0 part 

以mdadm创建RAID5

[root@chenshiren ~]# mdadm -Cv /dev/md0  -c 256K -x1  -n 4 -l 5 /dev/nvme0n2p{1..5}
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: partition table exists on /dev/nvme0n2p1
mdadm: partition table exists on /dev/nvme0n2p1 but will be lost or
       meaningless after creating array
mdadm: size set to 1046528K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@chenshiren ~]# mdadm -D /dev/md0 
/dev/md0:           # RAID设备文件名
           Version : 1.2  
     Creation Time : Thu Mar 21 19:45:44 2024   # 创建时间
        Raid Level : raid5                      # RAID级别
        Array Size : 3139584 (2.99 GiB 3.21 GB)  # 整组RAID可用容量
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)  # 每块磁盘设备容量
      Raid Devices : 4                           # 组成RAID磁盘数量
     Total Devices : 5                           # 包括备份盘的总磁盘数量
       Persistence : Superblock is persistent

       Update Time : Thu Mar 21 19:45:49 2024
             State : clean                       # 目前这个磁盘阵列的使用状态
    Active Devices : 4                           # 启动的设备数量
   Working Devices : 5                           # 目前使用于此整列的设备数
    Failed Devices : 0                           # 损坏的设备数
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 256K                        # 每个chunk的小数据块容量

Consistency Policy : resync

              Name : chenshiren:0  (local to host chenshiren)
              UUID : 33e82c07:d997218a:eeb8e838:35b20352
            Events : 18

    Number   Major   Minor   RaidDevice State
       0     259        5        0      active sync   /dev/nvme0n2p1  # 设备列表
       1     259        6        1      active sync   /dev/nvme0n2p2
       2     259       10        2      active sync   /dev/nvme0n2p3
       5     259       11        3      active sync   /dev/nvme0n2p4

       4     259       12        -      spare   /dev/nvme0n2p5  # 热备份盘
# 查看简要信息
[root@chenshiren ~]# mdadm -Q /dev/md0    
/dev/md0: 2.99GiB raid5 4 devices, 1 spare. Use mdadm --detail for more detail.

# 查看系统软件磁盘阵列的情况
[root@chenshiren ~]# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 nvme0n2p4[5] nvme0n2p5[4](S) nvme0n2p3[2] nvme0n2p2[1] nvme0n2p1[0]
# ↑第一行
# ↓第二行
      3139584 blocks super 1.2 level 5, 256k chunk, algorithm 2 [4/4] [UUUU]
      
unused devices: <none>
# 第一行部分:指出md0为RAID5,且使用了nvme0n2p4 nvme0n2p3 nvme0n2p2 nvme0n2p1等四块磁盘设备
#            每个设备后面的中括号内的数字为磁盘在RAID中的顺序,[S]则代表是热备份盘
# 第二行部分:磁盘阵列拥有3139584个区块(每个区块1KB),所以总容量约为3GB,使用RAID5级别
#            写入磁盘小数据块大小为256KB,[4/4]代表磁盘整列需要4个设备,且4个设备正常运行
#            后面[UUUU]代表的是四个所需的设备,U代表正常运行,若为_则代表不正常

格式化与挂载使用RAID

  • srtipe(chunk)容量为256KB,所以su=256k
  • 共有4块组成RAID5,因此容量少一块,所以sw=3
  • 由上面两项计算出数据宽度为:256*3=768k
[root@chenshiren ~]# mkfs.xfs -f -d su=256k,sw=3  -r extsize=768k /dev/md0  
meta-data=/dev/md0               isize=512    agcount=8, agsize=98048 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=784384, imaxpct=25
         =                       sunit=64     swidth=192 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=5184, version=2
         =                       sectsz=512   sunit=64 blks, lazy-count=1
realtime =none                   extsz=786432 blocks=0, rtextents=0
[root@chenshiren ~]# mkdir /srv/raid5
[root@chenshiren ~]# mount /dev/md0 /srv/raid5/
[root@chenshiren ~]# df -hT /srv/raid5/
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/md0       xfs   3.0G   54M  3.0G    2% /srv/raid5

模拟RAID错误的恢复模式

设置磁盘为错误

# 1 先复制一些东西进去
[root@chenshiren ~]# cp -a /etc /var/log/ /srv/raid5/
[root@chenshiren ~]# df -hT /srv/raid5/
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/md0       xfs   3.0G   91M  2.9G    3% /srv/raid5

# 2 假设/dev/nvme0n2p1 这个设备除错了
[root@chenshiren ~]# mdadm /dev/md0  -f /dev/nvme0n2p1 
mdadm: set /dev/nvme0n2p1 faulty in /dev/md0

[root@chenshiren ~]# mdadm -D /dev/md0 
...
...
       Update Time : Thu Mar 21 22:12:02 2024
             State : clean 
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 1    # 显示出错一个磁盘
     Spare Devices : 0
....
....

    Number   Major   Minor   RaidDevice State
       4     259       12        0      active sync   /dev/nvme0n2p5
       1     259        6        1      active sync   /dev/nvme0n2p2
       2     259       10        2      active sync   /dev/nvme0n2p3
       5     259       11        3      active sync   /dev/nvme0n2p4

       0     259        5        -      faulty   /dev/nvme0n2p1 # 备份磁盘p5启动了p1挂了

将出错的磁盘删除并加入新磁盘

实际p1并没有挂只是模拟而已,如果要换

  1. 先从/dev/md0磁盘阵列中删除/dev/nvme0n2p1这块【磁盘】
  2. 整个Linux系统关机,拔出/dev/nvme0n2p1这块【磁盘】,并安装上新的/dev/nvme0n2p1【磁盘】,之后启动
  3. 将新的/dev/nvme0n2p1放入/dev/md0磁盘阵列中
# 1 移除挂掉的磁盘
[root@chenshiren ~]# mdadm /dev/md0 -r /dev/nvme0n2p1 
mdadm: hot removed /dev/nvme0n2p1 from /dev/md0
# 假设你做了上面2  3 步骤,然后重新启动成功了
# 2 安装新的/dev/nvme0n2p1
[root@chenshiren ~]# mdadm /dev/md0 -a /dev/nvme0n2p1  
mdadm: added /dev/nvme0n2p1
[root@chenshiren ~]# mdadm -D /dev/md0                
/dev/md0:
           Version : 1.2
     Creation Time : Thu Mar 21 19:45:44 2024
        Raid Level : raid5
        Array Size : 3139584 (2.99 GiB 3.21 GB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 4
     Total Devices : 5
       Persistence : Superblock is persistent

       Update Time : Thu Mar 21 22:21:48 2024
             State : clean 
    Active Devices : 4
   Working Devices : 5
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 256K

Consistency Policy : resync

              Name : chenshiren:0  (local to host chenshiren)
              UUID : 33e82c07:d997218a:eeb8e838:35b20352
            Events : 39

    Number   Major   Minor   RaidDevice State
       4     259       12        0      active sync   /dev/nvme0n2p5
       1     259        6        1      active sync   /dev/nvme0n2p2
       2     259       10        2      active sync   /dev/nvme0n2p3
       5     259       11        3      active sync   /dev/nvme0n2p4

       6     259        5        -      spare   /dev/nvme0n2p1  # 新的热备份盘

开机自动启动RAID并自动挂载

​ 软件RAID也是有配置文件,这个配置文件是/etc/mdadm.conf ,这个配置文件内容很简单,你只要知道/dev/md0的UUID就能够设置这个文件

[root@chenshiren ~]# mdadm -D /dev/md0 | grep -i uuid
              UUID : 33e82c07:d997218a:eeb8e838:35b20352
# 后面的那一串数字就是UUID
# 设置 mdadm.conf
[root@chenshiren ~]# vim /etc/mdadm.conf
ARRAY /dev/md0 UUID=33e82c07:d997218a:eeb8e838:35b20352
      # RAID设备 # 识别码
[root@chenshiren ~]# blkid /dev/md0 
/dev/md0: UUID="018c1817-f90c-4939-b7b1-449c8c08b971" TYPE="xfs"
# 开始设置启动自动挂载并测试
[root@chenshiren ~]# vim /etc/fstab 
UUID=018c1817-f90c-4939-b7b1-449c8c08b971 /srv/raid5  xfs defaults 0 0
[root@chenshiren ~]# umount /srv/raid5 ; mount -a
[root@chenshiren ~]# df -hT /srv/raid5/
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/md0       xfs   3.0G   91M  2.9G    3% /srv/raid5
[root@chenshiren ~]# ll  /srv/raid5/  
总用量 16
drwxr-xr-x. 135 root root 8192  321 19:30 etc
drwxr-xr-x.  17 root root 4096  321 12:24 log

关闭软件RAID

# 1 卸载/srv/raid5
[root@chenshiren ~]# umount /srv/raid5 
# 2 删除/dev/md0自动挂载信息
[root@chenshiren ~]# sed -i '$d' /etc/fstab # 意思是删除/etc/fstab最后一行信息
# 3 删除/etc/mdadm.conf配置文件信息
[root@chenshiren ~]# sed -i '$d' /etc/mdadm.conf 
# 4 停止RAID5阵列
[root@chenshiren ~]# mdadm -S /dev/md0 
mdadm: stopped /dev/md0
# 5 卸载RAID5中所有磁盘信息
[root@chenshiren ~]# mdadm  --zero-superblock /dev/nvme0n2p1 
[root@chenshiren ~]# mdadm  --zero-superblock /dev/nvme0n2p2
[root@chenshiren ~]# mdadm  --zero-superblock /dev/nvme0n2p3
[root@chenshiren ~]# mdadm  --zero-superblock /dev/nvme0n2p4
[root@chenshiren ~]# mdadm  --zero-superblock /dev/nvme0n2p5
# 查看系统阵列信息
[root@chenshiren ~]# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
unused devices: <none> # 不存在任何整列设备

RAID10磁盘阵列的设置

# 1 分区
[root@chenshiren ~]# gdisk -l /dev/nvme0n2 |grep -i linux\ RAID
   1         8390656        10487807   1024.0 MiB  FD00  Linux RAID
   2         2099200         4196351   1024.0 MiB  FD00  Linux RAID
   3         4196352         6293503   1024.0 MiB  FD00  Linux RAID
   4         6293504         8390655   1024.0 MiB  FD00  Linux RAID
# 2 创建RAID10
[root@chenshiren ~]# mdadm -Cv /dev/md0  -n 4 -l 10 /dev/nvme0n2p{1,2,3,4}
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 1046528K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@chenshiren ~]# mdadm -D /dev/md0 
/dev/md0:
           Version : 1.2
     Creation Time : Fri Mar 22 16:45:01 2024
        Raid Level : raid10
        Array Size : 2093056 (2044.00 MiB 2143.29 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Fri Mar 22 16:45:11 2024
             State : clean 
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 0

            Layout : near=2
        Chunk Size : 512K

Consistency Policy : resync

              Name : chenshiren:0  (local to host chenshiren)
              UUID : 6f2c0ad2:d7b1c9e5:19345bd2:480fd54b
            Events : 17

    Number   Major   Minor   RaidDevice State
       0     259        8        0      active sync set-A   /dev/nvme0n2p1
       1     259       10        1      active sync set-B   /dev/nvme0n2p2
       2     259       11        2      active sync set-A   /dev/nvme0n2p3
       3     259       12        3      active sync set-B   /dev/nvme0n2p4
# 3 格式化挂载
[root@chenshiren ~]# mkfs.xfs /dev/md0
log stripe unit (524288 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/md0               isize=512    agcount=8, agsize=65408 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=523264, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@chenshiren ~]# mkdir /srv/raid10
[root@chenshiren ~]# mount /dev/md0 /srv/raid10/
[root@chenshiren ~]# df -hT /srv/raid10/
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/md0       xfs   2.0G   47M  2.0G    3% /srv/raid10

LVM(逻辑卷管理器)

LVM(Logical Volume Manager)的重点在于提供了可以弹性地调整文件系统容量的功能。通过LVM,管理员可以将多个物理分区整合成一个逻辑卷(Logical Volume),使其看起来像是一个磁盘,而且可以随时在这个逻辑卷管理的磁盘上新增或删除其他的物理分区。这种灵活配置使得整个磁盘空间的利用具有极大的弹性,而无需像传统分区那样重新分区、格式化、复制数据等繁琐操作

什么是LVM:PV、PE、VG、LV的意义

LVM(Logical Volume Manager)通过将多个物理分区或磁盘组合成一个虚拟组(Volume Group,VG),再对其划分为可用的逻辑卷(Logical Volume,LV),实现了将多个独立存储单元看作一个大磁盘的功能。这样的系统之所以能够灵活地进行文件系统的扩充或缩小,核心在于PE(Physical Extent)。PE是LVM中的最小存储单元,管理着VG中的物理空间分配。通过动态分配、释放PE,LVM可以实现对LV的容量进行动态调整,从而实现文件系统的扩展或缩减

物理卷(PV,Physical Volume)

物理卷是将一个物理分区或整个磁盘作为 LVM 系统的一部分。PV 是 LVM 的基础组成单位,它汇总多个 PV 以形成 VG。

卷组(VG,Volume Group)

卷组是由一个或多个 PV 组成的容器,在 VG 内部创建 LV。通过 VG,管理员可以管理多个 PV

逻辑卷(LV,Logical Volume)

逻辑卷是 VG 中的一个逻辑存储单元,类似于物理分区,可以被格式化并用作文件系统。

物理扩展块(PE,Physical Extent)

物理块是 LVM 中的最小存储单位,通常与物理介质的扇区大小对应。PE 是 VG 分配给 LV 的基本单元,它允许管理员增加或减少 LV 的大小,在实际磁盘上以 PE 为单位进行分配和管理。

image-20240321234414924

如上图VG内的PE会分给虚线部分的LV,如果未来这个VG要扩充的话,加上其他的PV即可。而LV如果需要扩充的话,也是通过加入VG内没有使用到的PE来扩充

实践流程

通过PV、VG、LV的规划后之后,再利用mkfs就可以将你的LV格式化成为可以利用的文件系统了,而且这个文件系统的容量在未来还能够进行扩充或减少,而且里面的数据不会被影响

image-20240322001640332

可以利用LV进行系统的挂载,当数据写入LV时,到底是怎么写入硬盘当中的

  • 线性模式

在线性模式下,LV 的数据被顺序写入物理卷(Physical Volume,PV)中。数据按照线性顺序写入 PV,直到一个 PV 满后才会写入下一个 PV。

  • 交错模式

在交错模式下,LV 的数据被分成固定大小的数据块,并交错地写入到多个物理卷中,类似RAID 0的数据交错方式。

LVM最主要的用处是在实现一个可以弹性调整容量的文件系统上,而不是建立一个性能为主的磁盘上

LVM默认的读写默认模式是线性模式,如果你使用交错模式,当一个分区【损坏】,所有的数据都会【损坏】

LVM实践流程

要求:

  • 使用4个硬盘分区,每个分区的容量均为1GB左右,且system ID需要8e00
  • 全部的分区整合成为一个VG,VG名称设置为vgcsq,且PE的大小为16MB
  • 建立一个名为lvcsq的LV,容量大约2GB
  • 最终这个LV格式化为xfs的文件系统,且挂载在/srv/lvm中

一、物理分区阶段

[root@chenshiren ~]# gdisk -l /dev/nvme0n2
...
...
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  8E00  Linux LVM
   2         2099200         4196351   1024.0 MiB  8E00  Linux LVM
   3         4196352         6293503   1024.0 MiB  8E00  Linux LVM
   4         6293504         8390655   1024.0 MiB  8E00  Linux LVM

二、PV阶段

要建立PV直接使用pvcreate即可

  • pvcreate:将物理分区建立成为PV
  • pvscan:查找目前系统里面任何具有PV的磁盘
  • pvdisplay:显示出目前系统上面的PV状态
  • pvremove:将PV属性删除,让分区不具有PV属性
# 1 检查有无PV在系统上,然后将/dev/nvme0n2p{1,2,3,4}建立成为PV模式
[root@chenshiren ~]# pvscan 
  PV /dev/nvme0n1p3   VG rhel            lvm2 [48.41 GiB / 0    free]
  Total: 1 [48.41 GiB] / in use: 1 [48.41 GiB] / in no VG: 0 [0   ]
[root@chenshiren ~]# lsblk -f /dev/nvme0n1p3 
NAME        FSTYPE      FSVER    LABEL UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1p3   LVM2_member LVM2 001       aRKDZH-Eee9-L3V8-D61M-DXfV-aFmB-qd6kyl                
├─rhel-root xfs                        e1af9794-ce86-43d6-ab5c-db7d68f24869       39G    10% /
└─rhel-swap swap        1              fa2672f6-bd1b-4d34-9f7e-e4fc393b6e31                  [SWAP]
# 可以看到/目录就是使用的LVM模式
[root@chenshiren ~]# pvcreate /dev/nvme0n2p{1,2,3,4} 
  Physical volume "/dev/nvme0n2p1" successfully created.
  Physical volume "/dev/nvme0n2p2" successfully created.
  Physical volume "/dev/nvme0n2p3" successfully created.
  Physical volume "/dev/nvme0n2p4" successfully created.
[root@chenshiren ~]# pvscan
  PV /dev/nvme0n1p3   VG rhel            lvm2 [48.41 GiB / 0    free]
  PV /dev/nvme0n2p1                      lvm2 [1.00 GiB]
  PV /dev/nvme0n2p2                      lvm2 [1.00 GiB]
  PV /dev/nvme0n2p3                      lvm2 [1.00 GiB]
  PV /dev/nvme0n2p4                      lvm2 [1.00 GiB]
  Total: 5 [52.41 GiB] / in use: 1 [48.41 GiB] / in no VG: 4 [4.00 GiB]
# 最后一行显示的是 整体PV的量/已经被使用到VG的PV量/剩余PV的量
# 2 更详细地列示出系统上面每个PV的个别信息
[root@chenshiren ~]# pvdisplay /dev/nvme0n2p1
  "/dev/nvme0n2p1" is a new physical volume of "1.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/nvme0n2p1  # 实际分区的设备名称
  VG Name                               # 因为尚未分配出去所以空白
  PV Size               1.00 GiB        # 容量
  Allocatable           NO              # 是否被分配
  PE Size               0               # PV内的PE大小
  Total PE              0               # 共划分几个PE
  Free PE               0               # 没有被LV用掉的PE
  Allocated PE          0               # 尚可分配出去的PE数量
  PV UUID               c4nSJV-YjG7-y1S9-9WOD-L6uz-yO7K-8oOkqD

三、VG阶段

  • vgcreate:建立VG的命令,参数较多
  • vgscan:查找系统上面是否有VG的存在
  • vgdisplay:显示目前系统上面的VG状态
  • vgextend:在VG内增加额外的PV
  • vgreduce:在VG内删除PV
  • vgchange:设置VG是否启动
  • vgremove:删除一个VG

与PV不同的是VG的名称可以自定义

[root@chenshiren ~]# vgcreate [-s N[mgt]] VG名称 PV名称
选项:
-s :后面接PE的大小(size),单位可以是m,g,t
# 1 将/dev/nvme0n2p{1,2,3}建立一个VG,且指定PE为16MB
[root@chenshiren ~]# vgcreate -s 16M vgcsq /dev/nvme0n2p{1,2,3}
  Volume group "vgcsq" successfully created
[root@chenshiren ~]# vgscan 
  Found volume group "vgcsq" using metadata type lvm2  # 我们做的
  Found volume group "rhel" using metadata type lvm2   # 系统安装做的
[root@chenshiren ~]# pvscan 
  PV /dev/nvme0n2p1   VG vgcsq           lvm2 [1008.00 MiB / 1008.00 MiB free]
  PV /dev/nvme0n2p2   VG vgcsq           lvm2 [1008.00 MiB / 1008.00 MiB free]
  PV /dev/nvme0n2p3   VG vgcsq           lvm2 [1008.00 MiB / 1008.00 MiB free]
  PV /dev/nvme0n1p3   VG rhel            lvm2 [48.41 GiB / 0    free]
  PV /dev/nvme0n2p4                      lvm2 [1.00 GiB]
  Total: 5 [52.36 GiB] / in use: 4 [51.36 GiB] / in no VG: 1 [1.00 GiB]
# 3个PV被用,还有一个PV没有被用掉
[root@chenshiren ~]# vgdisplay vgcsq
  --- Volume group ---
  VG Name               vgcsq
  System ID             
  Format                lvm2
  Metadata Areas        3
  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                3
  Act PV                3
  VG Size               2.95 GiB      # 整体VG容量
  PE Size               16.00 MiB     # 内部每个PE的大小
  Total PE              189           # PE的数量共有这么多
  Alloc PE / Size       0 / 0   
  Free  PE / Size       189 / 2.95 GiB  # 尚可配置给LV的PE数量/总量
  VG UUID               ZyJOWd-ESJD-LCAT-bGdG-lAx5-CWYM-fnZPXD
  
# 2 假设要增加vgcsq的容量
[root@chenshiren ~]# vgextend vgcsq /dev/nvme0n2p4 
  Volume group "vgcsq" successfully extended
[root@chenshiren ~]# vgdisplay vgcsq
  --- Volume group ---
  VG Name               vgcsq
  System ID             
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               <3.94 GiB   # 大小发生改变
  PE Size               16.00 MiB
  Total PE              252
  Alloc PE / Size       0 / 0   
  Free  PE / Size       252 / <3.94 GiB
  VG UUID               ZyJOWd-ESJD-LCAT-bGdG-lAx5-CWYM-fnZPXD

四、LV阶段

创造出VG这个大磁盘后,再来就是要建立分区,这个分区就是所谓的PV,假设要将vgcsq磁盘,划分为lvcsq,整个VG的容量都被分配到lvcsq里面

  • lvcreate:建立LV
  • lvscan:查询系统上面的LV
  • lvdisplay:显示系统上面的LV状态
  • lvextend:在LV里面增加容量
  • lvreduce:在LV里面减少容量
  • lvremove:删除一个LV
  • lvresize:对LV进行容量大小的调整
[root@chenshiren ~]# lvcreate [-L N[mgt]] [-n LV名称] VG名称
[root@chenshiren ~]# lvcreate [-l N] [-n LV名称]  VG名称
选项:
-L :后面接容量,容量单位可以是M、G、T,最小单位是PE
     因此后面这个数量必须要是PE的倍数,若不相符,系统会自行计算最相近的容量
-l :后面可以接PE的【个数】,而不是数量
-n : 后面接的是LV名称

# 1 将vgcsq分2GB给lvcsq
[root@chenshiren ~]# lvcreate -L 2G -n lvcsq vgcsq
  Logical volume "lvcsq" created.
# 也可以使用如下
lvcreate -l 128 -n lvcsq vgcsq
[root@chenshiren ~]# lvscan 
  ACTIVE            '/dev/vgcsq/lvcsq' [2.00 GiB] inherit  # 新增的
  ACTIVE            '/dev/rhel/swap' [5.00 GiB] inherit
  ACTIVE            '/dev/rhel/root' [43.41 GiB] inherit
[root@chenshiren ~]# lvdisplay /dev/vgcsq/lvcsq 
  --- Logical volume ---
  LV Path                /dev/vgcsq/lvcsq   # lv的全名
  LV Name                lvcsq
  VG Name                vgcsq
  LV UUID                O2c7zG-Lkcu-AHuL-1Zbh-xoML-UOEw-k9knQb
  LV Write Access        read/write
  LV Creation host, time chenshiren, 2024-03-22 12:17:29 +0800
  LV Status              available
  # open                 0
  LV Size                2.00 GiB        # 容量
  Current LE             128
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

五、文件系统阶段

[root@chenshiren ~]# mkfs.xfs /dev/vgcsq/lvcsq 
meta-data=/dev/vgcsq/lvcsq       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
[root@chenshiren ~]# mkdir  /srv/lvm  
[root@chenshiren ~]# mount /dev/vgcsq/lvcsq /srv/lvm/
[root@chenshiren ~]# cp -a /etc/ /var/ /srv/lvm/
[root@chenshiren ~]# df -hT /srv/lvm/           
文件系统                类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vgcsq-lvcsq xfs   2.0G  406M  1.6G   20% /srv/lvm

放大LV容量:xfs

放大LV容量流程:

  1. VG阶段需要有剩余的容量,因为需要放大文件系统,所以需要放大LV,但若没有多的VG容量,那么更上层的LV与文件系统就无法放大。一般来说VG容量不足,最简单的方法就是添加硬盘
  2. LV阶段产生更多的可用容量:如果VG的剩余容量足够,可用利用【lvresize】这个命令来将剩余容量加入到所需要增加的LV设备内
  3. 文件系统阶段的放大:实际使用的不是LV,而是LV里面的文件系统,xfs文件系统不支持文件系统的容量缩小,xfs放大文件系统通过【xfs_growfs】命令

假设想要对/srv/lvm增加500MB的容量

[root@chenshiren ~]# vgdisplay vgcsq
  --- Volume group ---
  VG Name               vgcsq
  System ID             
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               <3.94 GiB
  PE Size               16.00 MiB
  Total PE              252
  Alloc PE / Size       128 / 2.00 GiB
  Free  PE / Size       124 / <1.94 GiB
  VG UUID               ZyJOWd-ESJD-LCAT-bGdG-lAx5-CWYM-fnZPXD
# 因为LV只有2G VG足够大了,所以直接放大LV
[root@chenshiren ~]# lvresize -L +500M /dev/vgcsq/lvcsq 
  Rounding size to boundary between physical extents: 512.00 MiB.
  Size of logical volume vgcsq/lvcsq changed from 2.00 GiB (128 extents) to 2.50 GiB (160 extents).
  Logical volume vgcsq/lvcsq successfully resized.
# 这样就增加了LV,lvresize通过 -l或-L来增加
# 若增加使用+,减少则使用—
[root@chenshiren ~]# lvscan 
  ACTIVE            '/dev/vgcsq/lvcsq' [2.50 GiB] inherit # 由之前的2G增加到了2.5G
  ACTIVE            '/dev/rhel/swap' [5.00 GiB] inherit
  ACTIVE            '/dev/rhel/root' [43.41 GiB] inherit
[root@chenshiren ~]# df -hT /srv/lvm/
文件系统                类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vgcsq-lvcsq xfs   2.0G  351M  1.7G   18% /srv/lvm # 文件系统并没有增加
# 使用xfs_growfs命令
# 查看原本的文件系统内的superblock记录情况
[root@chenshiren ~]# xfs_info /srv/lvm/
meta-data=/dev/mapper/vgcsq-lvcsq 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
[root@chenshiren ~]# xfs_growfs /srv/lvm/
meta-data=/dev/mapper/vgcsq-lvcsq 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
data blocks changed from 524288 to 655360 # 数据块发生更改增加了
[root@chenshiren ~]# df -hT /srv/lvm/                  
文件系统                类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vgcsq-lvcsq xfs   2.5G  355M  2.2G   14% /srv/lvm
[root@chenshiren ~]# ll /srv/lvm/
总用量 16
drwxr-xr-x. 135 root root 8192  322 11:43 etc # 数据还在
drwxr-xr-x.  21 root root 4096  320 17:32 var

使用LVM thin Volume 让LVM动态自动调制磁盘使用率

概念:先建立一个可以实用实取、用多少容量才分配实际写入多少容量的磁盘容量存储池(thin pool),然后再由这个 thin pool 去产生一个【指定要固定容量大小的LV设备】,这个LV,虽然你会看到【声明上,它的容量可能有 10GB但实际上,该设备用到多少容量时,才会从 thin pool去实际获得所需要的容量】

实践:

  1. 由vgcsq的剩余容量取出1GB来做出一个名为csqpool的thin pool LV设备,这就是所谓的磁盘容量存储池
  2. 由vgcsq内的csqpool产生一个名为csqthin1的10GB LV设备
  3. 将此设备实际格式化为xfs文件系统,并且挂载于/srv/thin目录内
# 1 先以lvcreate来建立csqpool这个thin pool设备
[root@chenshiren ~]# lvcreate -L 1G -T vgcsq/csqpool
  Thin pool volume with chunk size 64.00 KiB can address at most <15.88 TiB of data.
  Logical volume "csqpool" created.
[root@chenshiren ~]# lvdisplay /dev/vgcsq/csqpool 
  --- Logical volume ---
  LV Name                csqpool
  VG Name                vgcsq
  LV UUID                vnmdob-Pk7X-tKas-KCrQ-gQ0C-dLjN-Mtux4e
  LV Write Access        read/write
  LV Creation host, time chenshiren, 2024-03-22 13:33:21 +0800
  LV Pool metadata       csqpool_tmeta
  LV Pool data           csqpool_tdata
  LV Status              available
  # open                 0
  LV Size                1.00 GiB  # 总共可分配出去的容量
  Allocated pool data    0.00%     # 可分配的容量百分比
  Allocated metadata     10.23%    # 已分配的元数据百分比
  Current LE             64
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:5
[root@chenshiren ~]# lvs vgcsq
  LV      VG    Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  csqpool vgcsq twi-a-tz-- 1.00g             0.00   10.23                           
  lvcsq   vgcsq -wi-ao---- 2.50g   

# 2 开始建立 csqthin1这个有10GB的设备
[root@chenshiren ~]# lvcreate -V 10G -T vgcsq/csqpool -n csqthin1
[root@chenshiren ~]# lvs vgcsq
  LV       VG    Attr       LSize  Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert
  csqpool  vgcsq twi-aotz--  1.00g                0.00   10.25                           
  csqthin1 vgcsq Vwi-a-tz-- 10.00g csqpool        0.00                                   
  lvcsq    vgcsq -wi-ao----  2.50g      
# vg都没有10G大 居然可以创建出10G的容量

# 3 开始建立文件系统
[root@chenshiren ~]# mkfs.xfs /dev/vgcsq/csqthin1 
[root@chenshiren ~]# mkdir /srv/thin 
[root@chenshiren ~]# mount /dev/vgcsq/csqthin1 /srv/thin/
[root@chenshiren ~]# df -hT /srv/thin/
文件系统                   类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vgcsq-csqthin1 xfs    10G  105M  9.9G    2% /srv/thin

# 4 测试容量使用,建立500M的文件,但不可超过1GB测试
[root@chenshiren ~]# dd if=/dev/zero of=/srv/thin/test bs=1M count=500
[root@chenshiren ~]# lvs vgcsq
  LV       VG    Attr       LSize  Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert
  csqpool  vgcsq twi-aotz--  1.00g                49.92  11.06                           
  csqthin1 vgcsq Vwi-aotz-- 10.00g csqpool        4.99                                   
  lvcsq    vgcsq -wi-ao----  2.50g     
# 可以看到已经分配了49%以上的容量了,而csqthin1才用掉5%而已
# 可以看到一个小小的磁盘可以模拟出很多容量,真的可用容量就是实际磁盘存储池内的容量,如果突破该容量
# 这个磁盘容量存储池会损坏

LVM的LV磁盘快照

快照就是将当时的系统信息记录下来,就好像照相记录一般。未来若有任何数据修改,则原始数据会被搬移到快照区,没有被修改的区域则由快照区与文件系统共享

image-20240322142838801

初始时,快照区与系统区共享物理空间,内容与文件系统相同。当系统运行一段时间后,如果数据被修改,则修改前的数据会被移动到快照区,快照区会被占用部分空间,而其他数据块仍然与文件系统共享。

流程:

  • 预计被拿来备份的原始LV为/dev/vgcsq/lvcsq
  • 使用传统方式创建快照。原始盘为/dev/vgcsq/lvcsq,快照名称为kuaizhao1,容量为vgcsq所剩余的容量

快照区的建立

# 1 先查看VG还剩下多少容量
[root@chenshiren ~]# vgdisplay vgcsq
...
...
  Alloc PE / Size       226 / 3.53 GiB
  Free  PE / Size       26 / 416.00 MiB  # 只剩下26个PE了
...
# 2 利用lvcreate建立lvcsq的快照区,快照名为kuaizhao1,且给予26个PE
[root@chenshiren ~]# lvcreate -s -l 26 -n kuaizhao1 /dev/vgcsq/lvcsq 
  Logical volume "kuaizhao1" created.
# -s选项代表快照功能的意思
# -n选项代表快照区的设备名称 后面跟的/dev/xxx 则是要被快照的LV完整文件名
# -l选项代表使用多少PE来被这个快照使用
[root@chenshiren ~]# lvdisplay /dev/vgcsq/kuaizhao1 
  --- Logical volume ---
  LV Path                /dev/vgcsq/kuaizhao1
  LV Name                kuaizhao1
  VG Name                vgcsq
  LV UUID                ejrZ9N-oWu0-PiyY-inQd-hieR-Dv1Q-RVNHEt
  LV Write Access        read/write
  LV Creation host, time chenshiren, 2024-03-22 14:40:46 +0800
  LV snapshot status     active destination for lvcsq
  LV Status              available
  # open                 0
  LV Size                2.50 GiB  # lvcsq原始容量
  Current LE             160
  COW-table size         416.00 MiB # 这个快照能够记录的最大容量
  COW-table LE           26
  Allocated to snapshot  0.00%      # 目前已经被用掉的容量
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:10
# 快照就被建立起来了,而且它的VG容量和原本的lvcsq相同,也就是说
# 如果你真的挂载了这个设备,看到的数据会跟原本的lvcsq相同
[root@chenshiren ~]# mkdir  /srv/kuaizhao  
[root@chenshiren ~]# mount -o nouuid /dev/vgcsq/kuaizhao1  /srv/kuaizhao/
# 因为xfs不允许相同UUID文件系统的挂载,因此我们得要加上那个nouuid的参数,让文件系统忽略相同的UUID
[root@chenshiren ~]# df -hT /srv/lvm/ /srv/kuaizhao/
文件系统                    类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vgcsq-lvcsq     xfs   2.5G  355M  2.2G   14% /srv/lvm
/dev/mapper/vgcsq-kuaizhao1 xfs   2.5G  355M  2.2G   14% /srv/kuaizhao

利用快照区恢复系统

要注意的是,你要恢复的数据量不能够高于快照区所能负载的实际容量

# 1 将lvcsq内的原始内容修改,增加一些内容删除一些内容
[root@chenshiren ~]# dd if=/dev/zero of=/srv/lvm/test bs=1M count=100  
[root@chenshiren ~]# rm -rf /srv/lvm/var/
[root@chenshiren ~]# df -hT /srv/lvm/ /srv/kuaizhao/                     
文件系统                    类型  容量  已用  可用 已用% 挂载点
/dev/mapper/vgcsq-lvcsq     xfs   2.5G  180M  2.4G    8% /srv/lvm
/dev/mapper/vgcsq-kuaizhao1 xfs   2.5G  355M  2.2G   14% /srv/kuaizhao
[root@chenshiren ~]# ll /srv/lvm/ /srv/kuaizhao/
/srv/kuaizhao/:
drwxr-xr-x. 135 root root 8192  322 11:43 etc
drwxr-xr-x.  21 root root 4096  320 17:32 var
# 可以看到两个目录以及不一样大了
/srv/lvm/:
drwxr-xr-x. 135 root root      8192  322 11:43 etc
-rw-r--r--    1 root root 104857600  322 14:54 test
[root@chenshiren ~]# lvdisplay /dev/vgcsq/kuaizhao1 
...
  Allocated to snapshot  24.67%   # 全部容量以及被用掉24.67%
...
# 2 还原快照
[root@chenshiren ~]# umount /srv/lvm 
[root@chenshiren ~]# umount /srv/kuaizhao 
[root@chenshiren ~]# lvconvert --merge /dev/vgcsq/kuaizhao1 
  Merging of volume vgcsq/kuaizhao1 started.
  vgcsq/lvcsq: Merged: 94.34%
  vgcsq/lvcsq: Merged: 100.00%
# 快照卷会被自动删除掉
[root@chenshiren ~]# mount /dev/vgcsq/lvcsq /srv/lvm/
[root@chenshiren ~]# ll /srv/lvm/
总用量 16
drwxr-xr-x. 135 root root 8192  322 11:43 etc
drwxr-xr-x.  21 root root 4096  320 17:32 var

LVM相关命令集合与LVM的关闭

任务PV阶段VG阶段LV阶段文件系统(xfs/ext4)
查找(scan)pvscanvgscanlvscanlsblk、blkid
建立(create)pvcreatevgcreatelvcreatemkfs.xfs/mkfs.ext
列出(display)pvdisplayvgdisplaylvdisplaydf、mount
增加(extend)vgextendlvextend(lvresize)xfs_growfs/resize2fs
减少(reduce)vgreducelvreduce不支持/resize2fs
删除(remove)pvremovevgremovelvremoveumount,重新格式化
修改容量(resize)lvresizexfs_growfs/resize2fs
修改属性(attribute)pvchangevgchangelvchange/etc/fstab、remount
恢复快照(lvconvert)lvconvert

流程:

  1. 先卸载系统上面的LVM文件系统(包括快照与所有LV)
  2. 使用lvremove删除LV
  3. 使用vgchange -a -n VGname让VGname这个VG不具有Active的标志
  4. 使用vgremove删除VG
  5. 使用pvremove删除PV
  6. 使用fdisk修改ID回来
[root@chenshiren ~]# umount /srv/lvm /srv/thin
[root@chenshiren ~]# lvs vgcsq
  LV       VG    Attr       LSize  Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert
  csqpool  vgcsq twi-aotz--  1.00g                49.92  11.06                           
  csqthin1 vgcsq Vwi-aotz-- 10.00g csqpool        4.99                                   
  lvcsq    vgcsq -wi-ao----  2.50g    
[root@chenshiren ~]# lvremove /dev/vgcsq/csqpool  /dev/vgcsq/csqthin1 
[root@chenshiren ~]# lvremove /dev/vgcsq/lvcsq 
[root@chenshiren ~]# vgchange -a n vgcsq
[root@chenshiren ~]# vgremove vgcsq
[root@chenshiren ~]# pvremove /dev/nvme0n2p{1,2,3,4}
[root@chenshiren ~]# gdisk -l /dev/nvme0n2  # 将磁盘ID改回8300
...
Number  Start (sector)    End (sector)  Size       Code  Name
   1         8390656        10487807   1024.0 MiB  8300  Linux filesystem
   2         2099200         4196351   1024.0 MiB  8300  Linux filesystem
   3         4196352         6293503   1024.0 MiB  8300  Linux filesystem
   4         6293504         8390655   1024.0 MiB  8300  Linux filesystem

放大缩小LV容量:ext4

# 1 物理分区阶段,systemID 8e00
[root@chenshiren ~]# gdisk -l /dev/nvme0n2
...
Number  Start (sector)    End (sector)  Size       Code  Name
   1         8390656        10487807   1024.0 MiB  8E00  Linux LVM
   2         2099200         4196351   1024.0 MiB  8E00  Linux LVM
   3         4196352         6293503   1024.0 MiB  8E00  Linux LVM
   4         6293504         8390655   1024.0 MiB  8E00  Linux LVM
# 2 建立PV
[root@chenshiren ~]# pvcreate /dev/nvme0n2p{1,2,3,4}
  Physical volume "/dev/nvme0n2p1" successfully created.
  Physical volume "/dev/nvme0n2p2" successfully created.
  Physical volume "/dev/nvme0n2p3" successfully created.
  Physical volume "/dev/nvme0n2p4" successfully created.
[root@chenshiren ~]# pvscan
  PV /dev/nvme0n1p3   VG rhel            lvm2 [48.41 GiB / 0    free]
  PV /dev/nvme0n2p1                      lvm2 [1.00 GiB]
  PV /dev/nvme0n2p2                      lvm2 [1.00 GiB]
  PV /dev/nvme0n2p3                      lvm2 [1.00 GiB]
  PV /dev/nvme0n2p4                      lvm2 [1.00 GiB]
  Total: 5 [52.41 GiB] / in use: 1 [48.41 GiB] / in no VG: 4 [4.00 GiB]
# 3 建立VG
[root@chenshiren ~]# vgcreate newvg /dev/nvme0n2p{1,2,3,4}
  Volume group "newvg" successfully created
[root@chenshiren ~]# vgdisplay newvg
  --- Volume group ---
  VG Name               newvg
  System ID             
  Format                lvm2
  Metadata Areas        4
  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                4
  Act PV                4
  VG Size               3.98 GiB
  PE Size               4.00 MiB   # 默认的话每个PE大小为4MB 可以自行-s设置
  Total PE              1020
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1020 / 3.98 GiB
  VG UUID               Jst2As-IeCv-I2s1-7JSE-P33l-FL7s-OxMyM3
# 4 建立LV
[root@chenshiren ~]# lvcreate -L 2G -n newlv newvg
[root@chenshiren ~]# lvdisplay /dev/newvg/newlv 
  --- Logical volume ---
  LV Path                /dev/newvg/newlv
  LV Name                newlv
  VG Name                newvg
  LV UUID                eyfOcT-DSV2-nJtc-eTTg-zFY2-Ei0V-sgFbXC
  LV Write Access        read/write
  LV Creation host, time chenshiren, 2024-03-22 16:05:13 +0800
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Current LE             512
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2
# 5 格式化挂载LV
[root@chenshiren ~]# mkfs.ext4 /dev/newvg/newlv 
mke2fs 1.46.5 (30-Dec-2021)
创建含有 524288 个块(每块 4k)和 131072 个inode的文件系统
文件系统UUID:2522d30c-e98a-4b8f-84dd-8e5d8c147ea4
超级块的备份存储于下列块: 
        32768, 98304, 163840, 229376, 294912

正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(16384 个块)完成
写入超级块和文件系统账户统计信息: 已完成
[root@chenshiren ~]# mkdir /newlv
[root@chenshiren ~]# mount /dev/newvg/newlv /newlv/
[root@chenshiren ~]# df -hT /newlv/
文件系统                类型  容量  已用  可用 已用% 挂载点
/dev/mapper/newvg-newlv ext4  2.0G   24K  1.8G    1% /newlv

# 6 扩容LV
[root@chenshiren ~]# lvresize -L +1G /dev/newvg/newlv         
  Size of logical volume newvg/newlv changed from 2.00 GiB (512 extents) to 3.00 GiB (768 extents).
  Logical volume newvg/newlv successfully resized.
[root@chenshiren ~]# e2fsck -f /dev/newvg/newlv 
e2fsck 1.46.5 (30-Dec-2021)1 步:检查inode、块和大小
第 2 步:检查目录结构
第 3 步:检查目录连接性
第 4 步:检查引用计数
第 5 步:检查组概要信息
/dev/newvg/newlv:11/131072 文件(0.0% 为非连续的), 26156/524288 块
[root@chenshiren ~]# resize2fs /dev/newvg/newlv 
resize2fs 1.46.5 (30-Dec-2021)
将 /dev/newvg/newlv 上的文件系统调整为 786432 个块(每块 4k)。
/dev/newvg/newlv 上的文件系统现在为 786432 个块(每块 4k)。
# resize2fs命令用于调整ext2、ext3、ext4文件系统的大小
[root@chenshiren ~]# df -hT /newlv/
文件系统                类型  容量  已用  可用 已用% 挂载点
/dev/mapper/newvg-newlv ext4  2.9G   24K  2.8G    1% /newlv

# 7 缩容LV
# 缩容需要先解除挂载,理论上resize2fs支持在线缩容扩容,可能我的内核不支持
[root@chenshiren ~]# umount /newlv/
[root@chenshiren ~]# e2fsck -f /dev/newvg/newlv 
e2fsck 1.46.5 (30-Dec-2021)1 步:检查inode、块和大小
第 2 步:检查目录结构
第 3 步:检查目录连接性
第 4 步:检查引用计数
第 5 步:检查组概要信息
/dev/newvg/newlv:11/196608 文件(0.0% 为非连续的), 30268/786432 块
[root@chenshiren ~]# resize2fs /dev/newvg/newlv 1G
resize2fs 1.46.5 (30-Dec-2021)
将 /dev/newvg/newlv 上的文件系统调整为 262144 个块(每块 4k)。
/dev/newvg/newlv 上的文件系统现在为 262144 个块(每块 4k)。

[root@chenshiren ~]# lvreduce -L 1G /dev/newvg/newlv 
  File system ext4 found on newvg/newlv.
  File system size (1.00 GiB) is equal to the requested size (1.00 GiB).
  File system reduce is not needed, skipping.
  Size of logical volume newvg/newlv changed from <3 GiB (918 extents) to 1.00 GiB (256 extents).
  Logical volume newvg/newlv successfully resized.
[root@chenshiren ~]# mount /dev/newvg/newlv /newlv/
[root@chenshiren ~]# df -hT /newlv/
文件系统                类型  容量  已用  可用 已用% 挂载点
/dev/mapper/newvg-newlv ext4  939M   24K  874M    1% /newlv
[root@chenshiren ~]# lvdisplay  /dev/newvg/newlv 
  --- Logical volume ---
  LV Path                /dev/newvg/newlv
  LV Name                newlv
  VG Name                newvg
  LV UUID                eyfOcT-DSV2-nJtc-eTTg-zFY2-Ei0V-sgFbXC
  LV Write Access        read/write
  LV Creation host, time chenshiren, 2024-03-22 16:05:13 +0800
  LV Status              available
  # open                 1
  LV Size                1.00 GiB
  Current LE             256
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2
# 8 关闭LVM
[root@chenshiren ~]# umount /newlv 
[root@chenshiren ~]# lvremove /dev/newvg/newlv 
[root@chenshiren ~]# vgremove newvg
[root@chenshiren ~]# pvremove /dev/nvme0n2p{1,2,3,4}
[root@chenshiren ~]# gdisk -l /dev/nvme0n2
Number  Start (sector)    End (sector)  Size       Code  Name
   1         8390656        10487807   1024.0 MiB  8300  Linux filesystem
   2         2099200         4196351   1024.0 MiB  8300  Linux filesystem
   3         4196352         6293503   1024.0 MiB  8300  Linux filesystem
   4         6293504         8390655   1024.0 MiB  8300  Linux filesystem
  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值