二十一、LVM

wangzhaoyang 发布于 1 天前 10 次阅读 网络工程中的Linux系统 无~ 4502 字


1. LVM基本概念

  • 物理卷(PV):物理磁盘或分区,如 /dev/sda
  • 卷组(VG):由一个或多个物理卷组成的集合。
  • 逻辑卷(LV):从卷组中分配的逻辑磁盘,可以被文件系统格式化并用于存储数据。
+----------------+     +----------+     +-----------+
| Physical Disks | --> | Physical | --> | Volume    |
|                |     | Volumes  |     | Groups    |
+----------------+     +----------+     +-----------+
                                    |       |
                                    |       |
                                    V       V
                                    +-------+-------+
                                    | Logical |  |
                                    | Volumes|  |
                                    +-------+  |
                                          |   |   |
                                          |   |   |
                                          V   V   V
                                          +---+---+---+
                                           | | |   |
                                          +-+-+-+-+-+

2. 安装LVM

在CentOS系统中,LVM通常已经预装,如果没有,可以通过以下命令安装:

[root@localhost ~]# sudo yum install lvm2

3. 创建LVM

第一步:创建物理卷(PV)

假设有一个新的磁盘 /dev/sdb,需要先将其初始化为物理卷:

[root@localhost ~]# sudo pvcreate /dev/sdb   /dev/sdc     #可以一次选多个

创建成功后,使用 pvdisplay 查看物理卷信息:

[root@localhost ~]# sudo pvdisplay

  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               cl
  PV Size               38.41 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB           ###  默认4MiB,必须是2的倍速
  Total PE              9833
  Free PE               0
  Allocated PE          9833
  PV UUID               s1Nddg-Y0AH-3geX-t8Te-1SxI-1aoX-WSJElS

第二步:创建卷组(VG)

创建一个名为 vg01 的卷组,包含 /dev/sdb

[root@localhost ~]# sudo vgcreate vg01 /dev/sdb   /dev/sdc     #可以一次选多个

[root@localhost ~]# sudo vgcreate vg01 -s 8M /dev/sdb /dev/sdc       #配置 PE Size

使用 vgdisplay 查看卷组信息:

[root@localhost ~]# sudo vgdisplay 

 --- Volume group ---
  VG Name               cl
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               38.41 GiB
  PE Size               4.00 MiB
  Total PE              9833
  Alloc PE / Size       9833 / 38.41 GiB
  Free  PE / Size       0 / 0   
  VG UUID               nXHyWG-B9cL-jfak-zti4-jetG-FANf-NEYuYl

第三步:创建逻辑卷(LV)

创建一个名为 lv01 的逻辑卷,大小为10GB:

[root@localhost ~]# sudo lvcreate -L 10G -n lv01 vg01

使用 lvdisplay 查看逻辑卷信息:

[root@localhost ~]# sudo lvdisplay

  --- Logical volume ---
  LV Path                /dev/cl/swap
  LV Name                swap
  VG Name                cl
  LV UUID                BJJtAq-VlJo-aJLe-MMI7-Y4ds-Pm1q-57cPvu
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-09 16:10:53 +0800
  LV Status              available
  # open                 2
  LV Size                3.96 GiB
  Current LE             1014
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/cl/root
  LV Name                root
  VG Name                cl
  LV UUID                v2OLhh-UW9f-a6M9-T1jw-9sch-ZdOE-sNlG0I
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-09 16:10:53 +0800
  LV Status              available
  # open                 1
  LV Size                <34.45 GiB
  Current LE             8819
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

第四步:格式化逻辑卷

对逻辑卷进行格式化,这里以ext4文件系统为例:

[root@localhost ~]# sudo mkfs.ext4 /dev/vg01/lv01

第五步:挂载逻辑卷

创建一个挂载点,并挂载逻辑卷:

[root@localhost ~]# sudo mkdir /mnt/data
[root@localhost ~]# sudo mount /dev/vg01/lv01 /mnt/data

第六步:配置开机自启

编辑 /etc/fstab 文件,添加以下行以实现开机自启:

[root@localhost ~]# /dev/vg01/lv01 /mnt/data ext4 defaults 0 0

