Linux---逻辑卷管理

本章主要介绍逻辑卷的管理。

  • 了解什么是逻辑卷
  • 创建和删除逻辑卷
  • 扩展逻辑卷
  • 缩小逻辑卷
  • 逻辑卷快照的使用

  前面介绍了分区的使用,如果某个分区空间不够,想增加空间是非常困难的。所以,建议尽可能使用逻辑卷而非普通的分区,因为逻辑卷的特点是空间可以动态地扩大或缩小。


了解逻辑卷 

逻辑卷如图所示 

  这里有三个大小为10G的分区,然后将这些分区加工变成PV(物理卷),它们就可以合体成 一个大小为30G的虚拟硬盘,这个虚拟硬盘叫作VG(卷组)。然后在这个虚拟硬盘(卷组)上划分一个个分区(逻辑卷),如下图所示。 

 

  这个逻辑卷是可变大、可缩小的,最大可以占用整个卷组的空间,即30G。如果逻辑卷还不够,可以继续找一个硬盘加入卷组中,如下图所示。 

 

  假设这里又在卷组中加了一个20G的分区,此时卷组的大小为50G,逻辑卷就可以继续扩展了。如果卷组不需要那么大空间,可以把新增加的硬盘从卷组中分离出去,如下图所示。 

 

  用户直接格式化挂载逻辑卷即可,不必关心写入逻辑卷中的数据最终是写入第一个分区还是第二个分区。 

创建逻辑卷的整个过程如下。

  1. 创建物理卷PV。
  2. 创建卷组VG。
  3. 创建逻辑卷LV。下面介绍物理卷和卷组。 

首先通过pvs或pvscan查看现在系统中是否存在PV,命令如下。 

[root@rhel03 ~]# pvscan No matching physical volumes found
[root@rhel03 ~]# 

  没有任何输出,说明现在还不存在任何PV,所以需要先创建PV。首先看一下分区情况,命令如下。 

[root@rhel03 ~]# fdisk -l /dev/sda
Disk /dev/sda:60 GiB,64424509440 字节,125829120 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x2831c07e设备       启动     起点      末尾      扇区 大小 Id 类型
/dev/sda1           2048  10487807  10485760   5G 83 Linux
/dev/sda2       10487808  20973567  10485760   5G 82 Linux swap / Solaris
/dev/sda4       20973568 125829119 104855552  50G  5 扩展
/dev/sda5       20975616  41947135  20971520  10G 8e Linux LVM
/dev/sda6       41949184  62920703  20971520  10G 8e Linux LVM
/dev/sda7       62922752  83894271  20971520  10G 8e Linux LVM
[root@rhel03 ~]#

  前面已经把sda5~sda7的分区类型转变为Linux LVM了。下面我们 把/dev/sda5~/dev/sda7创建为PV,命令如下。 

[root@rhel03 ~]# pvcreate /dev/sda{5..7}Physical volume "/dev/sda5" successfully created.Physical volume "/dev/sda6" successfully created.Physical volume "/dev/sda7" successfully created.
[root@rhel03 ~]#

删除PV用 pvremove命令。例如,删除/dev/sda7,则用pvremove /dev/sda7命令,命令如下。 

[root@rhel03 ~]# pvremove /dev/sda7Labels on physical volume "/dev/sda7" successfully wiped.
[root@rhel03 ~]# 

再次把/dev/sda7转变为PV,命令如下。 

[root@rhel03 ~]# pvcreate /dev/sda7Physical volume "/dev/sda7" successfully created.
[root@rhel03 ~]#

现在查看PV,命令如下。 

[root@rhel03 ~]# pvsPV         VG Fmt  Attr PSize  PFree /dev/sda5     lvm2 ---  10.00g 10.00g/dev/sda6     lvm2 ---  10.00g 10.00g/dev/sda7     lvm2 ---  10.00g 10.00g
[root@rhel03 ~]# 

  当然,也可以通过pvscan命令来查看,从上面可以看到VG列是空的,也就是这些PV都没 有加人任何VG。下面开始创建VG,首先通过vgs或vgscan 查看是否存在VG,命令如下。 

[root@rhel03 ~]# vgs
[root@rhel03 ~]# vgscan
[root@rhel03 ~]# 

  没有任何输出,说明此时不存在VG。下面把/dev/sda5、/dev/sda6组成一个名称为vg0 的VG,命令如下 

[root@rhel03 ~]# vgcreate vg0 /dev/sda5 /dev/sda6Volume group "vg0" successfully created
[root@rhel03 ~]# 

这个命令可以用 vgcreate vg0 /dev/sda{5,6}替代。 

再次查看现有的VG,命令如下。 

[root@rhel03 ~]# vgsVG  #PV #LV #SN Attr   VSize  VFree vg0   2   0   0 wz--n- 19.99g 19.99g
[root@rhel03 ~]# 

  可以看到,VG由2个PV组成,因为每个PV的大小为10G,所以VG的大小约为20G。再次查看PV的信息,命令如下。 

[root@rhel03 ~]# pvsPV         VG  Fmt  Attr PSize   PFree  /dev/sda5  vg0 lvm2 a--  <10.00g <10.00g/dev/sda6  vg0 lvm2 a--  <10.00g <10.00g/dev/sda7      lvm2 ---   10.00g  10.00g
[root@rhel03 ~]#

  可以看到,/dev/sda5和/dev/sda6现在是在vg0中的,但是/dev/sda7不是。如果vg0的 空间不够了,可以为 vg0增加空间。例如,把/dev/sda7加过去,命令如下。 

