LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2189|回复: 5

在ibm X3850服务器上安装linux的问题

[复制链接]
发表于 2007-10-13 19:06:24 | 显示全部楼层 |阅读模式
安装debian 4.0时找不到硬盘驱动,ibm网站上有rpm的硬盘驱动,但
服务器没有软驱,请问怎样安装? 硬盘型号是ST9XXXXSS的.
有没有办法把驱动程序加入到debian installer 中?
 楼主| 发表于 2007-11-10 20:42:28 | 显示全部楼层
发个帖庆祝问题的解决。
曾经试过的方法:
1  安装RHEL-4, 它也不支持该硬盘,需要另外用软驱安装驱动
2  把系统装在U盘上,想从U盘启动,编译新内核,用debootstrap安装, 但x3850不支持从U盘启动
3 在自己的机器上编译上新内核2.6.31.1,该内核中有aic95xx驱动支持。
    将新内核和initrd文件刻在光盘上,尝试从光盘启动,进入U盘上的系统。
    因对initrd及firmware的不了解,费了N张光盘后放弃。
4  从http://www.grml.org/,下载光盘grml64, 这是个基于debian的系统,
   包括许多工具,直接用光盘启动,不依赖于硬盘。而且介绍说该系统支持
   SAT94XX硬盘。实际使用时还是不能发现硬盘,不知grml-i386是不是能发现。


最终解决是看了下面的文章:
http://www.jimmy.co.at/weblog/?p=71
按照它介绍的步骤:
  1 下载已编译好的sarge内核模块aic94xx.ko,拷到U盘中。http://jimmy.co.at/weblog/uploaded_files/adp94xx.ko
  2 用sarge安装盘启动并安装系统,直到硬盘分区时报告不能发现硬盘
  3 按<ctrl-alt-f2>键,切换到另一个终端窗口,按enter键出现命令行提示
  4 插入U盘,运行"modprobe sd_mod", 就会发现U盘,但不会在屏幕上显示信息。用dmsg|tail查看,会看到U盘设备节点名。
  5 建一个新目录并把U盘mount上去。如, mkdir /usbstick; mount /dev/scsi/host0/bus0/target0/lun0/part1 /ubsstick
  6 拷贝驱动程序模块到系统中:cp /usbstick/adp94xx.ko /lib/modules/2.6.8-2-386/kernel/drivers/scsi
    然后运行"depmod"
  7 运行umount /usbstick, 拔出U盘,
    运行“modprobe -r sd_mod”,去掉模块sd_mod, 这样硬盘设备仍然是/dev/sda, 否则/dev/sda就是U盘了
  8 加载模块: “modprobe adp94xx”
    运行“modprobe sd-mod”
    查看dmesg的输出,就会看到已探测到了硬盘
  9 按<ctrl-alt-f1>,回到安装界面,重新进行分区

下面步骤用来生成initrd

  10 继续剩余的安装步骤,直到提示拿出安装盘重启(注意:提示选择内核时,一定要选择2.6.8-2-386)
  11 按<ctrl-alt-f2>键,回到另一个终端窗口
  12 拷贝模块adp94xx到新安装的内核:
      cp /lib/modules/2.6.8-2-386/kernel/drivers/scsi/adp94xx.ko  \
              /target/lib/modules/2.6.8-2-386/kernel/drivers/scsi/
  13 chroot到新安装的系统(系统安mount在/target下): chroot /target
    运行mount /proc
    运行depmod
    创建init ramdisk :mkinitrd -o /boot/initrd.img-2.6.8-2-386 2.6.8-2-386
    按ctrl-d或执行exit退出chroot
  14 按<ctrl-alt-f1>,回到安装界面, 重启系统。


15  重启系统后,不能用debootstrap在硬1盘1另1一1个1分区上5安装i, 因为chroot这一步过不去,因为在i386下能执行amd64的程序。

下面的步骤在U盘上制作合适的系统

16  在U盘上安装debian-amd64
17  在自己的amd64机器上编译2.6.23.1内核(含aic94xx模块),制作initrd文件:
      mkinitrd -o /boot/initrd.img-2.6.23.1 2.6.23.1
      cd /boot
      mkdir myinit
      解开initrd文件: zcat ../initrd.img-2.6.23.1 | cpio -i        (具体记不太清了)
      文件conf/modules中一定要含有unix模块,因为udev需要它,但不能加aic94xx模块,因为加载模块时还没有启动udevd,而aic94xx需要读firmware数据,要求udev已运行
    修改文件scripts/local-premount, 将其中的modprobe ide_core改为
      modprobe aic94xx
      modprobe sd_mod