4. 扩展逻辑卷

第一步:扩展卷组

假设有一个新的磁盘 /dev/sdc,将其添加到 vg01 卷组:

[root@localhost ~]# sudo pvcreate /dev/sdc
[root@localhost ~]# sudo vgextend vg01 /dev/sdc

第二步:扩展逻辑卷

lv01 扩展到20GB:

[root@localhost ~]# sudo lvextend -L 20G /dev/vg01/lv01

第三步:调整文件系统大小

对于ext4文件系统,使用 resize2fs 命令调整文件系统大小:

[root@localhost ~]# sudo resize2fs /dev/vg01/lv01

5. 缩小逻辑卷

  1. 卸载逻辑卷:在缩小逻辑卷之前,需要确保逻辑卷没有被挂载。可以使用umount命令来卸载逻辑卷。
   [root@localhost ~]# umount /mnt/data 
  1. 检查文件系统:在缩小文件系统之前,需要检查文件系统是否有错误。可以使用e2fsck命令来检查。
   [root@localhost ~]# e2fsck -f  /dev/mapper/vg01-lv01

这里的vg-namelv-name需要替换成你的卷组名称和逻辑卷名称。

  1. 调整文件系统大小:使用resize2fs命令来缩小文件系统的大小到你希望的大小。
   [root@localhost ~]# resize2fs /dev/mapper/vg01-lv01   new-size

这里的new-size是你希望缩小到的新大小,例如10G

  1. 缩小逻辑卷:使用lvreduce命令来缩小逻辑卷的大小。
   [root@localhost ~]# lvreduce -L new-size /dev/mapper/vg01-lv01

这里的new-size是你希望缩小到的新大小,例如10G

  1. 确认操作lvreduce命令会提示你确认是否要缩小逻辑卷,因为这可能会破坏数据。如果你确认无误,输入y继续。
  2. 重新挂载逻辑卷:缩小逻辑卷后,使用mount命令重新挂载逻辑卷。
   [root@localhost ~]# mount /dev/mapper/vg01-lv01     /mnt/data

6. 创建镜像卷

1. 创建两个逻辑卷

首先,您需要有两个逻辑卷来创建镜像。假设您已经有一个卷组 vg01,您可以创建两个逻辑卷 lv01lv02

[root@localhost ~]# sudo lvcreate -L 10G -n lv01 vg01
[root@localhost ~]# sudo lvcreate -L 10G -n lv02 vg01

2. 创建镜像

使用 lvcreate 命令创建镜像卷:

[root@localhost ~]# sudo lvcreate -m 1 --type mirror -L 10G -n mirror01 vg01
[root@localhost ~]# sudo lvconvert -m 2 /dev/vg01/mirror01
[root@localhost ~]# sudo lvconvert --merge /dev/vg01/mirror01

这里 -m 1 表示创建一个镜像,-m 2 表示添加第二个镜像组件,--merge 用于合并镜像组件。

3. 格式化并挂载镜像卷

[root@localhost ~]#  mkfs.ext4 /dev/vg01/mirror01
[root@localhost ~]#  mkdir /mnt/mirror01
[root@localhost ~]#  mount /dev/vg01/mirror01 /mnt/mirror01

7.创建快照卷

1. 创建快照

假设您有一个逻辑卷 lv01,您可以创建一个快照 snapshot01

[root@localhost ~]# sudo lvcreate -L 2G -s -n snapshot01 /dev/vg01/lv01

这里 -L 2G 表示快照的大小,-s 表示这是一个快照。

2. 格式化并挂载快照卷

[root@localhost ~]# sudo mkfs.ext4 /dev/vg01/snapshot01
[root@localhost ~]# sudo mkdir /mnt/snapshot01
[root@localhost ~]# sudo mount /dev/vg01/snapshot01 /mnt/snapshot01

注意事项

  • 在创建镜像卷和快照卷之前,请确保您的卷组有足够的空间。
  • 创建镜像卷时,所有参与镜像的逻辑卷必须具有相同的物理扩展(PE)大小。
  • 快照卷的大小通常小于或等于源逻辑卷的大小。
  • 快照卷可以用于备份和恢复数据,但请注意,快照卷不支持写操作,因为它只是一个数据的快照。