[root@rhel03 ~]# vgextend vg0 /dev/sda7Volume group "vg0" successfully extended
[root@rhel03 ~]# 

这样就把/dev/sda7加到vg0中了,再次查看VG的信息,命令如下。 

[root@rhel03 ~]# vgsVG  #PV #LV #SN Attr   VSize   VFree  vg0   3   0   0 wz--n- <29.99g <29.99g
[root@rhel03 ~]#

  可以看到, VG现在由3个PV组成,大小约为30G。如果空间又不够了,还可以增加硬盘, 继续添加到vg0中。如果此时想把/dev/sda7 从卷组中去除,则用vgreduce命令,命令如下。 

[root@rhel03 ~]# vgreduce vg0 /dev/sda7Removed "/dev/sda7" from volume group "vg0"
[root@rhel03 ~]# 

  使用vgdisplay命令会显示所有卷组的详细信息,如果只想显示特定的某个卷组的详细信息,则用“vgdisplay卷组名”命令。例如,现在要显示 vg0的详细信息,命令如下。 

[root@rhel03 ~]# vgdisplay vg0--- Volume group ---VG Name               vg0System ID             Format                lvm2Metadata Areas        2Metadata Sequence No  3VG Access             read/writeVG Status             resizableMAX LV                0Cur LV                0Open LV               0Max PV                0Cur PV                2Act PV                2VG Size               19.99 GiBPE Size               4.00 MiBTotal PE              5118Alloc PE / Size       0 / 0   Free  PE / Size       5118 / 19.99 GiBVG UUID               pSu9uD-DiCE-yheY-n21M-QDPR-EdPS-dZgm1X[root@rhel03 ~]# 

  上面的代码中有一个关键信息叫PE Size,PE的意思是物理扩展,是分配给逻辑卷的最小单位,即逻辑卷的大小是PE的整倍数。如果创建逻辑卷时指定的大小不是PE的整倍数,例如, 创建一个大小为98M的逻辑卷,而每个PE是4M,因为98M有24.5个PE,此时系统会自动把逻辑卷创建为100M、即25个PE,如下所示。 

[root@rhel03 ~]# lvcreate -L 98M -n lv0 vg0Rounding up size to full physical extent 100.00 MiBLogical volume "lv0" created.
[root@rhel03 ~]# 

删除此LV,命令如下 

[root@rhel03 ~]# lvremove -f /dev/vg0/lv0 Logical volume "lv0" successfully removed.
[root@rhel03 ~]# 

PE的大小只能在创建VG时用-s选项来指定,不可以后期修改。 

重命名VG用vgrename命令。例如,把 vg0重命名为myvg,命令如下。 

[root@rhel03 ~]# vgsVG  #PV #LV #SN Attr   VSize  VFree vg0   2   0   0 wz--n- 19.99g 19.99g
[root@rhel03 ~]# vgrename vg0 myvgVolume group "vg0" successfully renamed to "myvg"
[root@rhel03 ~]# vgsVG   #PV #LV #SN Attr   VSize  VFree myvg   2   0   0 wz--n- 19.99g 19.99g
[root@rhel03 ~]#

删除VG用vgremove命令。例如,现在把myvg删除,命令如下。 

[root@rhel03 ~]# vgremove myvg Volume group "myvg" successfully removed
[root@rhel03 ~]# vgs
[root@rhel03 ~]# 

练习:创建一个PE大小为8M、名称为vg0的 VG,命令如下。 

[root@rhel03 ~]# vgcreate -s 8 vg0 /dev/sda{5..7}Volume group "vg0" successfully created
[root@rhel03 ~]# 

此处8后面没有写单位,默认就是M。查看vg0属性,命令如下。 

[root@rhel03 ~]# vgdisplay vg0--- Volume group ---VG Name               vg0System ID             Format                lvm2Metadata Areas        3Metadata Sequence No  1VG Access             read/writeVG Status             resizableMAX LV                0Cur LV                0Open LV               0Max PV                0Cur PV                3Act PV                3VG Size               <29.98 GiBPE Size               8.00 MiBTotal PE              3837Alloc PE / Size       0 / 0   Free  PE / Size       3837 / <29.98 GiBVG UUID               dUojXX-7dlz-AxE8-9AlF-1TtW-FbLu-cjOkNc[root@rhel03 ~]#

为了后续使用方便,删除此vg0,然后创建一个默认PE大小的VG,命令如下。 

[root@rhel03 ~]# vgremove vg0Volume group "vg0" successfully removed
[root@rhel03 ~]# vgs
[root@rhel03 ~]# 
[root@rhel03 ~]# vgcreate vg0 /dev/sda{5..7}Volume group "vg0" successfully created
[root@rhel03 ~]# 

 

创建逻辑卷 

首先通过lvscan或lvs查看现在系统中是否存在逻辑卷,命令如下。 

[root@rhel03 ~]# lvscan
[root@rhel03 ~]# lvs
[root@rhel03 ~]# 

