##LVM是什么? LVM(Logical Volume Manager),即磁盘卷管理,是Linux环境下对磁盘分区进行管理的一种机制。通过LVM可以很方便的实现:
- 在线扩容
- 跨物理硬盘分区
- 在线迁移
- 快照
##LVM原理 LVM是磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。 LVM架构如下:
- 物理存储介质(PhysicalStorageMedia) 指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元。
- 物理卷(Physical Volume,PV) 指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
- 卷组(Volume Group,VG) 类似于非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷)。
- 逻辑卷(Logical Volume,LV) 类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。
- 线性逻辑卷 (Linear Volumes) 一个线性逻辑卷聚合多个物理卷成为一个逻辑卷.比如,如果你有两个60GB硬盘,你可以生成120GB的逻辑卷.
- 条块化的逻辑卷(Striped Logical Volumes) 当你写数据到此逻辑卷中时,文件系统可以将数据放置到多个物理卷中.对于大量连接读写操作,它能改善数据I/O效率.
- 镜像的逻辑卷(Mirrored Logical Volumes) 镜像在不同的设备上保存一致的数据.数据同时被写入原设备及镜像设备.它提供设备之间的容错。
- 快照卷(Snapshot Volumes) 快照卷提供在特定瞬间的一个设备虚拟映像,当快照开始时,它复制一份对当前数据区域的改变,由于它优先执行这些改变,所以它可以重构当前设备的状态。
- 物理块(Physical Extent,PE) 每一个物理卷PV被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成。所以每一个逻辑卷大小都是物理块的整数倍。
- 逻辑块(Logical Extent,LE) LVM抽象模型 逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
创建LVM
以下操作前请确定保存好硬盘中的数据。。。。
-
首先安装LVM(以Debian为例)
sudo apt-get install lvm2
-
将硬盘初始化为物理卷 在创建卷组前,首先要将硬盘初始化成物理卷已供LVM使用。
pvcreate /dev/sda /dev/sdb /dev/sdc2
可以通过pvdisplay或者pvs来查看已经创建的物理卷信息。
-
创建卷组 将已经创建的物理卷整合成为一个卷组
vgcreate mydisk /dev/sda /dev/sdb /dev/sdc2
vgcreate可以通过-s选项来改变PE的默认大小,大小必须是2的阶乘,最小为1kb。 同样可以通过vgdisplay和vgs来查看卷组信息。 可以发现/dev/多了一个mydisk文件夹 -
创建逻辑卷
lvcreate -n MyRoot -L +14G mydisk
这样就创建了名字为MyRoot的逻辑卷,块设备文件默认为/dev/mydisk/MyRoot(其是一个连接,指向/dev/mapper/的同名文件)。 同样可以使用lvs和lvdisplay来查看逻辑卷的情况。
PS 如果过需要条块化,请参阅7
-
在逻辑卷上创建分区 逻辑卷创建完成后就可以当成普通的块文件来使用。
mkfs.ext4 /dev/mydisk/MyRoot
-
挂载使用 挂载到合适的位置。
mount /dev/mydisk/MyRoot/ /mnt/MySecret
-
条块化I/O LVM条块化是LVM功能之一,该技术会跨多个磁盘写入数据,而不是对单一物理卷持续写入。条块化优点如下:
- 它会改善磁盘性能。
- 避免对单一硬盘的不断的大量写入。
- 使用对多个硬盘的条块化写入,可以减少硬盘填满的几率。
创建lv的时候可以加上-i[number]选项就可以使用条块化方法,如果需要可以使用-I选项声明条块尺寸,同样必须是2的阶乘,但是不能超过PE的大小。
##LVM的伸展 LVM可以实现在线扩大分区容量,也就是说,如果分区的空间不够用了,可以随时扩大而不用下线。 从下至上
-
初始化要添加的物理分区或硬盘,同上。
-
扩展卷组 将一个硬盘或者物理分区添加到卷组之中。
vgextend mydisk /dev/sdd
-
扩展逻辑卷 扩大逻辑卷
lvextend -L +1G /dev/mydisk/MyRoot
注意扩大的单位可以使用一定不要超过VG的剩余空间。 -
更新文件系统
resizefs /dev/mydisk/MyRoot #ext2、ext3、ext4
xfs_growfs /dev/mydisk/MyRoot #XFS
简单而优雅。
##LVM的缩小 LVM缩小操作必须离线,而且一定要备份数据 相比伸展,LVM的缩小操作就有一定的风险了,一定要小心。 自上而下
- 卸载LV
umount /mnt/MySecret
- 缩小文件系统
resize2fs /dev/mydisk/MyRoot 1G #将文件系统改变为1G,请确定已存在的文件体积小于1G
- 检查文件系统
e2fsck -f /dev/mydisk/MyRoot
- 缩小LV
lvreduce -L -1G /dev/mydisk/MyRoot #将MyRoot缩小成1G
- 重新挂载
mount /dev/mydisk/MyRoot /mnt/MySecret
一定要小心谨慎。。
##缩小卷组 缩小卷组其实就是将物理硬盘移出卷组,移出前一定要保证移出的物理硬盘是空的。如果使用了条块化I/O的化,备份数据吧(求大神指教)。 vgreduce mydisk /dev/sda
vgreduck -a mydisk #自动移除空的卷
##删除LVM 由上至下。。
1.删除LV lvremove /dev/mydisk/MyRoot
2.删除VG vgremove mydisk 3.删除PV
pvremove /dev/sda`
##LVM快照
LVM快照是以空间换时间时间的方式制作的lvm卷副本。它只在lvm中工作,并只在源逻辑卷发生改变时占用快照卷的空间。如果源卷的变化达到1GB这么大,快照卷同样也会产生这样大的改变。因而,对于空间有效利用的最佳途径,就是总是进行小的修改。如果快照将存储空间消耗殆尽,我们可以使用lvextend来扩容。而如果我们需要缩减快照所占用卷的大小,可以使用lvreduce。
说白了快照就是保存变化前的文件,所以快照不能用于备份,它并不是完整的副本,所以当遇到硬盘物理损坏等非正常状况是无法恢复的。
步骤:
- 查看卷组中是否有足够剩余空间(
vgdisplay
信息里的Free PE/Size项)来创建快照,没有的话请参考上面扩容部分扩容。
2.创建快照
lvcreate --size 1G --snapshot --name my_snap /dev/mydisk/MyRoot
-
验证快照 使用
lvs
查看,会发现多了一个my_snap,而它的origin栏对应着MyRoot,这就是存放快照的卷,可以通过df -Th
来查看占用的空间。 -
扩充快照 在使用过程中可能发生空间不够用的情况,这时候请一定在空间占慢前扩充快照的空间,也就是其逻辑卷的空间(参考上文)。
-
快照恢复 恢复操作是无法在线的。 首先要卸载要回复的物理卷,然后在进行合并操作。
umount /mnt/MyRoot lvconvert --merge /dev/mydisk/my_snap
在合并完成后,快照卷将被自动移除。
##LVM迁移
LVM迁移是LVM众多优秀特性之一,通过它,我们可以迁移逻辑卷到一个新的磁盘而不会丢失数据,也不用关机操作。该特性的功能是将数据从旧磁盘移动到新磁盘。通常,我们只是在一些磁盘发生错误时,才将数据从一个磁盘迁移到另外一个磁盘存储。 特点:
- 将逻辑卷从一个磁盘移动到另一个磁盘。
- 我们可以使用任何类型的磁盘,如SATA、SSD、SAS、SAN storage iSCSI或者FC。
- 在线迁移磁盘,而且数据不会丢失。
###方法一:
- 确认磁盘状况,确定要将数据从那个硬盘迁移,迁移到那个硬盘。 通过
df -h
和lvdisplay
和vgdisplay
查看磁盘和LVM状态
2.在要迁移到的硬盘/分区上创建物理卷
`pvcreate /dev/sdc1`
-
添加到已有卷组
` vgextend mydisk /dev/sdc1` `vgs`
-
创建镜像到新物理卷
`lvconvert -m 1 /dev/mydisk/MyRoot /dev/sdc1`
-m为--mirror的缩写,数字是表示镜像份数,过程时间稍长。。
-
验证镜像
lvs -o+devices
-
删除原镜像 这时候MyRoot对应者/dev/sdc1的镜像和对应原来的多个物理卷组成的镜像。要将原来的移除,要先删除原来的镜像
lvconvert -m 0 /dev/mydisk/MyRoot
0即移除。
- 将MyRoot从vg中移除,参考上面的删除lv
###方法2 方法一第三步往后:直接使用`pvmove /dev/mydisk/MyRoot /dev/sdc1 方法一的意义在于,服务器环境LVM一般会有很多镜像,类似raid 1,直接创建镜像要快的多。(听人说的,待确定)