删除

  1. 卸载文件系统
  • 首先,需要卸载挂载的逻辑卷。使用umount命令来卸载。
    bash [root@localhost ~]# umount /dev/vg0/lv01
  • 确保逻辑卷没有被任何进程使用。
  1. 删除/etc/fstab中的记录
  • 编辑/etc/fstab文件,移除与/dev/vg0/lv01相关的条目。这一步是为了确保在系统重启时不会尝试自动挂载已删除的逻辑卷。
    bash # 编辑 /etc/fstab 文件 # 移除或注释掉 /dev/vg0/lv01 的条目
  1. 删除逻辑卷
  • 使用lvremove命令来删除逻辑卷。
    bash [root@localhost ~]# lvremove /dev/vg0/lv01
  • 这个命令会从LVM中删除逻辑卷,但不会删除底层的物理存储。
  1. 删除卷组
  • 在删除所有逻辑卷后,可以使用vgremove命令来删除卷组。
    bash [root@localhost ~]# vgremove vg0
  • 这个命令会删除卷组及其包含的所有逻辑卷,但不会删除物理卷。
  1. 删除物理卷
  • 如果需要释放物理卷,可以使用pvremove命令来删除物理卷。
    bash [root@localhost ~]# pvremove /dev/sdb1
  • 请注意,puremove命令在你的笔记中可能是一个笔误,正确的命令应该是pvremove
  1. 整理物理卷
  • 删除物理卷后,如果需要重新使用这些空间,可能需要重新分区或格式化。

请确保在执行这些操作之前,你已经备份了所有重要数据,因为这些操作会永久删除数据。同时,确保你有足够的权限来执行这些命令,通常需要root权限。

8. 数据迁移

场景描述

假设您需要将数据从一个逻辑卷(LV)迁移到另一个逻辑卷,可能是因为您需要将数据从一个卷组(VG)移动到另一个卷组,或者因为您需要将数据从一个物理卷(PV)移动到另一个新的物理卷。

步骤1:准备目标逻辑卷

  1. 创建目标物理卷(PV):如果目标存储在新的物理设备上,首先需要初始化该设备为物理卷。
   [root@localhost ~]# sudo pvcreate /dev/sdx
  1. 创建目标卷组(VG):如果目标存储在新的卷组中,创建一个新的卷组。
   [root@localhost ~]# sudo vgcreate vg02 /dev/sdx
  1. 创建目标逻辑卷(LV):在新的卷组中创建一个足够大的逻辑卷来存储迁移的数据。
   [root@localhost ~]# sudo lvcreate -L 20G -n lv02 vg02

步骤2:复制数据

  1. 复制文件:使用rsync或其他文件复制工具将数据从源逻辑卷复制到目标逻辑卷。
   [root@localhost ~]# sudo rsync -avH /mnt/data/ /mnt/newdata/

这里/mnt/data是源逻辑卷的挂载点,/mnt/newdata是目标逻辑卷的挂载点。

步骤3:验证数据

  1. 验证复制的数据:确保所有数据都已成功复制到新逻辑卷。可以使用文件系统检查工具或手动验证数据的完整性。

步骤4:更新系统配置

  1. 更新挂载点:更新系统的挂载配置,如/etc/fstab,将源逻辑卷的挂载点指向目标逻辑卷。
   [root@localhost ~]# /dev/vg02/lv02 /mnt/data ext4 defaults 0 0

步骤5:卸载源逻辑卷

  1. 卸载源逻辑卷:一旦确认数据已经成功迁移,并且系统配置已更新,您可以安全地卸载源逻辑卷。
   [root@localhost ~]# sudo umount /mnt/data

步骤6:清理源物理卷

  1. 从卷组中移除源物理卷:如果源物理卷不再需要,可以从卷组中移除,并重新分配给其他用途或安全地移除。
   [root@localhost ~]# sudo vgreduce vg01 /dev/sdb

然后,使用pvremove命令来移除物理卷。

   [root@localhost ~]# sudo pvremove /dev/sdb

