[ZLG-ARM] Linux 下 软RAID(mdadm) 及 LVM 基于VMware 上的试验

[复制链接]
 楼主| billen 发表于 2009-6-4 17:03 | 显示全部楼层 |阅读模式
有这样一个需求:为内部网络的&nbsp;PC&nbsp;提供共享存储、备份,没有太强的读写压力,资金投入也有限,但需要够安全,而且为逐渐增长的数据量考虑,需要扩容方便。<br />于是,打算通过&nbsp;mdadm&nbsp;和&nbsp;LVM&nbsp;来实现。用这样的硬件:内部空间够大,电源够强劲,扇热要好,支持多个&nbsp;SATA&nbsp;接口的塔式机。<br />为了不浪费空间,用一块小硬盘装系统,比如一块&nbsp;20G&nbsp;的&nbsp;IDE&nbsp;硬盘。3块别的老&nbsp;PC&nbsp;上拆下来&nbsp;80G&nbsp;SATA&nbsp;硬盘。<br /><br />在&nbsp;VMware&nbsp;上模拟了一下。因为需要模拟&nbsp;SATA&nbsp;硬盘,建立虚拟机时用了&nbsp;SCSI&nbsp;硬盘。要选择&nbsp;RedHat&nbsp;Enterprise&nbsp;版才能支持&nbsp;SCSI&nbsp;硬盘。<br />使用&nbsp;VMware-gsx-server-3.2.1&nbsp;发现在较大的(试验了&nbsp;160G/250G)虚拟硬盘上的&nbsp;RAID5&nbsp;recovery&nbsp;到尾声时会死机,重启后又要从头再来,但依然会死机,周而复始。换成&nbsp;VMware-server-1.0.3&nbsp;后就没有问题了。<br />在&nbsp;hda&nbsp;安装了&nbsp;CentOS&nbsp;5.1&nbsp;,最小化安装。安装过程没有对&nbsp;sda,&nbsp;sdb,&nbsp;sdc&nbsp;进行分区。<br /><br />用&nbsp;mdadm&nbsp;创建&nbsp;RAID<br />#&nbsp;mdadm&nbsp;-C&nbsp;/dev/md0&nbsp;-l5&nbsp;-n3&nbsp;-c128&nbsp;/dev/sd[a,b,c]<br />参数所代表的意思可以用&nbsp;man&nbsp;mdadm&nbsp;查看。<br />基本命令<br />#&nbsp;mdadm&nbsp;-A&nbsp;/dev/md0&nbsp;#启动阵列<br />#&nbsp;mdadm&nbsp;-S&nbsp;/dev/md0&nbsp;#停止阵列(停止前必须先&nbsp;umount)<br />#&nbsp;mdadm&nbsp;-D&nbsp;/dev/md0&nbsp;#显示阵列详细信息<br /><br />#&nbsp;watch&nbsp;'cat&nbsp;/proc/mdstat'<br />可以看到&nbsp;RAID&nbsp;的&nbsp;recovery&nbsp;过程。<br />此时&nbsp;RAID&nbsp;已经可以使用了。<br /><br />LVM&nbsp;初始化<br />#&nbsp;vgscan<br />创建&nbsp;PV<br />#&nbsp;pvcreate&nbsp;/dev/md0<br />创建&nbsp;VG<br />#&nbsp;vgcreate&nbsp;vga&nbsp;/dev/md0<br />创建&nbsp;LV<br />#&nbsp;lvcreate&nbsp;-l&nbsp;40959&nbsp;-n&nbsp;lv1&nbsp;vga<br />在&nbsp;LV&nbsp;上建立文件系统<br />#&nbsp;mkfs&nbsp;-t&nbsp;ext3&nbsp;-L&nbsp;/data&nbsp;/dev/vga/lv1<br />挂载<br />#&nbsp;mkdir&nbsp;/data<br />#&nbsp;mount&nbsp;-t&nbsp;ext3&nbsp;-o&nbsp;defaults&nbsp;/dev/vga/lv1&nbsp;/data<br />测试<br />#&nbsp;cd&nbsp;/data<br />#&nbsp;dd&nbsp;if=/dev/zero&nbsp;of=test&nbsp;bs=1024k&nbsp;count=1k<br />#&nbsp;dd&nbsp;if=test&nbsp;of=/dev/null<br /><br />recovery&nbsp;结束后,生成&nbsp;/etc/mdadm.conf&nbsp;文件,在系统重启后自动启用&nbsp;RAID<br />#&nbsp;mdadm&nbsp;-Ds&nbsp;&gt&nbsp;/etc/mdadm.conf<br />编辑&nbsp;/etc/mdadm.conf&nbsp;文件,在顶部加入如下一行:<br />DEVICE&nbsp;/dev/sd*<br /><br />在&nbsp;/etc/fstab&nbsp;尾部加入一行<br />LABEL=/data&nbsp;/data&nbsp;ext3&nbsp;defaults&nbsp;0&nbsp;0<br />重启后自动挂载。<br /><br />接着,模拟这样一种状况:为了扩容,要给&nbsp;RAID&nbsp;加入一块硬盘。<br />关机,给&nbsp;VM&nbsp;添加一块&nbsp;80G&nbsp;的&nbsp;SCSI&nbsp;硬盘后启动。<br />给&nbsp;RAID&nbsp;添加硬盘<br />#&nbsp;mdadm&nbsp;/dev/md0&nbsp;-a&nbsp;/dev/sdd<br />此时,新添加的硬盘会被作为&nbsp;spare<br />把&nbsp;RAID&nbsp;设备设置为4个,使用新硬盘<br />#&nbsp;mdadm&nbsp;-G&nbsp;/dev/md0&nbsp;-n4<br />扩充&nbsp;PV<br />#&nbsp;pvresize&nbsp;/dev/md0<br />扩充&nbsp;LV<br />#&nbsp;lvextend&nbsp;-l&nbsp;+20480&nbsp;/dev/vga/lv1<br />扩大文件系统大小<br />#&nbsp;resize2fs&nbsp;/dev/vga/lv1<br />此命令可在&nbsp;mount&nbsp;时操作。并且同时&nbsp;dd&nbsp;模拟写入和读取文件,除了速度变慢,没有发现异常。<br /><br />再来模拟这样一种情况:空间又被用完了,需要更大的存储空间,再找来3块&nbsp;160G&nbsp;的硬盘扩容。为了安全,还是把这三块硬盘组成&nbsp;RAID5&nbsp;。<br />关机,给&nbsp;VM&nbsp;添加三块&nbsp;160G&nbsp;的&nbsp;SCSI&nbsp;硬盘后启动。<br />CentOS5(RHEL5)&nbsp;使用了&nbsp;udev&nbsp;来管理系统设备文件名,/dev&nbsp;目录下只有&nbsp;md0,需要手动建立&nbsp;RAID&nbsp;设备。<br />#&nbsp;mknod&nbsp;/dev/md1&nbsp;b&nbsp;9&nbsp;1<br />#&nbsp;chown&nbsp;root:disk&nbsp;/dev/md1<br />#&nbsp;chmod&nbsp;640&nbsp;/dev/md1<br />为了在重启后能自动创建&nbsp;md1&nbsp;,还需如下设置<br />#&nbsp;mkdir&nbsp;/etc/udev/devices<br />#&nbsp;cp&nbsp;-a&nbsp;/dev/md1&nbsp;/etc/udev/devices/<br /><br />建立&nbsp;RAID<br />#&nbsp;mdadm&nbsp;-C&nbsp;/dev/md1&nbsp;-l5&nbsp;-n3&nbsp;-c128&nbsp;/dev/sd[e,f,g]<br /><br />创建&nbsp;PV<br />#&nbsp;pvcreate&nbsp;/dev/md1<br />扩充&nbsp;VG<br />#&nbsp;vgextend&nbsp;vga&nbsp;/dev/md1<br />扩充&nbsp;LV<br />#&nbsp;lvextend&nbsp;-l&nbsp;+81919&nbsp;/dev/vga/lv1<br />扩充分区大小:<br />#&nbsp;resize2fs&nbsp;/dev/vga/lv1<br />此间,继续使用&nbsp;dd&nbsp;模拟读写,没有问题。<br />把第二个&nbsp;RAID&nbsp;的配置也写入配置文件<br />#&nbsp;mdadm&nbsp;-Ds&nbsp;|&nbsp;grep&nbsp;md1&nbsp;&gt&gt&nbsp;/etc/mdadm.conf<br /><br />模拟设备损坏的情况<br />将&nbsp;/dev/sdb&nbsp;标记为已损坏的设备<br />#&nbsp;mdadm&nbsp;/dev/md0&nbsp;-f&nbsp;/dev/sdb<br />移除损坏的设备<br />#&nbsp;mdadm&nbsp;/dev/md0&nbsp;-r&nbsp;/dev/sdb<br />此时可用&nbsp;dd&nbsp;模拟读写。<br />更换设备并重新添加到&nbsp;RAID&nbsp;中<br />#&nbsp;mdadm&nbsp;/dev/md0&nbsp;-a&nbsp;/dev/sdb<br />会重新&nbsp;recovery&nbsp;,同样,可以&nbsp;dd&nbsp;模拟下读写。<br /><br />如果发现缺失某个设备后&nbsp;RAID&nbsp;不能启动,可以使用剩余设备启动&nbsp;RAID<br />#&nbsp;mdadm&nbsp;-A&nbsp;--run&nbsp;/dev/md1&nbsp;/dev/sde&nbsp;/dev/sdf<br /><br />此后又再给&nbsp;md1&nbsp;添加了一块硬盘&nbsp;sdh&nbsp;进行相应测试,还是正常的。<br /><br />特殊情况,去掉一个&nbsp;PV<br />#&nbsp;umount&nbsp;/data<br />#&nbsp;resize2fs&nbsp;-f&nbsp;/dev/vga/lv1&nbsp;240G<br />#&nbsp;lvreduce&nbsp;-l&nbsp;-81919&nbsp;/dev/vga/lv1<br />#&nbsp;vgreduce&nbsp;vga&nbsp;/dev/md1<br />不建议在生产系统上减小&nbsp;LV<br />这本来是想用来试验大&nbsp;PV&nbsp;替换小&nbsp;PV&nbsp;的,但为了安全,还是把老&nbsp;LV&nbsp;的数据复制到新的&nbsp;LV&nbsp;后再做打算。<br /><br />有了更大的硬盘(250G*4,&nbsp;VMware&nbsp;只能创建小于&nbsp;256G&nbsp;的虚拟硬盘)用来扩容,为了留出机箱空间并降低电力消耗,需要把老硬盘上的数据转移到新硬盘。<br />先用新硬盘组成的&nbsp;RAID5<br />#&nbsp;mknod&nbsp;/dev/md2&nbsp;b&nbsp;9&nbsp;2<br />#&nbsp;chown&nbsp;root:disk&nbsp;/dev/md2<br />#&nbsp;chmod&nbsp;640&nbsp;/dev/md2<br />#&nbsp;cp&nbsp;-a&nbsp;/dev/md2&nbsp;/etc/udev/devices/<br />#&nbsp;mdadm&nbsp;-C&nbsp;/dev/md2&nbsp;-l5&nbsp;-n4&nbsp;-c128&nbsp;/dev/sd[i,j,k,l]<br />#&nbsp;mdadm&nbsp;-Ds&nbsp;|&nbsp;grep&nbsp;md2&nbsp;&gt&gt&nbsp;/etc/mdadm.conf<br /><br />依然使用&nbsp;LVM<br />#&nbsp;pvcreate&nbsp;/dev/md2<br />#&nbsp;vgcreate&nbsp;vg0&nbsp;/dev/md2<br />#&nbsp;lvcreate&nbsp;-l&nbsp;191999&nbsp;-n&nbsp;lv1&nbsp;vg0<br />#&nbsp;mkfs&nbsp;-t&nbsp;ext3&nbsp;/dev/vg0/lv1<br /><br />把&nbsp;/dev/vg0/lv1&nbsp;挂载上后便可以复制数据了,cp,&nbsp;rsync&nbsp;都行。<br /><br />当有大量小文件时,用&nbsp;dd&nbsp;复制,并把块设置的大些,速度会非常快。<br />为保证数据同步,先卸载<br />#&nbsp;umount&nbsp;/data<br />然后复制<br />#&nbsp;dd&nbsp;if=/dev/vga/lv1&nbsp;of=/dev/vg0/lv1&nbsp;bs=16MB<br />用&nbsp;dd&nbsp;复制还可以跳过&nbsp;mkfs&nbsp;的过程。<br />在&nbsp;VMware&nbsp;中,就算没有使用预分配空间的磁盘模式,也会进行完全复制填满磁盘空间。可以在复制开始一会儿后就结束&nbsp;dd&nbsp;进程,节约空间和时间。<br /><br />挂载,检查一下数据完整性<br />#&nbsp;mount&nbsp;-t&nbsp;ext3&nbsp;-o&nbsp;defaults&nbsp;/dev/vg0/lv1&nbsp;/mnt<br /><br />用&nbsp;dd&nbsp;复制会把新的&nbsp;LV&nbsp;容量变成和老的一样大,需要调整容量<br />#&nbsp;resize2fs&nbsp;/dev/vg0/lv1<br /><br />没有问题的话,就修改&nbsp;LV&nbsp;卷标,以便系统重启后能挂载新的&nbsp;LV<br />#&nbsp;e2label&nbsp;/dev/vga/lv1&nbsp;/backup<br />#&nbsp;e2label&nbsp;/dev/vg0/lv1&nbsp;/data<br /><br />如果要把老的&nbsp;LV&nbsp;转移到另外的机器上,需要备份&nbsp;LVM&nbsp;卷组信息以及&nbsp;mdadm&nbsp;的配置<br />先查看一下&nbsp;/etc/lvm/backup/vga&nbsp;是否存在,没有的话就创建备份<br />#&nbsp;vgcfgbackup<br />把&nbsp;/etc/lvm/backup/vga&nbsp;和&nbsp;/etc/mdadm.conf&nbsp;备份到远程主机上。<br />这还可以用于恢复存储服务器操作系统崩溃而导致的&nbsp;LVM&nbsp;不可用。比如&nbsp;hda&nbsp;损坏了。<br /><br />重装系统时,千万不要对&nbsp;sd*&nbsp;进行操作—重建分区表,这会导致&nbsp;LVM&nbsp;信息的丢失。<br />在真实设备上操作时,为了安全,可以先安装完系统再给硬盘通电。<br /><br />先恢复&nbsp;RAID<br />把&nbsp;mdadm.conf&nbsp;恢复到新系统的&nbsp;/etc&nbsp;目录下,启动&nbsp;RAID<br />#&nbsp;mdadm&nbsp;-A&nbsp;/dev/md0<br />#&nbsp;mdadm&nbsp;-A&nbsp;/dev/md1<br />再恢复&nbsp;LVM<br />#&nbsp;vgcfgrestore&nbsp;-f&nbsp;vga&nbsp;vga<br />第一个&nbsp;vga&nbsp;是备份的文件名,第二个是要还原的&nbsp;Volume&nbsp;Group&nbsp;Name&nbsp;。如果&nbsp;vga&nbsp;这个卷组名被占用了,需要重命名。<br />#&nbsp;vgscan<br />#&nbsp;pvscan<br />然后启动&nbsp;VG<br />#&nbsp;vgchange&nbsp;-a&nbsp;y&nbsp;vga<br />再扫描&nbsp;LV<br />#&nbsp;lvscan<br />恢复完成,可以挂载并使用了。<br /><br />至此,VMware&nbsp;试验完成,可在真实硬件设备上试验了。<br />&nbsp;<br /> &nbsp;&nbsp;<br />
armpc 发表于 2009-6-4 17:09 | 显示全部楼层

好帖,顶

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

53

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部