没有任何输出,说明现在还不存在任何逻辑卷。下面用 Ivereate命令创建逻辑卷,语法如下。 

  • lvcreate ‐L 大小 ‐n 名称 卷组(需要注意的是,这里是大写字母L,用于指定大小

或者

  • lvcreate ‐l pe数 ‐n 名称 卷组(需要注意的是,这里是小写字母l,用于指定PE数) 

或者

  • lvcreate ‐l 数字%free ‐n 名称 卷组

现在在vg0上创建一个大小为200M的逻辑卷lv0,命令如下。 

[root@rhel03 ~]# lvcreate -L 200M -n lv0 vg0Logical volume "lv0" created.
[root@rhel03 ~]# 

查看逻辑卷的信息,命令如下。 

[root@rhel03 ~]# lvscanACTIVE            '/dev/vg0/lv0' [200.00 MiB] inherit
[root@rhel03 ~]# 

可以看到,访问逻辑卷的方式为/dev/卷组名/逻辑卷,这里是/dev/vg0/1v0,大小为 200M。 

再创建一个包含50个PE、名称为lv1的逻辑卷,命令如下。 

[root@rhel03 ~]# lvcreate -l 50 -n lv1 vg0Logical volume "lv1" created.

查看逻辑卷的信息,命令如下。 

[root@rhel03 ~]# lvscanACTIVE            '/dev/vg0/lv0' [200.00 MiB] inheritACTIVE            '/dev/vg0/lv1' [200.00 MiB] inherit
[root@rhel03 ~]# 

因为每个PE的大小为4M,50个PE总共为200M。 

创建一个逻辑卷lv2,大小为剩余空间的25%,命令如下。 

[root@rhel03 ~]# lvcreate -l 25%free -n lv2 vg0Logical volume "lv2" created.
[root@rhel03 ~]#

创建一个逻辑卷lv3,使用剩余所有空间,命令如下。 

[root@rhel03 ~]# lvcreate -l 100%free -n lv3 vg0Logical volume "lv3" created.
[root@rhel03 ~]# 

现在查看一下现有逻辑卷,命令如下。 

[root@rhel03 ~]# lvscanACTIVE            '/dev/vg0/lv0' [200.00 MiB] inheritACTIVE            '/dev/vg0/lv1' [200.00 MiB] inheritACTIVE            '/dev/vg0/lv2' [<7.40 GiB] inheritACTIVE            '/dev/vg0/lv3' [<22.20 GiB] inherit
[root@rhel03 ~]# 

  显示逻辑卷的详细信息可以用Ivdisplay命令,这样会显示所有逻辑卷的信息,如果想要查看某个逻辑卷的详细信息,则用“lvdisplay 逻辑卷名”命令。例如,查看/dev/vg0/lv0的详 细信息,命令如下。 

[root@rhel03 ~]# lvdisplay /dev/vg0/lv0--- Logical volume ---LV Path                /dev/vg0/lv0LV Name                lv0VG Name                vg0LV UUID                zY4lqW-tiuJ-5BSC-Jark-fdGa-Mfli-5eSpSDLV Write Access        read/writeLV Creation host, time rhel03, 2023-12-06 06:09:59 +0300LV Status              available# open                 0LV Size                200.00 MiBCurrent LE             50Segments               1Allocation             inheritRead ahead sectors     auto- currently set to     8192Block device           253:0[root@rhel03 ~]#

删除逻辑卷用“lvremove逻辑卷名”命令。例如,删除/dev/vg0/1v3,命令如下。 

[root@rhel03 ~]# lvremove /dev/vg0/lv3
Do you really want to remove active logical volume vg0/lv3? [y/n]: yLogical volume "lv3" successfully removed.
[root@rhel03 ~]# 

  此处必须输入y或n,y表示确定删除。如果想直接删除,可以加上-f选项表示强制删除。例如,现在把lv2删除,命令如下 

[root@rhel03 ~]# lvremove -f /dev/vg0/lv2Logical volume "lv2" successfully removed.
[root@rhel03 ~]# 

查看逻辑卷的信息,命令如下。 

[root@rhel03 ~]# lvscanACTIVE            '/dev/vg0/lv0' [200.00 MiB] inheritACTIVE            '/dev/vg0/lv1' [200.00 MiB] inherit
[root@rhel03 ~]#

下面将这两个逻辑卷分别用XFS和EXT4文件系统进行格式化,命令如下。 

[root@rhel03 ~]# mkfs.xfs /dev/vg0/lv0
meta-data=/dev/vg0/lv0           isize=512    agcount=4, agsize=12800 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=1, sparse=1, rmapbt=0=                       reflink=1
data     =                       bsize=4096   blocks=51200, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1368, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@rhel03 ~]# mkfs.ext4 /dev/vg0/lv1
mke2fs 1.45.6 (20-Mar-2020)
创建含有 204800 个块(每块 1k)和 51200 个inode的文件系统
文件系统UUID:bc14700f-70a7-44a9-b7ff-7fa2b464c402
超级块的备份存储于下列块: 8193, 24577, 40961, 57345, 73729正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(4096 个块)完成
写入超级块和文件系统账户统计信息: 已完成[root@rhel03 ~]# 

然后创建两个目录/lv0-xfs 和/lv1-ext4,分别挂载/dev/vg0/lv0和 /dev/vg0/lv1,命令如下。 

