——————————————————————————————————————————————————
很久没有写文章了,距上次更新,已有十来天的光景了,最近事儿挺多,忙来忙去,到头来也是瞎忙一场,没有多大收成,哎,该反省总结了。

好了,废话不多说了,开始正题,这次准备写一些关于LVM逻辑卷的文章,理论部分可能不会太多,重点是实际操作部分,结合遇到的问题加以阐述。有需要用到LVM的朋友,可以拿去借鉴,如果文章中有什么错误信息,烦请各位指正。谢谢!
——————————————————————————————————————————————————

测试环境:
操作系统:Asianux3.0 sp3 x86-64 (kernel 2.6.18-194.1AXS3)
LVM2 :lvm2-2.02.56-8.1.0.1.AXS3

一、创建篇
本节主要是讲LVM逻辑卷的创建,如果有对LVM理论不太熟悉的朋友,可以先去看看LVM的原理,我在这儿暂且不表,直接讲下LVM创建实例。

要在Linux系统上使用LVM的功能,除了核心必须支持以外,还必须得安装LVM2套件。现在的Linux系统,核心都能支持,并且系统也自带了LVM2套件,如果没有装的话,就得自己动手装装了。

整个LVM制作流程可以简单分成三个部分,制作PV、创建VG、划分LV,下面来依次介绍。

1、建立和查询 PV

1.1、我准备了一个2G的盘来做测试,设备为/dev/sdb,
[php]
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
[/php]

然后对这个设备划分两个分区,来制作PV之用。当然,也可以直接把 /dev/sdb 作为一个pv。
[php]
[root@localhost ~]# fdisk -l

Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 914 7237282+ 83 Linux
/dev/sda3 915 1044 1044225 82 Linux swap / Solaris

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
[root@localhost ~]# fdisk /dev/sdb

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-261, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-261, default 261): +300M

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (38-261, default 38):
Using default value 38
Last cylinder or +size or +sizeM or +sizeK (38-261, default 261): +400M

Command (m for help): p

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 37 297171 83 Linux
/dev/sdb2 38 87 401625 83 Linux
[/php]

现在可以看到 ID 为83,这是LINUX格式,我们需要做PV,则需要将 ID 更改为 8e ,成为 LINUX LVM 格式。继续上面的操作:
[php]
Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 37 297171 8e Linux LVM
/dev/sdb2 38 87 401625 8e Linux LVM

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@localhost ~]# partprobe
[root@localhost ~]# fdisk -l

Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 914 7237282+ 83 Linux
/dev/sda3 915 1044 1044225 82 Linux swap / Solaris

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 37 297171 8e Linux LVM
/dev/sdb2 38 87 401625 8e Linux LVM
[/php]

通过上面的操作,我们可以看出,已经将ID更改为8e,并且使用 partprobe 命令,让核心立刻读取最新的分区表,而不需要重新启动系统。

