linux以lvm的方式挂载硬盘以及硬盘在线扩展

1,572 阅读11分钟

简介

LVM(Logical Volume Manager),即逻辑卷管理,是在硬盘分区和文件系统之间添加的一个逻辑层,为文件系统屏蔽下层硬盘分区布局,并提供一个抽象的盘卷,在盘卷上建立文件系统。管理员利用LVM可以在硬盘不用重新分区的情况下动态调整文件系统的大小,并且利用LVM管理的文件系统可以跨越物理硬盘。当服务器添加了新的硬盘后,管理员不必将原有的文件移动到新的硬盘上,而是通过LVM直接扩展文件系统来跨越物理硬盘。

常用概念

  • PV(physical volume):物理卷位于逻辑卷管理的最底层抽象,可以是物理硬盘或者物理硬盘上的分区
  • VG(volume group):卷组建立在物理卷上,是对物理卷在上层抽象,一个卷组中至少要包括一物理卷,卷组建立后可动态的添加物理卷到卷组中,一个逻辑卷管理系统工程中可有多个卷组。
  • LV(logical volume):逻辑卷建立在卷组基础上,是最终给到文件系统挂载的层级。卷组中未分配空间可用于建立新的逻辑卷,逻辑卷建立后可以动态扩展和缩小空间。
  • PE(physical extent):物理区域是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的pv加入到vg后,pe的大小自动更改为vg中定义的pe大小。
  • LE(logical extent):逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。 卷组描述区域:卷组描述区域存在于每个物理卷中,用于描述物理卷本身、物理卷所属卷组、卷组中逻辑卷、逻辑卷中物理区域的分配等所有信息,它是在使用pvcreate建立物理卷时建立的。

结构说明

lvm的结构:硬盘、分区-> pv -> vg -> lv

lvm结构图

如上图:

  • pv可以由硬盘或者硬盘的分区组成,一个硬盘或者一个分区只能对应一个pv。
  • vg由pv组成,一个vg可以对应多个pv。
  • lv由vg组成,一个vg可以给多个lv使用,但是一个lv固定只能对应一个vg。

软件安装

lvm所有的软件包都包含在lvm这个软件里面,以centos 7为例,lvm的版本升级到lvm2。安装命令如下:

# yum install -y lvm2

常用命令

PV命令

pvcreate:将物理分区建立成独立的pv

pvscan:查找目前系统里面任何具有pv的磁盘

pvdisplay、pvs:显示出目前系统上面的pv状态

pvremove:将pv属性删除,让该分区不具有pv属性

VG命令

vgcreate:建立VG的命令

主要参数:

-l:卷组上允许创建的最大逻辑卷数

-p:卷组中允许添加的最大物理卷数

-s:卷组上的物理卷的PE大小

vgscan:查看系统上存在的VG

vgdisplay、vgs:显示系统上的VG

vgextend:对VG的大小进行扩展(添加新的PV)

vgreduce:对VG的大小进行缩减(删除指定PV)

vgchange:设置VG的属性

vgchange 用于修改卷组的属性,经常被用来设置卷组是处于活动状态或非活动状态。处于活动状态的卷组无法被删除,必须使用vgchange命令将卷组设置为非活动状态后才能删除。

扩展: 在系统重装之后,需要执行该命令把vg设置为激活状态

# vgchange -ay vg名称

vgremove:删除VG

LV命令

lvcreat:创建LV

lvscan:查看系统上存在的LV

lvdisplay、lvs:显示系统上的LV

lvextend:对LV的大小进行扩展

lvreduce:对LV的大小进行缩减

lvremove:删除LV

lvresize:调整LV容量大小

xfs_growfs:xfs文件系统,扩展lv的大小

resize2fs:非xfs文件系统,扩展lv的大小

xfs_growfsresize2fs命令用以扩展lv的大小,该命名是在通过lvextend命令扩展了LV的大小之后,让LV的大小生效。

实战

lvm创建磁盘挂载的顺序为: fdisk格式化硬盘 -> 创建pv -> 创建vg -> 创建lv -> 挂载lv

fdisk格式化硬盘相关操作,请移步:【磁盘挂载相关操作】

首先查看硬盘分区情况

# fdisk -l
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000c7bcb
​
   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    83886046    41941999+  83  Linux