注意事项

  • 在执行数据迁移之前,确保已经对所有重要数据进行了备份。
  • 在迁移过程中,确保源逻辑卷和目标逻辑卷的大小足以容纳数据。
  • 在迁移完成后,进行彻底的测试以确保数据的完整性和系统的稳定性。
  • 数据迁移可能会影响系统的可用性,因此在执行迁移操作时,选择一个合适的维护窗口。

9. 修改物理卷(PV)属性

  • 设置PV为不可分配
  [root@localhost ~]# pvchange -x n device

这条命令将指定的物理卷(device)设置为不可分配,即LVM不会使用这个物理卷进行任何操作。

  • 设置PV为可分配
  [root@localhost ~]# pvchange -xy device

这条命令将指定的物理卷(device)设置为可分配,即LVM可以利用这个物理卷。

2. 修改卷组(VG)属性

  • 激活卷组
  [root@localhost ~]# vgchange -ay vgname

这条命令激活指定的卷组(vgname),使其可以被使用。

  • 禁用卷组
  [root@localhost ~]# vgchange -an vgname

这条命令禁用指定的卷组(vgname),使其不可被使用。

3. 修改逻辑卷(LV)属性

  • 激活逻辑卷
  [root@localhost ~]# lvchange -ay lvname

这条命令激活指定的逻辑卷(lvname),使其可以被使用。

  • 禁用逻辑卷
  [root@localhost ~]# lvchange -an lvname

这条命令禁用指定的逻辑卷(lvname),使其不可被使用。

  • 设置逻辑卷为只读
  [root@localhost ~]# lvchange -pr lvname

这条命令将指定的逻辑卷(lvname)设置为只读模式。

  • 设置逻辑卷为读写
  [root@localhost ~]# lvchange -prw lvname

这条命令将指定的逻辑卷(lvname)设置为读写模式。

10. 逻辑卷快照

1. 创建逻辑卷快照

逻辑卷快照允许你在特定时间点创建逻辑卷的只读副本,从而实现数据备份。

示例:

[root@localhost ~]# lvcreate -L 64M -s -n datasnap /dev/vg0/lv01

参数说明

  • -L 64M:指定快照大小为64MB。你可以根据实际需求调整此值。
  • -s:创建快照。
  • -n datasnap:为快照指定名称为 datasnap
  • /dev/vg0/lv01:指定源逻辑卷路径。

创建完成后,你会看到类似如下的信息:

[root@localhost ~]# Logical volume "datasnap" created.

2. 挂载逻辑卷快照

在挂载快照之前,首先需要创建一个挂载点目录。

示例:

[root@localhost ~]# mkdir -p /mnt/datasnap

然后,你可以将快照挂载到该目录。

[root@localhost ~]# mount /dev/vg0/datasnap /mnt/datasnap -o nouuid

参数说明

  • -o nouuid:因为快照是基于原逻辑卷的副本,可能会出现UUID冲突。使用 nouuid 选项可以防止此问题,确保快照能够挂载。

挂载后,你可以在 /mnt/datasnap 目录中访问快照数据。

3. 备份数据

在快照挂载后,你可以像普通文件系统一样操作快照,执行数据备份等操作。例如,使用 rsync 备份数据:

[root@localhost ~]# rsync -av /mnt/datasnap/ /backup/datasnap/

4. 卸载快照并移除快照

完成备份后,需要卸载快照并将其删除,以释放空间。

卸载快照:

[root@localhost ~]# umount /mnt/datasnap

移除快照:

[root@localhost ~]# lvremove /dev/vg0/datasnap

系统会提示你确认删除操作,输入 y 进行确认。

5. 快照恢复

如果需要恢复到快照创建时的状态,可以使用 lvconvert 命令将快照合并到原逻辑卷。

示例:

[root@localhost ~]# lvconvert --merge /dev/vg0/datasnap

注意:合并快照时,原逻辑卷会被恢复到快照创建时的状态,因此所有之后的更改会被丢失。

6. 注意事项

  • 快照大小:快照的大小通常不需要与原逻辑卷相等。快照的大小由变更数据的数量决定。过小的快照可能无法容纳所有变化,导致快照失败或数据丢失。
  • 性能影响:在创建和使用快照时,会有一定的性能影响,特别是在进行大量写操作时。建议根据实际应用场景评估是否使用快照。

