为什么要使用逻辑卷管理?
逻辑卷:
优点:在于灵活管理
1、动态扩容
2、在线扩容
3、离线裁剪
4、数据条带化
5、数据镜像
基本概念:
物理卷(pv):
物理卷是底层真正存放数据的一个设备,该设备可以是整块磁盘也可以是磁盘的某个分区。
卷组(vg):
卷组是建立在物理卷之上,它是由一个或者多个物理卷组成的。即将很多个物理卷融合在一起来提供容量。
逻辑卷(lv):
逻辑卷是建立在卷组之上,它是从卷组中“切”出来一块空间来让用户使用。
物理区域(PE):
每一个物理卷被划分成称为PE的最小单位。默认是4M,寻址的最小单位。
逻辑区域(LE):
逻辑卷被划分为称为LE的可被寻址的最小单位。在同一个卷组中PE和LE的大小是一一对应的。
总结:
真实的物理设备——>逻辑上做成物理卷(pv)——>卷组(vg)——>逻辑卷(lv)
dmoe1:
创建一个普通的逻辑卷,大小是1G,挂载使用。 1、拿一块硬盘 2、将硬盘分区(根据实际情况) sdb 8:16 0 20G 0 disk ├─sdb1 8:17 0 2G 0 part ├─sdb2 8:18 0 2G 0 part ├─sdb3 8:19 0 6G 0 part └─sdb4 8:20 0 10G 0 part 3、将设备做成物理卷 # pvcreate /dev/sdb1 查看: pvs 简单查看 pvdisplay 详细查看 4、创建卷组,将物理卷加入到卷组 # vgcreate vg01 /dev/sdb1 Volume group "vg01" successfully created -l: 卷组上允许创建的最大逻辑卷数 -s:卷组上的物理卷的PE大小 -p:卷组中允许添加的最大物理卷数 查看: vgs vgdisplay 5、创建逻辑卷,大小1G # lvcreate -n lv01 -L 1G vg01 -L:指定最终大小 -l:指定pe的个数或者卷组剩余空间的百分比 # lvcreate -n lv02 -l 50 vg01 # lvcreate -n lv03 -l 50%free vg01 查看: lvs lvdisplay 6、将逻辑卷格式化 创建好的逻辑卷会映射到以下两个地方: # ll /dev/mapper/vg01-lv01 lrwxrwxrwx. 1 root root 7 Apr 8 10:42 /dev/mapper/vg01-lv01 -> ../dm-2 # ll /dev/vg01/lv01 lrwxrwxrwx. 1 root root 7 Apr 8 10:42 /dev/vg01/lv01 -> ../dm-2 mkfs -t ext4 /dev/mapper/vg01-lv01 或者 mkfs.ext4 /dev/vg01/lv01 7、挂载使用 mount /dev/vg01/lv01 /u01 demo2:在线扩容逻辑卷 情况1:当卷组剩余空间不够 1、扩容卷组 # vgextend vg01 /dev/sdb3 No physical volume label read from /dev/sdb3 Physical volume /dev/sdb3 not found Physical volume "/dev/sdb3" successfully created Volume group "vg01" successfully extended 说明: 卷组是由物理卷组成的,如果直接将设备加入卷组,那么系统会自动先将设备做成pv,然后在加入。 2、扩容逻辑卷 # lvextend -L +2G /dev/vg01/lv01 在原来的基础上增加2G空间 3、同步文件系统 # resize2fs /dev/vg01/lv01 情况2:当前卷组剩余空间足够 1、扩容逻辑卷 # lvextend -L 3G /dev/vg01/lv01 将原来的逻辑卷扩大到3G 2、同步文件系统 # resize2fs /dev/vg01/lv01 实例:动态扩容根文件系统 demo3:离线裁剪逻辑卷 1、卸载逻辑卷 umount /dev/vg01/lv01 2、裁剪文件系统 # e2fsck -f /dev/mapper/vg01-lv01 # resize2fs /dev/mapper/vg01-lv01 2G 3、裁剪逻辑卷 # lvreduce -L 2G /dev/mapper/vg01-lv01 # e2fsck -f /dev/mapper/vg01-lv01 4、挂载使用 # mount /dev/mapper/vg01-lv01 /u01 注意: 1、离线裁剪之前最好将数据备份 2、裁剪后的空间大小一定要大于数据大小 demo4:总结逻辑卷相关的命令 创建物理卷 pvcreate /dev/sdb /dev/sdc[1-3] 创建卷组 vgcreate vg01 /dev/sdb 创建逻辑卷 lvcreate -n lv01 -L 2G vg01 lvcreate -n lv02 -l 50 vg02 lvcreate -n lv03 -l 50%free vg03 扩容卷组 vgextend vg01 /dev/sdc[1-3] 扩容逻辑卷 lvextend -L +1G /dev/vg01/lv01 删除逻辑卷 # lvremove /dev/mapper/vg01-lv03 删除卷组 # vgremove vg01 删除物理卷 # pvremove /dev/sdb /dev/sdc[1-3] 将一个物理卷从卷组里移除 # vgreduce vg01 /dev/sdb2 注意: 该物理卷没有被使用才能够移除 demo5:逻辑卷实现条带化 条带化: 把保存在逻辑卷上的数据分成n等分,分别同时写入到不同的物理卷中,可以提高数据的读写速率;如果任何一个涉及到物理卷损坏,数据都会无法恢复。 创建前: # pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg_node1 lvm2 a-- 19.51g 0 /dev/sdb1 vg01 lvm2 a-- 2.00g 2.00g /dev/sdb2 vg01 lvm2 a-- 2.00g 2.00g 创建条带化的逻辑卷: # lvcreate -n lv01 -L 1G -i 2 vg01 /dev/sdb[12] -i:指定条带化的个数 创建后: # pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg_node1 lvm2 a-- 19.51g 0 /dev/sdb1 vg01 lvm2 a-- 2.00g 1.50g /dev/sdb2 vg01 lvm2 a-- 2.00g 1.50g 格式化文件系统: mkfs.ext4 /dev/vg01/lv01 挂载使用 mount /dev/vg01/lv01 /u01 测试验证: # iostat -d -m /dev/sdb[12] 2 demo6:逻辑卷实现镜像 镜像:对某个逻辑卷做数据镜像,实现数据备份作用。 创建前: # pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg_node1 lvm2 a-- 19.51g 0 /dev/sdb1 vg01 lvm2 a-- 2.00g 1.50g /dev/sdb2 vg01 lvm2 a-- 2.00g 1.50g /dev/sdb3 vg02 lvm2 a-- 2.00g 2.00g /dev/sdb4 vg02 lvm2 a-- 2.00g 2.00g 创建一个互为镜像的逻辑卷: # lvcreate -n lv02 -L 1G -m 1 vg02 /dev/sdb[34] -m:指定镜像的个数 # lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert lv01 vg01 -wi-ao---- 1.00g lv02 vg02 mwi-a-m--- 1.00g lv02_mlog 100.00 数据同步100%完成 创建后: # pvs PV VG Fmt Attr PSize PFree /dev/sda2 vg_node1 lvm2 a-- 19.51g 0 /dev/sdb1 vg01 lvm2 a-- 2.00g 1.50g /dev/sdb2 vg01 lvm2 a-- 2.00g 1.50g /dev/sdb3 vg02 lvm2 a-- 2.00g 1.00g /dev/sdb4 vg02 lvm2 a-- 2.00g 1.00g 格式化文件系统并且挂载使用 # mkfs.ext4 /dev/vg02/lv02 # mkdir /u02 # mount /dev/mapper/vg02-lv02 /u02 测试验证: # dd if=/dev/zero of=/dev/sdb3 bs=1M count=300 # vgreduce --removemissing -f vg02 强制从卷组中移除损坏的盘 再次将逻辑卷挂载使用,我们需要将坏的盘修好换成健康的盘让其再次互为镜像: # lvconvert -m 1 /dev/vg02/lv02 /dev/sdb[34]
练习:
1、添加一块新的10g硬盘到你的linux系统中,并将其分为2个分区(大小自己决定),如sdb1和sdb2
[[email protected] ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 19.5G 0 part ├─VolGroup-lv_root (dm-0) 253:0 0 17.6G 0 lvm / └─VolGroup-lv_swap (dm-1) 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 10G 0 disk └─VolGroup-lv01 (dm-2) 253:2 0 5G 0 lvm /data sdc 8:32 0 10G 0 disk [[email protected] ~]# fdisk /dev/sdc Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x989783d7. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won‘t be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It‘s strongly recommended to switch off the mode (command ‘c‘) and change display units to sectors (command ‘u‘). Command (m for help): m Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition‘s system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1305, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +5G Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (655-1305, default 655): Using default value 655 Last cylinder, +cylinders or +size{K,M,G} (655-1305, default 1305): 1305 Command (m for help): p Disk /dev/sdc: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x989783d7 Device Boot Start End Blocks Id System /dev/sdc1 1 654 5253223+ 83 Linux /dev/sdc2 655 1305 5229157+ 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
2、创建大小为2G的逻辑卷lv01挂载到系统中的/u01目录下面,并且在/u01目录下面创建file1~file5 5个文件。
[[email protected] ~]# mkdir /u01 [[email protected] ~]# pvcreate /dev/sdc1 Physical volume "/dev/sdc1" successfully created [[email protected] ~]# pvcreate /dev/sdc2 Physical volume "/dev/sdc2" successfully created [[email protected] ~]# vgextend VolGroup /dev/sdc[1-2] Volume group "VolGroup" successfully extended [[email protected] ~]# lvcreate -n lv02 -L 2G VolGroup Logical volume "lv02" created [[email protected] ~]# mkfs -t ext4 /dev/mapper/VolGroup-lv02 [[email protected] ~]# mount /dev/mapper/VolGroup-lv02 /u01 [[email protected] ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 18G 14G 3.0G 82% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 477M 28M 425M 6% /boot /dev/mapper/VolGroup-lv01 4.8G 19M 4.6G 1% /data /dev/mapper/VolGroup-lv02 2.0G 3.0M 1.9G 1% /u01 [[email protected] ~]# touch /u01/file{1..5} [[email protected] ~]# ls /u01 file1 file2 file3 file4 file5 lost+found
3、假设sdb1分区有坏块,现在需要将sdb1分区上的数据快速移动到另外的硬盘sdb2上,怎么做?
首先,先在sdb2新建一个逻辑卷,然后挂载,把sdb1分区上的数据拷贝到sdb2
4、由于业务需要,/u01目录需要扩大到9G,怎么做?
[[email protected] ~]# lvextend -L +7G /dev/mapper/VolGroup-lv02 [[email protected] ~]# resize2fs /dev/mapper/VolGroup-lv02
5、新建一个卷组vg02,PEsize为8M,在卷组中创建一个名为lv02的逻辑卷,大小为50个pe,格式化成ext3的文件系统挂载使用,要求开机自动挂载
vgcreate -s 8M vg02 /dev/sda3 lvcreate -n lv02 -l 50 vg02 mkfs.ext3 /dev/mapper/vg02-lv02
扩展:
1、测试验证已有逻辑卷的硬盘,从一台服务器换到另一台服务器上是否可以正常读取到原来的数据?需要怎么做?
不能正常读取原来数据,已经有分区表,可以挂载读到原来的数据,重要的是原服务器必须关机,要不加不了
正常的步骤是添加进去先要激活vg,然后才可以挂载使用
vgchange -a y lvm_list激活卷组
2、测试验证已有互为镜像的逻辑卷的硬盘,从一台服务器换到另一台服务器上是否可以正常读取数据?怎么做?
原来服务器关掉,现有服务器也关掉,然后把原服务器互为镜像的逻辑硬盘加到现在服务器,可以读取数据,需要正常挂载
lvmdiskcan扫描块设备,看看那些是逻辑卷
逻辑卷迁移:
源端: 1)将源文件系统umount umount /test 2)将lv和lv inactive lvchange -an /dev/vg_test/lv_test vgchange -an vg_test 3)导出vg vgexport vg_test 目标端: 1)永kudzu检测新的盘 2)导入vg vgimport vg_test 3)激活vg vgchange -ay vg_test 3)mount文件系统