​
Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x8b1332ff
​
   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048    20000000     9998976+  83  Linux

如上,/dev/vdb1是我新格式化的分区,准备把它通过lvm格式进行挂载。可以看到,其System类型为Linux,因为我们使用的是lvm2,所以可以直接使用该文件格式,若使用的是lvm,则需要通过fdisk命令,修改其文件系统类型为lvm,可以参考【磁盘挂载相关操作】

咱们现在就对分区进行lvm操作:

  1. 创建物理卷pv

    # pvcreate /dev/vdb1
    

    pvcreate 可以指定分区,可以指定硬盘。例如: pvcreate /dev/vdb,命令其他参数,可以通过man pvcreate查看

  2. 创建卷组vg

    # vgcreate user /dev/vdb1 
      Volume group "user" successfully created
    

    如上,基于/dev/vdb1分区,创建了卷组:user

  3. 创建逻辑卷lv

    # lvcreate -l 100%FREE -n app user
      Logical volume "app" created.
    

    创建lv : app ,并把user这个卷组的所有空闲空间给到它。

    一个卷组可以给多个lv使用,在创建lv的时候,可以指定当前lv使用的空间有多大。如下命令,创建逻辑卷app,使用卷组user2G的大小。

    # lvcreate -L 2G -n app user
    
  4. 格式化并挂载lv

    执行fdisk -l查看分区情况,可以看到如下条目:

    # fdisk -l
    Disk /dev/mapper/user-app: 10.2 GB, 10234101760 bytes, 19988480 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    

    lvm的操作产生了如上的 分区:/dev/mapper/user-app , 我们对其进行格式化并挂载就可以使用了,本例中,我们使用xfs文件系统。

    # mkfs.xfs /dev/mapper/user-app
    meta-data=/dev/mapper/user-app   isize=512    agcount=4, agsize=624640 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=2498560, 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
    

    挂载硬盘

    # mount /dev/mapper/user-app /app
    # df -h
    Filesystem            Size  Used Avail Use% Mounted on
    devtmpfs              1.9G     0  1.9G   0% /dev
    tmpfs                 1.9G     0  1.9G   0% /dev/shm
    tmpfs                 1.9G  496K  1.9G   1% /run
    tmpfs                 1.9G     0  1.9G   0% /sys/fs/cgroup
    /dev/vda1              40G  3.0G   35G   8% /
    tmpfs                 379M     0  379M   0% /run/user/0
    /dev/mapper/user-app  9.6G   33M  9.5G   1% /app
    
  5. 扩展空间

    查看分区信息

    执行fdisk -l,可看到如下条目。其中/dev/vdb2是我要新扩展到lv:app里面去的分区。

    # fdisk -l
    Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x8b1332ff
    ​
       Device Boot      Start         End      Blocks   Id  System
    /dev/vdb1            2048    20000000     9998976+  83  Linux
    /dev/vdb2        20000768    41943039    10971136   83  Linux
    

    创建物理卷pv

    基于/dev/vdb2创建物理卷/dev/vdb2

    # pvcreate /dev/vdb2
    WARNING: ext4 signature detected on /dev/vdb2 at offset 1080. Wipe it? [y/n]: y
      Wiping ext4 signature on /dev/vdb2.
      Physical volume "/dev/vdb2" successfully created.
    

    扩展卷组

    把物理卷/dev/vdb2加入到卷组user里面

    # vgextend user /dev/vdb2
      Volume group "user" successfully extended
    

    扩展逻辑卷

    把逻辑卷/dev/user/app增大5G

    # lvdisplay
      --- Logical volume ---
      LV Path                /dev/user/app
      LV Name                app
      VG Name                user
      LV UUID                IFoazm-IbGi-zy2h-HXe9-DncI-2C2r-MOvvlt
      LV Write Access        read/write
      LV Creation host, time app1, 2022-05-07 11:04:01 +0800
      LV Status              available
      # open                 0
      LV Size                9.53 GiB
      Current LE             2440
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     8192
      Block device           252:0
    # lvextend -L +5G /dev/user/app
      Size of logical volume user/app changed from 9.53 GiB (2440 extents) to 14.53 GiB (3720 extents).
      Logical volume user/app successfully resized.
    

    调整实际的大小

    执行 xfs_growfs /dev/user/app命令扩展硬盘

    # xfs_growfs /dev/user/app
    meta-data=/dev/mapper/user-app   isize=512    agcount=4, agsize=624640 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0 spinodes=0
    data     =                       bsize=4096   blocks=2498560, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal               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 2498560 to 3809280
    #
    # df -h
    Filesystem            Size  Used Avail Use% Mounted on
    devtmpfs              1.9G     0  1.9G   0% /dev
    tmpfs                 1.9G     0  1.9G   0% /dev/shm
    tmpfs                 1.9G  496K  1.9G   1% /run
    tmpfs                 1.9G     0  1.9G   0% /sys/fs/cgroup
    /dev/vda1              40G  3.0G   35G   8% /
    tmpfs                 379M     0  379M   0% /run/user/0
    /dev/mapper/user-app   15G   33M   15G   1% /app
    

    如上可以看见,/app 的挂载已经由开始的9.6G扩展成为15G。

    备注1

    对xfs文件系统进行扩展使用xfs_growfs命令,对ext4等其他文件系统的扩展使用resize2fs命令

    备注2

    lvm创建磁盘挂载之前,需要先用磁盘格式化工具对磁盘进行格式选择,lvm1必须要设置磁盘格式为8e,lvm2可以使用默认的格式,也可以使用8e。

    备注3

    本例中,我在创建/dev/vdb2分区保存的时候,报了如下警告:

    WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    Syncing disks.
    

    fdisk -l命令能看到该分区,但是lsblk却看不到。

    # lsblk
    NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    vda          253:0    0   40G  0 disk 
    └─vda1       253:1    0   40G  0 part /
    vdb          253:16   0   20G  0 disk 
    └─vdb1       253:17   0  9.5G  0 part 
    └─user-app 252:0    0  9.5G  0 lvm  
    

    解决方法(二选其一或者都做,看具体情况)

    • 重启服务

    • 执行如下命令:

      # partprobe
      # lsblk
      NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
      vda          253:0    0   40G  0 disk 
      └─vda1       253:1    0   40G  0 part /
      vdb          253:16   0   20G  0 disk 
      ├─vdb1       253:17   0  9.5G  0 part 
      │ └─user-app 252:0    0  9.5G  0 lvm  
      └─vdb2       253:18   0 10.5G  0 part 
      