11. 卷组迁移到其他主机

1. 卸载逻辑卷(LV)

首先,在迁移之前,需要确保卷组中的逻辑卷已经被卸载。这样可以避免数据损坏或丢失。

[root@localhost ~]# umount /dev/vgname/lvname

参数说明

  • /dev/vgname/lvname:需要卸载的逻辑卷路径。
  • 确保逻辑卷未被其他进程占用,可以使用 lsoffuser 工具检查。
[root@localhost ~]# umount /dev/vg0/lvdata

2. 禁用卷组

在卸载逻辑卷之后,需要禁用卷组,防止该卷组在其他主机上被自动激活。

[root@localhost ~]# vgchange -an vgname

参数说明

  • -a:表示针对所有卷组操作。
  • -n:禁用指定卷组。
[root@localhost ~]# vgchange -an vg0

3. 导出卷组到磁盘

使用 vgexport 命令导出卷组,以便在目标主机上导入。导出卷组后,卷组的元数据会从当前主机的 LVM 配置中移除。

示例:
[root@localhost ~]# vgexport vgname

参数说明

  • vgname:卷组名称。
[root@localhost ~]# vgexport vg0

此命令会将 vg0 卷组的元数据从当前主机的 LVM 配置中移除,但不影响卷组本身的数据。

4. 关机并移除磁盘

为了迁移卷组的物理卷(PV),需要关机并断开存储设备。你可以通过关机移除物理磁盘(通常是外部存储设备或附加硬盘)以便将其插入目标主机。

[root@localhost ~]# shutdown -h now

关机后,物理设备可以从当前主机上移除。

5. 将磁盘插入新的主机

在关机并移除磁盘之后,将磁盘连接到新的主机上。连接方法取决于你使用的存储硬件(例如 SATA、SCSI、USB、iSCSI 等)。

6. 扫描物理卷(PV)

新主机启动后,使用 pvscan 命令扫描系统中的物理卷。

[root@localhost ~]# pvscan
PV /dev/sdb   lvm2 [500.00 GiB]
  VG vg0       lvm2 [500.00 GiB / 500.00 GiB free]

该命令会扫描所有已连接的磁盘,识别其中的物理卷。如果设备未识别,可能需要检查硬件连接或驱动。

7. 导入卷组

在新主机上,需要通过 vgimport 命令导入卷组,恢复卷组的元数据。

#

[root@localhost ~]# vgimport vgname

参数说明

  • vgname:需要导入的卷组名称。
[root@localhost ~]# vgimport vg0

该命令会将 vg0 卷组导入新主机,恢复卷组的元数据。

8. 激活卷组

导入卷组后,最后一步是激活卷组,使其在新主机上可用。

[root@localhost ~]# vgchange -ay vgname

参数说明

  • -a:表示激活所有卷组。
  • -y:激活指定卷组。
[root@localhost ~]# vgchange -ay vg0

这时,卷组和它的逻辑卷将变为活动状态,可以使用 lvscan 命令检查卷组和逻辑卷是否已经激活。

验证迁移结果

完成上述步骤后,可以验证卷组和逻辑卷是否迁移成功。使用以下命令检查卷组和逻辑卷状态:

[root@localhost ~]# vgdisplay vgname
[root@localhost ~]# lvdisplay /dev/vgname/lvname
[root@localhost ~]# vgdisplay vg0
[root@localhost ~]# lvdisplay /dev/vg0/lvdata

如果一切顺利,你应该能够在新主机上访问和使用逻辑卷。

注意事项

  1. 数据备份:在执行任何迁移操作之前,请确保备份所有重要数据,以防发生意外。
  2. 磁盘兼容性:确保新的主机可以识别和支持旧主机上的磁盘格式(例如,LVM 配置和物理卷)。
  3. 驱动和配置:如果新主机使用不同的硬件或驱动,可能需要重新配置 LVM 或安装必要的驱动。
  4. 磁盘故障排查:如果在迁移后无法识别磁盘,检查硬件连接、磁盘状态、LVM 配置文件等。