一、LVM简述
LVM(Logical Volume Manager),即逻辑卷管理,它是Linux环境下对磁盘分区进行管理的一种机制。
我们知道,物理磁盘或分区之间是分隔的,数据无法跨盘或分区,而各磁盘或分区的大小固定,重新调整比较麻烦。LVM可以将这些底层的物理磁盘或分区整合起来,抽象成容量资源池,以划分成逻辑卷的方式供上层使用,其最主要的功能即是可以在无需关机无需重新格式化(准确地说,原来的部分无需格式化,只格式化新增的部分)的情况下弹性调整逻辑卷的大小。
二、LVM的实现过程
LVM结构图
①将各物理磁盘或分区的系统类型设为Linux LVM,其system ID为8e,通过fdisk工具中的t命令设置
[root@localhost ~]# fdisk /dev/sda ... Command (m for help): n First cylinder (1593-3916, default 1593): Using default value 1593 Last cylinder, +cylinders or +size{K,M,G} (1593-3916, default 3916): +5G ... Command (m for help): t Partition number (1-6): 5 Hex code (type L to list codes): 8e # 指定system ID为8e Changed system type of partition 5 to 8e (Linux LVM) ... Command (m for help): p ... /dev/sda5 1593 2246 5252227+ 8e Linux LVM /dev/sda6 2247 2900 5253223+ 8e Linux LVM /dev/sda7 2901 3554 5253223+ 8e Linux LVM Command (m for help): w ... [root@localhost ~]# partx -a /dev/sda ... [root@localhost ~]# kpartx -af /dev/sda ...
②将各物理磁盘或分区初始化为PV(physical volume,物理卷),这一阶段可使用的命令为pvcreate、pvremove、pvscan、pvdisplay(pvs)
■pvcreate:创建物理卷
用法:pvcreate [option] DEVICE
选项:
-f:强制创建逻辑卷,不需用户确认
-u:指定设备的UUID
-y:所有问题都回答yes
例 pvcreate /dev/sda5 /dev/sda6
■pvscan:扫描当前系统上的所有物理卷
用法:pvscan [option]
选项:
-e:仅显示属于输出卷组的物理卷
-n:仅显示不属于任何卷组的物理卷
-u:显示UUID
■pvdisplay:显示物理卷的属性
用法:pvdisplay [PV_DEVICE]
■pvremove:将物理卷信息删除,使其不再被视为一个物理卷
用法:pvremove [option] PV_DEVICE
选项:
-f:强制删除
-y:所有问题都回答yes
例 pvremove /dev/sda5
[root@localhost ~]# pvcreate /dev/sda{5,6,7} # 将三个分区初始化为物理卷 Physical volume "/dev/sda5" successfully created Physical volume "/dev/sda6" successfully created Physical volume "/dev/sda7" successfully created [root@localhost ~]# pvscan PV /dev/sda5 lvm2 [5.01 GiB] PV /dev/sda6 lvm2 [5.01 GiB] PV /dev/sda7 lvm2 [5.01 GiB] Total: 3 [15.03 GiB] / in use: 0 [0 ] / in no VG: 3 [15.03 GiB] [root@localhost ~]# pvdisplay /dev/sda5 # 显示物理卷sda5的详细信息 "/dev/sda5" is a new physical volume of "5.01 GiB" --- NEW Physical volume --- PV Name /dev/sda5 VG Name PV Size 5.01 GiB Allocatable NO PE Size 0 # 由于PE是在VG阶段才划分的,所以此处看到的都是0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID lrNOS3-8U21-ZS8o-eyKH-HqPn-DLhX-W1ppl4 [root@localhost ~]# pvremove /dev/sda7 # 删除sda7的物理卷信息 Labels on physical volume "/dev/sda7" successfully wiped [root@localhost ~]# pvscan # 可以看到PV列表中已无sda7 PV /dev/sda5 VG myvg lvm2 [5.01 GiB / 5.01 GiB free] PV /dev/sda6 VG myvg lvm2 [5.01 GiB / 5.01 GiB free] [root@localhost ~]# pvcreate /dev/sda7 Physical volume "/dev/sda7" successfully created
③创建VG(volume group,卷组)。卷组将多个物理卷整合起来(屏蔽了底层细节),并划分PE(physical extend)。PE是物理卷中的最小存储单元,有点类似于文件系统中的block,PE大小可指定,默认为4M。这一阶段用到的命令有vgcreate、vgscan、vgdisplay、vgextend、vgreduce
■vgcreate:创建卷组
用法:vgcreate [option] VG_NAME PV_DEVICE
选项:
-s:卷组中的物理卷的PE大小,默认为4M
-l:卷组上允许创建的最大逻辑卷数
-p:卷级中允许添加的最大物理卷数
例 vgcreate -s 8M myvg /dev/sda5 /dev/sda6
■vgscan:查找系统中存在的LVM卷组,并显示找到的卷组列表
■vgdisplay:显示卷组属性
用法:vgdisplay [option] [VG_NAME]
选项:
-A:仅显示活动卷组的信息
-s:使用短格式输出信息
■vgextend:动态扩展LVM卷组,它通过向卷组中添加物理卷来增加卷组的容量
用法:vgextend VG_NAME PV_DEVICE
例 vgextend myvg /dev/sda7
■vgreduce:通过删除LVM卷组中的物理卷来减少卷组容量,不能删除LVM卷组中剩余的最后一个物理卷
用法:vgreduce VG_NAME PV_DEVICE
■vgremove:删除卷组,其上的逻辑卷必须处于离线状态
用法:vgremove [-f] VG_NAME
-f:强制删除
■vgchange:常用来设置卷组的活动状态
用法:vgchange -a n/y VG_NAME
-a n为休眠状态,休眠之前要先确保其上的逻辑卷都离线;
-a y为活动状态
[root@localhost ~]# vgcreate -s 8M myvg /dev/sda{5,6} # 使用sda5、sda6创建卷组,指定PE大小为8M Volume group "myvg" successfully created [root@localhost ~]# vgscan Reading all physical volumes. This may take a while... Found volume group "myvg" using metadata type lvm2 [root@localhost ~]# vgdisplay # 查看卷组详细信息 --- Volume group --- VG Name myvg System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 1 VG Access read/write # 可读写 VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 10.02 GiB # 卷组容量 PE Size 8.00 MiB Total PE 1282 # PE总数 Alloc PE / Size 0 / 0 # 分配的容量 Free PE / Size 1282 / 10.02 GiB # 空闲的容量 VG UUID 5zBY8e-5Cgc-HqSo-BOiZ-02NX-77ON-NJSCbN
④在卷组上创建LV(logical volume,逻辑卷)。为了便于管理,逻辑卷对应的设备文件保存在卷组目录下,为/dev/VG_NAME/LV_NAME。LV中可以分配的最小存储单元称为LE(logical extend),在同一个卷组中,LE的大小和PE是一样的,且一一对应。这一阶段用到的命令有lvcreate、lvscan、lvdisplay、lvextend、lvreduce、lvresize
■lvcreate:创建逻辑卷或快照
用法:lvcreate [选项] [参数]
选项:
-L:指定大小
-l:指定大小(LE数)
-n:指定名称
-s:创建快照
-p r:设置为只读(该选项一般用于创建快照中)
注:使用该命令创建逻辑卷时当然必须指明卷组,创建快照时必须指明针对哪个逻辑卷
例 lvcreate -L 500M -n mylv myvg
■lvscan:扫描当前系统中的所有逻辑卷,及其对应的设备文件
■lvdisplay:显示逻辑卷属性
用法:lvdisplay [/dev/VG_NAME/LV_NAME]
■lvextend:可在线扩展逻辑卷空间
用法:lvextend -L/-l 扩展的大小 /dev/VG_NAME/LV_NAME
选项:
-L:指定扩展(后)的大小。例如,-L +800M表示扩大800M,而-L 800M表示扩大至800M
-l:指定扩展(后)的大小(LE数)
例 lvextend -L 200M /dev/myvg/mylv
■lvreduce:缩减逻辑卷空间,一般离线使用
用法:lvexreduce -L/-l 缩减的大小 /dev/VG_NAME/LV_NAME
选项:
-L:指定缩减(后)的大小
-l:指定缩减(后)的大小(LE数)
例 lvreduce -L 200M /dev/myvg/mylv
■lvremove:删除逻辑卷,需要处于离线(卸载)状态
用法:lvremove [-f] /dev/VG_NAME/LV_NAME
-f:强制删除
[root@localhost ~]# lvcreate -L 500M -n mylv myvg # 创建大小为500M、名为mylv的逻辑卷 Rounding up size to full physical extent 504.00 MiB Logical volume "mylv" created [root@localhost ~]# lvscan ACTIVE '/dev/myvg/mylv' [504.00 MiB] inherit [root@localhost ~]# lvdisplay --- Logical volume --- LV Path /dev/myvg/mylv LV Name mylv VG Name myvg LV UUID 0fPpO3-gVaI-ZKqi-xHnc-uaHk-u6of-i5wds7 LV Write Access read/write LV Creation host, time localhost.localdomain, 2015-10-18 22:05:18 +0800 LV Status available # open 0 LV Size 504.00 MiB # 这里为什么不是指定的500M呢,因为500M不是PE的倍数,系统会自行计算最相近的容量 Current LE 63 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
⑤格式化逻辑卷并挂载,这一阶段就不再赘述了
[root@localhost ~]# mke2fs -t ext4 /dev/myvg/mylv ... Writing inode tables: done Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: done ... [root@localhost ~]# mkdir /data [root@localhost ~]# mount /dev/myvg/mylv /data [root@localhost ~]# cp /etc/inittab /data [root@localhost ~]# ls /data inittab lost+found
三、LVM的写入模式
LVM有两种写入模式:线性模式和条带模式。线性模式即写完一个设备后再写另一个设备,条带模式就有点类似于RAID0,即数据是被分散写入到LVM各成员设备上的。因为条带模式的数据不具有安全性,且LVM并不强调读写性能,故LVM默认为线性模式,这样即使一个设备坏了,其它设备上的数据还在
四、文件系统的扩展和缩减
我们知道,文件系统在创建时是分成多个块组(block group)的,因此文件系统的增减实际上就是以增减块组的方式实现的
在linux中,ext系列格式的文件系统是可以扩展和缩减的,而xfs格式的目前只能扩展
1、扩展文件系统:
①先确定扩展的目标大小,并确保对应卷组中有足够的空闲空间可用。如果不够,可先通过vgextend命令扩大卷组容量
vgextend myvg /dev/sda7
②扩展逻辑卷
lvextend -L 4G /dev/myvg/mylv
③扩展文件系统
resize2fs为ext系列文件系统大小的调整工具用法为:resize2fs 文件系统所对应的设备文件名 [大小]
resize2fs /dev/myvg/mylv
[root@localhost ~]# vgextend myvg /dev/sda7 # 假如卷组容量不够,扩展文件系统之前先扩展卷组 Volume group "myvg" successfully extended [root@localhost ~]# lvextend -L +300M /dev/myvg/mylv Rounding size to boundary between physical extents: 304.00 MiB Snapshot origin volumes can be resized only while inactive: try lvchange -an Run `lvextend --help' for more information. [root@localhost ~]# umount /dev/myvg/mylv_snap [root@localhost ~]# lvremove /dev/myvg/mylv_snap # 要增减逻辑卷,需要先删除对对应的快照卷 Do you really want to remove active logical volume mylv_snap? [y/n]: y Logical volume "mylv_snap" successfully removed [root@localhost ~]# lvextend -L +300M /dev/myvg/mylv # 逻辑卷扩大300M Rounding size to boundary between physical extents: 304.00 MiB Extending logical volume mylv to 808.00 MiB Logical volume mylv successfully resized [root@localhost ~]# resize2fs /dev/myvg/mylv # 扩展文件系统 resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/myvg/mylv is mounted on /data; on-line resizing required old desc_blocks = 2, new_desc_blocks = 4 Performing an on-line resize of /dev/myvg/mylv to 827392 (1k) blocks. The filesystem on /dev/myvg/mylv is now 827392 blocks long. [root@localhost ~]# df -h # 显示容量确实已扩大 ... /dev/mapper/myvg-mylv 783M 11M 732M 2% /data
2、缩减很危险,要离线
①先确定缩减后的目标大小,并确保对应的目标逻辑卷大小足够容纳原有数据
②先卸载文件系统,并要执行强制检测
e2fsck -f
③缩减文件系统
resize2fs DEVICE 例如,resize2fs /dev/myvg/mylv 3G 缩减至3G
④缩减逻辑卷
lvreduce -L 3G /dev/myvg/mylv
■注:当逻辑卷有快照时是不能扩展和缩减的,除非先将快照删除
[root@localhost ~]# umount /dev/myvg/mylv # 缩减文件系统之前要先卸载 [root@localhost ~]# e2fsck -f /dev/myvg/mylv # 检测文件系统 e2fsck 1.41.12 (17-May-2010) 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 /dev/myvg/mylv: 12/206848 files (0.0% non-contiguous), 36856/827392 blocks [root@localhost ~]# resize2fs /dev/myvg/mylv 500M # 缩减文件系统至500M resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/myvg/mylv to 512000 (1k) blocks. The filesystem on /dev/myvg/mylv is now 512000 blocks long. [root@localhost ~]# lvreduce -L 500M /dev/myvg/mylv # 缩减逻辑卷至500M Rounding size to boundary between physical extents: 504.00 MiB WARNING: Reducing active and open logical volume to 504.00 MiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce mylv? [y/n]: y Reducing logical volume mylv to 504.00 MiB Logical volume mylv successfully resized [root@localhost ~]# mount /dev/myvg/mylv /data # 重新挂载 [root@localhost ~]# df -h # 显示容量确实已减小 ... /dev/mapper/myvg-mylv 485M 11M 449M 3% /data [root@localhost ~]# vgchange -an myvg # 当我们一段时间内不再使用卷组时,可将其休眠 Logical volume myvg/mylv contains a filesystem in use. Can't deactivate volume group "myvg" with 1 open logical volume(s) [root@localhost ~]# umount /data # 休眠之前先卸载逻辑卷 [root@localhost ~]# umount /mnt [root@localhost ~]# vgchange -an myvg 0 logical volume(s) in volume group "myvg" now active [root@localhost ~]# vgchange -ay myvg # 重新激活卷组 1 logical volume(s) in volume group "myvg" now active [root@localhost ~]# vgremove myvg # 若打算以后都不再使用,可删除卷组 Do you really want to remove volume group "myvg" containing 1 logical volumes? [y/n]: y Do you really want to remove active logical volume mylv? [y/n]: y Logical volume "mylv" successfully removed Volume group "myvg" successfully removed
五、snapshot(快照)
snapshot是像照相一样将当前的系统信息保存下来。
当创建一个snapshot的时候,仅拷贝原始卷里数据的元数据(meta-data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,因此这个原理的实现叫做写时复制(copy-on-write)。
在写操作写入块之前,原始数据被移动到 snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作,如果是没有修改过的块,那么会将读操作直接重定向到原始卷上,如果是已经修改过的块,那么就读取拷贝到snapshot中的块。
■创建快照卷:
lvcreate [选项] [参数]
选项:
-L:指定大小
-l:指定大小(LE数)
-n:指定名称
-s:创建快照
-p r:设置为只读
例如 lvcreate -s -L 512M -n mylv_snap -p r /dev/myvg/mylv # 针对逻辑卷mylv创建大小为512M的只读快照
■注:创建快照前需将针对的逻辑卷临时改为只读,创建完毕后再改为读写,例如
创建快照前:mount -o remount,ro /dev/myvg/mylv /data
创建快照后:mount -o remount,rw /dev/myvg/mylv /data
[root@localhost ~]# mount -o remount,ro /dev/myvg/mylv /data # 创建快照卷之前先将对应的逻辑卷改为只读 [root@localhost ~]# lvcreate -s -L 512M -n mylv_snap /dev/myvg/mylv # 创建大小为512M的快照 Logical volume "mylv_snap" created [root@localhost ~]# mount -o remount,rw /dev/myvg/mylv /data # 将逻辑卷改回为读写 [root@localhost ~]# mount /dev/myvg/mylv_snap /mnt [root@localhost ~]# df -h # 可以看到快照和其对应的逻辑卷显示的参数值一样 ... /dev/mapper/myvg-mylv 489M 11M 453M 3% /data /dev/mapper/myvg-mylv_snap 489M 11M 453M 3% /mnt [root@localhost ~]# ls /mnt inittab lost+found [root@localhost ~]# cp /etc/passwd /data # 向原始卷中新增一些数据 [root@localhost ~]# ls /data inittab lost+found passwd [root@localhost ~]# ls /mnt # 快照所显示的文件系统状态仍是创建那一刻的 inittab lost+found