1.2、现在开始使用刚才建立的两个分区,来创建我们的PV设备。
[php]
[root@localhost ~]# pvscan
No matching physical volumes found
[root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
[root@localhost ~]# pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created
[root@localhost ~]# pvscan
PV /dev/sdb1 lvm2 [290.21 MB]
PV /dev/sdb2 lvm2 [392.21 MB]
Total: 2 [682.42 MB] / in use: 0 [0 ] / in no VG: 2 [682.42 MB]
[/php]

使用 pvcreate 命令将分区改为pv格式后,可以使用 pvscan 命令搜索当前系统里任何具有PV格式的磁盘,如果想要查看详细的信息,可以执行 pvdisplay 命令。
[php]
[root@localhost ~]# pvdisplay
"/dev/sdb1" is a new physical volume of "290.21 MB"
— NEW Physical volume —
PV Name /dev/sdb1
VG Name
PV Size 290.21 MB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 4F633B-c57H-DQ0D-FppL-Ujv0-eDCH-mnBRko

"/dev/sdb2" is a new physical volume of "392.21 MB"
— NEW Physical volume —
PV Name /dev/sdb2
VG Name
PV Size 392.21 MB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID Axqcih-c0VU-peX7-SL22-q4QM-rQg2-zrluIj
[/php]

当然,也可以删除任何一个pv设备,使用 pvremove 命令即可。
[php]
[root@localhost ~]# pvremove /dev/sdb2
Labels on physical volume "/dev/sdb2" successfully wiped
[root@localhost ~]# pvscan
PV /dev/sdb1 lvm2 [290.21 MB]
Total: 1 [290.21 MB] / in use: 0 [0 ] / in no VG: 1 [290.21 MB]
[/php]

2、建立和查询 VG

2.1、创建VG时要使用 vgcreate 命令,格式和具体操作如下:
[php]
[root@localhost ~]# vgcreate vg1 /dev/sdb1 /dev/sdb2
Volume group "vg1" successfully created
[root@localhost ~]# vgscan
Reading all physical volumes. This may take a while…
Found volume group "vg1" using metadata type lvm2
[/php]

2.2、查询VG详细信息可以使用 vgdisplay 命令,如
[php]
[root@localhost ~]# vgdisplay
— Volume group —
VG Name vg1
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 680.00 MB
PE Size 4.00 MB
Total PE 170
Alloc PE / Size 0 / 0
Free PE / Size 170 / 680.00 MB
VG UUID DMO8p5-OZoJ-QM0v-ewcW-KU0E-HZ0T-DUrO2l
[/php]

2.3、在这里罗嗦几句关于PE的概念,所谓 PE,就是 Physical Extend 物理扩展,在建立VG的时候,需要指定PE的数值,如果不指定,则默认为 4MB 。那么当PE为4MB 时,VG最大的容量就是256GB,不难看到,PE有点像VG的块,PE的大小决定了VG的容量。如果想让VG大于默认的256GB,那么就要改变PE这个数值。需要注意的是,一个VG最大可以允许65534个PE。

更改PE的值,要在创建VG时就要指定,使用 -s 参数即可。
[php]
[root@localhost ~]# vgcreate -s 16M vg1 /dev/sdb1 /dev/sdb2
Volume group "vg1" successfully created
[/php]
这样,名为vg1的VG容量从256GB增加到了 1TB 。不同的版本的核心对于PE的限制也不同,具体情况可以参看下man vgcreate中-s参数的解释。

但是,只有LVM1需要指定PE大小,来达到控制VG容量的效果,而现在的linux大部分都使用了 LVM 2 ,LVM2的PE数量已经没有限制了,所以,设置PE的大小,只会影响速率,而不会影响VG容量大小。

2.4、在VG内删除PV和增加PV设备
在VG内,可以随意删除某个PV设备,也可以随意添加某个PV设备进入到VG内,使用的命令为 vgreduce 和 vgextend
[php]
[root@localhost ~]# vgdisplay
— Volume group —
VG Name vg1
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 672.00 MB
PE Size 16.00 MB
Total PE 42
Alloc PE / Size 0 / 0
Free PE / Size 42 / 672.00 MB
VG UUID EzIPfa-DVvM-itX0-y1nd-MxsJ-ZUdZ-8eqsxB

[root@localhost ~]# vgreduce vg1 /dev/sdb2
Removed "/dev/sdb2" from volume group "vg1"
[root@localhost ~]# vgdisplay
— Volume group —
VG Name vg1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 288.00 MB
PE Size 16.00 MB
Total PE 18
Alloc PE / Size 0 / 0
Free PE / Size 18 / 288.00 MB
VG UUID EzIPfa-DVvM-itX0-y1nd-MxsJ-ZUdZ-8eqsxB

[root@localhost ~]# vgextend vg1 /dev/sdb2
Volume group "vg1" successfully extended
[root@localhost ~]# vgdisplay
— Volume group —
VG Name vg1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
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 672.00 MB
PE Size 16.00 MB
Total PE 42
Alloc PE / Size 0 / 0
Free PE / Size 42 / 672.00 MB
VG UUID EzIPfa-DVvM-itX0-y1nd-MxsJ-ZUdZ-8eqsxB
[/php]

2.5、激活VG
当操作系统出现问题而无法开机时,备份数据显的由为重要。进入 rescue 模式或其他有 LVM 命令的环境,执行 pvscan 进行pv的扫描,此时可以查看到 pv和vg 的名字,再执行 vgchange -ay vg名字 命令,激活这个vg,就可以将里面的lv设备里的数据备份出来。
(1)单机使用LVM时,可以使用
[php]
vgchange -a y vgname #来激活vg
vgchange -a n vgname #来非激活vg
[/php]
(2)Cluster模式下,有多台主机,当一台主机激活了VG,其他主机则无法激活VG,保证了数据的完整性,可以这样操作:
[php]vgchange -c y vgname #设置exclusive 属性;
vgchange -a e vgname #以 exclusive 模式激活vg ,上一步操作是前提条件;[/php]
[php]
vgchange -a n vgname #仍然使用这个命令来 非激活 vg ;
vgchange -c n vgname #去掉 exclusive 属性;
[/php]
(3)共享模式。允许VG被多台主机同时激活使用,如Oracle OPS等,但卷组里都必须是些裸设备才行,这样操作系统和文件系统不会对该设备进行操作,而完全交给应用程序来处理,数据的完整性也靠应用程序管理。
[php]
vgchange -c y -S y vgname #设置VG为共享模式;
vgchange -a -s vgname #共享方式激活VG;
vgchange -a n vgname #仍然使用这个命令来 非激活 vg ;
[/php]

2.6、删除VG
删除一个VG很简单,执行
[php]
vgremove vgname #删除名为vgname的vg
[/php]

3、创建LV
3.1、当vg创建好后,可以创建lv设备了,使用lvcreate命令即可:
在创建之前,需要介绍下两种模式,线性(linear)和交错(striped),默认情况下都是线性模式,如果有需要,可以选择交错模式。

线性(linear)
简单来说,就是按顺序分配,例如,LV 的 LE 1–100 映射到 pv1 上, LE 101—200 映射到 pv2 上。

[php]
格式:
lvcreate -L [sizeMG] -n [lvname] vgname
例如:
[root@localhost ~]# lvcreate -L 96M -n lv1 vg1
Logical volume "lv1" created
[root@localhost ~]# lvcreate -L 160M -n lv2 vg1
Logical volume "lv2" created
[/php]

条带(striped)
简单来说,就是交错分配,例如,LV的 LE1 映射到 pv1 的 PE1 上,LV的 LE2 映射到 pv2 的 PE1 上,LV的 LE3 映射到 pv1 的 PE2 上,LV的 LE4 映射到 pv2 的 PE2 上等等。

[php]
格式:
lvcreate -i [Stripes] -I [StripeSize] -L [sizeMG] -n [lvname] vgname
例如:
[root@localhost ~]# lvcreate -i 3 -I 4k -L 7G -n lv1 vg1
Rounding size (1792 extents) up to stripe boundary size (1794 extents)
Logical volume "lv1" created
[/php]
-i 参数是在几个PV上建立交错模式,
-I 参数是采用交错模式时使用的块大小,默认是4K,也可以设大些,但必须是2的N此方,N最大为9。

3.2、查看lv信息
可以先扫描下lv设备 (lvscan),再查看下lv的详细信息 (lvdisplay)
[php]
[root@localhost ~]# lvscan
ACTIVE ‘/dev/vg1/lv1’ [96.00 MB] inherit
ACTIVE ‘/dev/vg1/lv2’ [160.00 MB] inherit
[root@localhost ~]# lvdisplay
— Logical volume —
LV Name /dev/vg1/lv1
VG Name vg1
LV UUID 9KNWK8-RGlB-VTiT-rn1R-IbGP-juoz-Froeco
LV Write Access read/write
LV Status available
# open 0
LV Size 96.00 MB
Current LE 6
Segments 1
Allocation inherit
Read ahead sectors auto
– currently set to 256
Block device 253:0

— Logical volume —
LV Name /dev/vg1/lv2
VG Name vg1
LV UUID vHKb4j-MlSO-ppLG-Srk0-ofF4-silb-oT7Lel
LV Write Access read/write
LV Status available
# open 0
LV Size 160.00 MB
Current LE 10
Segments 1
Allocation inherit
Read ahead sectors auto
– currently set to 256
Block device 253:1
[/php]

3.3、扩大或减小lv的容量
可以使用 lvextend 和 lvreduce 命令来扩大或减少 lv 的大小,具体的扩容问题后面会有专门的小节讲到,在这儿先简单的介绍下这两个命令。
[php]
[root@localhost ~]# lvextend -L +32M /dev/vg1/lv1
Extending logical volume lv1 to 128.00 MB
[root@localhost ~]# lvscan
ACTIVE ‘/dev/vg1/lv1’ [128.00 MB] inherit
ACTIVE ‘/dev/vg1/lv2’ [160.00 MB] inherit
[root@localhost ~]# lvdisplay
— Logical volume —
LV Name /dev/vg1/lv1
VG Name vg1
LV UUID 9KNWK8-RGlB-VTiT-rn1R-IbGP-juoz-Froeco
LV Write Access read/write
LV Status available
# open 0
LV Size 128.00 MB
Current LE 8
Segments 1
Allocation inherit
Read ahead sectors auto
– currently set to 256
Block device 253:0

— Logical volume —
LV Name /dev/vg1/lv2
VG Name vg1
LV UUID vHKb4j-MlSO-ppLG-Srk0-ofF4-silb-oT7Lel
LV Write Access read/write
LV Status available
# open 0
LV Size 160.00 MB
Current LE 10
Segments 1
Allocation inherit
Read ahead sectors auto
– currently set to 256
Block device 253:1
[/php]
[php]
[root@localhost ~]# lvreduce -L -16M /dev/vg1/lv1
WARNING: Reducing active logical volume to 112.00 MB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv1? [y/n]: y
Reducing logical volume lv1 to 112.00 MB
Logical volume lv1 successfully resized
[root@localhost ~]# lvscan
ACTIVE ‘/dev/vg1/lv1’ [112.00 MB] inherit
ACTIVE ‘/dev/vg1/lv2’ [160.00 MB] inherit
[root@localhost ~]# lvdisplay
— Logical volume —
LV Name /dev/vg1/lv1
VG Name vg1
LV UUID 9KNWK8-RGlB-VTiT-rn1R-IbGP-juoz-Froeco
LV Write Access read/write
LV Status available
# open 0
LV Size 112.00 MB
Current LE 7
Segments 1
Allocation inherit
Read ahead sectors auto
– currently set to 256
Block device 253:0

— Logical volume —
LV Name /dev/vg1/lv2
VG Name vg1
LV UUID vHKb4j-MlSO-ppLG-Srk0-ofF4-silb-oT7Lel
LV Write Access read/write
LV Status available
# open 0
LV Size 160.00 MB
Current LE 10
Segments 1
Allocation inherit
Read ahead sectors auto
– currently set to 256
Block device 253:1
[/php]

4、格式化lv,正式使用lv
[php]
[root@localhost ~]# mkfs.ext3 /dev/vg1/lv1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
28672 inodes, 114688 blocks
5734 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
14 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]#
[/php]
格式化为ext3格式后,挂载上来即可使用。
[php]
[root@localhost ~]#cd /mnt
[root@localhost mnt]# mkdir sdb1
[root@localhost mnt]# mount /dev/vg1/lv1 /mnt/sdb1
[root@localhost mnt]# cd sdb1/
[root@localhost sdb1]# ll
total 12
drwx—— 2 root root 12288 10-28 14:50 lost+found

[root@localhost sdb1]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 6.7G 4.9G 1.6G 76% /
/dev/sda1 99M 12M 82M 13% /boot
tmpfs 187M 0 187M 0% /dev/shm
/dev/mapper/vg1-lv1 109M 5.6M 98M 6% /mnt/sdb1
[/php]

至此,LVM 制作步骤结束,明天再写点关于扩容方面的介绍。如果大家喜欢,欢迎多多留言啊~~~ ^0^…