首页 > 代码库 > 17.文件系统——逻辑卷、快照以及如何创建逻辑卷(pv、vg、lv)
17.文件系统——逻辑卷、快照以及如何创建逻辑卷(pv、vg、lv)
一、逻辑卷管理器LVM概述
前面我们在Linux系统上模拟软RAID,使用的是md模块,事实上,还有一个模块dm——device mapper,也可以实现软RAID的模拟。md模块的管理工具是mdadm,它专门用来管理RAID设备;dm模块则更为强大,它的管理工具不再是一个单一的工具,而是一组工具,根据不同的规则进行管理(如物理卷的创建、删除、修改;卷组的大小调整、扫描、显示等;逻辑卷的创建、删除和修改等),为dm提供设备映射法则;它支持将多个物理设备以多种不同的方式组合起来,其中包含但不仅限于RAID的机制(镜像、条带等),而它最主要的功能是LVM——逻辑卷管理器(Logical Volume Manager),目前常用的LVM指的是lvm2。
LVM是将多个底层的物理卷(块设备)在更高层次上组合成逻辑卷组,然后将逻辑卷组进一步划分成多个逻辑卷。它能够动态的扩展其边界。一个逻辑卷可能跨越多个物理卷,也可能不足一个物理卷。
二、逻辑卷功能之动态调整大小
如果现在一个数据库为500G,预计在一年之内会再增加500G,一种方法是换一块1TB的磁盘,将现有的数据复制过去,但复制的时候需要停止数据库的服务,这在通常情况下是不被允许的,因此就需要动态的扩展现有的磁盘空间,以保证当前的服务不被停止。
逻辑卷的作用就在于此,它可以动态的扩展其大小(这个边界称为物理边界),而其中的文件系统的大小(其边界被称为逻辑边界/文件系统边界)也可以随之扩展到整个空间;逻辑卷也支持动态缩减,但缩减逻辑卷之前,要先缩减其中的文件系统的大小,不过这样的操作有风险,可能造成数据的丢失。
当逻辑卷扩展到卷组边界后,仍需要继续扩展,这时可以通过新增物理卷的方法来扩展卷组大小,然后将逻辑卷进一步扩大。逻辑卷底层所依赖的块设备可以是普通磁盘,也可以是RAID设备。
逻辑卷在创建之初需要为其指定物理盘区(PE:Physical Extents)。比如某逻辑卷指定了PE为8MB,那么以后逻辑卷的扩展都必须为8MB的整数倍,因此如果想创建一个50MB的逻辑卷,最后实际创建出来的逻辑卷大小可能是48MB或者56MB,但不会精确到50MB。物理盘区的大小通常为2的n次方兆,如4MB,8MB,32MB或64MB等,扩展逻辑卷就是将更多的PE分配给逻辑卷。
卷组的空间一旦被分配给了某个逻辑卷,那么这块空间就变成了逻辑盘区(LE:Logical Extents),缩减逻辑卷实际上就是将逻辑卷上没有使用的LE收回。
如果一个逻辑卷组原本由5个物理卷组成,现在想移走其中的一个(删除物理卷),那么在移动之前必须先检查该物理卷,看它上面是否存有数据,如果有,则应该将这些数据转移到另外的四个物理卷上(转移物理卷)。而删除了物理卷之后,逻辑卷组也会随之缩小,这个过程称之为缩减逻辑卷。
三、逻辑卷功能之快照
灵活的扩展其边界,是逻辑卷的优势之一,而它的另一个优势在于快照功能(snapshot,即保存某一时刻的状态),这个功能对数据备份极为有用。
试想,某个数据库需要进行备份,但在备份的同时,该数据库还在提供服务。如果开始备份的时间是上午10:00,备份时进行传输的数据流很小,因此需要10个小时才能完成备份,那么在备份的这10个小时里,数据库中的数据有可能已经被修改了,这样就会导致想要备份的数据和实际备份的数据不一致。快照的作用就体现在这里:在上午10:00的时候采用快照的功能,保存数据库的状态,备份只针对这一刻的状态进行;而后的10个小时,不论数据库做了哪些改动,新数据都不会备份。
逻辑卷提供的快照功能,也是将某一时刻的数据保存起来:用户访问逻辑卷上的数据,会有两条通道:①逻辑卷原卷;②逻辑卷的快照卷。
如果为当前逻辑卷创建了快照,那么当逻辑卷原卷中的文件发生了改变时,会将原有数据备份一份到快照卷上,这时用户如果要访问快照时刻的文件,而该文件后来被改动过,则用户会进入快照卷的通道,查看备份数据;如果该文件没有被改动过,则会进入原卷的通道,查看原始数据。
快照卷的大小不需要和原卷一致,因为它只保存被修改过的文件。如果一个原卷有10G,而快照卷只有100MB,而被改动过的数据大小达到了1G,这些数据的大小已经超过了快照卷的大小,这种情况会造成快照卷的崩溃,因此要保证快照卷的大小能容纳所有变化的数据。快照卷的大小如果和原卷一样大,则快照卷一定不会崩溃,但这样做会浪费硬盘资源,因此设定快照卷的大小需根据实际情况而定。事实上快照主要用于备份,一旦备份完成,快照卷就可以删除了。后续的文章中将会介绍如何使用逻辑卷的快照卷来进行数据库备份。
四、创建逻辑卷
逻辑卷的创建过程分为三步:
①创建PV(Physical Volume)→②组合成VG(Volume Group)→③划分成LV(Logical Volume)
第一步:创建一个2G的PV:
在创建PV之前,需要先准备两个分区,并将分区的id号调整为8e:
[root@localhost ~]# fdisk/dev/sdc
WARNING: DOS-compatible mode isdeprecated. It‘s strongly recommended to switch off the mode (command ‘c‘) andchange display units to sectors (command ‘u‘). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 3 First cylinder (787-1305, default787): Using default value 787 Last cylinder, +cylinders or+size{K,M,G} (787-1305, default 1305): +1G Command (m for help): t Partition number (1-7): 3 Hex code (type L to list codes):8e Changed system type of partition3 to 8e (Linux LVM) Command (m for help): w The partition table has beenaltered! Calling ioctl() to re-readpartition table. WARNING: Re-reading the partitiontable failed with error 16: Device or resource busy. The kernel still uses the oldtable. The new table will be used at the next reboot or after you runpartprobe(8) or kpartx(8) Syncing disks.
[root@localhost ~]# partx -a/dev/sdc
BLKPG: Device or resource busy error adding partition 1 BLKPG: Device or resource busy error adding partition 2
[root@localhost ~]# partx -a/dev/sdc3 /dev/sdc
# 创建一个1G的分区/dev/sdc3,类型调整为8e(LVM的id号为8e),并将其信息同步到内核中
接下来再创建一个分区/dev/sdd3,并调整其id号为8e,过程和上面一样,不加赘述。
现在将刚刚调整过的两个分区创建成物理卷,创建物理卷使用的命令组是pv,以pv开头的命令有很多:
[root@localhost ~]# pv
pvchange pvck pv.sh
pvcreate # 创建物理卷
pvscan #扫描物理卷
pvresize # 调整物理卷大小
pvmove # 移动物理卷
pvdisplay # 显示物理卷,没有参数,则显示所有的PV,有参数则显示具体的PV
pvs # 以更简洁的方式显示物理卷
pvremove # 删除物理卷上所有和逻辑卷有关的元数据
使用pvcreate命令来创建物理卷,其格式为:
pvcreate/dev/Device_Name
将/dev/sdc3和/dev/sdd3创建成PV的方法如下:
[root@localhost ~]# pvcreate/dev/sd{c,d}3
Physical volume"/dev/sdc3" successfully created Physical volume"/dev/sdd3" successfully created # 两个PV已经创建成功了
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree /dev/sdc3 lvm2 a-- 1.01g 1.01g /dev/sdd3 lvm2 a-- 1.01g 1.01g # 简单查看当前系统上的PV
[root@localhost ~]# pvdisplay
# 查看当前系统上的PV详细信息 --- Physical volume--- PV Name /dev/sda2 VG Name VolGroup PV Size 24.51 GiB / not usable 3.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 6274 Free PE 0 Allocated PE 6274 PV UUID 4xIMsz-FjmJ-KS9S-r5b8-QFVq-6Vdp-nREmnf "/dev/sdc3" is a new physical volume of "1.01 GiB" --- NEW Physicalvolume --- PV Name /dev/sdc3 VG Name PV Size 1.01 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID o530uK-hBsV-huUH-M5ag-IaFT-4VPC-aWhxM8 "/dev/sdd3" is a new physical volume of "1.01 GiB" --- NEW Physicalvolume --- PV Name /dev/sdd3 VG Name PV Size 1.01 GiB Allocatable NO PE Size 0 # 由于还没有创建逻辑卷,所以PE的大小为0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID zJ7eym-BQVb-7t4S-x3IM-Rmlh-eJia-bQqGsw
第二步:创建VG:
创建完物理卷组后,可以开始创建逻辑卷组VG了。创建逻辑卷组的命令组是vg,以vg开头的命令有:
[root@localhost ~]# vg
vgcfgbackup vgconvert vgexport vgmerge vgrename vgcfgrestore vgcreate vgextend vgmknodes vgs vgchange vgdb vgimport vgreduce vgscan vgck vgdisplay vgimportclone vgremove vgsplit
使用vgcreate命令来创建逻辑卷组,其格式为:
VgcreateVG_NAME /dev/Device_Name
在创建VG时,可以使用-s选项来指定PE的大小,PE的可选范围从8KB到16GB不等,如果不指定,默认的PE大小是4MB。
通常情况下,安装操作系统使会默认安装一个VG,根文件系统就是安装在这个VG上的。
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
VolGroup 1 2 0 wz--n- 24.51g 0 # 简单查看当前VG,可以看到已经存在一个VG了
现在新建一个VG,起名为testvg
[root@localhost ~]# vgcreatetestvg /dev/sd{c,d}3
Volume group"testvg" successfully created # 提示创建成功
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree VolGroup 1 2 0 wz--n- 24.51g 0 testvg 2 0 0 wz--n- 2.02g 2.02g # 可以看到已经有两个VG了
[root@localhost ~]# vgdisplaytestvg
# 显示testvg这个VG的详细信息 --- Volume group --- VG Name testvg System ID Format lvm2 Metadata Areas 2 Metadata SequenceNo 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 2.02 GiB PE Size 4.00 MiB Total PE 516 Alloc PE / Size 0 / 0 Free PE / Size 516 / 2.02 GiB VG UUID RdwIdn-Pnax-qhjT-eJHY-kKkQ-XIEp-fc7rpf
第三步:创建LV:
创建逻辑卷LV使用的命令组是lv,以lv开头的命令有:
[root@localhost ~]# lv
lvchange lvdisplay lvmchange lvmdump lvmsar lvrename lvscan lvconvert lvextend lvmconf lvmetad lvreduce lvresize lvcreate lvm lvmdiskscan lvmsadc lvremove lvs
使用lvcreate 来创建逻辑卷,可配合选项-L和-n来使用,其中 -L用来指定逻辑卷的大小,-n用来指定逻辑卷的名称,其格式如下:
lvcreate -L SIZE -n LV_NAME VG_NAME
Lvcreate还可以使用-l选项来指定PE的个数,这个个数根据需要而定,比如PE的大小为4MB,现在要创建4G的LV,那么PE的个数就为1024个;除此以外,还可以使用百分比来设定,指的是整个VG中PE个数的百分比。
由于卷组大小为2G,因此逻辑卷的大小不能超过2G,所以创建一个1G的逻辑卷:
[root@localhost ~]# lvcreate -L1G -n mylv testvg
Logical volume"mylv" created # 提示逻辑卷mylv已经创建成功了
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert lv_root VolGroup-wi-ao---- 22.54g lv_swap VolGroup-wi-ao---- 1.97g # 前两个LV是系统自带的 mylv testvg -wi-a----- 1.00g # 这个是新创建的逻辑卷
使用lvdisplay命令来查看一下当前的LV信息:
[root@localhost ~]# lvdisplay
# 这里显示的是所有逻辑卷的信息 --- Logical volume--- LV Path /dev/testvg/mylv LV Name mylv VG Name testvg LV UUID sfw6EW-0syj-v5w0-KM5T-Kao1-JwJ5-WndWQA LV Write Access read/write LV Creation host,time localhost.localdomain, 2014-08-14 21:11:52 -0400 LV Status available # open 0 LV Size 1.00 GiB Current LE 256 Segments 1 Allocation inherit Read aheadsectors auto - currently setto 256 Block device 253:2 --- Logical volume--- LV Path /dev/VolGroup/lv_root LV Name lv_root VG Name VolGroup LV UUID 4qxnP4-h1Rf-CItA-ddhr-MQQC-cIDh-zJkfXV LV Write Access read/write LV Creation host,time localhost.localdomain, 2014-07-09 21:18:50 -0400 LV Status available # open 1 LV Size 22.54 GiB Current LE 5770 Segments 1 Allocation inherit Read aheadsectors auto - currently setto 256 Block device 253:0 --- Logical volume--- LV Path /dev/VolGroup/lv_swap LV Name lv_swap VG Name VolGroup LV UUID Vsrdyz-Sf3q-7JQl-fxZI-vu4H-pCJO-LIwcRi LV Write Access read/write LV Creation host,time localhost.localdomain, 2014-07-09 21:19:16 -0400 LV Status available # open 1 LV Size 1.97 GiB Current LE 504 Segments 1 Allocation inherit Read aheadsectors auto - currently setto 256 Block device 253:1
如果只想查看刚才创建的LV,先使用lvdisplay /dev/DEVICE_NAME试一下:
[root@localhost ~]# lvdisplaymylv
Volume group"mylv" not found Skipping volumegroup mylv # 发现无法查看,和卷组只需要名称来引用不同,逻辑卷需要靠设备文件来引用
逻辑卷的设备文件在/dev/VG_NAME/LV_NAME,下;
[root@localhost ~]# ls -l/dev/testvg/mylv
lrwxrwxrwx. 1 root root 7 Aug 14 21:11 /dev/testvg/mylv-> ../dm-2 # 此时会发现这是个链接文件,指向的是父目录/dev下的dm-2
[root@localhost ~]# lvdisplay/dev/testvg/mylv
--- Logical volume --- LV Path /dev/testvg/mylv LV Name mylv VG Name testvg LV UUID sfw6EW-0syj-v5w0-KM5T-Kao1-JwJ5-WndWQA LV Write Access read/write LV Creation host,time localhost.localdomain, 2014-08-14 21:11:52 -0400 LV Status available # open 0 LV Size 1.00 GiB Current LE 256 Segments 1 Allocation inherit Read aheadsectors auto - currently setto 256 Block device 253:2
事实上,在/dev下还有一个目录,叫做mapper,也包含了这个链接文件
[root@localhost ~]# ls -l/dev/mapper
total 0 crw-rw----. 1 root root 10, 58 Aug 14 20:11 control lrwxrwxrwx. 1 root root 7 Aug 14 21:11 testvg-mylv -> ../dm-2 lrwxrwxrwx. 1 root root 7 Aug 14 20:12 VolGroup-lv_root -> ../dm-0 lrwxrwxrwx. 1 root root 7 Aug 14 20:11 VolGroup-lv_swap -> ../dm-1
因此还可以通过/dev/mapper/VG_NAME-LV_NAME来查看:
[root@localhost ~]# lvdisplay/dev/mapper/testvg-mylv
--- Logical volume--- LV Path /dev/testvg/mylv LV Name mylv VG Name testvg LV UUID sfw6EW-0syj-v5w0-KM5T-Kao1-JwJ5-WndWQA LV Write Access read/write LV Creation host,time localhost.localdomain, 2014-08-14 21:11:52 -0400 LV Status available # open 0 LV Size 1.00 GiB Current LE 256 Segments 1 Allocation inherit Read aheadsectors auto - currently setto 256 Block device 253:2
至此,整个逻辑卷的创建过程就完成了。
下面再来使用pvdisplay命令查看一下物理卷的情况:
[root@localhost ~]# pvdisplay
--- Physical volume--- PV Name /dev/sdc3 VG Name testvg PV Size 1.01 GiB / not usable 3.44 MiB Allocatable yes PE Size 4.00 MiB Total PE 258 Free PE 2 Allocated PE 256 PV UUID o530uK-hBsV-huUH-M5ag-IaFT-4VPC-aWhxM8 --- Physical volume--- PV Name /dev/sdd3 VG Name testvg PV Size 1.01 GiB / not usable 3.44 MiB Allocatable yes PE Size 4.00 MiB Total PE 258 Free PE 258 # 对比创建逻辑卷之前的物理卷信息,现在PE相关的信息都显示出来了 Allocated PE 0 PV UUID zJ7eym-BQVb-7t4S-x3IM-Rmlh-eJia-bQqGsw --- Physical volume--- PV Name /dev/sda2 VG Name VolGroup PV Size 24.51 GiB / not usable 3.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 6274 Free PE 0 Allocated PE 6274 PV UUID 4xIMsz-FjmJ-KS9S-r5b8-QFVq-6Vdp-nREmnf
第四步格式化逻辑卷
格式化逻辑卷使用的命令还是mke2fs:
[root@localhost ~]# mke2fs -text4 /dev/testvg/mylv
mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 65536 inodes, 262144 blocks 13107 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=268435456 8 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304,163840, 229376 Writing inode tables: done Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information:done This filesystem will be automatically checked every 35mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
格式化成功后,这个逻辑卷就可以挂载使用了:
[root@localhost ~]# mount/dev/testvg/mylv /mnt
[root@localhost ~]# cd /mnt
[root@localhost mnt]# ls
lost+found
[root@localhost mnt]# cp/etc/fstab ./
[root@localhost mnt]# cat fstab
# # /etc/fstab # Created by anaconda on Wed Jul 9 21:21:40 2014 # # Accessible filesystems, by reference, are maintained under‘/dev/disk‘ # See man pages fstab(5), findfs(8), mount(8) and/orblkid(8) for more info # /dev/mapper/VolGroup-lv_root / ext4 defaults 1 1 UUID=d9512fb3-8dd6-4613-ae55-8e99ba0ef627 /boot ext4 defaults 1 2 /dev/mapper/VolGroup-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/sdb3 /mydata ext4 defaults,noatime 0 0 LABEL="NEWSWAP" swap swap defaults 0 0
本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1540859