18 从www.adaptec.com下载firmware文 ... 或/lib/firmware下, 否则加载aic94xx后会显示load aic94xx-seq.fw出错
19 产生initrd文件: find . |cpio -iH newc |gzip -9 > ../boot/initrd.img-2.6.23.1
20 把内核vmlinuz-2.6.23.1和initrd.img-2.6.23.1拷贝到U盘的boot目录下

21 启动x3850进入debian-i386, 插入U盘,把安装在U盘上的系统拷到新硬盘分区上,相应修改menu.lst
    用新系统启动, OK!
回复 支持 反对

使用道具 举报

发表于 2007-11-11 07:48:33 | 显示全部楼层
谢谢分享,如果用外置设备,还是有必要的驱动编入内核较方便,省却 initrd,如不打算编译内核又当别论。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-21 20:19:53 | 显示全部楼层

initrd的执行过程

这是安装过程中的笔记,放这里希望对大家有用。错误之处请指正。

(系统为debian etch, 以安装后默认的initrd.img-2.6.18-5为例)

[color="Red"]解开initrd文件:
例如有initrd文件/boot/initrd.img, 用file命令看到这是个gzip压缩的文件,可以用下面的命令解开查看:

  1. mkdir /boot/myinit
  2.   cd /boot/myinit
  3.   zcat ../initrd.img | cpio -id
复制代码


(注:用mkinitrd命令默认产生的是cramfs格式的。如果文件格式是压缩的ramfs文件系统,可以直接mount之后查看:mount -t cramfs /boot/initrd.img /mnt/)

在当前目录下就有一些目录和文件init,其中文件init是启动时加载initrd之后执行的脚本。

[color="Red"]目录结构:

         /bin/: 文件有busybox, mknod, sh, uname, cat, mount, pivot_root等

--------/sbin/: 文件有modprobe, depmod, udevd, udevdtrigger

--------/lib/: 文件有:
----------------(1) 可执行文件需要的动态库
----------------(2) modules/: 内核模块
----------------(3) udev/: udev需要的可执行文件

--------/lib64/: 文件有:x86_64程序装载器

--------/etc/: 与modprobe, udev相关的配置文件

--------/conf/: 有如下的文件
----------------(1) modules: 列出了需要加载的模块
----------------(2) arch.conf: 设置变量DPKG_ARCH=amd64
----------------(3) initramfs.conf: 定义了一些变量

--------/scripts/:
----------------有如下的文件:
----------------functions: 定义了一些方便使用的函数
----------------local和nfs: mount根目录时执行的脚本,一般mount本地系统,执行local
----------------
----------------有如下的目录,其中放置各阶段执行的脚本:
----------------init_top/
----------------init_premount/
----------------init_bottom/
----------------local_top/
----------------local_premount/
----------------local_bottom/

--------/init: 启动时加载initrd之后执行的脚本


[color="Red"]生成initrd文件:

find . |cpio -o --dereference -H newc | gzip -9 > ../initrd.img


[color="Red"]init文件执行流程:

--------1) 创建目录/dev, /root, /sys, /proc, /tmp, /var/lock,其中/root是下面根文件系统要mount的位置

--------2) mount系统proc和sys

--------3) 执行脚本/etc/udev/udev.conf,仅定义变量

--------4) mount udev设备:mount -t tmpfs -o size=<xx>  udev /dev

--------5) 创建/dev/console, /dev/null, /dev/.initramfs

--------6) 导入/conf目录下的initramfs.conf, /conf/conf.d/目录以及/scripts/functions定义的变量和函数, 并且根据传递的内核参数设置相应的变量,其中比较重要的变量有:
----------------a) rootdelay=<时间>, 加载根文件系统前等待的时间。如果根文件系统在U盘上,一定要在这里或在grub的kernel后加上这个参数,等待发现U盘后再mount根文件系统,否则会出现找不到根文件系统的错误.
----------------b) panic=<时间>  系统panic后,隔多长时间再reboot。当你试验新内核或新initrd,经常panic而不想按开机按钮时可以加上这个参数

--------7) depmod -a  在/lib/modules/<内核版本号>/目录下产生modules.dep文件

--------8) 执行init_top目录下的脚本文件。这里只有一个framebuffer,它处理内核参数video=,vga=,splash等参数, 另外创建节点/dev/tty[0-8]

