Chinaunix首页 | 论坛 | 博客
  • 博客访问: 53107
  • 博文数量: 6
  • 博客积分: 121
  • 博客等级: 入伍新兵
  • 技术积分: 104
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-23 13:24
文章分类
文章存档

2012年(6)

分类: LINUX

2012-02-03 17:41:19

原始需求:工作多年下来,有些资料,例如视频、图片、文档、代码、SVN库、CVS库等需要保存在硬盘上,为了资料安全,用2 个硬盘做 Raid 镜像,另外自己也需要在 Windows 和 Linux 下编点程序。

需求:
1. 3 个硬盘,其中 2 个 1T 的硬盘做 RAID1 镜像,另外一个 320G 的装操作系统和软件。
2. 装 Windows 7 64bit Version 和 Gentoo Linux 64bit Version 12.0。
3. 在 Windows 7 上装 VMware,创建 Linux 虚拟机,采用物理硬盘。这样 Gentoo Linux 可以直接启动,也可以在 Windows 7 下的 VMware 里面启动。

硬件平台:
1. CPU: Intel i3 2120
2. 主板:ASUS P8Z68-V LX,这个主板支持 Intel 的 ICHxR RAID
3. 内存:Kingston DDR3 1600 4G * 2


似乎剩下的就是体力劳动了 :(

操作系统安装:
1. 首先直接在启动时的 RAID 配置界面中,直接将 2 个硬盘配置为了1个 RAID1 的硬盘,标签为 SAVEDATA。
2. 由于我没有将 OS 装在 RAID 上,所以 OS 的安装也很容易。在 Win7 装好了再装 Intel 的驱动。在 Gentoo Linux 装了以后,更新到最新的 portage,配置 genkernel,在 ramdisk 中启用 dmraid,另外也 emerge dmraid。
3. 装 VMware,我装的是 VMware Workstation 8.0.1。

一切看起来都很顺利 :)
但是很快就发现了问题 :(

问题1:在 Linux 下,如何用 DISK LABEL 方法来 mount RAID1 的分区?
    Linux 下,本身支持 disk label 方式,例如我采用 e2label 可以对某个分区(例如 /dev/sdb6)设置一个 disk label,例如 /data,然后用 mount LABEL=/data /data 的方式来 mount。
    但是采用 RAID1 的话,那么实际上有 3 个分区会显示出其 disk label 为 /data: /dev/sdb6, /dev/sdc6, /dev/mapper/isw_xxxx_SAVEDATA6。启动 /dev/sdb6 和 /dev/sdc6 为 2 个原始硬盘分区,/dev/mapper/isw_xxxx_SAVEDATA6 才是真正需要 mount 的。如果直接用上面的方式,会把 /dev/sdb6 mount 为 /data。
    在网上查了一下,后来设置了一下 /etc/blkid.conf (缺省是没有的),添加一行:
      EVALUATE=scan
      (blkid 缺省的 EVALUATE=udev,scan)
    这样就可以了,mount LABEL=/data 的时候,可以将正确的 /dev/mapper/isw_xxxx_SAVEDATA6 mount 为 /data。

后来的经历表明上面的问题只是小菜一碟 :)
搞定上面的问题以后,发现了一个严重的问题:
问题2:VMware 不支持对镜像盘按照分区使用,只能使用整个硬盘!VMware 会报告 One of the parameters supplied is invalid.

我在镜像盘上共分了 5 个区,3个给 Windows 7 用,2 个 EXT3 给 Linux 用。就算采用整个硬盘给 VMware 的虚拟机,那么使用的时候,那 3 个给 Windows 7 使用的硬盘会都被锁定,不能进行读取。这样就麻烦了。

尝试了几种方法,但是都没有用:
1. 将镜像盘上的所有分区都删除掉,然后只创建了一个 40G 的分区。还是不能只使用某个物理分区。还是报告 One of the parameters supplied is invalid.
    期间为了将原来保存的 xxxG 的内容弄到其他地方去,花费 xx小时 ...
2. 在 BIOS 里面配置,去掉 RAID 支持,然后 Win7 启动中直接重新启动,采用安全模式也是一样的。
3. 在 RAID 的启动配置中,删除 RAID,然后利用 Win7 自身创建镜像卷。但是这样即使只使用 320G 的硬盘,VMware 启动的时候也会报告 物理硬盘已经使用。

看来只能给 VMware 整个硬盘用了。于是重新配置 RAID,将其分为了 2 个 RAID1 的盘,1个 500G,另外一个约 430G。这样 500G 的给 Windows 7 用,430G 的给 Linux 用,井水不犯河水。