[root@rhel03 ~]# mkdir /lv0-xfs /lv1-ext4
[root@rhel03 ~]# mount /dev/vg0/lv0 /lv0-xfs/
[root@rhel03 ~]# mount /dev/vg0/lv1 /lv1-ext4/
[root@rhel03 ~]#

查看逻辑卷的挂载情况,命令如下。 

[root@rhel03 ~]# df -Th | grep lv
/dev/mapper/vg0-lv0 xfs       195M   12M  184M    6% /lv0-xfs
/dev/mapper/vg0-lv1 ext4      190M  1.6M  175M    1% /lv1-ext4
[root@rhel03 ~]# 

注意:逻辑卷的命名也可以写成如下格式。

/dev/mapper/卷组名-逻辑卷名 

然后分别往两个挂载点中拷贝测试文件,命令如下。 

[root@rhel03 ~]# cp /etc/hosts /lv0-xfs/
[root@rhel03 ~]# cp /etc/hosts /lv1-ext4/
[root@rhel03 ~]# 

 

逻辑卷扩大 

  前面讲逻辑卷的优点在于可以动态地扩大或缩小,下面演示逻辑卷的扩大。首先查看当前逻辑卷和文件系统的大小,命令如下。 

[root@rhel03 ~]# lvscanACTIVE            '/dev/vg0/lv0' [200.00 MiB] inheritACTIVE            '/dev/vg0/lv1' [200.00 MiB] inherit
[root@rhel03 ~]# 
[root@rhel03 ~]# df -Th | grep lv
/dev/mapper/vg0-lv0 xfs       195M   12M  184M    6% /lv0-xfs
/dev/mapper/vg0-lv1 ext4      190M  1.6M  175M    1% /lv1-ext4
[root@rhel03 ~]# 

可以看到,lv0和lv1的大小都是200M,里面的文件系统也为200M(显示为195M)。为了 更好地理解,可以将文件系统当成逻辑卷中的填充物,如下图所示。 

里面灰色部分为文件系统,填充了整个逻辑卷。下面开始扩展逻辑卷,命令是lvextend, 用法如下。 

  • lvextend ‐L +M ‐n逻辑卷 ‐‐这句话的意思是在原有的基础上加M

或者

  • lvextend ‐L N ‐n 逻辑卷‐‐这句话的意思是不管原来是多大,现在变为N 

练习:把 lv0 扩展到600M,命令如下。 

[root@rhel03 ~]# lvextend -L +400M /dev/vg0/lv0Size of logical volume vg0/lv0 changed from 200.00 MiB (50 extents) to 600.00 MiB (150 extents).Logical volume vg0/lv0 successfully resized.
[root@rhel03 ~]#

这是在原有的基础上额外加400M,现在共600M。 

把 lv1 扩展到600M,命令如下。

[root@rhel03 ~]# lvextend -L 600M /dev/vg0/lv1Size of logical volume vg0/lv1 changed from 200.00 MiB (50 extents) to 600.00 MiB (150 extents).Logical volume vg0/lv1 successfully resized.
[root@rhel03 ~]# 

这里不带“+”,直接写600M意思是不管原来是多大,现在扩展到600M。查看大小, 命令如下。 

[root@rhel03 ~]# lvscanACTIVE            '/dev/vg0/lv0' [600.00 MiB] inheritACTIVE            '/dev/vg0/lv1' [600.00 MiB] inherit
[root@rhel03 ~]# 

现在查看一下文件系统的大小,命令如下。 

[root@rhel03 ~]# df -Th | grep lv
/dev/mapper/vg0-lv0 xfs       195M   12M  184M    6% /lv0-xfs
/dev/mapper/vg0-lv1 ext4      190M  1.6M  175M    1% /lv1-ext4
[root@rhel03 ~]# 

会发现还是200M,这是为何?需要卸载重新挂载吗?不需要,如下图所示。 

   刚才讲了为了便于理解,把文件系统当成填充物,右侧是逻辑卷新增加的400M空间,这里面没有文件系统,只有前面200M的逻辑卷中才有文件系统。所以,现在要做的就是扩展文件系统,直到把多增加的400M逻辑卷也填充满为止,如下图所示。 

 

这样文件系统的大小也是600M了,扩展文件系统的命令如下。 

  • XFS文件系统使用xfs_growfs,用法xfs_growfs/挂载点
  • EXT4文件系统用resize2fs,用法resize2fs逻辑卷名#注意,不是挂载点 

下面开始扩展lv0的文件系统大小,命令如下。 

[root@rhel03 ~]# xfs_growfs /lv0-xfs/
meta-data=/dev/mapper/vg0-lv0    isize=512    agcount=4, agsize=12800 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=1, sparse=1, rmapbt=0=                       reflink=1
data     =                       bsize=4096   blocks=51200, imaxpct=25=                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1368, version=2=                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 51200 to 153600
[root@rhel03 ~]#

扩展lv1的文件系统大小,命令如下。 

[root@rhel03 ~]# resize2fs /dev/vg0/lv1
resize2fs 1.45.6 (20-Mar-2020)
/dev/vg0/lv1 上的文件系统已被挂载于 /lv1-ext4;需要进行在线调整大小old_desc_blocks = 2, new_desc_blocks = 5
/dev/vg0/lv1 上的文件系统现在为 614400 个块(每块 1k)。[root@rhel03 ~]#

查看大小,命令如下。 

