写在前面:

    博客书写牢记5W1H法则:What,Why,When,Where,Who,How。


本篇主要内容:

● LVM基本介绍

● LVM结构

● LVM命令工具

    pv ...

    vg ...

    lv ...




LVM基本介绍

   Logical Volume Manager (version2)

   LVM功能是由内核模块dm(device mapper)提供的,该模块能够将一个或多个底层设备组织成一个逻辑设备。设备具体目录在/dev/dm-#


LVM设备路径:

   /dev/mapper/VG_NAME-LV_NAME 为链接文件,指向dm模块生成的设备。

   /dev/VG_NAME/LV_NAME  为链接文件,指向dm模块生成的设备。


特点;

   (1)可屏蔽底层磁盘布局,便于动态调整磁盘容量

   (2)可将多个磁盘或分区组合成一个大的“虚拟磁盘”,整合零散空间。并可在将来进行磁盘或分区的新增与移除。

   (3)通过快照,可以实现COW(Copy On Write)。以方便在挂载的情况下完成备份等操作。

   (4)/boot分区不能放置在LVM。


LVM结构:

   LVM是由3层结构组成的。

   PV(Physical Volume):将独立的磁盘或分区标记为物理卷,以备上层使用。

   VG(Volume Group):将PV进行整合,形成一个大的“虚拟磁盘”。隐藏物理差别,格式化最小单位为PE(Physical Expend),默认PE大小为4MB

   LV(Logical Volume):类似于分区之于磁盘,LV也相当于VG的分区,创建LV之后就可以格式化使用了。


