Linux LVM

发布时间 2023-06-13 11:46:50作者: williamzheng

一、LVM简介

LVM的限制:

  • 一块物理硬盘(PV)只能属于一个卷组(VG)
  • 一个VG里的最大逻辑卷(LV)数目是255
  • 每个PV最大PE数目是65536,可在创建VG时通过vgcreate –e 设定
  • 每个VG中最大PV数目是255,可在创建VG时通过vgcreate –p 设定

二、创建LVM

手动添加一块磁盘

  1. 检查当前系统是否安装了LVM管理工具

    [root@mycentos ~]# rpm -qa |grep lvm
    ## 如果检查没有安装lvm工具,则使用如下命令安装
    [root@mycentos ~]# yum -y install lvm2.x86_64
    
  2. 新建分区,分区类型为Linux LVM(8e)
    这里需要注意的是,磁盘默认为MBR,建议将磁盘改为GPT格式

    [root@mycentos ~]#  fdisk /dev/sdb
    Command (m for help): n
    Select (default p): p
    Partition number (1-4, default 1): 1
    First sector (2048-20971519, default 2048):
    ## 直接回车,默认从起始扇区开始
    Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519):
    ## 直接回车,默认从结尾扇区结束
    Command (m for help): p
    Command (m for help): t
    ## t:转换分区格式
    Hex code (type L to list all codes): L
    ## L:展示分区格式代码
    Hex code (type L to list all codes): 8e
    ## 8e:LVM分区格式代码
    Command (m for help): p
    Command (m for help): w
    
  3. 将分区信息读到内核中

    [root@mycentos ~]# partprobe /dev/sdb
    [root@mycentos ~]# partprobe /dev/sdb1
    
  4. 创建PV

    [root@mycentos ~]# pvcreate /dev/sdb1
    ## 使用pvcreate创建PV,命令后面跟分区类型为8e的分区
    [root@mycentos ~]# pvdisplay
    
  5. 创建VG

    [root@mycentos ~]# vgcreate vg0 /dev/sdb1
    ## vgcreate创建VG,后面跟VG的名称,名称可自定义,最后跟PV
    [root@mycentos ~]# vgdisplay
    
  6. 创建LV
    lvcreate命令创建LV,从vg0中创建

    • -L:指定逻辑卷大小
    • -n:指定逻辑卷名称
    [root@mycentos ~]# lvcreate -L 5G -n data vg0
    [root@mycentos ~]# lvdisplay
    
  7. 格式化LV并指定LV文件系统类型

    [root@mycentos ~]# mkfs.xfs /dev/vg0/data
    
  8. 用LV的绝对路径写入fstab并挂载

    [root@mycentos ~]# echo "/dev/vg0/data /data xfs defaults 0 0" >> /etc/fstab
    [root@mycentos ~]# mkdir /data
    [root@mycentos ~]# mount –a
    [root@mycentos ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    devtmpfs              980M     0  980M   0% /dev
    tmpfs                 991M     0  991M   0% /dev/shm
    tmpfs                 991M  9.5M  981M   1% /run
    tmpfs                 991M     0  991M   0% /sys/fs/cgroup
    /dev/sda2              20G  1.4G   19G   8% /
    /dev/sr0              4.4G  4.4G     0 100% /mnt/cdrom
    tmpfs                 199M     0  199M   0% /run/user/0
    /dev/mapper/vg0-data  5.0G   33M  5.0G   1% /data
    

三、扩展LVM

当某个分区剩余空间不足的时候,可以进行逻辑卷的拉伸,逻辑卷的拉伸可以在线进行,不用卸载文件系统,不用重启,只要操作得当,一般都是没有风险的。需要注意的是,拉伸逻辑卷的时候,文件系统(df -h里看到的就是文件系统,文件系统有ext4、xfs等,lvdisplay里看到的是逻辑卷)一定要比逻辑卷大,这就好比装水的杯子一定要比水的容量要大,否则逻辑卷会撑爆文件系统!

  1. 添加新的磁盘,并分区
    分区方法参考第一章的第2步

  2. 创建新的PV
    如果VG空间足够,则可以直接在LV中拉伸,为了适应更多的场景,本示例从PV开始扩展,需要添加新磁盘

    [root@mycentos ~]# pvcreate /dev/sdc1
    
  3. 扩展VG
    将新添加的磁盘扩展到vg中,vgextend命令扩展VG空间,后面跟VG名称和PV名称

    [root@mycentos ~]# vgextend vg0 /dev/sdc1
    [root@mycentos ~]# vgdisplay 
    
  4. 扩展LV
    lvextend扩展LV,此处注意:后面直接跟数字代表加到多少,后面跟“+num” 代表在原有的基础上增加多少

    • -L:指定逻辑卷大小
    • -l:指定PE数量;或者跟“+100%FREE”,代表vgdisplay里全部的Free PE
    [root@mycentos ~]# lvextend -L +5G /dev/vg0/data
    
  5. 格式化并扩展文件系统
    注意:此处格式化的只是拉伸部分的空间,LV中原有的数据不会被格式化。xfs文件系统使用此命令拉伸,ext4文件系统使用:resize2fs命令拉伸

    [root@mycentos ~]# xfs_growfs /dev/vg0/data
    [root@mycentos ~]# df -h
    

四、缩小LVM

当某个分区一开始的时候分的过大,实际情况又没有使用那么多空间,而其他使用的分区空间又不足,又不想新增磁盘或物理机磁盘插槽已满的情况下,可以进行缩小逻辑卷,缩小逻辑卷需要卸载文件系统,并且有一定的风险,如果操作得当,可以将风险降到很小,即使如此,一般情况下,也不建议缩小LVM。

注意:xfs文件系统不支持缩小,如一定要缩小,需安装工具xfsdump

4.1ext4文件系统缩小

  1. 卸载挂载分区

    [root@mycentos ~]# umount /data/
    [root@mycentos ~]# df -h
    
  2. 扫描文件系统
    注意:扫描文件系统一定要先卸载分区,否则可能会导致数据丢失!!!此命令在缩小LVM的时候一定不能省略!e2fsck命令扫描文件系统,整理文件系统中非连续的block,并且可以检查文件系统是否有错误,如有错误,则根据提示解决错误后,再进行LVM缩小。

    [root@mycentos ~]# e2fsck -f /dev/vg0/data
    
  3. 缩小文件系统
    将文件系统缩小成6G

    [root@mycentos ~]# resize2fs /dev/vg0/data 6G
    [root@mycentos ~]# lvdisplay
    ## 此处LV大小还是15G,因为resize2fs只是缩小了文件系统,逻辑卷并没有缩小
    
  4. 缩小逻辑卷
    lvreduce缩小LV,此处注意:后面直接跟数字代表缩小到多少,后面跟“-num ”代表在原有的基础上减少多少

    • -L:指定逻辑卷大小
    • -l:指定PE大小
    [root@mycentos ~]# lvreduce -L 6G /dev/vg0/data
    
  5. 检查并重新挂载分区

    [root@mycentos ~]# lvdisplay
    ## LV中已经缩成了6G大小
    [root@mycentos ~]# mount -a
    [root@mycentos ~]# df -h
    ## 重新挂载后,可以看到/data挂载点已经缩小成了6G大小
    

4.2xfs文件系统缩小

xfs的lvm不能直接在线缩小空间,所以一定注意,xfs文件系统的lvm分区,尽量往小了分,一旦上线就只扩不减!

如果强行用ext4文件系统的lvm缩容方法去缩小空间,会导致出现superblock错误无法挂载!万不得已需要缩小xfs文件系统的lvm分区空间时候,一定要缩小需严格按照以下顺序。

  1. 安装xfsdump工具

    [root@mycentos ~]# yum -y install xfsdump
    
  2. 目标数据备份。以/data为例
    xfsdump -f "dump文件存放的绝对路径加文件名" "需要缩减容量的目录"
    比如,注意最后面备份的目录格式是"/data",不能是"/data/"

    [root@mycentos ~]# xfsdump -f /opt/data.dump /data
    please enter label for this dump session (timeout in 300 sec)
     -> data.dump
    ## 输入备份数据名称
    [root@mycentos ~]# ll /opt/data.dump
    
  3. 卸载挂载分区

    [root@mycentos ~]# umount /data
    
  4. 将逻辑卷缩容成6G,是扩大还是缩小它自己会判断

    [root@mycentos ~]# lvresize -L 6G /dev/mapper/vg0-data
    Do you really want to reduce vg0/data? [y/n]: y
    
  5. 格式化以更新到最新大小

    [root@mycentos ~]# mkfs.xfs -f /dev/mapper/vg0-data
    
  6. 挂载出来空分区

    [root@mycentos ~]# mount /dev/vg0/data/
    
  7. 恢复第2步备份的dump数据

    [root@mycentos ~]# xfsrestore -f /opt/data.dump /data
    

五、 LVM数据迁移

当物理磁盘因为性能或其他的原因需要更换或移除时,可以通过LVM数据迁移技术,将逻辑卷上的数据从旧的磁盘上迁移到新的磁盘上,数据不会丢失,并且可以在线进行,不用卸载文件系统。逻辑卷的迁移不用考虑物理磁盘的厂商或类型,因此解决了通过存储层面迁移数据需要考虑的兼容性问题。

本示例介绍将/dev/sdb1的数据迁移到/dev/sdc1

  1. 备份数据
    虽然LVM数据迁移可以在线进行,但是为了防止不可控的因素(比如在迁移的过程中突然停电),还是建议在做数据迁移之前,先备份数据。

  2. 检查PV状态,确定要移除的PV

    [root@mycentos ~]# pvdisplay
    ##########部分输出省略##########
    PV Name               /dev/sdb1
    
    Total PE              5119
    Free PE               3583
    Allocated PE          1536
    ## 通过pvdisplay可以发现,/dev/sdb1总共有5119个PE,空闲3583个PE,已使用1536个PE
    ##########部分输出省略##########
    
  3. 迁移数据,将磁盘sdb1上的数据迁移至磁盘sdc1上,并检查pv状态

    [root@mycentos ~]# pvmove /dev/sdb1 /dev/sdc1
    [root@mycentos ~]# pvdisplay
    ##########部分输出省略##########
    PV Name               /dev/sdb1
    
    Total PE              5119
    Free PE               5119
    Allocated PE          0
    ## /dev/sdb1上的数据迁移后,通过pvdisplay可以看到 sdb1上已经没有数据
    ##########部分输出省略##########
    
  4. 从卷组中移除PV
    使用vgreduce命令从VG中移除PV

    [root@mycentos ~]# vgdisplay -v
    ## 通过vgdisplay –v可以看到PV,VG,LV的一个总体的情况,检查要移除的/dev/sdb1目前使用的PE情况,确定是否空闲
    [root@mycentos ~]# vgreduce vg0 /dev/sdb1
    [root@mycentos ~]# vgdisplay -v
    ## 此时通过vgdisplay –v查看lvm状态,可以看到VG中已经没有/dev/sdb1了
    
  5. 移除PV

    [root@mycentos ~]# pvdisplay
    ## 可以看到/dev/sdb1当前是未分配状态
    [root@mycentos ~]# pvremove /dev/sdb1
    ## pvremove命令,在PV中移除/dev/sdb1
    [root@mycentos ~]# pvdisplay
    ## 通过pvdisplay命令可以看到在已经没有/dev/sdb1这个PV了
    

六、删除LVM

  1. 卸载分区

    [root@mycentos ~]# umount /data/
    [root@mycentos ~]# df -h
    
  2. 删除LV

    [root@mycentos ~]# lvremove /dev/vg0/data
    Do you really want to remove active logical volume data? [y/n]: y
    
  3. 删除VG

    [root@mycentos ~]# vgremove vg0
    
  4. 删除PV

    [root@mycentos ~]# pvremove /dev/sdc1
    

七、LVM快照

LVM快照技术可以将LV分区做一个快照,将来如果想要将分区恢复到拍快照时的状态,可以随时恢复,LVM的快照技术应用非常广泛,比如误删除数据了,或者系统升级前可以拍个快照,以免在升级失败的时候,可以快速回滚系统。做快照的时间非常快,几乎是实时的,并且占用空间可以自己定义。使用LVM快照技术需要深入掌握LVM快照技术的原理,否则可能会导致数据丢失!LVM快照使用的是COW(Copy On Write写前拷贝)技术。

7.1COW概述

LVM对LV提供了快照“snapshot”备份功能。LVM的快照使用的是COW(Copy On Write写前拷贝)技术。当一个snapshot创建的时候,仅拷贝原始LV中的inode,并不会拷贝block,即使原始LV中有几百GB数据,创建的快照大小也可以只有几十M甚至几M大小,因为这不是物理上的数据拷贝,因此snapshot的创建特别快。当原始LV中的数据有写入时, COW空间会记保存原始LV发生变化的数据;当原始LV中有新数据覆盖旧数据时,将旧数据拷贝到COW空间里,起到备份数据的作用。以上两点就保证了所有数据和创建备份卷之前的数据一致性。而对于snapshot的读操作,如果是读取数据块是没有修改过的,那么会将读操作直接重定向到原始卷上,如果是要读取已经修改过的块,那么就读取拷贝到snapshot中的块。所以当原始卷破坏了之后还能用snapshot备份的数据还原。

创建snapshot的COW空间大小并不需要和原始卷一样大,其大小需要考虑从snapshot创建到释放这段时间内,估计数据的改变量有多大,数据更新的频率。一旦COW空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而导致这个snapshot无效,COW空间中的备份数据将丢失。

7.2创建LVM快照

lvcreate命令创建快照

  • -L:指定快照的COW容量为1G
  • -s:snapshot,不加-s代表创建LV
  • -n:指定快照名称
[root@mycentos ~]# lvcreate -L 1G -s -n data_snap /dev/vg0/data
  Using default stripesize 64.00 KiB.
  Logical volume "data_snap" created.
[root@mycentos ~]# lvdisplay

##########部分输出省略##########
  COW-table size         1.00 GiB
## lvdisplay命令可以查看快照的详细信息,此处代表COW空间大小
  COW-table LE           256
  Allocated to snapshot  0.00%
## COW空间使用百分比
##########部分输出省略##########

[root@mycentos ~]# vgdisplay

##########部分输出省略##########
Alloc PE / Size       2816 / 11.00 GiB
Free  PE / Size       2303 / 9.00 GiB
## vgdisplay可以看到总共20GB的卷组,前面创建逻辑卷用了10G,COW空间用了1G,还剩9G
##########部分输出省略##########

7.3恢复LVM快照

  1. 卸载文件系统

    [root@mycentos ~]# umount /data/
    [root@mycentos ~]# df -h
    
  2. 还原快照

    [root@mycentos ~]# lvconvert --merge /dev/vg0/data_snap
      Merging of volume vg0/data_snap started.
      app: Merged: 100.00%
    
  3. 重新激活逻辑卷
    先取消激活,然后激活

    • -a:active,活动状态
      后面接n代表 no active
      后面接y代表active
    [root@mycentos ~]# lvchange -a n /dev/vg0/app
    [root@mycentos ~]# lvchange -a y /dev/vg0/app
    
  4. 挂载测试

    mount -a
    df -h
    

7.4管理快照COW空间

7.4.1手动增加COW空间

手动给data_snap增加2G的的空间,和前面一样,如果不加“+”号,则是加到多少

[root@mycentos ~]# lvdisplay
[root@mycentos ~]# lvextend -L +1G /dev/vg0/data_snap
[root@mycentos ~]# lvdisplay
## 查看COW-table size可以发现快照已经变成了2G

7.4.2COW空间自动扩展

由于LVM快照使用的是COW技术,创建快照的时候,需要手工指定一个COW空间大小,但是这个COW空间的大小在生产环境中很难预估。COW空间设置过大的话会浪费磁盘空间,设置过小的话又会造成COW空间爆满,导致快照失效,为了解决这一问题,LVM的配置文件中提供了“autoextend(自动扩展)”功能。例如在COW空间达到80%的时候,自动扩展COW空间20%。

  1. 配置COW空间自动扩展
    [root@mycentos ~]# vim /etc/lvm/lvm.conf
    ##########部分输出省略##########
    # Configuration optionactivation/snapshot_autoextend_threshold.
    # Auto-extend a snapshot when its usage exceeds thispercent.
    # Setting this to 100 disables automatic extension.
    # The minimum value is 50 (a smaller value is treated as50.)
    # Also see snapshot_autoextend_percent.
    # Automatic extension requires dmeventd to be monitoringthe LV.
    #    
    # Example
    # Using 70% autoextend threshold and 20% autoextend size,when a 1G
    # snapshot exceeds 700M, it is extended to 1.2G, and whenit exceeds
    # 840M, it is extended to 1.44G:
    # snapshot_autoextend_threshold = 70
    #    
    snapshot_autoextend_threshold = 100
    ## 将此处设置为70,代表快照空间达到70%的阀值,则触发自动扩展机制。默认参数为100,当此处为100的时候,则关闭自动扩展机制。
    # Configuration optionactivation/snapshot_autoextend_percent.
    # Auto-extending a snapshot adds this percent extra space.
    # The amount of additional space added to a snapshot isthis
    # percent of its current size.
    #    
    # Example
    # Using 70% autoextend threshold and 20% autoextend size,when a 1G
    # snapshot exceeds 700M, it is extended to 1.2G, and whenit exceeds
    # 840M, it is extended to 1.44G:
    # snapshot_autoextend_percent = 20
    #    
    snapshot_autoextend_percent = 20
    ## 将此处设置为20,代表一旦触发自动扩展阀值,则按此处设置的20%来扩充%20的COW空间
    ##########部分输出省略##########
    

八、LVM状态信息备份与恢复

LVM提供了恢复功能,由于人为误操作或者文件系统故障,可以通过命令恢复。每做一次LVM命令相关的操作,LVM都会备份操作前的LVM状态,LVM的状态通过配置文件保存在/etc/lvm/archive,可以通过LVM的状态配置文件进行恢复。

  1. 列出卷组信息
    vgcfgrestore命令可以恢复卷组信息

    • -l:列出卷组状态信息
    • vg0:卷组名称
    [root@mycentos ~]# vgcfgrestore -l vg0
      File:		/etc/lvm/archive/vg0_00000-351600058.vg
      Couldn't find device with uuid 7WVKTx-152W-VmP9-H4Cl-jkpc-iIDa-RrHYUZ.
      VG name:    	vg0
      Description:	Created *before* executing 'vgcreate vg0 /dev/sdb1'
      Backup Time:	Mon May 25 17:41:51 2020
    
    
      File:		/etc/lvm/archive/vg0_00001-1600128515.vg
      VG name:    	vg0
      Description:	Created *before* executing 'lvcreate -L 8G -n data   vg0'
      Backup Time:	Mon May 25 17:44:23 2020
    
    
      File:		/etc/lvm/archive/vg0_00002-261533161.vg
      ## 卷组状态信息保存的位置
      VG name:    	vg0
      Description:	Created *before* executing 'lvreduce -L 5G   /dev/vg0/data'
      Backup Time:	Mon May 25 17:50:21 2020
    
       
      File:		/etc/lvm/backup/vg0
      VG name:    	vg0
      Description:	Created *after* executing 'lvreduce -L 5G   /dev/vg0/data'
      Backup Time:	Mon May 25 17:50:21 2020
    
    
  2. 通过卷组状态配置文件恢复

    [root@mycentos ~]# vgcfgrestore -f     /etc/lvm/archive/vg0_00002-261533161.vg vg0
      Restored volume group vg0
    
  3. 重新激活卷组状态
    通过vgchange命令重新激活卷组状态

    • -a:active,活动状态
      后面接n代表 no active
      后面接y代表active
    [root@mycentos ~]# vgchange -a n vg0
      0 logical volume(s) in volume group "vg0" now active
    [root@mycentos ~]# vgchange -a y vg0
      1 logical volume(s) in volume group "vg0" now active
    
    

九、将标准分区转换为逻辑卷

如果在分区的时候没有把分区做成逻辑卷,或者需要拉伸或缩小普通分区,或者要做快照进行备份等等场景下,可以通过把普通分区转换成逻辑卷后,再进行拉伸或缩小等操作。

  1. 分一个2G的标准分区

    [root@mycentos ~]# fdisk /dev/sdc
    ##########部分输出省略##########
    Command (m for help): n
    Select (default p): p
    Partition number (1-4, default 1): 1
    First sector (2048-41943039, default 2048): 
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-41943039, default     41943039): +2G
    Partition 1 of type Linux and of size 2 GiB is set
    
    Command (m for help): w
    ##########部分输出省略##########
    [root@mycentos ~]# partprobe /dev/sdc
    
  2. 格式化并挂载到/data

    [root@mycentos ~]# mkfs.ext4 /dev/sdc1 
    [root@mycentos ~]# mount /dev/sdc1 /data/
    [root@mycentos ~]# df -h
    
  3. 测试往/data目录下写数据,待会验证逻辑卷中数据是否存在

    [root@mycentos ~]# cp /etc/passwd /data/
    [root@mycentos ~]# cp -r /etc/ /data/
    [root@mycentos ~]# cd /data/
    [root@mycentos ~]# ls
    etc  lost+found  passwd
    
  4. 卸载挂载点

    [root@mycentos ~]# umount /data/
    [root@mycentos ~]# df -h
    
  5. 创建逻辑卷
    创建的逻辑卷一定要比原文件系统要大,否则dd过来就会把逻辑卷撑爆掉

    [root@mycentos ~]# lvcreate -L 4G -n data vg0
    ## 注意,此处创建的逻辑卷是4G,比源/data标准分区2G要大
    
  6. 不用格式化逻辑卷,直接用dd命令将普通分区的所有数据d过来
    通过dd命令,将原来普通分区上的数据,d到逻辑卷上。注意:此逻辑卷是没有文件系统的,dd命令直接就将原文件系统d到逻辑卷上了

    [root@mycentos ~]# dd if=/dev/sdc1 of=/dev/vg0/data
    [root@mycentos ~]# df -h
    [root@mycentos ~]# mount /dev/vg0/data /test/
    [root@mycentos ~]# df -h
    /dev/mapper/vg0-data  2.0G   45M  1.8G   3% /test
    ## 因为d过来的只是2G部分的文件系统,总文件系统是4G,多的2G部分没有文件系统,所以此时看到的只是原来2G的文件系统,而且是逻辑卷的形式
    
  7. 扩展逻辑卷
    如果是xfs文件系统则使用xfs_growfs /dev/vg0/data命令

    [root@mycentos ~]# resize2fs /dev/vg0/data
    [root@mycentos ~]# df -h
    /dev/mapper/vg0-data  3.9G   47M  3.7G   2% /test
    ## 因为刚刚创建逻辑卷的时候是4G大小,此时只需要拉伸文件系统,逻辑卷就变成4G了
    
  8. 验证数据是否丢失

    [root@mycentos ~]# cd /test/
    [root@mycentos ~]# ls
    etc  lost+found  passwd
    ## 数据都还在,标准分区转换成逻辑卷成功