[root@rhel03 ~]# lvscanACTIVE            '/dev/vg0/lv0' [600.00 MiB] inheritACTIVE            '/dev/vg0/lv1' [600.00 MiB] inherit
[root@rhel03 ~]# df -Th | grep lv
/dev/mapper/vg0-lv0 xfs       595M   15M  580M    3% /lv0-xfs
/dev/mapper/vg0-lv1 ext4      578M  2.3M  545M    1% /lv1-ext4
[root@rhel03 ~]# 

  可以看到,已经成功扩展了,在整个扩展过程中并没有先卸载,这种叫作在线扩展。现在测试一下里面的文件是否被损坏,命令如下。 

[root@rhel03 ~]# cat /lv0-xfs/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.23.133 www.rhel.cc
[root@rhel03 ~]# cat /lv1-ext4/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.23.133 www.rhel.cc
[root@rhel03 ~]# 

依然是可以读取的,说明文件并没有损坏。 

注意:在使用 Ivextend命令时,可以加上 -r 选项,这样在扩展逻辑卷的同时会把文件系统(XFS,EXT4等) 一并扩展了。 


 

逻辑卷的缩小 

非常不建议对逻辑卷做缩小的操作,但是如果必须缩小,一定要先缩小文件系统,然后再 缩小逻辑卷,否则会破坏文件系统,如下图所示。

 原来的文件系统和逻辑卷是贴合的,如果先把逻辑卷缩小了,则文件系统会多出来一块, 没有承载体,整个文件系统就会被破坏,所以一定要先缩小文件系统,然后再缩小逻辑卷。 不过对于XFS 文件系统来说是不支持缩小的,这里使用EXT4来演示。 

 下面开始进行缩小的操作,缩小文件系统请严格按照下面的步骤进行操作。

(1)卸载文件系统,命令如下。 

[root@rhel03 ~]# umount /lv1-ext4 
[root@rhel03 ~]# 

(2)对文件系统进行fsck检查,命令如下。 

[root@rhel03 ~]# fsck -f /dev/vg0/lv1
fsck,来自 util-linux 2.32.1
e2fsck 1.45.6 (20-Mar-2020)
第 1 步:检查inode、块和大小
第 2 步:检查目录结构
第 3 步:检查目录连接性
第 4 步:检查引用计数
第 5 步:检查组概要信息
/dev/mapper/vg0-lv1:12/153600 文件(0.0% 为非连续的), 25794/614400 块
[root@rhel03 ~]# 

(3)缩小文件系统,命令如下。 

[root@rhel03 ~]# resize2fs /dev/vg0/lv1 200M
resize2fs 1.45.6 (20-Mar-2020)
将 /dev/vg0/lv1 上的文件系统调整为 204800 个块(每块 1k)。
/dev/vg0/lv1 上的文件系统现在为 204800 个块(每块 1k)。[root@rhel03 ~]#

这里200M指的是最终的大小,即文件系统被减掉了400M。 

(4)减小逻辑卷,逻辑卷最终的大小要大于等于200M,即减掉的值不能超过600M. 命令如下。 

[root@rhel03 ~]# lvreduce -L -400M /dev/vg0/lv1WARNING: Reducing active logical volume to 200.00 MiB.THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/lv1? [y/n]: ySize of logical volume vg0/lv1 changed from 600.00 MiB (150 extents) to 200.00 MiB (50 extents).Logical volume vg0/lv1 successfully resized.
[root@rhel03 ~]# 

  这里给了一次警告,提示“如果你减小逻辑卷可能会损坏数据,你是否要继续”,输 入“y”并按【Enter】键。 

现在重新挂载逻辑卷验证,命令如下。 

[root@rhel03 ~]# mount /dev/vg0/lv1 /lv1-ext4/
[root@rhel03 ~]# df -Th | grep lv1
/dev/mapper/vg0-lv1 ext4      190M  1.6M  176M    1% /lv1-ext4
[root@rhel03 ~]# 
[root@rhel03 ~]# lvscanACTIVE            '/dev/vg0/lv0' [700.00 MiB] inheritACTIVE            '/dev/vg0/lv1' [200.00 MiB] inherit
[root@rhel03 ~]#

可以看到,逻辑卷和文件系统的大小均为200M。验证里面的文件是否被损坏,命令如下。 

[root@rhel03 ~]# cat /lv1-ext4/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.23.133 www.rhel.cc
[root@rhel03 ~]#

依然是可以访问的。


 

恢复逻辑卷 

  当在逻辑卷中存储数据时,数据是写入底层的PV中的,所以即使删除了逻辑卷,也并没有删除存储在PV中的数据。如果恢复删除的逻辑卷,仍然能看到逻辑卷中原有的数据。

前面已经创建了逻辑卷lv1,里面有几个文件,现在卸载并把此逻辑卷删除,命令如下。 

[root@rhel03 ~]# umount /lv1-ext4 
[root@rhel03 ~]# lvremove -f /dev/vg0/lv1Logical volume "lv1" successfully removed.
[root@rhel03 ~]# lvscan | grep lv1
[root@rhel03 ~]# 

  下面开始恢复。我们在卷组上做过的所有操作均有日志记录,可以通过“vgcfgrestore-- list卷组名”来查看。现在查看vg0的所有日志记录,命令如下。 

