如果对于生产环境下的服务器来说,如果存储数据的分区磁盘空间不够了怎么办?
因为如果要把一个分区的内容都拷贝到另一个分区上去,势必要首先卸载掉之前的那个分区,然后*对整个分区进行拷贝,如果服务器上运行着一个重要的服务,比如说WWW或者FTP,其要求是 7*24 小时运行正常的,那么卸载掉分区这是不可想象的,同时如果该分区保存的内容非常非常的多,那么在对分区进行转移时时间可能会耗费很久,所以,这个时候我们就会受到传统磁盘管理的限制,因为其不能够进行动态的磁盘管理。因此,为了解决这个问题,LVM技术就诞生了!!!
LVM(Logicalvolume Manager)是逻辑卷管理的简称。它是Linux环境下对磁盘分区进行管理的一种机制。现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制,对于其它的类UNIX操作系统,以及windows操作系统都有类似与LVM这种磁盘管理软件。
LVM的工作原理:
它就是通过将底层的物理硬盘封装起来,然后以逻辑卷的方式呈现给上层应用。在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。
LVM最大的特点:
可以对磁盘进行动态管理:因为逻辑卷的大小是可以动态调整的,而且不会丢失现有的数据。
我们如果新增加了硬盘,其也不会改变现有上层的逻辑卷。
作为一个动态磁盘管理机制,逻辑卷技术大大提高了磁盘管理的灵活性!!!
LVM 常用的术语:
PV(Physical Volume),物理卷
PE(Physical Extend),我们的LVM磁盘管理中PE的默认大小是4M大小,其实PE就是我们逻辑卷管理的最基本单位。比如说我有一个400M的硬盘,那么在将其格式化成PV的时候,其实际就是将这块物理硬盘划分成了100个的PE,因为PE默认的大小就是4M。
VG即卷组 作用就是用来装PE的,我们可以把一个或者多个PV加到VG当中
LV(Logical Volume),所以第三步操作就是基于VG来创建我们最终要使用的LV。
创建LVM的基本步骤:
1)物理磁盘被格式化为PV,(空间被划分为一个个的PE) #PV包含PE
(2)不同的PV加入到同一个VG中,(不同PV的PE全部进入到了VG的PE池内) #VG包含PV
(3)LV基于PE创建,(组成LV的PE可能来自不同的物理磁盘) #LV基于PV创建
(4)LV直接可以格式化后挂载使用 #格式化挂载使用
(5)LV的扩充缩减实际上就是增加或减少组成该LV的PE数量,其过程不会丢失原始数据
lvm常用的命令
功能 PV管理命令 VG管理命令 LV管理命令
scan扫描 pvscan vgscan lvscan
create创建 pvcreate vgcreate lvcreate
display显示 pvdisplay vgdisplay lvdisplay
remove移除 pvremove vgremove lvremove
extend扩展 vgextend lvextend
reduce减少 vgreduce lvreduce
实战
[root@RHEL7 ~]# date
Sat Aug 20 20:39:15 CST 2016
[root@RHEL7 ~]# pvcreate /dev/sdc1 /dev/sdc2
Physical volume "/dev/sdc1" successfully created
Physical volume "/dev/sdc2" successfully created
[root@RHEL7 ~]#
[root@RHEL7 ~]# vgcreate vgtest /dev/sdc1 /dev/sdc2
Volume group "vgtest" successfully created
创建LV
lvcreate -n 指定逻辑卷名称 -L 指定大小
[root@RHEL7 ~]# lvcreate -n lvtest -L 100M vgtest
Logical volume "lvtest" created
[root@RHEL7 ~]# ls /dev/vgtest/lvtest
/dev/vgtest/lvtest
格式化LV
[root@RHEL7 ~]# mkfs.xfs /dev/vgtest/lvtest
meta-data=/dev/vgtest/lvtest isize=256 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=853, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@RHEL7 ~]#
挂载
[root@RHEL7 ~]# mkdir /lvdisk
[root@RHEL7 ~]# mount /dev/vgtest/lvtest /lvdisk
[root@RHEL7 ~]# df -h | tail -1
/dev/mapper/vgtest-lvtest 97M 5.2M 92M 6% /lvdisk
[root@RHEL7 ~]#
[root@RHEL7 ~]# cd /lvdisk/
[root@RHEL7 lvdisk]# dd if=/dev/zero of=lv.txt bs=2M count=50
dd: error writing ‘lv.txt’: No space left on device
46+0 records in
45+0 records out
95936512 bytes (96 MB) copied, 0.66916 s, 143 MB/s
[root@RHEL7 lvdisk]# du /lvdisk/lv.txt
93688 /lvdisk/lv.txt
[root@RHEL7 lvdisk]#
查看PV信息
[root@RHEL7 lvdisk]# pvdisplay
--- Physical volume ---
PV Name /dev/sdc1
VG Name vgtest
PV Size 95.00 MiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 23
Free PE 23
Allocated PE 0
PV UUID L6mWDE-0cek-zMWQ-8jiZ-IS1O-bVn0-hGs8Fu
--- Physical volume ---
PV Name /dev/sdc2
VG Name vgtest
PV Size 191.00 MiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 47
Free PE 22
Allocated PE 25
PV UUID cbV60E-zrNB-FV6a-pIFX-JTb2-ZFNo-S3u5jE
查看VG卷信息
[root@RHEL7 lvdisk]# vgdisplay
--- Volume group ---
VG Name rhel
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 10.75 GiB
PE Size 4.00 MiB
Total PE 2751
Alloc PE / Size 2750 / 10.74 GiB
Free PE / Size 1 / 4.00 MiB
VG UUID hjnlV1-hW10-AaJc-s0eS-mdnh-obfZ-EY2miG
--- Volume group ---
VG Name vgtest
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 280.00 MiB
PE Size 4.00 MiB
Total PE 70
Alloc PE / Size 25 / 100.00 MiB
Free PE / Size 45 / 180.00 MiB
VG UUID rSEMrZ-IfzS-jsyX-p4Ei-qTPV-ni7V-u7MGLu
VG扩容
[root@RHEL7 lvdisk]# pvcreate /dev/sdb1
[root@RHEL7 lvdisk]# partprobe /dev/sdb
[root@RHEL7 lvdisk]# vgextend vgtest /dev/sdb1
Volume group "vgtest" successfully extended
[root@RHEL7 lvdisk]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- 10.75g 4.00m
/dev/sdb1 vgtest lvm2 a-- 10.00g 10.00g
/dev/sdc1 vgtest lvm2 a-- 92.00m 92.00m
/dev/sdc2 vgtest lvm2 a-- 188.00m 88.00m
LV扩容
[root@RHEL7 lvdisk]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/rhel-root xfs 9.8G 3.3G 6.5G 34% /
devtmpfs devtmpfs 908M 0 908M 0% /dev
tmpfs tmpfs 914M 80K 914M 1% /dev/shm
tmpfs tmpfs 914M 8.9M 905M 1% /run
tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 xfs 197M 91M 106M 47% /boot
/dev/mapper/vgtest-lvtest xfs 109M 97M 12M 89% /lvdisk
[root@RHEL7 lvdisk]# lvextend -L +100MB /dev/vgtest/lvtest
Extending logical volume lvtest to 212.00 MiB
Logical volume lvtest successfully resized
[root@RHEL7 lvdisk]# xfs_growfs /lvdisk/
meta-data=/dev/mapper/vgtest-lvtest isize=256 agcount=5, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=28672, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=853, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 28672 to 54272
[root@RHEL7 lvdisk]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/rhel-root xfs 9.8G 3.3G 6.5G 34% /
devtmpfs devtmpfs 908M 0 908M 0% /dev
tmpfs tmpfs 914M 80K 914M 1% /dev/shm
tmpfs tmpfs 914M 8.9M 905M 1% /run
tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 xfs 197M 91M 106M 47% /boot
/dev/mapper/vgtest-lvtest xfs 209M 97M 112M 47% /lvdisk
移除VG
[root@RHEL7 lvdisk]# vgreduce vgtest /dev/sdb1
Removed "/dev/sdb1" from volume group "vgtest"
[root@RHEL7 lvdisk]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- 10.75g 4.00m
vgtest 2 1 0 wz--n- 280.00m 68.00m
[root@RHEL7 lvdisk]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- 10.75g 4.00m
/dev/sdb1 lvm2 a-- 10.00g 10.00g
/dev/sdc1 vgtest lvm2 a-- 92.00m 68.00m
/dev/sdc2 vgtest lvm2 a-- 188.00m 0
删除LVM:先删除lv,再删除vg,再删除pv
[root@RHEL7 lvdisk]# umount /lvdisk/
umount: /lvdisk: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
[root@RHEL7 lvdisk]# cd
[root@RHEL7 ~]# umount /lvdisk/
[root@RHEL7 ~]# lvremove /dev/vgtest/lvtest
Do you really want to remove active logical volume lvtest? [y/n]: y
Logical volume "lvtest" successfully removed
[root@RHEL7 ~]# vgremove vgtest
Volume group "vgtest" successfully removed
[root@RHEL7 ~]# pvremove /dev/sdc1 /dev/sdc2
Labels on physical volume "/dev/sdc1" successfully wiped
Labels on physical volume "/dev/sdc2" successfully wiped
LVM快照
先准备一个LV
[root@RHEL7 ~]# pvcreate /dev/sdc
Physical volume /dev/sdc not found
Device /dev/sdc not found (or ignored by filtering).
[root@RHEL7 ~]# pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created
[root@RHEL7 ~]# vgcreate vgtest /dev/sdc1
Volume group "vgtest" successfully created
[root@RHEL7 ~]# lvcreate -n lvtest -L 50M vgtest
Rounding up size to full physical extent 52.00 MiB
Logical volume "lvtest" created
[root@RHEL7 ~]#
格式化LV
[root@RHEL7 ~]# mkfs.xfs /dev/vgtest/lvtest
meta-data=/dev/vgtest/lvtest isize=256 agcount=2, agsize=6656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=13312, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=853, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@RHEL7 ~]# mkdir /lvdisk
[root@RHEL7 ~]# mount /dev/vgtest/lvtest /lvdisk/
[root@RHEL7 ~]# df -h | tail -1
/dev/mapper/vgtest-lvtest 49M 2.7M 46M 6% /lvdisk
创建一个文件来测试
[root@RHEL7 ~]# cd /lvdisk/
[root@RHEL7 lvdisk]# touch test.txt
[root@RHEL7 lvdisk]# ls
test.txt
[root@RHEL7 lvdisk]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- 10.75g 4.00m
vgtest 1 1 0 wz--n- 92.00m 40.00m
[root@RHEL7 lvdisk]#
转载于:https://blog.51cto.com/andyliu/1840905