但是很快就发现了新的问题:在 Linux 下用 dmraid 的时候,报告 ERROR: dos: partition address past end of RAID device,然后我本来在 这个盘上分了 2 个区的,但是第二个区在 /dev/mapper/ 下面没有。
在网上搜了一下,有一个帖子提到了 dmraid 的版本问题,但是也没有搞得很清楚。我更新了 dmraid 的版本,从 1.0.0.rc14 升到最新的 1.0.0.rc16,结果还是不行。
这个时候就体现出 Linux 下开源的好处来了,我把 dmraid 1.0.0.rc16 的代码解压和配置:
   ebuild /usr/portage/sys-fs/dmraid/dmraid-1.0.0_rc16-r3.ebuild configure
这样就得到一个 Gentoo 下配置过的目录,再在代码中搜索了一下 "partition address past end of RAID device",在 /var/tmp/portage/sys-fs/dmraid-1.0.0_rc16_r3/work/dmraid/1.0.0.rc16-3/dmraid/lib/format/partition/dos.c, line 159:

/* Check sector vs. RAID device end */
static int
rd_check_end(struct lib_context *lc, struct raid_dev *rd, uint64_t sector)
{
        if (sector > rd->di->sectors)
                LOG_ERR(lc, 1, "%s: partition address past end of RAID device",
                        handler);

        return 0;
}

先多加一点输出再说,改为:
                LOG_ERR(lc, 1, "%s: partition address past end of RAID device, sector: %llu, raid device: %llu",
                        handler, sector, rd->di->sectors);


编译出来,运行,得到: ERROR: dos: partition address past end of RAID device, sector: 904939783, raid device: 904939520。
这下奇怪了,再用 fdisk 查看,终于发现了问题,的确是第二个分区超出了。
但是我之前都是用 fdisk 分区的,为什么会超出了呢?
我再把 dmraid 降到了 1.0.0_rc14,发现了原因:dmraid 1.0.0.rc14 识别出来的硬盘大小是 904939784 sectors,但是 dmraid 1.0.0.rc16 识别出来的是 904939520 sectors,dmraid 1.0.0_rc14 识别的硬盘大小错了,对于第二个逻辑盘,要大一些!
2 个版本的大小不一样,到底哪个是对的?我进入 Win7,然后在 Win7 下用 VMware ,分配整个硬盘,然后再虚拟机里面查看这个硬盘大小,显示为 904939520 sectors,就是说 1.0.0_rc16 的大小是对的。
后来想了一下,出错过程应该是这样的:
1. 采用 Gentoo Linux 安装,装好了以后安装 stable 的 genkernel 和 dmraid,genkernel 里面,配置支持 dmraid,Gentoo Linux 下的 dmraid 和 genkernel 创建 ramdisk 时用的 dmraid,都是 1.0.0_rc14 的。
2. Gentoo Linux 启动好以后,执行 dmraid -ay,找到了 /dev/mapper/isw_caabaejfbj_LINUXDATA,然后用 fdisk /dev/mapper/isw_caabaejfbj_LINUXDATA 分区,这个时候由于 dmraid 是 1.0.0_rc14 版本的,所以认为这个硬盘有 904939784 sectors,于是最后一个分区的 End sector 设置为了 904939783 !
3. 重新启动 Linux,再 dmraid -ay 的时候,就会报错。


解决方法:其实很简单,就是用 1.0.0_rc16 的 dmraid 来 dmraid -ay,然后重新分区即可。然后把 genkernel 里面的也升级到 1.0.0_rc16。


总结:
1. OS 采用单独的一个硬盘,这样折腾起来要方便的多 :)
2. RAID1 配置 2 个逻辑盘,一个给 Windows,一个给 Linux。我后来重新分了一下,给 Windows 的 700G,给 Linux 的 232G。
3. Windows 上 3 个区,250G NTFS + 250G NTFS + 200G vfat(在 Linux 下格式化)。这样这个 vfat 分区可以在 Windows 下和 Linux 下都可以识别,我把 SVN 库放在这个分区上。
4. 在 Linux 下采用 1.0.0_rc16-3 或者以上版本的 dmraid,然后 genkernel 里面的需要升级掉。emerge dmraid 结束时会告诉你怎么修改 genkernel.conf 来升级。
5. 在 Win7 下的 VMware,配置虚拟机的 Linux 使用整个给 Linux 的镜像逻辑盘。

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