[root@rhel03 ~]# vgcfgrestore --list vg0
File:		/etc/lvm/archive/vg0_00023-895388597.vgVG name:    	vg0Description:	Created *before* executing 'lvremove -f /dev/vg0/lv1'Backup Time:	Wed Dec  6 06:59:24 2023

  可以看到,执行Ivremove -f /dev/vg0/Iv1命令之前的日志文件是/etc/lvm/archive/vg0_00023-895388597.vg,那么就可以利用这个文件对LV进行恢复。恢复 命令是vgcfgrestore,语法如下。 

  • vgcfgrestore ‐f 日志文件卷组名 

下面开始恢复vg0,命令如下。 

[root@rhel03 ~]# vgcfgrestore -f /etc/lvm/archive/vg0_00023-895388597.vg vg0Volume group vg0 has active volume: lv0.WARNING: Found 1 active volume(s) in volume group "vg0".Restoring VG with active LVs, may cause mismatch with its metadata.
Do you really want to proceed with restore of volume group "vg0", while 1 volume(s) are active? [y/n]: yRestored volume group vg0.
[root@rhel03 ~]# 

查看逻辑卷的信息,命令如下。 

[root@rhel03 ~]# lvscan | grep lv1inactive          '/dev/vg0/lv1' [200.00 MiB] inherit
[root@rhel03 ~]# 

可以看到,现在已经恢复出来了,但是状态为inactive,即不活跃状态,所以现在需要激活它,命令如下。 

[root@rhel03 ~]# lvchange -ay /dev/vg0/lv1
[root@rhel03 ~]# lvscan | grep lv1ACTIVE            '/dev/vg0/lv1' [200.00 MiB] inherit
[root@rhel03 ~]# 

这里-ay的意思是 active yes,表明已经成功激活,然后挂载查看里面的文件,命令如下。 

[root@rhel03 ~]# mount /dev/vg0/lv1 /lv1-ext4/
[root@rhel03 ~]# ls /lv1-ext4/
hosts  lost+found
[root@rhel03 ~]# 

依然是可以正常访问的。 


 

逻辑卷的快照 

  为了备份逻辑卷中的数据,可以通过对逻辑卷做快照 来实现,快照的原理如下图所示。

 现在有一个逻辑卷lv0,这个文件中有3个文件 hosts、issue、 file,然后对这个逻辑卷做快照 Iv0_snap(记住不要对快照格式化)。用户访同 lv0_snap时,发现v0中的内容在Iv0_snap中都有,例如,在 lv0_snap中也能看到hosts 等文件。 

  但是此时在lv0_snap中看到的这些文件都只是一个影子而已(这个影子通过硬链接来实 现),如同井中望月。所以,创建快照时,快照的空间可以很小,因为看到的内容并非真的存 储在快照中。 

  如果在快照中把 issue删除,也不会从原始逻辑卷中把 issue删除,只是把对应的映射删除而已,如下图所示。 

 

  如果在 lv0_snap中创建一个文件 file,则这个文件是保存在lv0_snap中的,占用 1vO_snap的空间,并不会写入lv0,如下图所示。 

 

所以,在快照中新增文件的总大小不能超过快照的大小。

  上面这种映射和原始文件之间的关系,采用的是写时复制(copy-on-write)策略。 创建快照的语法如下。 

  • lvcreate ‐L 大小 ‐n 名称 ‐s 逻辑卷 

现在为lv0创建一个名称为lv0_snap、大小为20M 的快照,命令如下。 

[root@rhel03 ~]# lvcreate -L 20M -n lv0_snap -s /dev/vg0/lv0Logical volume "lv0_snap" created.
[root@rhel03 ~]# 

查看逻辑卷的信息,命令如下。 

[root@rhel03 ~]# lvscanACTIVE   Original '/dev/vg0/lv0' [700.00 MiB] inheritACTIVE            '/dev/vg0/lv1' [200.00 MiB] inheritACTIVE   Snapshot '/dev/vg0/lv0_snap' [20.00 MiB] inherit
[root@rhel03 ~]#

  可以看到,/dev/vg0/lv0是原始逻辑卷,/dev/vg0/lv0_snap是快照。从哪里能看 到/dev/vg0/lv0_snap是/dev/vg0/lv0的快照呢?可以通过lvs命令来查看,命令如下。 

[root@rhel03 ~]# lvsLV       VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertlv0      vg0 owi-aos--- 700.00m                                                    lv0_snap vg0 swi-a-s---  20.00m      lv0    0.06                                   lv1      vg0 -wi-ao---- 200.00m                                                    
[root@rhel03 ~]#

或者

[root@rhel03 ~]# lvdisplay /dev/vg0/lv0_snap --- Logical volume ---LV Path                /dev/vg0/lv0_snapLV Name                lv0_snapVG Name                vg0LV UUID                rO100L-UIbF-xvY9-afPN-0nRT-kQVd-LoXXINLV Write Access        read/writeLV Creation host, time rhel03, 2023-12-06 07:16:06 +0300LV snapshot status     active destination for lv0LV Status              available# open                 0LV Size                700.00 MiBCurrent LE             175COW-table size         20.00 MiBCOW-table LE           5Allocated to snapshot  0.10%Snapshot chunk size    4.00 KiBSegments               1Allocation             inheritRead ahead sectors     auto- currently set to     8192Block device           253:4[root@rhel03 ~]# 

把lv0_snap挂载到/snap目录上,命令如下。 