--------9) 用modprobe按顺序加载/conf/modules列出的模块。[color="Blue"]注意,udev需要unix模块,否则会出现错误: udevd[606]: error initializing udev socket

--------10) 执行/scripts/init-premount/下的脚本文件。
-------------10.1) 文件thermal: 它根据DPKG_ARCH的不同值加载相应需要的模块,并且加载fan和thermal模块。
-------------10.2) 文件udev: 执行如下过程:
------------------------a) mkdir -p /dev/.udev/db
------------------------b) udevd --daemon 以daemon形式启动udevd,大概用于监视hotplug设备的插拔
------------------------c) mkdir -p /dev/.udev/queue/    (不知道这两个mkdir的用途)
------------------------d) udevtrigger 对于coldplug的设备,(也就是开机前插入的设备),触发设备的uevents,以便内核处理
------------------------e) udevsettle 等待,直到内核uevents事件处理完

--------11) 执行/scripts/local, 它完成mount根文件系统的过程:
----------------11.1) 首先执行local-top/目录下的脚本
------------------------11.1.1) 文件udev_helper:
----------------------------------a) 针对根文件系统设备(如通常的/dev/sda1, /dev/sda2等)不存在的情况,加载了模块ide_generic。我[color="Blue"]可以针对找不到硬盘的情况,加载模块aic94xx, sd_mod.
----------------11.2) 如果根文件系统设备还不存在,则年等待一段时间(默认180s),过了这段时间还找不到根文件系统设备就panic.
----------------11.3) 取得根文件系统的类型:先看有没有传递参数rootfstype=,如果没有就执行/bin/fstype,如果还不知道文件系统类型就执行/lib/udev/vol_id来取得文件系统类型。
----------------11.4) 执行local-premount/ 下的脚本:
-------------------------11.4.1) 文件resume: (没看太懂)
------------------------------a) 处理传递的resume参数,它指定的是一个分区,格式为resume=LABEL=/dev/sda1或resume=UUID=xxx, 用于suspend to disk
----------------11.5) 根据文件系统类型加载相应的模块,例如如果根文件系统是ext2类型的,就加载ext2(如果没编译进内核)。
----------------11.6)mount根文件系统到/root上
----------------11.7) 执行local-bottom/下的脚本(这里没有脚本)。

--------12) 执行init-bottom/下的脚本:
---------------12.1) 文件udev:
------------------------a) kill掉udevd
------------------------b) nuke /dev/.udev/queue/  (不知啥意思)
------------------------c) 执行/etc/udev/udev.conf 设置变量tmpfs_size=10M
------------------------d) mkdir /dev/.static/dev   (注意,这个目录不是在硬盘上创建的)
------------------------e) mount -n -o bind /root/dev /dev/.static/dev  把真实文件系统的/dev目录下的node(在硬盘上) bind到/dev/.static/dev/下
------------------------f) mount -n -o move /dev  /root/dev 把tmpfs类型的udev移到真实的文件系统的/dev下,(注意前面一开始就在/dev上mount了udev), 这时真实文件系统的/dev上mount了udev,而原来在硬盘的/dev目录下的node到了/dev/.static/dev下,实际上在硬盘上没有/dev/.static这个目录. (这个不太好理解)
------------------------g) nuke /dev  (不知啥意思)
------------------------h) ln -s /root/dev /dev  前面mount -o move之后,目录/dev下什么也没了,这时/root还没真正成为根。这一步使得,如果其它脚本要使用/dev/下的设备文件时不至于找不到。

--------13) mount -n -o move /sys /root/sys

--------14) mount -n -o move /proc /root/proc

--------15) exec run-init /root  /sbin/init  "$@" </root/dev/console > /root/dev/console 这一步应该是使真实文件系统成为根,并执行它的/sbin/init(没看懂)

[color="Blue"]注:加载aic94xx时,需要从目录/usr/lib/hotplug/firmware或者/lib/udev/firmware下读入firmware数据,所以还要建立目录usr/lib/hotplug/firmware或者lib/udev/firmware (在initrd的根目录下,即/boot/myinit) ,然后,把aic94xx-seq.fw拷到任何一个目录中。 可以看出,如果把aic94xx编译进内核,就应把firmware数据也放进内核,但这个功能还没实现。参见内核文档Documentation/firmware_class/README的末尾。
回复 支持 反对

使用道具 举报

发表于 2007-11-21 20:58:26 | 显示全部楼层
2.6.31?哪里来的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-23 20:16:32 | 显示全部楼层
不好意思,输错了,是2.6.23.1
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表