LVM(Logical Volume Management)是逻辑卷管理的缩写。它的出现将物理磁盘分割成一些逻辑单位,来自于不同磁盘的分区能组成一个逻辑卷。此外,在需要时分区能被动态的加入和删除。举例来说,如果你有一个8GB的磁盘,其上有一个2GB的分区/usr,它的空间已经耗尽了。如果您要扩大/usr分区的话,必须首先创建一个更大的分区,然后将/usr的所有内容都拷贝到此分区中,改变/etc/fstab文件,重新启动。但是如果在系统中使用了LVM的话,你只需使用LVM中的命令,就可以简单的增大/usr。
LVM的分区方式对于需要大数据量存储的分区进行管理,可以极大的减轻管理员的负担。而且,在LVM和RAID设备结合使用之后,可以构造出一种灵活而且高效的存储方案。
4.1 LVM的基本概念
后面在建立LVM类型的分区时,会用到一些术语,下面先对这些术语进行介绍。
物理卷(PV)
物理卷仅仅是进行了LVM初始化的物理分区,以使得LVM管理程序能识别这个分区。
物理范围(PE)
物理范围是一些大数据块,通常有几兆字节。
卷组(VG)
一个VG可由多个PE组成。一个VG可由几个分区组成,它包含的PE由这些分区提供。在某种意义上说,我们可以认为VG就是一个硬盘设备。
逻辑卷(LV)
逻辑卷是最终用户访问的部分,它用于存储数据。在某种意义上说,我们可以认为LV就是一个逻辑分区。其上可以创建任何类型的分区,包括EXT2,ReiserFS,NTFS等等。在访问时,它和正常的磁盘分区一样。
逻辑范围(LE)
每个逻辑卷被分割成为数据块。
为了使LVM在系统中能够正常工作,那么在定制内核的时候,要将LVM支持作为模块形式定制。然后,为了创建和管理LVM逻辑分区,您还需要安装LVM包。
步骤如下:
使用fdisk命令设置分区/dev/hda3和/dev/hdc3类型为0x8e。
创建物理卷。
pvcreate /dev/hda3
pvcreate /dev/hdc3
创建新卷组newvg,它包含/dev/hda3和/dev/hdc3分区,卷组的大小是两个分区容量的总和。在成功创建此卷组之后会在/dev目录下形成目录/dev/newvg,在其后生成的逻辑卷设备文件都保存在此目录下。
vgcreate newvg /dev/hda3
vgcreate newvg /dev/hdc3
创建新的逻辑卷
lvcreate -L1500 -nnewlv newvg
创建一个1500MB线性逻辑卷,同时这条命令也创建逻辑卷对应的块设备文件/dev/newvg/newlv。
lvcreate -i2 -I4 -l1500 -notherlv newvg
以交错块(stripe)为2,块大小为4 KB创建另一个逻辑卷,对应的设备别名是/dev/newvg/otherlv。
创建文件系统
mke2fs /dev/newvg/newlv
在设备/dev/newvg/newlv上创建ext2文件系统,除了ext2文件系统之外,您还可以创建Reiserfs等多种文件系统。
激活lvm逻辑卷
vgchange -a y
在使用卷组之前,控制卷组对内核的可见性。这条命令激活系统中所有已知的卷组。在删除一个卷组之前,最好先使用vgchange -a n禁用卷组。
读入LVM分区信息 sub get_lvs {
my ($lvm) = @_;
my @fstabs;
my $start = 0;
@fstabs = ();
$lvm->{primary}{normal} = ();
undef $lvm->{primary}{normal};
#- 使用vgdisplay -v -D lvmname获得所有卷组。
foreach (map { /^LV Name\s+(\S+)/ ? $1 : () } `vgdisplay -v -D $lvm->{LVMname}`) {
#- 使用lvdisplay -D -c lv获得逻辑卷的信息。
my @lvinfo = split(':', `lvdisplay -D -c $_`);
my $size = $lvinfo[6];
my $type = -e $_ && fsedit::typeOfPart($_);
my %fstab;
$fstab{device} = $_;
$fstab{type} = $type || 0x83;
$fstab{size} = $size;
$fstab{isFormatted} = $type;
$fstab{number} = $lvinfo[4];
$fstab{start} = $start;
$fstab{lvm} = $_;
$start += $size;
push @fstabs, \%fstab;
}
$lvm->{primary}{normal} = \@fstabs;
}
将LVM分区操作写入磁盘 #- 对已经删除的lvm分区,则除去其上的逻辑卷,然后将其除去。
#- 若只有部分逻辑卷被除去,则删除这部分逻辑卷
foreach my $lv (@{$o->{lvms}}) {
if ($lv->{isRemove}) {
#- 除去所有的逻辑卷
foreach (fsedit::get_fstab($lv)) {
lvm::lv_delete($_);
}
#- 清空主分区描述结构
splice @{$lv->{primary}{normal}}, 0;
#- 清除卷组
lvm::vg_destroy($lv);
} else {
foreach (fsedit::get_fstab($lv)) {
lvm::lv_delete($_) if ($_->{isRemove});
}
}
}
foreach my $lv (@lvm) {
#- 对现在存在的lvm分区,如果是新创建的,则创建新的卷组
#- 否则,找出新添加的卷组,并将其加入已存在的卷组中
if ($lv->{isCreate}) {
lvm::vg_add($_) foreach (@{$lv->{disks}});
} else {
lvm::vg_add($_) foreach (grep { $_->{isNewPV} } @{$lv->{disks}});
}
#- 对于卷组上存在的逻辑卷,如果是新创建的,则调用lv_create创建。