写在前面:
博客书写牢记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