lv、vg、pv、删除操作以及空间压缩

注意:xfs文件系统,不能缩减空间。

注意:xfs文件格式,不能缩减空间。

注意:xfs文件格式,不能缩减空间。

空间压缩、释放

把逻辑卷/dev/user/app的空间压缩到5G

# lvreduce -L 5G /dev/mapper/user-app

把逻辑卷/dev/user/app的空间减少5G

# lvreduce -L -5G /dev/mapper/user-app

重装系统数据恢复

重装系统之后,以前通过lvm挂载的硬盘模式是不能用的

# mkdir /app
# mount /dev/user/app /app

需要做如下操作对vg进行激活:

# vgchange -ay user
# mount /dev/user/app /app
# df -h
文件系统              容量  已用  可用 已用% 挂载点
/dev/vda1              40G  1.9G   36G    6% /
devtmpfs              1.9G     0  1.9G    0% /dev
tmpfs                 1.9G     0  1.9G    0% /dev/shm
tmpfs                 1.9G  452K  1.9G    1% /run
tmpfs                 1.9G     0  1.9G    0% /sys/fs/cgroup
tmpfs                 379M     0  379M    0% /run/user/0
/dev/mapper/user-app   15G   33M   15G    1% /app

raid和lvm的区别

LVM主要侧重动态磁盘扩容

LVM是一个动态扩展磁盘分区容量的功能性工具,可以用来管理磁分区满了,扩容,但是在大规模环境性能低下,尽量不要使用它。

RAID主要侧重磁盘性能和数据安全

磁盘阵列可以把多个磁盘驱动器通过不同的连接方式连接在一起协同工作,大大提高了读取速度,同时把磁盘系统的可靠性提高到接近无错的境界,使其可靠性极高.

用RAID最直接的好处是:

  1. 提升数据安全性。
  2. 提升数据读写性能。
  3. 提供更大的单一逻辑磁盘数据容量存储。