电脑技术学习

如何实现Linux的软件磁盘阵列(RAID)

dn001
;;;如果你想实现一个;Linux;的软件磁盘阵列(以下简称;RAID;或;raid),;那么在开始前,;下面的这个最重要的网点是你应该首先去涉猎的:;

Linas;Vepsta;的;raid;主页:;http://linas.org/linux/raid.html;

本文发表的时间是;1998年10月29日,;目前已有的文档还不全,;比较混乱.;这篇文章就是;澄清一些当你在实现;raid0;和;raid1;时会遇到的问题.;(译者注:;raid0;--;是指将数据散布在不同的硬盘上操作,;无冗余数据,;读写都可以并行操作,;速度快,;英文简称为;striping,;以下译作"分散读写";;raid1;--;是指磁盘镜像,;英文为;mirroring.);

我想实现基于分散读写模式(striping)的镜像模式(mirroring).;分散读写模式具备优异;的读写性能,;而镜像模式带来备份和读的性能增强.;

我使用一个;2.0.30;的内核,;实现了;raid0(striping).;然后我将内核升级到;2.0.35,;这下笑话开始了.;在同;raid0;做了一番争斗后(译者注:;可能未成功),;我开始处理;raid1.;然后,;你猜怎样,;扔掉你所知道所有的;raid;知识,;从打草稿开始!;(因此)一个简化工作;的好主意是,;首先使;raid0;能用,;之后增加;raid1.;故事是这样的:;

