Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103750303
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-04-22 22:41:09

出处:ChinaITLab 
 
#- 若只有部分逻辑卷被除去,则删除这部分逻辑卷
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创建。
my @fstab = get_all_fstab($lv);
foreach (@fstab) {
lvm::lv_create($lv, $_) if ($_->{isCreate});
}
#- 重新创建卷组的主分区结构,设置安装点和格式化标志
lvm::get_lvs($lv);
foreach my $f (fsedit::get_fstab($lv)) {
foreach (@fstab) {
if ($_->{type} && $f->{device} eq $_->{device}) {
$f->{mntpoint} = $_->{mntpoint};
$f->{toFormat} = $_->{toFormat};
}
}
}
}
#- 生成/etc/lvmtab描述文件,同时激活卷组
if (@lvm) {
run_program::run('vgscan') if !-e '/etc/lvmtab';
run_program::run('vgchange', '-a', 'y');
}
为了在系统启动时能够加载lvm-mod.o模块,扫描物理卷,生成正确的描述文件/etc/lvmtab,同时激活LVM分区,又由于基于 RedHat的发布缺省情况下是不支持LVM的分区方式,您还需要修改初始启动脚本文件/etc/rc.d/rc.sysinit文件,在其中加入如下语句:
# 创建/etc/lvmtab文件
if [ -x /sbin/vgscan ]; then
/sbin/vgscan > /dev/null 2>&1
fi
# 激活lvm分区,如果不进行激活操作,lvm分区无法正常工作
if [ -x /sbin/vgchange -a -f /etc/lvmtab ]; then
action "Setting up LVM:" /sbin/vgchange -a y
fi
5 支持软Raid分区
软件Raid分区支持是指Linux系统不借助任何硬件支持,在普通ide或scsi硬盘上实现Raid功能。这首先需要内核的支持,其次还需要安装raidtools包。
5.1 Raid设备概念
Linear模式
两个或者多个磁盘被组合成一个物理设备,这些磁盘是叠加使用的。也就是说,RAID设备会先装满第一个磁盘,然后第二个磁盘,以此类推。每个磁盘的大小不必相同。
使用此模式Raid设备不提供冗余信息。如果一个磁盘崩溃了,你将会丢失所有的数据。对于单个读写操作,读写性能都没有任何提升,但是当多个用户共享RAID设备时,如果用户访问的文件在不同的磁盘上,那可能会使访问性能更高。
RAID-0模式
这种模式也被称为交错(Stripe)模式。RAID0要求磁盘(分区)具有近似的大小。它的所有磁盘读/写操作时并行完成的。如果其中一个分区比另外一个分区大得多,那么在使用这些空间时,并行操作无法完成,导致性能下降。
这种模式也不存在数据冗余。如果一个磁盘损坏,将导致所有数据丢失。但是,在此种模式下,因为并行存取读写性能会提升。这是使用RAID0的主要原因。
RAID-1模式
此种模式具有数据冗余性。RAID-1缺省时,使用两块磁盘,同时也可以指定多块备用盘。这个模式下的两个硬盘互为镜像。这就要求这两个磁盘的大小一致,否则RAID设备的大小等于最小的磁盘。
在任何一个磁盘崩溃之后,数据都会保持完整并可立即进行重建。在此种方式下,读性能会得到很大的提升,但是写磁盘的性能保持不变或者有所下降。
RAID-4模式
这种模式不是经常使用,用于三个或者多个磁盘上。这种模式采用数据块存储方式,将校验数据单独存在一个磁盘上,写数据到其他磁盘时采用和RAID-0相似的方式。因为一个磁盘用于奇偶校验,所以RAID阵列的大小为(N-1)*S(S为阵列中最小的磁盘尺寸)。
在一个磁盘失效之后,奇偶信息会用于重构所有数据。但如果有两个磁盘崩溃,所有数据将会丢失。但是奇偶信息保存在一个磁盘上,每次数据更新都会访问这张磁盘,因此这张磁盘会成为瓶颈。
RAID-5模式
在需要组合大量的物理磁盘时,这是最有用的RAID方式。它也用在三个或者多个磁盘上,RAID阵列的大小为(N-1)*S。此种模式采用数据块存储方式,将校验数据分布保存在各个磁盘上,避免了RAID-4的瓶颈问题。
如果一块磁盘崩溃,在存在备用盘的情况下,重构立即开始。但是如果有两个磁盘崩溃,所有数据将会丢失。在此种方式下读写的性能都将有所提升。
5.2 Raid设备安装
在Linux系统下为了安装RAID设备,必须首先安装raidtools工具,创建/etc/raidtab文件,描述创建的RAID阵列的类别。然后使用mkraid命令创建RAID分区。
mkraid /dev/md0
这条命令初始化RAID阵列,写永久超级块并且启动阵列。然后察看/proc/mdstat,应该见到阵列正在运行。最后,可以创建文件系统,并在fstab中挂接它。
下面是配置不同RAID模式时,raidtab文件的内容:
线性模式 raiddev /dev/md0
raid-level linear
nr-raid-disks  2
chunk-size 32
persistent-superblock 1
device /dev/hdb6
raid-disk  0
device /dev/hdc5
raid-disk  1
RAID-0模式 raiddev /dev/md0
raid-level 0
nr-raid-disks  2
persistent-superblock 1
chunk-size 4
device /dev/hdb6
raid-disk  0
device /dev/hdc5
raid-disk  1
RAID-1 raiddev /dev/md0
raid-level 1
nr-raid-disks  2
nr-spare-disks 0
chunk-size 4
persistent-superblock 1
device /dev/hdb6
raid-disk  0
device /dev/hdc5
raid-disk  1
若有备用盘,可以增加它们到设备规范的尾部,例如:
device /dev/hdd5
spare-disk 0
spare-disk的设定值应该与nr-spare-disks项的设置一致。
mkraid /dev/md0启动镜像初始化(镜像重构)。重构过程使用空闲的I/O带宽,重构过程是透明的,重构时仍能使用这个设备。在重构运行时,格式化、挂接和使用设备都可以使用。
Raid-4 raiddev /dev/md0
raid-level 4
nr-raid-disks  4
nr-spare-disks 0
persistent-superblock 1
chunk-size 32
device /dev/hdb1
raid-disk  0
device /dev/hdc1
raid-disk  1
device /dev/hdd1
raid-disk  2
device /dev/hde1
raid-disk  3
若有备用磁盘,添加
device /dev/hdf1
spare-disk 0
mkraid /dev/md0进行初始化。使用带有特殊选项的mke2fs进行格式化。
mke2fs -b 4096 -R stride=8 /dev/md0
Raid-5 raiddev /dev/md0
raid-level 5
nr-raid-disks  7
nr-spare-disks 0
persistent-superblock 1
parity-algorithmleft-symmetric
chunk-size 32
device /dev/hda3
raid-disk  0
device /dev/hdb1
raid-disk  1
device /dev/hdc1
raid-disk  2
device /dev/hdd1
raid-disk  3
device /dev/hde1
raid-disk  4
device /dev/hdf1
raid-disk  5
device /dev/hdg1
raid-disk  6
运行mkraid /dev/md0,使用带有特殊选项的mke2fs格式化阵列。例如:
mke2fs -b 4096 -R stride=8 /dev/md0
stride=8表示raid块为8个文件系统块大小,即为32KB。
5.3 启动Raid设备
在创建了正确的RAID描述文件,并使用mke2fs文件创建了正确的文件系统之后,您还需要执行命令:
raidstart /dev/md0
启动RAID设备。在执行此命令之后,内核的RAID子系统就自动地在后台开始工作了。在修改RAID设备对应的分区时,为了保证数据不发生错误,必须先用
raidstop /dev/md0
停止此设备,然后才能进行修改。
#- 下面的代码是安装程序中创建raid设备的模块。
#- 根据raid设备结构,创建/etc/raidtab文件和软Raid分区:
sub make
{
my ($raid) = @_;
isMDRAID($_) and make($raid, $_) foreach @{$raid->{disks}};
#- 创建raid设备
my $dev = devices::make($raid->{device});
#- 根据raid级别,加载对应的设备模块
eval { modules::load(module($raid)) };
run_program::run("raidstop", $dev);
#- 创建/etc/raidtab文件和软Raid分区
&write($raid, "/etc/raidtab");
run_program::run("mkraid", "--really-force", $dev) or die
$::isStandalone ? _("mkraid failed (maybe raidtools are missing?)") : _("mkraid failed");
}
在RAID设备作为系统的根分区安装之后,为了使系统能够正常启动,整个的系统环境还要做到自动检测RAID设备并正确挂接分区。这需要下列步骤:
定制的系统内核支持raid设备自动检测。也就是说,在编译内核时选择: Multi-device support (RAID and LVM)
[*] Multiple devices driver support (RAID and LVM)
<*>RAID support
将设备模块md.o打入内核。如果对此设备的支持选择了内核模块的方式,那么软件RAID分区无法作为根分区启动系统。这主要是因为RAID设备需要在启动之初对硬盘进行读写,以决定RAID分区的位置,类型等参数。如果不将md.o置入内核,仅选择模块方式,那么它将从初始内存镜像中进行加载,但是加载过后无法完成上述的信息读取过程。
用带有persistent-superblock的选项创建RAID设备。
RAID的设备分区类型必须设为0xFD。
正确的配置RAID阵列,并在RAID系统上建立了正确的文件系统。
必须创建初始启动镜像,这样保证在启动时能够加载raid设备模块。
mkinitrd --with=raid5 raid-ramdisk 2.4.3
纠正/etc/fstab文件,使/dev/md0为根文件系统对应的设备文件,并使引导时所用的分区包含在fstab中。

阅读(374) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~