[root@rhel03 ~]# mkdir /snap
[root@rhel03 ~]# mount -o nouuid /dev/vg0/lv0_snap /snap/
[root@rhel03 ~]# ls /snap/
hosts  issue
[root@rhel03 ~]# 

注意:

  • 快照不需要格式化。
  • 因为原始逻辑卷的文件系统是XFS的,所以挂载快照时需要加上nouid选项。 

  可以看到,/snap中有lv0的内容,但是这些内容并非存储在lv0_snap中的。在/snap下面再创建一个10M的测试文件,命令如下。 

[root@rhel03 ~]# dd if=/dev/zero of=/snap/file bs=1M count=10
记录了10+0 的读入
记录了10+0 的写出
10485760 bytes (10 MB, 10 MiB) copied, 0.0107622 s, 974 MB/s
[root@rhel03 ~]# 

这10M的文件占用的是快照lv0_snap的空间,并没有出现在lv0中,命令如下。 

[root@rhel03 ~]# ls /lv0-xfs/
hosts  issue
[root@rhel03 ~]# 

  快照有什么用呢?假设原始逻辑卷中的数据被我们误删除了,那么可以利用快照恢复原始逻辑卷中的数据。 

先把lv0中的数据删除,命令如下。

[root@rhel03 ~]# rm -rf /lv0-xfs/*
[root@rhel03 ~]# ls /lv0-xfs/
[root@rhel03 ~]# 

然后用lv0_snap恢复lv0中的数据。先卸载1v0_snap和 lv0,命令如下。 

[root@rhel03 ~]# umount /snap
[root@rhel03 ~]# umount /lv0-xfs 
[root@rhel03 ~]# 

然后用Ivconvert命令恢复数据,命令如下。

[root@rhel03 ~]# lvconvert --merge /dev/vg0/lv0_snapMerging of volume vg0/lv0_snap started.vg0/lv0: Merged: 99.94%[root@rhel03 ~]# 

  这里后面指定了快照,即用哪个快照来恢复原始逻辑卷中的数据,现在看到已经恢复成功了,验证命令如下。 

[root@rhel03 ~]# mount /dev/vg0/lv0 /lv0-xfs/
[root@rhel03 ~]# ls /lv0-xfs/
file  hosts  issue
[root@rhel03 ~]# 

  可以看到,数据已经恢复出来了,且在快照中创建的文件也恢复到原始逻辑卷中了。通过这种用法,我们可以每天对某逻辑卷做快照,一旦数据丢失,就可以用快照来恢复数据了。 

再次查看逻辑卷的信息,命令如下。

[root@rhel03 ~]# lvscanACTIVE            '/dev/vg0/lv0' [700.00 MiB] inheritACTIVE            '/dev/vg0/lv1' [200.00 MiB] inherit
[root@rhel03 ~]#

可以看到,快照lv0_snap已经没有了,因为它已经“牺牲”自己成全了lv0。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/211937.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

localhost工具:本地代码的远程之路 | 京东云技术团队

在日常的开发过程中&#xff0c;本地代码远程调试一直是最理想的开发状态。本文通过介绍京东集团内开发的一个轻量简单的小工具”localhost”&#xff0c;从多角度的方案思考&#xff0c;到原理介绍&#xff0c;到最终的方案落地&#xff0c;在开发阶段发现问题&#xff0c;解决…

【数据结构高阶】AVL树

上期博客我们讲解了set/multiset/map/multimap的使用&#xff0c;下面我们来深入到底层&#xff0c;讲解其内部结构&#xff1a; 目录 一、AVL树的概念 二、AVL树的实现 2.1 节点的定义 2.2 数据的插入 2.2.1 平衡因子的调整 2.2.1.1 调整平衡因子的规律 2.2.2 子树的旋…

识别低效io引起的free buffer waits

产生事发时间段的awr报告 Top 5 wait events 这里重点关注&#xff1a; 1.free buffer waits 2.enq_HW-contention 3.enq:tx-row lock contention enq:HW-contention属于水位线的争用&#xff0c;已经透过alter table allocate extent&#xff0c;提前分配空间,这里不做讨论 …

C++——红黑树

作者&#xff1a;几冬雪来 时间&#xff1a;2023年12月7日 内容&#xff1a;C——红黑树讲解 目录 前言&#xff1a; 红黑树的概念&#xff1a; 红黑树的性质&#xff1a; 红黑树的路径计算&#xff1a; 最长路径和最短路径&#xff1a; AVL树与红黑树的区别&#xff…

让你在组建企业级项目时手到擒来——浅谈各类常用工具和框架概述

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

分布式系统理论基础

目录 引言 CAP定理 CAP的工程启示 1、关于 P 的理解 2、CA非0/1的选择 3、跳出CAP 小结 本文转自&#xff1a;https://www.cnblogs.com/bangerlee/p/5328888.html 该系列博文会告诉你什么是分布式系统&#xff0c;这对后端工程师来说是很重要的一门学问&#xff0c;我们会逐步了…

Node.js版本管理工具NVM(Node Version Manager)的使用

nvm简介 nvm&#xff08;Node Version Manager&#xff09;是一个用于管理 Node.js 版本的工具。它可以让你在同一台计算机上安装并切换多个 Node.js 版本&#xff0c;非常方便。 如何安装 nvm 下载 nvm 安装包 访问 nvm下载地址 &#xff0c;根据你的操作系统选择对应的安…

