Oracle Enterprise Linux 4U4 在MV C61V主板打开DMA支持
前段时间打算安装Oracle EBS 11i, 为此买了台AMD Athlon AM2 3800+的机器, 之所以选择这块CPU, 主要是因为以后可以测试64位的Linux. 但是目前还是当一台i386来用. 当时认为现在的Linux已经很容易安装了, 所以也就没有仔细选择主板的芯片组, 就选了技嘉的C61V, 该主板集成了网卡/显卡/声卡.芯片组使用的是nVidia nForce 6100/, C61V的V代表Value, 经济型的, 怪不得这么便宜. 总之, 这块主板插上CPU内存就是一台机器了. 等到机器装好, 装上Oralce Enterprise Linux, 才发现问题多了去了.
首先是网卡的问题, OEL4根本没有检测到网卡, 没有网卡, 就什么都没戏了. 这块主板的网卡是Realtek 8012的NIC,据说是物理层而已, MAC是由主芯片提供的, 因此根本没有Realtek 8012的驱动程序, 需要的是主板的驱动. 于是找到nVidia的网站, 上面有Linux下所有的驱动程序, 下下来看了看, 有个forcedeth的驱动, 是专门给eth用的. 于是开始着手安装网卡.
首先, nVidia的驱动包中有一个forcedeth, 参见<<Oracle Enterprise Linux 4U4 在MV C61V主板安装Realtek 8012网卡>>
接下来, 准备复制Oracle EBS的DVD. 第一张盘开始复制後, 发现居然要50分钟复制一张DVD, 这太痛苦了. 于是怀疑不支持DMA, 看了以下说明, 似乎是支持的, 那肯定又是驱动的问题. 于是在Linux下运行
#hdparm /dev/hda
/dev/hda:
multcount = 16 (on)
IO_support = 0 (default 16-bit)
unmaskirq = 0 (off)
using_dma = 0 (off) ####这表明DMA 没有打开
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 256 (on)
geometry = 24321/255/63, sectors = 200048565760, start = 0
果然没有打开DMA
然后尝试用hdparm打开DMA
#hdparm -d1 -c1 -k1 /dev/hda
其它两个都可以了, 就DMA不行, 报错.
/dev/hda:
setting 32-bit IO_support flag to 1
setting using_dma to 1 (on)
HDIO_SET_DMA failed: Operation not permitted
setting keep_settings to 1 (on)
IO_support = 1 (32-bit)
using_dma = 0 (off)
keepsettings = 1 (on)
看来是不行了,要编译内核了. 于是下载了Oracle Enterprise Linux 4U4的源代码.
第一步,安装内核源代码
#cd /stage
#rpm -ivh kernel-2.6.9-42.EL.src.rpm
#ln -s /usr/src/redhat/BUILD/ /usr/src/linux
第二步,查找amd的驱动程序, 这个程序在/usr/src/linux/drivers/ide/pci/amd74xx.c
#cd /usr/src/linux/
#vi drivers/ide/pci/amd74xx.c
找了一下, 果然没有MCP61的芯片支持, 打开nVidia提供的驱动程序, 居然也没有MCP61的, 真让人绝望. 于是我只能google一下MCP61芯片组的相关信息, 还好, 有讨论组里提供了MCP61的源代码, 下载后, 保存为amd74xx.c, 备份了原来的amd74xx.c, 把新文件复制到/usr/src/linux/drivers/ide/pci.
amd74xx.c里面主要增加了以下几行,
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, 0x50, AMD_UDMA_133 },
于是一次在google上找到了他们在/usr/src/linux/include/linux/pci_ids.h里的定义, 分别是
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE 0x0265
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA 0x03E7
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE 0x03EC
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2 0x03F6
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3 0x03F7
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE 0x036E
#define PCI_DEVICE_ID_AMD_CS5536_IDE 0x209A
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA 0x0266
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2 0x0267
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA 0x037E
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2 0x037F
SATA的一些不用管, 反正驱动里没有用到.
第三步, 准备编译内核.
#cd /usr/src/linux
#make mrproper
#cp configs/kernel-2.6.9-i686.config .config -f
事实上, 后来证实应该用/boot里面的config, 这个config里很多module都没有.
所以, 尝试使用
#cp /boot/config-2.6.9-42.0.0.0.1.ELsmp .config
然后就是编译了
#make
居然遇到了pci_get_legacy_ide_irq not defined 的问题, 根据源代码, 这个可以不要的, 注释掉之后就通过了.
然后就是
#make modules
第四步, 安装新的内核
之所以不用make install,主要是担心把现有的kernel 改掉後, 无法启动.
所以, 采用了以下的步骤.
1. 复制bzImage
#cd /usr/src/linux
#cp -p arch/i386/boot/bzImage /boot/vmlinuz-2.6.43 #名字随便起了一个
2. 在grub.conf里添加一个启动选项, 基本上是复制了title Enterprise (2.6.9-42.0.0.0.1.ELsmp)的内容
title Enterprise (ide.ELsmp)
root (hd0,0)
kernel /vmlinuz-2.6.43 ro root=LABEL=/1 rhgb quiet
initrd /initrd-2.6.9-42.0.0.0.1.ELsmp.img
3. reboot机器, 选择"Enterprise (ide.ELsmp)",
4. 用hdparm检查以下, dma打开了.