命令工具:

   PV:

      pvcreate 

         pvcreate /dev/DEVICE 创建PV

      pvs

         简要显示pv列表及使用情况

      pvdisplay

         显示pv详细信息

      pvmove 

         pvmove FROM_PV TO_PV 移动PV上的数据到另一个PV上

      pvremove

         pvremove /dev/DEVICE 删除PV设备

   VG:

      vgcreate

         vgcreate VG_NAME [-s #[KMGT]] /dev/DEVICE 创建vg,-s指定PE大小

      vgs

      vgdisplay

      vgremove

      vgextend

         vgextend VG_NAME /dev/DEVICE 扩展vg容量,添加PV

      vgreduce

         vgreduce VG-NAME /dev/DEVICE 缩减vg容量,移除PV

   LV:

      lvcreate

         lvcreate -L SIZE -n LV_NAME VG_NAME

         lvcreate -L SIZE -p r -s -n LV_NAME VG_NAME 创建快照LV卷,权限为只读。

      lvs

      lvdisplay

      lvremove

      lvextend

         lvextend -L [+]SIZE /dev/VG_NAME/LV_NAME

      lvreduce

         lvreduce -L [-]SIZE /dev/VG_NAME/LV_NAME


备份介绍:

   冷备份:卸载文件系统,不能读写。

   温备份:不卸载文件系统,可读,不可写。

   热备份:不卸载文件系统,可读写。


LV的扩展:

   扩展应该由底层到高层,从PV --> VG --> LV --> 文件系统层层操作。可以在挂载的同时操作。


LV的缩减:

   缩减操作应该先卸载文件系统,由高层到底层,从文件系统 --> LV --> VG --> PV层层操作,直到最后移除硬盘。


LV的快照:

   LV快照支持挂载文件系统的情况下进行操作,保证业务不中断。但对于频繁写入的文件系统,应先停止所有写操作(如数据库进行锁操作),而后快速执行快照,再恢复业务。快照期间,频繁的写入可能会影响写入速度,完成备份等操作后,应及时删除快照卷。



创建LVM并挂载使用

  #fdisk工具创建2个分区,分区大小分别为15G和5G,并指定标识符为8e(Linux LVM)
[root@localhost ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0      2:0    1    4K  0 disk 
sda      8:0    0  120G  0 disk 
├─sda1   8:1    0  500M  0 part /boot
├─sda2   8:2    0   40G  0 part /
├─sda3   8:3    0   20G  0 part /usr
├─sda4   8:4    0    1K  0 part 
├─sda5   8:5    0   15G  0 part 
└─sda6   8:6    0    5G  0 part 
sr0     11:0    1 1024M  0 rom  
  #使用分区创建pv
[root@localhost ~]# pvcreate /dev/sda5
  Physical volume "/dev/sda5" successfully created
[root@localhost ~]# pvcreate /dev/sda6
  Physical volume "/dev/sda6" successfully created

  #使用已划分为pv的分区创建vg
[root@localhost ~]# vgcreate TESTVG -s 16M /dev/sda{5,6}
  Volume group "TESTVG" successfully created
  #在刚创建的vg上创建lv,大小为5G
root@localhost ~]# lvcreate -L 5G -n TESTLV TESTVG
WARNING: swap signature detected on /dev/TESTVG/TESTLV at offset 4086. Wipe it? [y/n]: y
  Wiping swap signature on /dev/TESTVG/TESTLV.
  Logical volume "TESTLV" created.
  #格式化LV为ext4文件类型,块大小为4K,卷标为TESTLV
[root@localhost ~]# mke2fs -L TESTLV -b 4096 -t ext4 /dev/TESTVG/TESTLV
...省略输出...
  #挂载并设置开机挂载到/users目录
[root@localhost ~]# mkdir /users
[root@localhost ~]# mount /dev/TESTVG/TESTLV /users
[root@localhost ~]# blkid /dev/TESTVG/TESTLV
/dev/TESTVG/TESTLV: LABEL="TESTLV" UUID="a23cfb47-1e13-44d8-80ac-6081b7371abd" TYPE="ext4" 
[root@localhost ~]# vim /etc/fstab  #添加以下内容:
UUID=a23cfb47-1e13-44d8-80ac-6081b7371abd /users                  ext4    defaults        0 0
  #一定使用mount -a检查下/etc/fstab文件是否正确。如果正确,会挂载文件中设置的所有条目,否则,会提示错误。
[root@localhost ~]# mount -a
[root@localhost ~]# mount | grep /users
/dev/mapper/TESTVG-TESTLV on /users type ext4 (rw,relatime,seclabel,data=ordered)


  #尝试写入数据,我们这里新建用户archlinux并让/users/archlinux作为其家目录
[root@localhost ~]# useradd archlinux -d /users/archlinux
[root@localhost ~]# su - archlinux
[archlinux@localhost ~]$ cp /etc/pam.d/* /users/archlinux/


  #扩展TESTLV至7G

[root@localhost ~]# lvextend -L 7G /dev/TESTVG/TESTLV
  Size of logical volume TESTVG/TESTLV changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents).
  Logical volume TESTLV successfully resized.
  #扩展ext4文件系统与LV一致
[root@localhost ~]# resize2fs /dev/TESTVG/TESTLV 
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/TESTVG/TESTLV is mounted on /users; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/TESTVG/TESTLV is now 1835008 blocks long.
  #查看块设备已扩展到7G,挂载目录的数据未丢失
[root@localhost ~]# lsblk 
NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0                 2:0    1    4K  0 disk 
sda                 8:0    0  120G  0 disk 
├─sda1              8:1    0  500M  0 part /boot
├─sda2              8:2    0   40G  0 part /
├─sda3              8:3    0   20G  0 part /usr
├─sda4              8:4    0    1K  0 part 
├─sda5              8:5    0   15G  0 part 
│ └─TESTVG-TESTLV 253:0    0    7G  0 lvm  /users
└─sda6              8:6    0    5G  0 part 
sr0                11:0    1 1024M  0 rom  
[root@localhost ~]# ls /users/archlinux/
atd                  gdm-launch-environment  password-auth     setup              system-auth
chfn                 gdm-password            password-auth-ac  smartcard-auth     system-auth-ac
chsh                 gdm-pin                 polkit-1          smartcard-auth-ac  systemd-user
config-util          gdm-smartcard           postlogin         smtp               vlock
crond                kcheckpass              postlogin-ac      smtp.postfix       vmtoolsd
cups                 kscreensaver            ppp               sshd               xserver
fingerprint-auth     liveinst                remote            su
fingerprint-auth-ac  login                   runuser           sudo
gdm-autologin        other                   runuser-l         sudo-i
gdm-fingerprint      passwd                  screen            su-l


  #缩减TESTLV的大小至3G。缩减前请一定确定已使用空间要小于缩减后的空间。

[root@localhost ~]# umount /dev/TESTVG/TESTLV 
  #在调整文件系统大小前,需要先检查设备是否有文件系统错误
[root@localhost ~]# e2fsck -f /dev/TESTVG/TESTLV 
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
TESTLV: 70/458752 files (0.0% non-contiguous), 67386/1835008 blocks
  #调整文件系统大小
[root@localhost ~]# resize2fs /dev/TESTVG/TESTLV 3G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/TESTVG/TESTLV to 786432 (4k) blocks.
The filesystem on /dev/TESTVG/TESTLV is now 786432 blocks long.

  #调整LV大小,会有安全风险,重要数据需备份
[root@localhost ~]# lvreduce -L 3G /dev/TESTVG/TESTLV 
  WARNING: Reducing active logical volume to 3.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce TESTLV? [y/n]: y
  Size of logical volume TESTVG/TESTLV changed from 7.00 GiB (448 extents) to 3.00 GiB (192 extents).
  Logical volume TESTLV successfully resized.
  #重新挂载,庆幸的是文件都还在
[root@localhost ~]# mount -a
[root@localhost ~]# ls /users/archlinux/
atd                  gdm-launch-environment  password-auth     setup              system-auth
chfn                 gdm-password            password-auth-ac  smartcard-auth     system-auth-ac
chsh                 gdm-pin                 polkit-1          smartcard-auth-ac  systemd-user
config-util          gdm-smartcard           postlogin         smtp               vlock
crond                kcheckpass              postlogin-ac      smtp.postfix       vmtoolsd
cups                 kscreensaver            ppp               sshd               xserver
fingerprint-auth     liveinst                remote            su
fingerprint-auth-ac  login                   runuser           sudo
gdm-autologin        other                   runuser-l         sudo-i
gdm-fingerprint      passwd                  screen            su-l


  #释放设备/分区

  #分配了20G的VG,只使用了不到1G,我们来把15G的/dev/sda5释放出来。
[root@localhost ~]# lsblk
NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0                 2:0    1    4K  0 disk 
sda                 8:0    0  120G  0 disk 
├─sda1              8:1    0  500M  0 part /boot
├─sda2              8:2    0   40G  0 part /
├─sda3              8:3    0   20G  0 part /usr
├─sda4              8:4    0    1K  0 part 
├─sda5              8:5    0   15G  0 part 
│ └─TESTVG-TESTLV 253:0    0    3G  0 lvm  /users
└─sda6              8:6    0    5G  0 part 
sr0                11:0    1 1024M  0 rom 
  #由于LV只有3G,而我们将要剩余的/dev/sda6有5G空间,所以,文件系统我们无需再缩减;但我们看到TESTLV的数据都在/dev/sda5上面,直接从VG移除/dev/sda5必然会损失数据,所以,我们先将/dev/sda5上的数据移动到/dev/sda6上面。
[root@localhost ~]# pvmove /dev/sda5 /dev/sda6
  /dev/sda5: Moved: 0.0%
  /dev/sda5: Moved: 12.0%
  /dev/sda5: Moved: 25.0%
  /dev/sda5: Moved: 37.5%
  /dev/sda5: Moved: 46.4%
  /dev/sda5: Moved: 57.8%
  /dev/sda5: Moved: 72.9%
  /dev/sda5: Moved: 100.0%
[root@localhost ~]# lsblk
NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0                 2:0    1    4K  0 disk 
sda                 8:0    0  120G  0 disk 
├─sda1              8:1    0  500M  0 part /boot
├─sda2              8:2    0   40G  0 part /
├─sda3              8:3    0   20G  0 part /usr
├─sda4              8:4    0    1K  0 part 
├─sda5              8:5    0   15G  0 part 
└─sda6              8:6    0    5G  0 part 
  └─TESTVG-TESTLV 253:0    0    3G  0 lvm  /users
sr0                11:0    1 1024M  0 rom  
  #OK,把/dev/sda6从TESTVG移除,移除此PV
[root@localhost ~]# vgreduce TESTVG /dev/sda5
  Removed "/dev/sda5" from volume group "TESTVG"
[root@localhost ~]# pvremove /dev/sda5
  Labels on physical volume "/dev/sda5" successfully wiped
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sda6  TESTVG lvm2 a--  4.98g 1.98g


  #为LV创建快照。

  #注意养成好习惯,在快照创建时,就应该设置为只读!快照建立前,首先要确保并没有程序正在写入操作。避免数据不完整

[root@localhost ~]# lvcreate -L 1G -s -p r -n TESTLV_SNAPSHOT /dev/TESTVG/TESTLV
  Logical volume "TESTLV_SNAPSHOT" created.
  #挂载LV快照快照,验证在原LV新建数据,快照LV仍为快照时刻的数据
[root@localhost ~]# mount /dev/TESTVG/TESTLV_SNAPSHOT /backup
mount: /dev/mapper/TESTVG-TESTLV_SNAPSHOT is write-protected, mounting read-only
[root@localhost ~]# echo "new file" > /users/archlinux/newfile
[root@localhost ~]# ls /users/archlinux/newfile 
/users/archlinux/newfile
[root@localhost ~]# ls /backup/archlinux/newfile
ls: cannot access /backup/archlinux/newfile: No such file or directory

  #数据备份完成后,卸载LV快照
[root@localhost ~]# umount /dev/TESTVG/TESTLV_SNAPSHOT 
[root@localhost ~]# lvremove /dev/TESTVG/TESTLV_SNAPSHOT 
Do you really want to remove active logical volume TESTLV_SNAPSHOT? [y/n]: y
  Logical volume "TESTLV_SNAPSHOT" successfully removed