开源,可商业化!性能比Stable Difusion强2.5倍

文生图平台Playground宣布开源Playground V2版本&#xff0c;允许商业化&#xff0c;用户通过文本就能生成3D、动漫、素描、朋克、暗黑等多种类型1024x1024图片&#xff0c;同时提供免费在线体验。 Playground V2是基于Stable Diffusion XL开发而成&#xff0c;还从Midjourney…

台灯应该买什么样的才能护眼?学生护眼必备护眼台灯推荐

10月26日&#xff0c;教育部召开新闻发布会&#xff0c;介绍综合防控儿童青少年近视工作情况。全国综合防控儿童青少年近视工作联席会议机制办公室主任、教育部体育卫生与艺术教育司司长王登峰介绍&#xff0c;2018年全国儿童青少年的总体近视率53.6%&#xff0c;2019年总体近视…

1.2 C语言简介

一、为什么要讲C语言 C语言是编程界的长青藤&#xff0c;可以查看语言排名发现&#xff0c;虽然现在语言很多&#xff0c;但是C语言一直占有一定地址 来源网站&#xff1a;https://www.tiobe.com/tiobe-index/ 在系统、嵌入式、底层驱动等领域存在一定的唯一性&#xff08;C语…

使用GPT-4V解决Pycharm设置问题

pycharm如何实现关联&#xff0c;用中文回答 在PyCharm中关联PDF文件类型&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 打开PyCharm设置&#xff1a;点击菜单栏中的“File”&#xff08;文件&#xff09;&#xff0c;然后选择“Settings”&#xff08;设置&#xff09;。…

【目标检测】进行实时检测计数时,在摄像头窗口显示实时计数个数

这里我是用我本地训练的基于yolov8环境的竹签计数模型&#xff0c;在打开摄像头窗口增加了实时计数显示的代码&#xff0c;可以直接运行&#xff0c;大家可以根据此代码进行修改&#xff0c;其底层原理时将检测出来的目标的个数显示了出来。 该项目链接&#xff1a;【目标检测…

SQL注入漏洞的检测及防御方法

SQL注入&#xff08;SQL Injection&#xff09;是一种广泛存在于Web应用程序中的严重安全漏洞&#xff0c;它允许攻击者在不得到授权的情况下访问、修改或删除数据库中的数据。这是一种常见的攻击方式&#xff0c;因此数据库开发者、Web开发者和安全专业人员需要了解它&#xf…

tomcat控制台中文信息显示乱码

问题现象 我的tomcat版本是10.1版本。 在cmd下启动tomcat&#xff0c;会新打开控制台输出窗口&#xff1a; 控制台窗口输出的中文信息是乱码&#xff1a; 问题原因 产生这个问题的原因是&#xff1a;控制台窗口的编码和输出到控制台窗口的日志信息编码不一致。 查看tomc…

【开发技能】-解决visio交叉线(跨线)交叉点弯曲问题

问题 平时工作中使用visio作图时&#xff0c;经常会遇到交叉线在相交时会形成一个弯曲弓形&#xff0c;这十分影响视图效果。可以采用下面的方法消除弓形。 方法 第一步&#xff1a;菜单栏--设计---连接线 第二步&#xff1a;选中这条交叉线---点击显示跨线 最终问题得到解决…

【Java】实现顺序表基本的操作(数据结构)

文章目录 前言顺序表1、打印顺序表2、增加元素3、在任意位置增加元素4、判断是否包含某个元素5、查找某个元素对于的位置6、获取任意位置的元素7、将任意位置的元素设为value8、删除第一次出现的关键字9、获取顺序表长度10、清空顺序表总结 前言 在了解顺序表之前我们要先了解…

编织魔法世界——计算机科学的奇幻之旅

文章目录 每日一句正能量前言为什么当初选择计算机行业计算机对自己人生道路的影响后记 每日一句正能量 人生就像赛跑&#xff0c;不在乎你是否第一个到达尽头&#xff0c;而在乎你有没有跑完全程。 前言 计算机是一个神奇的领域&#xff0c;它可以让人们创造出炫酷的虚拟世界…

gpt3、gpt2与gpt1区别

参考&#xff1a;深度学习&#xff1a;GPT1、GPT2、GPT-3_HanZee的博客-CSDN博客 Zero-shot Learning / One-shot Learning-CSDN博客 Zero-shot&#xff08;零次学习&#xff09;简介-CSDN博客 GPT-2 模型由多层单向transformer的解码器部分构成&#xff0c;本质上是自回归模型…

【Android】查看keystore的公钥和私钥

前言&#xff1a; 查看前准备好.keystore文件&#xff0c;安装并配置openssl、keytool。文件路径中不要有中文。 一、查看keystore的公钥&#xff1a; 1.从keystore中获取MD5证书 keytool -list -v -keystore gamekeyold.keystore 2.导出公钥文件 keytool -export -alias …

vue+echarts实现桑吉图的效果

前言&#xff1a; 在我们项目使用图形的情况下&#xff0c;桑吉图算是冷门的图形了&#xff0c;但是它可以实现我们对多级数据之间数据流向更好的展示的需求&#xff0c;比如&#xff0c;我们实际数据流向中&#xff0c;具有1对多&#xff0c;多对多的情况下&#xff0c;如果用…