资源描述
实验13 逻辑卷的使用
PS:若无lvm相关命令,请把相关的包装上去。
任务目的
1.理解逻辑卷的基本原理
2.掌握物理卷、卷组、逻辑卷的创建和使用
任务预备知识
1 LVM工作原理
每个Linux使用者在安装Linux时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值。因为如果估计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统、清除硬盘、重新对硬盘分区,然后恢复数据到新分区。
因此完美的解决方法应该是在零宕机前提下可以自如对文件系统的大小进行调整,可以方便实现文件系统跨越不同磁盘和分区。Linux提供的逻辑盘卷管理(LVM,Logical Volume Manager)机制就是一个完美的解决方案。
LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。通过LVM系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组(volume group),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logical volumes),并进一步在逻辑卷组上创建文件系统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配,例如按照使用用途进行定义:“development”和“sales”,而不是使用物理磁盘名“sda”和“sdb”。而且当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。
LVM 是一种把硬盘驱动器空间分配成逻辑卷的方法,这样硬盘就不必使用分区而被简易地重划大小。
使用LVM,硬盘驱动器或硬盘驱动器集合就会分配给一个或多个物理卷(physical volumes)。物理卷无法跨越一个以上驱动器。
物理卷被合并成逻辑卷组(logical volume group),唯一的例外是 /boot 分区。/boot 分区不能位于逻辑卷组,因为引导装载程序无法读取它。如果你想把 / 分区放在逻辑卷上,你需要创建一个分开的 /boot分区,它不属于卷组的一部分。
由于物理卷无法跨越多个驱动器,如果你想让逻辑卷组跨越多个驱动器,你就应该在每个驱动器上创建一个或多个物理卷。
2 LVM名词与术语
LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。以下LVM相关术语:
(1) 物理存储介质(The physical media)
这里指系统的存储设备:硬盘,如:/dev/hda1、/dev/sda等等,是存储系统最低层的存储单元。
(2) 物理卷(physical volume)
物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
(3) 卷组(Volume Group)
LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
(4)逻辑卷(logical volume)
LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。
(5) PE(physical extent)extent n.范围,长度
每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。
PS:PE大小必须为2的n次方。
(6) LE(logical extent)
逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
PE--(组成)--VG---(划分)---LV 逻辑终归是要映射到现实上!
图1
从图1可以看到,PE和LE有着一一对应的关系。一个卷组由一个或多个物理卷组成,逻辑卷建立在卷组上。首先可以看到,物理卷(PV)被由大小等同的基本单元PE组成。逻辑卷就相当于非LVM系统的磁盘分区,可以在其上创建文件系统。
和非LVM系统将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷起始处的VGDA(卷组描述符区域)中。VGDA包括以下内容: PV描述符、VG描述符、LV描述符、和一些PE描述符 。
系统启动LVM时激活VG,并将VGDA加载至内存,来识别LV的实际物理存储位置。当系统进行I/O操作时,就会根据VGDA建立的映射机制来访问实际的物理位置。我们也可以按照图2简单地去理解。
图2
3 逻辑卷的配置使用
1. 创建和使用新的LVM逻辑卷的步骤:
l 建立LVM类型的分区
l 建立LVM物理卷
l 建立LVM卷组
l 建立LVM逻辑卷
l 建立文件系统
l 挂载文件系统
l 使用文件系统
2. 相关命令:
(1)创建物理卷
格式:pvcreate {分区|磁盘},如将是sda1,sda2创建成物理卷:
#pvcreate /dev/sda1 //分区标识要改成8e 即 fdisk -t 命令
#pvcreate /dev/sda2
//PV阶段时PE的大小显示为0,因为PE是在vgcreate阶段设置的
#pvdisplay 查看pv
(2)创建卷组
格式:vgcreate [-s N{M,G,T}] {卷组名} [物理卷1] [物理卷2]- [物理卷n], 如:
#vgcreate guptVG /dev/sda1 /dev/hda2
PS:vgcreate -s 8M guptVG /dev/sda1 /dev/hda2
//设置PE大小为8M,PE大小必须为2的n次方
(3)激活卷组 //一般默认是激活的,此步骤看情况而定。
格式: vgchange –a y {卷组名},如:
#vgchange –a –y guptVG
(4)查看卷组
查看总体卷组:
#vgscan
查看单个卷组的详细情况:(pv大小及使用情况)
格式:vgdisplay [卷组名],如:
#vgdisplay guptVG
(5)把物理卷加入卷组
格式:vgextend {卷组名}[物理卷1] [物理卷2]- [物理卷n],如:
#vgextend guptVG /dev/sda3
(6)从卷组中删除物理卷
格式:vgreduce {卷组名}[物理卷1] [物理卷2]- [物理卷n],如:
#vgreduce guptVG /dev/sda3
(7)创建逻辑卷(单位:M)
格式:lvcreate [选项] {逻辑卷名} {卷组名}
不加参数可以查看lvcreate这个命令的详细信息。如:
#lvcreate –L 100m –n guptLV1 guptVG
–L 100m是逻辑卷的大小,-n后面跟的是逻辑卷的名字。
(8)删除一个逻辑卷
格式:lvremove {逻辑卷相对路径},如:
#lvremove /dev/guptVG/guptLV1 //因为LV是设备文件所以在/dev目录下
注意在删除前要先卸载这个逻辑卷。
(9)扩展逻辑卷大小
格式:lvextend [选项] {逻辑卷相对路径},如增加guptLV1空间100m
#lvextend –L +100m /dev/guptVG/guptLV1 ①物理上增加
#
这里只列出一些常用的命令,读者可以自己通过其它途径再加深。
任务要求
Sdb、sdc是两个大小为1GB的SCSI磁盘(大小可以不相同的);
1.sda创建了sda1分区创建了PV;
2.sdb创建了sdb1分区创建了PV;
3.来自sda1和sdb1的PV共同组成了一个2GB的卷组:guptVG1;
4.guptVG1又被划分成3个大小为200M的逻辑卷:guptLV1、guptLV2、guptLV3;
5.保留空间供扩展使用。
任务内容
1. 首先确定系统中是否安装了lvm工具:
[root@gupt ~]# rpm –qa|grep lvm
system-config-lvm-1.0.16-1.0
lvm2-2.02.01-1.3.RHEL4
2.我们加了两个磁盘,先看看它们的原始信息
[root@gupt ~]# fdisk -l
Disk /dev/sdc: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdc doesn't contain a valid partition table
Disk /dev/sdd: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdd doesn't contain a valid partition table
3.进行分区:
两个磁盘建立主分区,并把全部磁盘空间划分给sdc1和sdd1,并将它们的格式转为Linux LVM格式,16进制编码为8e。
[root@gupt ~]# fdisk -l
Disk /dev/sdc: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 1 130 1044193+ 8e Linux LVM
Disk /dev/sdd: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdd1 1 130 1044193+ 8e Linux LVM
4.创建物理卷:
[root@gupt ~]# pvdisplay /dev/sdc1
No physical volume label read from /dev/sdc1
Failed to read physical volume "/dev/sdc1"
[root@gupt ~]# pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created
用同样的方法创建/dev/sdd1,然后查看两个物理卷。
[root@gupt ~]#pvscan
PV /dev/sdc1 lvm2 [1019.53 MB]
PV /dev/sdd1 lvm2 [1019.53 MB]
Total: 2 [1.99 GB] / in use: 0 [0 ] / in no VG: 2 [1.99 GB]
5.创建卷组:
[root@gupt ~]# vgcreate guptVG1 /dev/sdc1 /dev/sdd1
Volume group "guptVG1" successfully created
6.激活卷组:
[root@gupt ~]# vgchange -a y guptVG1
0 logical volume(s) in volume group "guptVG1" now active
7.查看卷组:
[root@gupt ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "guptVG1" using metadata type lvm2
[root@gupt ~]# pvscan
PV /dev/sdc1 VG guptVG1 lvm2 [1016.00 MB / 1016.00 MB free]
PV /dev/sdd1 VG guptVG1 lvm2 [1016.00 MB / 1016.00 MB free]
Total: 2 [1.98 GB] / in use: 2 [1.98 GB] / in no VG: 0 [0 ]
8.从卷组中删除一个物理卷:
[root@gupt ~]# vgreduce guptVG1 /dev/sdc1
Removed "/dev/sdc1" from volume group "guptVG1"
9.增加一个物理卷:
[root@gupt ~]# vgextend guptVG1 /dev/sdc1
Volume group "guptVG1" successfully extended
10.创建逻辑卷(单位:M):
[root@gupt ~]# lvcreate -L 200m -n guptLV1 guptVG1 //指定逻辑卷大小为200M
Logical volume "guptLV1" created
[root@gupt ~]# lvscan
ACTIVE '/dev/guptVG1/guptLV1' [200.00 MB] inherit
[root@gupt ~]# lvresize -L 800m /dev/guptVG1/guptLV1
没格式化文件系统之前可以随便自由拉伸。
但mkfs -t /dev/guptVG1/guptLV1 之后
若在拉伸LV,应该把拉伸部分也格式化了 //读取磁盘大小并告知系统
即:resize2fs /dev/guptVG1/guptLV1
以同样的方式在guptVG1上建立guptLV2和guptLV3:
[root@gupt ~]# lvscan
ACTIVE '/dev/guptVG1/guptLV1' [200.00 MB] inherit
ACTIVE '/dev/guptVG1/guptLV2' [200.00 MB] inherit
ACTIVE '/dev/guptVG1/guptLV3' [200.00 MB] inherit
11.建文件系统(格式化):
[root@gupt ~]# mkfs -t ext3 /dev/guptVG1/guptLV1
[root@gupt ~]# mkfs -t ext3 /dev/guptVG1/guptLV2
[root@gupt ~]# mkfs -t ext3 /dev/guptVG1/guptLV3
12.挂载逻辑卷:
先在/mnt创建LV1 、LV2和 LV3:
[root@gupt ~]# mkdir /mnt/LV1
[root@gupt ~]# mkdir /mnt/LV2
[root@gupt ~]# mkdir /mnt/LV3
再把guptLV1挂载到/mnt/LV1,把guptLV2和guptLV3挂载到/mnt/LV2和/mnt/LV3上并查看挂载情况:
[root@gupt~]# mount /dev/guptVG1/guptLV1 /mnt/LV1
[root@gupt~]# mount /dev/guptVG1/guptLV2 /mnt/LV2
[root@gupt~]# mount /dev/guptVG1/guptLV3 /mnt/LV3
[root@gupt~]# mount
/dev/mapper/guptVG1-guptLV1 on /mnt/LV1 type ext3 (rw)
/dev/mapper/guptVG1-guptLV2 on /mnt/LV2 type ext3 (rw)
/dev/mapper/guptVG1-guptLV3 on /mnt/LV3 type ext3 (rw)
13.自动加载文件系统
在/etc/fstab这个文件中加入以下内容:
[root@gupt~]# vi /etc/fstab
/dev/guptVG1/guptLV1 /mnt/LV1 ext3 defaults 0 0
/dev/guptVG1/guptLV2 /mnt/LV2 ext3 defaults 0 0
/dev/guptVG1/guptLV3 /mnt/LV3 ext3 defaults 0 0
14.删除一个逻辑卷
删除逻辑卷前先把它卸载,操作如下:
[root@gupt~]#umount /dev/guptVG1/guptLV3
[root@gupt~]# lvremove /dev/guptVG1/guptLV3
Do you really want to remove active logical volume "guptLV3"? [y/n]:
Logical volume "guptLV3" successfully removed
15. 扩展、缩减逻辑卷大小
扩展、缩减逻辑卷大小最好按PE个数加减即:
lvresize -l +/- n /dev/guptVG1/guptLV1
lvresize -L +/-/ n (m,g,t) /dev/guptVG1/guptLV1
- n ,缩减多少;+ n 扩展多少 ; n 变到 多少。请注意区别!!!!
注意按大小时,只能增长或减少4*n(n为正整数)M。
什么狗屁lvextend 和 lvreduce,渣渣
把guptLV1增加100MB:
[root@gupt~]# lvscan |grep LV1
ACTIVE '/dev/guptVG1/guptLV1' [200.00 MB] inherit
[root@gupt~]# lvextend -L +100m /dev/guptVG1/guptLV1
Extending logical volume guptLV1 to 300.00 MB
Logical volume guptLV1 successfully resized
[root@gupt~]# lvscan |grep LV1
ACTIVE '/dev/guptVG1/guptLV1' [300.00 MB] inherit
[root@gupt~]#resize2fs /dev/guptVG1/
将整个LV的大小调整到文件系统的大小。
(未挂载,未格式化时)把guptLV1减少50MB:,
[root@gupt root]# lvreduce -L -50m /dev/guptVG1/guptLV1
Rounding up size to full physical extent 48.00 MB
WARNING: Reducing active and open logical volume to 252.00 MB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce guptLV1? [y/n]:
Reducing logical volume guptLV1 to 252.00 MB
Logical volume guptLV1 successfully resized
[root@gupt~]# lvscan |grep LV1
ACTIVE '/dev/guptVG1/guptLV1' [252.00 MB] inherit
*(已格式化并已挂载)减少LV的大小
[root@db ~]#e2fsck -f /dev/vg/lv2 //缩减lv时必须先运行这个命令,否则哼哼, 删了在做一遍吧。
e2fsck 1.39 (29-May-2006)
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/vg/lv2: 11/90112 files (9.1% non-contiguous), 21665/360448 blocks
[root@db ~]#resize2fs /dev/vg/lv2 300M
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/vg/lv2 to 307200 (1k) blocks.
The filesystem on /dev/vg/lv2 is now 307200 blocks long.
lvresize -l -75 /dev/jmm/jmm_lv //75=300/4(4即PE大小)为要移除分区的PE数
WARNING: Reducing active logical volume to 300.00 MB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce jmm_lv? [y/n]: y
Reducing logical volume jmm_lv to 300.00 MB
Logical volume jmm_lv successfully resized
/* 至此以上已完成LV的缩减,下面是LV缩减的实际意义即移走要用的磁盘*/
pvmove /dev/sdb1 /dev/sdb5
[root@db ~/LVM]#pvmove /dev/sdb1 /dev/sdb5 //先把sdb1的数据的移到sdb5上
/dev/sdb1: Moved: 35.4%
/dev/sdb1: Moved: 91.7%
/dev/sdb1: Moved: 100.0%
[root@db ~/LVM]#vgreduce wyb /dev/sdb1 //把sdb1从卷组wyb中移除
Removed "/dev/sdb1" from volume group "wyb"
[root@db ~/LVM]#pvscan
PV /dev/sdb2 VG wyb lvm2 [576.00 MB / 0 free]
PV /dev/sdb3 VG wyb lvm2 [288.00 MB / 288.00 MB free]
PV /dev/sdb5 VG wyb lvm2 [1.45 GB / 368.00 MB free]
PV /dev/sdb1 lvm2 [768.70 MB] //已移除
Total: 4 [3.05 GB] / in use: 3 [2.30 GB] / in no VG: 1 [768.70 MB]
[root@db ~/LVM]#pvremove /dev/sdb1 //把sdb1还原,即踢出pv
Labels on physical volume "/dev/sdb1" successfully wiped
[root@db ~/LVM]#pvscan //已踢出sdb1
PV /dev/sdb2 VG wyb lvm2 [576.00 MB / 0 free]
PV /dev/sdb3 VG wyb lvm2 [288.00 MB / 288.00 MB free]
PV /dev/sdb5 VG wyb lvm2 [1.45 GB / 368.00 MB free]
Total: 3 [2.30 GB] / in use: 3 [2.30 GB] / in no VG: 0 [0 ]
[root@db ~/LVM]#ls //原保存在sdb1的数据依然在。
a lost+found
LVM的系统快照
假设已存在一个格式化好的逻辑卷LV:/dev/vg/lv
①挂载LV,并创建文件。
#mount /dev/vg/lv /mnt/lvm
#dd if=/dev/zero of=/mnt/LVM/a bs=100M count=1
②创建快照区
#lvcreate -l 40 -s -n lv_sn /dev/vg/lv --》 被快照区。
-s (snapshot) 表示是快照区。
#mount /dev/vg/lv_sn /mnt/snapshot (不要格式化文件系统即可挂载)
#df -h (会发现,两个lV的大小和使用率相同)
/dev/mapper/vg-lv2 291M 11M 269M 4% /root/LVM
/dev/mapper/vg-lv2_sn
291M 11M 269M 4% /root/snapshot
③改变/dev/vg/lv被快照区的使用率
#cd /mnt/LVM
#dd if=/dev/zero of=/mnt/LVM/a bs=10M count=1
#df -h (会发现快照区使用率未发生变化)
啦啦啦啦,想想很合理嘛,什么是按得照相机,得到的是那一瞬间的照片~
/dev/mapper/vg-lv2 291M 11M 269M 4% /root/LVM
/dev/mapper/vg-lv2_sn
291M 111M 168M 40% /root/snapshot
④还原被快照区
#mkdir /backups 建一个目录来存放,备份文件。
#tar -zcvf /backups/lvm.tar.gz /mnt/snapshot/* 备份
#tar -zxvf /backups/lvm.tar.gz -C /mnt/LVM 还原
至此,LVM的快照备份还原结束,你是否感觉十分蛋疼,十分垃圾,十分无用。
哈哈,我也觉得。但受鸟哥读鸟哥一席话,顿感自己太年轻。
在这些垃圾的般的操作中你有木有发现一些金子??????
不如说,我们换个角度用逆向的思维想想,我们可以这么做:
将原本的lv当作备份数据,然后将lv_sn当作实际运行中的数据,做任何测试的操作都在
lv_sn这个快照区中测试,当测试完成或者破坏了系统,只要删掉快照区,再重建一个即可
。举一个最直接的例子,当你接触虚拟机时(xen,构建多份给其他人使用),你只需要有一个基础的环境并维护好,其他的环境使用快照来提供即可。就算其中一份系统被搞坏,你只需要删掉快照,在重建一个即可。
到这了捎带提一下VMware Workstation的快照功能。
①选择一个虚拟机---右键----Snapshot----Take Snapshot
②恢复快照
展开阅读全文