|
1. 事情起因
事情缘起于我的一个客户,这个客户由于项目需要,购买了一台组装的2U服务器。确认服务器的配置的过程中,我也给了客户一些参考的建议,没想到这成为了麻烦的源头。
服务器的配置简单如下:
处理器:INTEL XEON 5520@2.26GHZ *2(一共8核16线程);
内存:KINGSTON DDR3/1333 ECC REG 4GB*2(一共8GB);
硬盘:SEAGATE SAS 10Krpm 300GB*2(做RAID1);
主板:SUPERMICRO X8DTL-3(LSI 1068E RAID Controler onboard & 8*SAS ports)。
机箱电源:千际2U+七盟550W/2U
问题就出在这个主板的LSI 1068E SAS RAID控制器上了,本来我自信满满,认为自己见多识广,做过的RAID已经很多,原没把这个RAID控制器放在心上,没想到就是这个1068E让我重新意识到自己还有多无知。
拿到机器之后,我当然还是安装自己最喜欢的gentoo。先是拿自己PNY 8G U盘插上(我在U盘上量产了一个逻辑USB CDROM,里面是gentoo amd64 mini install cd),按下电源开关,Ctrl+M进入RAID BIOS配置,轻松搞定RAID1配置(LSI RAID配置网上很多文章,有兴趣的可以找来看),重启,然后……认不出我的U盘……
这等小事自然难不住我,拿出我的USB CDROM,放入真正的mini install cd(这机器没配光驱),重启,然后:gentoo dodmraid=lsi doscsi dosmp noapic nokeymap nosound回车,……成功引导!
提示符出来之后,驾轻就熟输入cfdisk,然后……空白,no disk found???!!!
小意思,fdisk -l,啥都没有。汗一个,这不是raid么,赶紧ls /dev/mapper –la。啥?!就一个control???我的raid呢?赶紧dmesg,哦,发现了lsi设备,不过怎么是unkown device?我的硬盘怎么一个都看不到?我的sda、sdb、md啥啥都没有呢?
lsmod、modprobe齐上阵,无效…………
小意思,哥别的不多,就发行版光盘多。gentoo mini install不行,咱不有10周年纪念版livedvd么。老板,换碟!
无效…………
呦你个小样,还跟我闹脾气,咱再换:Centos5.4,大佬上阵,看你老实不。
无效…………
嘿嘿,小弟不行,大佬的大佬来:RHEL 5.4。
无效…………
哥这个时候开始有点湿了……
唉,看来要请出大杀器了,咱也google一下吧。
咦,怎么网上无答案?用1068E也不少人吧,不过咋都用Windows呢?欺负咱开源阵营无人是吧?
赶紧去LSI的网站上查查datasheet,哦,这玩意和fushion、mpt都有点关系,貌似freebsd对mpt的支持还是不错滴,用freebsd看看。
嘿嘿,这次成功识别到硬盘了,不过,是两个。我的raid呢?
赶紧去gentoo的官方论坛去瞅瞅。用1068e、lsi raid、mpt、sas等关键字反复搜索了几遍,发现苦主还真不少啊,不过大家怎么都没什么辙呢?甚至一个老哥和一位打算买1068E RAID卡的TX语重心长地规劝道:您还是换个别的吧。
有位TX想了半天,提出了个非常有建设性的建议:超微的SAS设置是有IT模式的,进入IT模式,就可以禁用RAID功能,但是可以认到mptsas硬盘。然后用lvm做个纯软raid不就成了?
得,这位TX还真有建设性,去超微网站下载了主板说明书(地址:http://www.supermicro.com/produc ... PI/5500/X8DTL-3.cfm),赶紧研究一下。
开机箱,设IT模式,通电,放入gentoo mini install cd。嘿,您猜怎么着,sda/sdb出现啦!不过,等等,我怎么觉着有点东西不对劲呢?赶紧再重启,进入BIOS。果然,可引导设备中,原来的SCSI设备不见了,只剩下我的破USB CDROM了。原来IT模式的硬盘不能直接引导…………我想了几下,还是忍住没进入主板的工厂模式,咱不能把客户的机器当小白老鼠啊。
有点为难了,看来这小东西还真有点脾气。回复到正常模式,硬盘还是找不到,看着启动信息中RAID1 ONLINE的字样,我就哭笑不得。
赶紧再去gentoo官网论坛溜达溜达吧,我就不相信国外能人那么多,就没人想到解决办法的,如果真这样,超微还卖个P主板啊。附带说一句,人家超微确实提供对RHEL/SUSE/WIN SERVER的官方驱动支持,不过咱是穷人,花不起那个操作系统的钱。
在官网论坛兜兜转转,终于被我在个墙角挖到个牛人,牛人说,默认的mptsas驱动是有个问题的,就是主板厂商设置的设备识别号和内核驱动中配置的是不同的,改改就好。
重新启动一下系统,嘿,还果然。超微板子上的LSI 1068E识别为0x0059,而驱动中是0x0058,我#%¥@#……
不过我犯难了,这破install cd的内核驱动,咱改不了啊,除非咱改install cd才行。
做事要大胆假设小心求证,为了保证不出错,还是先验证一下吧。工作这么多年,啥本事不见得有,不过这十八般兵器咱还是攒了几样的。有请我的外接USB硬盘!
这个硬盘尺寸不大,320GB SATA而已,因为是WD RE2的盘子,所以主要用来备份,上面有两个NTFS分区和一个reiserfs分区。以前极度无聊的时候把reiserfs做了个可引导的gentoo,这次可以派上用场了。
接上硬盘,启动成功,当然,还是认不到sas硬盘,没关系,咱重新编译内核。修改了相应文件(具体文件在后文),重新编译内核,重启!
嘿嘿,您猜怎么着?硬盘找到了!sda/sdb/sdc如期出现!!!
等等,怎么有个sdc?哦,是我的USB硬盘占了sda,两个sas自然就是b+c了。
看到这里,可能有TX问了,这问题不就解决了么?你可以用USB硬盘开始做系统了。如果您这么认为,那您就错了。这个系统是用sda+sdb来做raid1,而我的USB硬盘占用了sda,那么………………
不过现在感觉大问题已经解决,可以确认解决方案了。
2. 解决方案
初步确认的解决方案如下:
*重新制作一张livecd来安装系统;
*livecd中修改驱动解决mptsas识别问题;
*在livecd中加入需要的raid工具。
心动不如行动,动手!
制作livecd的过程不赘述,请大家参考:http://en.gentoo-wiki.com/wiki/Build_Your_Own_LiveCD_or_LiveDVD。
我只说说我与原文做得不同的地方:
1) 我对make.conf做了一些修改,如下:
[PHP]
CFLAGS="-mtune=generic -O3 -pipe -fomit-frame-pointer -mmmx -msse -msse2" (注释:用-mtune=generic是因为我自己的机器是AMD Phenom处理器,而目标机器是Xeon)
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j3"
USE="livecd ssl nls unicode cjk zh nptl nptlonly mmx sse sse2 -X -gtk -gnome \
-doc -kde -qt -cups -alsa -apache -java"
ACCEPT_KEYWORDS="~amd64"
LINGUAS="zh_CN"
SYNC="rsync://rsync.asia.gentoo.org/gentoo-portage"
GENTOO_MIRRORS="http://mirrors.163.com/gentoo ftp://gg3.net/pub/linux/gentoo"
[/PHP]
2) 我修改了locale.gen,如下
[PHP]
en_US ISO-8859-1
en_US.UTF-8 UTF-8
zh_CN UTF-8
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN.GB2312 GB2312
zh_CN.GB18030 GB18030
[/PHP]
3) 由于我用了~amd64,所以可以使用最新的gcc 4.4.3,而官方stage中是4.3.4,这个问题要解决,所以需要先emerge gcc,然后用gcc-config 2来选择新的gcc,再emerge -C gcc-4.3.4。由于后面要emerge -e system,所以就不revdev-rebuild了。然后再emerge glibc。做过LFS的同学知道,这第一步算完成了。然后就是emerge -e system。
4) 编译内核部分,我怕有同学出错,所以我把我整个步骤列在下面(我在config里面去掉了很多对于我来说没用的驱动,不过这个配置选择过程不详细说明了):
[PHP]
# emerge gentoo-sources genkernel
# cd /usr/src/linux
# make allmodconfig
# genkernel --dmraid --menuconfig all (注释:这里与wiki里面略有不同)
# genkernel initramfs
# mv /boot/initramfs-xxxx /boot/initrd
# mv /boot/kernel-xxxx /boot/vmlinuz
[/PHP]
(接下来,我没有make clean)
现在来说说我对内核驱动修改的地方:
[PHP]
# cd /usr/src/linux/drivers/message/fusion/lsi
[/PHP]
修改mpi_cnfg.h,找到0x0058这行,在下面加入:
[PHP]
#define MPI_MANUFACTPAGE_DEVID_SAS1068_820XELP (0x0059)
[/PHP]
然后:
[PHP]
# cd ..
[/PHP]
修改mptsas.c,找到static struct pci_device_id mptsas_pci_table这行,在
{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068E, PCI_ANY_ID, PCI_ANY_ID }
后面加入:
{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068_820XELP, PCI_ANY_ID, PCI_ANY_ID }
搞定!
5) 我没有执行:find / -type l ! -xtype f ! -xtype d -ok rm -f {} \; 这一步,因为一个一个确认,会很累人,呵呵。
6) 在配置grub的步骤,你如果按照原文做,你会死掉的,嘿嘿,下面是我的
[php]
(注释:记得grub.conf cp成为menu.lst,不要用menu.lst的符号链接):
default 0
timeout 5
splashimage=/boot/grub/splash.xpm.gz
title LiveCD
root (cd) (注释:我喜欢这样做,原文没有,但是我在这里确认用cd)
kernel /boot/vmlinuz root=/dev/loop0 real_root=/dev/loop0 looptype=squashfs loop=/livecd.squashfs vga=ask initrd udev nodevfs cdroot dodmraid (注释:原文没有root=/dev/loop0,这是不对滴)
initrd /boot/initrd
title LiveCD NO-FB
root (cd)
kernel /boot/vmlinuz root=/dev/loop0 real_root=/dev/loop0 looptype=squashfs loop=/livecd.squashfs initrd udev nodevfs cdroot dodmraid
initrd /boot/initrd
title Memtest86+
root (cd)
kernel /boot/memtest86plus/memtest.bin
[/PHP]
7) 我安装了一些常见的工具:
[PHP]
# emerge dmraid megamgr megacli megactl megarc mdadm mpt-status
# rc-update add mdadm boot; rc-update add mdraid boot;
[/PHP]
8) 网卡配置这块,由于我是有开启了dhcp的内部路由器,所以:
[PHP]
# emerge dhcpcd
# rc-update dhcpcd default
# echo "config_eth0=(\"dhcpd\")" > /etc/conf.d/net
# echo "config_eth1=(\"dhcpd\")" >> /etc/conf.d/net (注释:双网卡)
[/PHP]
9) 到了同步的步骤,我写了一个脚本,首先在rsync的时候就做了一些exclude,rsync的脚本如下(在livecd目录下执行):
[PHP]
#!/bin/bash
echo "syncing boot files..."
rsync --delete-after --archive --hard-links --verbose ./source/boot ./target/
echo ""
echo "syncing source files..."
rsync --delete-after --archive --progress --verbose --exclude "var/tmp/*" \
--exclude "var/cache/*" --exclude "*.h" --exclude "usr/portage" \
--exclude "var/run/*" --exclude "var/log/*" --exclude "tmp/*" \
--exclude "*.a" --exclude "root/*" \
--exclude "etc/portage" --exclude "usr/share/doc" --exclude "usr/src" \
./source/ ./target/files/source/
echo "syncing finished."
[/PHP]
10) 如果你有兴趣在livecd中包含stage3和snapshot的portage包,可以直接放在source下面的某个目录下,例如可以建一个目录叫做stage,然后统统放进去。当livecd挂载之后,可以在/mnt/livecd下面找到。
到此为止,livecd做好,把iso烧录到光盘上,我做好的iso差不多170MB大小。
3. 最终效果
废话不多说,只贴dmesg:
[PHP]
GDT-HA: Storage RAID Controller Driver. Version: 3.05
imm: Version 2.05 (for Linux 2.4.0)
Fusion MPT base driver 3.04.13
Copyright (c) 1999-2008 LSI Corporation
Fusion MPT SPI Host driver 3.04.13
Fusion MPT FC Host driver 3.04.13
Fusion MPT SAS Host driver 3.04.13
mptsas 0000:02:00.0: PCI INT A -> GSI 24 (level, low) -> IRQ 24
mptbase: ioc0: Initiating bringup
ioc0: : Capabilities={Initiator}
mptsas 0000:02:00.0: setting latency timer to 64
scsi4 : ioc0: , FwRev=011a0000h, Ports=1, MaxQ=478, IRQ=24
mptsas: ioc0: attaching ssp device: fw_channel 0, fw_id 0, phy 0, sas_addr 0x5000c500170623f1
scsi 4:0:0:0: Direct-Access SEAGATE ST3300656SS HS09 PQ: 0 ANSI: 5
sd 4:0:0:0: Attached scsi generic sg0 type 0
sd 4:0:0:0: [sda] 585937500 512-byte logical blocks: (300 GB/279 GiB)
mptsas: ioc0: attaching ssp device: fw_channel 0, fw_id 1, phy 1, sas_addr 0x5000c50017062b99
scsi 4:0:1:0: Direct-Access SEAGATE ST3300656SS HS09 PQ: 0 ANSI: 5
sd 4:0:0:0: [sda] Write Protect is off
sd 4:0:0:0: [sda] Mode Sense: b3 00 10 08
sd 4:0:1:0: Attached scsi generic sg1 type 0
sd 4:0:0:0: [sda] Write cache: enabled, read cache: enabled, supports DPO and FUA
sd 4:0:1:0: [sdb] 585937500 512-byte logical blocks: (300 GB/279 GiB)
sd 4:0:1:0: [sdb] Write Protect is off
sd 4:0:1:0: [sdb] Mode Sense: b3 00 10 08
sda:
sd 4:0:1:0: [sdb] Write cache: enabled, read cache: enabled, supports DPO and FUA
sdb: sda1 sda2 sda3 < sda5 sdb1 sdb2 sdb3 < sdb5 sda6 sdb6 sda7 sdb7 sda8 >
sdb8 >
sd 4:0:0:0: [sda] Attached SCSI disk
sd 4:0:1:0: [sdb] Attached SCSI disk
megaraid cmm: 2.20.2.7 (Release Date: Sun Jul 16 00:01:03 EST 2006)
megaraid: 2.20.5.1 (Release Date: Thu Nov 16 15:32:35 EST 2006)
megasas: 00.00.04.12-rc1 Thu Sep. 17 11:41:51 PST 2009
.......
sl811: driver sl811-hcd, 19 May 2005
device-mapper: uevent: version 1.0.3
device-mapper: ioctl: 4.16.0-ioctl (2009-11-05) initialised: dm-devel@redhat.com
md: raid0 personality registered for level 0
usb 2-2: new high speed USB device using ehci_hcd and address 2
md: raid1 personality registered for level 1
md: raid10 personality registered for level 10
[/PHP]
然后 ls /dev/mapper -la,就会出现:
[PHP]
total 0
drwxr-xr-x 2 root root 200 Mar 1 08:58 .
drwxr-xr-x 14 root root 13980 Mar 1 08:58 ..
crw-rw---- 1 root root 10, 56 Mar 1 08:58 control
brw-rw---- 1 root disk 253, 0 Mar 1 08:58 ddf1_4c53492020202020100000550000000038bcdb5b00001450
[/PHP]
这个设备名够长吧?哈哈哈,幸亏bash有tab自动完成功能。
然后就可以
[PHP]
# cfdisk /dev/mapper/ddf1_4c53492020202020100000550000000038bcdb5b00001450
[/PHP]
来安装系统咯,和用普通的硬盘设备没啥区别了。
在分区写入之后,可能需要重新启动一下系统来识别新的分区表。另外,如果不确认,也可以用一下dmsetup mknodes。
接下来,就不用多说了吧。 |
|