工作于内核;2.0.30;下的;Raid0;(striping)
从;2.x;版本开始,;内核已经实现了线性和;raid0(striping);模式.;你必须重新编译内核;以带有多设备界面支持(multiple;devices).;我强烈建议将它编译到内核中.;如果你是;使用模块方式,;你将会吃尽苦头.;
检查是否多设备界面(multiple;devices)已经安装.;dmesg;|more;然后检查是否;存在;md;驱动器(md;driver)和;raid0;已经注册(raid0;registered)的信息(想不起精确的;词语;-;"夜太深";;-(;);

或敲入;cat;/proc/mdstat;查看你的;md;驱动器的状态.;你应该看到;/dev/md0;到;/dev/md3;处于非激活状态.;

奇怪的是,;内核工具;mdtools-0.35;通常并不随销售包提供.;那里面有建立,;运行和使;raid;停止的工具.;

你在;Slackware;的销售包中可以找到它(;大小为;23k;);

http://sunsite.unc.edu/pub/Linux/distributions/slackware/slakware/ap1/md.tgz;

下载到;/usr/local/src;然后:;


cd;/;
tar;-zxvf;/usr/local/src/md.tgz
它将把文件放在正确的位置.;
sbin/mdadd
sbin/mdcreate
usr/etc/mdtab
install/doinst.sh
usr/man/man5/mdtab.5.gz
usr/man/man8/mdadd.8.gz
usr/man/man8/mdcreate.8.gz
usr/doc/md/COPYING
usr/doc/md/ChangeLog
usr/doc/md/README
usr/doc/md/md_FAQ
通读;README;文件(毫无疑问,;忽略警告们).;这份文档极适合于内核版本;2.0.30;和;线性(linear)/raid0;模式.;Linux;日报(Linux;Journal)(1998年六月或七月刊)中有一篇精采的介绍怎样实现;raid0(striping);的文章.;它增强了我的兴趣.;
Linux;公报(LG);中有另一篇文章,;也有所帮助:;
http://www.ssc.com/lg/issue17/raid.html;

你应该在;fsck;-a;之前开始启动;raid;阵列,;在;Slackware;中它(fsck)通常;位于;/etc/rc.d/rc.s;文件中,;而在;/etc/rc.d/rc.0;和;rc.6;中停止;raid;阵列.;(BTW:;既然在;slackware;中这两个文件相同,;我们能不能做一个软联结,;然后只需;修改一个?);

为了检查它是否工作,;敲入;cat;/proc/mdstat,;它(输出的信息)将指示;md;设备的情况.;(/dev/md0;raid0;using;/dev/sda1;and;/dev/sdb1).;

测试,;测试,;再测试你的;raid.;关机,;上电,;看看它是否如你所愿地工作.;

我曾做过有趣的拷贝,;使用;cp;-rap;开关将全部目录结构拷入;raid;阵列中.;(测试完成)然后修改;/etc/fstab;以包括新的驱动器(指;raid).;

交换分区不需要分块操作.;当一个优先级启用时,;他们将自动这样做.;阅读;Software-RAID-mini-HOWTO;和傻瓜问题一段可知详情.;这出乎意料地简单.;

现在使用;UPS!
如果(运行中)掉电了,;你将失去你的;raid;和上面的所有数据!;你应该使用一个;UPS;后备电源.;UPS;的作用是让你的系统在灯火管制或电源失败时能够保持运行一小段时间.;UPS;能够在电源失败时通过一个串口通知你的系统.;在后台,;有一个精灵程序在运行监控这个串口.;当它被通知电源失败时,;它将在发出关机命令前等待一段预定时间;(通常是;5;分钟).;如此的工作原理是如果;5;分钟内还是无电,;那么将持续很长时间.;
大多数;Linux;销售包带有基本的;UPS;电源精灵程序.;使用;"man;powerd";可以得到;更多信息.;这是一个简单的精灵程序,;它在;/etc/inittab;中.;从根本上来说,;一个;哑;UPS,;只是在串口保持一个接力联结.;powerd;检测这个联结是否已经断掉.;一旦;联结断掉,;它将在预定时间后将;PC;关闭.;警告用户,;并且向;root;发一封邮件.;

我使用一台;APC;智能;UPS,;它通过串口通讯.;有一个称作;apcupsd;的卓越精灵如有;神助般地工作.;它在这儿.;请阅读布告,;赞同作者,;他完成了一项优异工作;(作者的光荣!).;安装工作如同魔法,;文档也十分优秀.;

http://www.dyer.vanderbilt.edu/server/apcupsd/;

RAID0;基于;2.0.31;to;2.0.34
没有尝试过.;因为我直接从;2.0.30;升级到;2.0.35,;一个最新的稳定版本.;
RAID0;基于核心版本;2.0.35
mdtools;在我家中的机器上编译地很顺利(运行;2.0.30),;但在我的工作机上不能编译;(已经升级到;2.0.35).;我不断地得到一个关于;MD_Version;(记不住确切的名称)没有定义的错误.;经过大量挠头的搜索,;我发现在;/usr/src/include/md.h;中有;md;驱动器;的版本号.;在版本;2.0.30;中,;它是;0.35;;而在;2.0.35;中它是;0.36.;如果你使用;"mdadd;-V";它将指示;mdadd;可以工作的;md;的版本号.;所以我取得了错误的;mdtools;版本.;这里是正确版本的位置:;
ftp://ftp.kernel.org/pub/linux/daemons/raid/raidtools-0.41.tar.gz;

下载到;/usr/local/src;然后;

tar;-zxvf;raidtools-0.41.tar.gz
将生成一个新目录;/usr/local/src/raidtools-0.41;
进入新目录,;阅读;INSTALL;文件,;然后;

../configure
我记不清之后是否必须做;make;和;make;install.;我不能复现;这一过程,;因为我已经为;raid;打了一个新补丁.;
你应该有一个新的;mkraid;和;mdadd;的运行文件(binary).;敲入;mdadd;-V;以;检查是否你的运行码已经更新了.;它应该显示一些像;mdadd;0.3d;compiled;for;raidtools-0.41的信息.;然后阅读;QuickStart.RAID;获得最新信息.;对于;raid0,;比以前版本没有多少改变.;

RAID1;基于内核;2.0.35
若想使用;raid1,;4;或;5,;你必须为内核打一个补丁,;它位于;
ftp://ftp.kernel.org/pub/linux/daemons/raid/alpha/raid0145-19981005-c-2.0.35.tz;

拷贝到;/usr/src;directory,;将补丁解压缩:;

tar;-zxvf;raid0145-19981005-c-2.0.35.tz
注意补丁将搜索;/usr/src/linux-2.0.35;目录.;如果你将;2.0.35;的源码安装在目录;/usr/src/linux;下,;你需要mv;/usr/src/linux;/usr/src/linux-2.0.35,;然后做一个符号联结;ln;-s;/usr/src/linux-2.0.35;/usr/src/linux;
为了使用这个补丁,;进入目录;/usr/src:;

patch;-p0;(在我的系统中有些地方小写的;c;会变成大写的;C;吗?;也许在解压后?);
你现在可以去重新编译内核.;当你选择多设备(选项)时,;你将看到有选择;raid1,4和5.;依次步骤是;

make;menuconfig;(or;config;or;xconfig)
make;clean
make;dep
make;zImage
make;modules;(如果你使用了模块)
make;modules_install
将新内核拷到你系统中适当的地方(/;或;/boot).;我建议你同时拥有一个无;raid;的内核;和一个有;raid;的内核.;你能够通过修改;lilo.conf;来确定使用那一个内核启动.;这根本;不困难,;尽管初看起来有些恐怖.;查看;/usr/lib/lilo;的例子和文档.;(译者注:;可能为;Slackware;中的目录,;Redhat5.1;中无);
查看;dmesg;|;more;的输出内容确定;md;驱动器已经装载,;raid0;&;1;已经注册.;敲入;cat;/proc/mdstat;看看你是否有了新的;md;驱动器.;你应该看到;16个;md;驱动器而不是;4;个.;

你将必须升级你的;raidtools.;mdadd,;/etc/mdtab;和;mdcreate;是旧的,;新工具应该是;raidstart,;/etc/raidtab;和;mkraid.;从这一点上来说,;(当前的)文档的确是过时了.;

ftp://ftp.kernel.org/pub/linux/daemons/raid/alpha/raidtools-19981005-B-0.90.tar.gz;

下载到/usr/local/src;然后;


tar;-zxvf;raidtools-19981005-B-0.90.tar.gz
这将产生一个新目录;/usr/local/src/raidtools-0.90.;进入这个目录作;
../configure
又一次,;我记不起是否该接着做;make;和;make;install.;
一个较简单的方式完成内核;2.0.35;下的;RAID0
使用两个;scsi;设备;/dev/sda1;和;/dev/sdb1;完成一个;raid0;阵列的步骤:;
将;/dev/sda1;和;/dev/sdb1;分区,;让他们有相同的块大小.;
将分区的类型设为;0xfd.;这是用来让新内核在启动时自动识别;raid.;
按下面例子修改;/etc/raidtab;文件(随;raidtools;提供的例子缺少一些重要的信息):;

#;Striping;example;
#;/dev/md0;using;/dev/sda1;and;/dev/sdb1

raiddev;/dev/md0
raid-level;0
nr-raid-disks;2
persistent-superblocks;1
nr-spare-disks;0
chunk-size;32
device;/dev/sda1
raid-disk;0
device;/dev/sdb1
raid-disk;1
敲入;mkraid;-f;/dev/md0;一定注意;-;阅读错误信息,;明确方向!;
cat;/proc/mdstat;检查输出信息,;确定;md;设备是否正确地做好.;
使用;mke2fs;-c;/dev/md0;格式化新;raid;设备.;
产生一个安装目录(例如;/raidtest)以测试它是否工作.;
mount;/dev/md0;/raidtest;
看你是否能将一个文件拷贝到;/raidtest.;如果你的硬盘设备有各自独立的;LED;灯;,;你能够看到两个设备都在工作.;
重启动,;检查内核是否自动将;raid;设备;md0;关闭.;会有一些信息滚过屏幕.;(有谁知道如何使用;"dmesg";读取关机信息?);
检查重启动过程中计算机是否自动识别;raid;设备和;/dev/md0;是否作为一个;raid0;阵列.;如果不是,;检查前几个步骤,;特别是步骤2和步骤4.;
基于内核;2.0.35;RAID1;的新方式
使用两个;raid0(striping)设备构造一个;raid1;阵列;/dev/md2;的步骤如下,;两个;raid0;设备为;/dev/md0;(/dev/sda1;+;/dev/sdb1);和;/dev/md1;(/dev/sdc1;+;/dev/sdd1):;
按照上面(建立;raid0;的)步骤建立;/dev/md0;和;/dv/md1.;重要信息:;你不能安装或者在;/dev/md0;和;/dev/md1;上建立文件系统.;这只是测试;raid0;是否工作!;
按照下面例子修改;/etc/raidtab;文件(随;raidtools;提供的例子缺少一些重要信息):;
#;Striping;example;
#;/dev/md0;using;/dev/sda1;and;/dev/sdb1

raiddev;/dev/md0
raid-level;0
nr-raid-disks;2
persistent-superblocks;1
nr-spare-disks;0
chunk-size;32
device;/dev/sda1
raid-disk;0
device;/dev/sdb1
raid-disk;1;

#;/dev/md1;using;/dev/sdc1;and;/dev/sdd1

raiddev;/dev/md1
raid-level;0
nr-raid-disks;2
persistent-superblocks;1
nr-spare-disks;0
chunk-size;32
device;/dev/sdc1
raid-disk;0
device;/dev/sdd1
raid-disk;1;

#;Mirror;example;
#;/dev/md2;using;/dev/md0;and;/dev/md1

raiddev;/dev/md2
raid-level;1
nr-raid-disks;2
persistent-superblocks;1
nr-spare-disks;0
chunk-size;32
device;/dev/md0
raid-disk;0
device;/dev/md1
raid-disk;1
敲入;"mkraid;-f;/dev/md2";重要信息;-;阅读错误信息,;明确方向!;这一步;要化一段时间,;因为磁盘要进行同步(超过;39;分钟).;
cat;/proc/mdstat;查看是否;md;设备正确地完成.;
使用;mke2fs;-c;/dev/md2;格式化新;raid;设备;
产生安装目录(例如;/raidtest_mirror);
mount;/dev/md0;/raidtest;
看你是否能够将文件拷到;/raidtest;中.;如果你的硬盘有各自独立的;LED;灯,;你可以发现它们在同时工作.;
加;raidstart;/dev/md2;到你的;/etc/rc.d/rc.s;文件中,;注意在;fsck;-a;之前.;一个好位置是正在;swapon;-a;之后.;目前,;内核不能自动识别;raid1.;下一个补丁将完成它(自动识别).;
修改;/etc/fstab;将;/dev/md2;安装到;/raidtest.;
/dev/md2;/raidtest;ext2;defaults;1;1
重启动,;看内核是否自动关闭设备;md0,;md1;和;md2.;会有一些信息滚过屏幕.;(有谁知道如何使用;"dmesg";查看关机信息?);
检查在重启动过程中内核是否自动识别出;raid;设备;/dev/md0;和;/dev/md1;全部启动作为;raid0;阵列.;检查;/dev/md2;设备是否为一个;raid1;阵列.;
cat;/proc/mdstat;查看是否;md;设备正确建立.;
你应该有;基于;raid0;的;raid1;阵列在运行.;
如果你遇到问题,;这里有一些其他资源可以参考:;

linux;raid;档案:;http://www.linuxhq.com/lnxlists/linux-raid/;
发一条新闻到;comp.os.linux.setup;
搜索;www.dejanews.com;-;过去;5;年来新闻组消息的归档站点.;
如果你完全不知如何是好了,;向;Linux;RAID;邮件列表发;e-mail.;询问问题,;e-mail;linux-raid@vger.rutgers.edu;
参加内核;RAID;列表,;e-mail;majordomo@vger.rutgers.edu;在信体中写;subscribe;linux-raid;
不要;e-mail;给我,;所有我所知道的都已经写在这儿了!;

标签: linux