SCSI设备驱动过程
下面以Adaptec SCSI RAID 3200S卡为例,介绍SCSI RAID卡的驱动过程。这是常见的带RAID功能的SCSI卡。在大部分编译好的内核中,都会编译对SCSI设备的支持。但是需要知道,内核中只是支持通用的SCSI总线,而具体的SCSI卡还需要加载相应的驱动程序。SCSI芯片驱动的安装比较特殊,下面分成两种情况叙述。
1. Linux系统的启动文件就是在SCSI硬盘上
这种情况下,SCSI设备的驱动程序不能像普通的驱动程序来安装。因为如果系统启动时没有加载SCSI卡的驱动程序,那么根本无法访问其它的Linux系统文件,所以必须在内核启动后立刻就加载该设备的驱动程序。以下是在Red Hat系统中具体的安装过程。
(1)从Adaptec网站http://www.adaptec.com/worldwide/support/driverdetail.jsp?sess=no&language=English+US&cat=/Product/ASR-3200S&filekey=dpt_i20-drv_2.5.0-rh9-i686.img 下载Adaptec SCSI RAID 3200S卡针对Red Hat 9.0的驱动程序,大家可以看到这是一个.img的镜像文件。
(2)将该镜像文件写入软盘中。Linux下可以用下面命令:
# dd if=dpt_i20-drv_2.5.0-rh9-i686.img of=/dev/fd0
|
或者
# cat dpt_i20-drv_2.5.0-rh9-i686.img > /dev/fd0
|
在Windows下利用Red Hat第一张安装光盘中的/CDROM/dosutils/rawrite.exe程序。
(3)在启动Red Hat安装过程时,boot提示符出现时进入安装模式:
(4)按照向导提示,将刚才制作的驱动软盘插入。
以后的安装过程就没有什么不同了。安装向导实际上将软盘上的驱动程序放到了initrd的RAMDISK(内存磁盘镜像)文件中,每次内核启动后,都最先加载这个内存虚拟硬盘的镜像,利用里面的SCSI驱动程序来驱动SCSI RAID卡和卡上连接的硬盘。
2. Linux系统已经安装到一个IDE的硬盘上
这种情况跟其它的驱动程序没有太大的区别,用modprobe或insmod将SCSI卡的驱动模块加载到内存中。(1)查看系统是否能访问PCI设备:
(2)从Adaptec网站http://www.adaptec.com/worldwide/support/driverdetail.jsp?sess=no&language=English+US&cat=/Product/ASR-3200S&filekey=dpt_i20-drv_2.5.0-rh9.rpm下载驱动程序,检验是否可以加载模块。
# rpm -ivh dpt_i20-drv_2.5.0-rh9.rpm
# modprobe dpt_i2o
|
(3)察看是否可以访问/dev/sda设备,或者已经创建好/dev/md0设备。
加载以太网卡驱动模块及参数调整
1.以太网卡的驱动过程
处理网络方面任务是Linux的长项,仅仅一两兆的Linux内核就可以对TCP/IP有很好的支持。下面首先了解一下最常见的网络设备—以太网卡的驱动过程。
在内核加载后,虽然已经有了对TCP/IP协议的支持,但是具体的网络接口设备的驱动并没有加载。在内核启动后,将硬盘上的根分区mount到系统中,系统就会查找模块配置文件/etc/modules.conf,并按照该文件记录的内容来加载模块:
# cat /etc/modules.conf
alias eth0 8139too
alias sound-slot-0 i810_audio
post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :
pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :
alias usb-controller usb-uhci
alias usb-controller1 ehci-hcd
|
上面代码表示加载8139too模块,我的网卡是8139的100Mb以太网芯片,并将该模块取别名叫做eth0。这表示第一个以太网的网络接口,以后只要访问eth0,就是访问这块网卡。然后系统会在/lib/modules/2.4XXX/的modules.deps中查找该模块的具体位置:
# grep 8139too /lib/modules/2.4.21-4.EL/modules.dep
/lib/modules/2.XXX/kernel/drivers/net/8139too.o:
/lib/modules/2.4.21-4.EL/kernel/drivers/net/mii.o
/lib/modules/2.4.21-4.EL/kernel/lib/crc32.o
|
以上内容在同一行中,表示8139too模块依存于mii模块和crc32模块,8139too模块的具体位置在/lib/modules/2.XXX/kernel/drivers/net/8139too.o,所有系统内置的网络驱动程序都在/lib/modules/2.XXX/kernel/drivers/net目录下。
驱动模块加载完成之后,可以直接通过命令ifconfig来设置网卡的IP地址,:
# ifconfig eth0 192.168.1.1
|
这样设置的IP地址重启后就会失效,使用netconfig命令可以永久更改IP地址:
# netconfig
# service network restart 或者
# /etc/rc.d/init.d/network restart`
|
那么系统每次启动时是怎样配置网络的呢?在Linux系统中,网络作为一项服务被加载,配置文件是/etc/rc.d/init.d/network,在该文件中可以看到系统启动网络接口、绑定IP地址、设定静态路由的过程,这个文件通过调用/etc/sysconfig/network-scripts/ifcfg-*的几个文件来配置各个网卡的IP地址。比如有eth0,则会生成一个文件ifcfg-eth0,系统每次启动时自动绑定eth0的IP地址:
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.0.1
NETMASK=255.255.255.0
TYPE=Ethernet
|
以上就为eth0设备绑定了192.168.0.1的IP地址。
# cat /etc/sysconfig/network-scripts/ifcfg-eth0:1
DEVICE=eth0:1
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.1.1
NETMASK=255.255.255.0
TYPE=Ethernet
|
以上的ifcfg-eth0:1文件为eth0设定了第二个IP地址192.168.1.1,这个文件是我添加的,注意DEVICE=eth0:1 跟上一个文件是不一样的。
2.安装3COM 3CR990网卡驱动程序
我们可以看到,系统内置的网卡驱动程序在/lib/modules/2.4.XXX/kernel/drivers/net目录下,如果网卡不在默认支持的硬件中,可以用以下方法来安装网卡驱动。
比如,我们有一块3COM 3CR990网卡,可以到3COM网站上下载针对2.4内核的驱动http://support.3com.com/infodeli/tools/nic/linux/3c990-1.0.0a.tar.gz。然后解压缩下载的文档到解开的目录中:
#t tar xvfz 3c990-1.0.0a.tar.gz
# make
|
此时当前文件下将会生成3c990.o的驱动模块。
看一下该模块是否可以被正常加载,如果没有问题,就更改/etc/modules.conf文件和/lib/modules/2.XXX/modules.dep文件,让模块每次启动时加载:
# echo “alias eth0 3c990” >> /etc/modules.conf
# cp ./3c990.o /lib/modules/2.XXX/kernel/drivers/net
# echo "/lib/modules/2.XXX/kernel/drivers/net/3c990.o:" >> /lib/modules/2.XXX/modules.deps
|
3.调整以太网卡的参数
有时在加载完网卡的驱动后,如果网卡的状态不正确,比如驱动起一块网卡,但是它在100Mb的速度上工作很不稳定,就可以使用mii-tool命令调整以太网卡的属性。目前多数以太网卡为10BaseT与100BaseTx的10Mb/100Mb自适应网卡,也有较新的支持1000BaseT的千兆以太网卡。
下面介绍mii-tool命令的一些用法:
(1)显示当前网卡所使用的以太网类型,目前这块网卡使用的是100baseTx的全双工工作方式。
# mii-tool
eth0: negotiated 100baseTx-FD flow-control, link ok
|
(2)显示当前的网卡支持的所有以太网类型。
# mii-tool -v
eth0: negotiated 100baseTx-FD flow-control, link ok
product info: vendor 00:08:18, model 22 rev 2
basic mode: autonegotiation enabled
basic status: autonegotiation complete, link ok
capabilities: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
advertising: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control
link partner: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control
|
(3)强制eth0使用10baseT-FD的方式(10Mb全双工的方式)工作。
# mii-tool -F 10baseT-FD eth0
|
(4)解除eth0的强制状态,让eth0自动侦测使用什么方式通信。
# mii-tool -R
resetting the transceiver...
|
Modem和ADSL驱动安装及PPP连接设置
1.外置Modem的驱动程序安装
Modem分为外置和内置两种。比较而言,外置的Modem配置较容易,使用方便。Modem一般接在串口上,在Linux中串口对应的设备文件为/dev/ttyS*,如果是COM1口,则对应/dev/ttyS0。如果不知道连接的是哪一个COM口,可以先给Modem加电,用以下命令测试:
如果Modem的TR灯亮,则表明该Modem接到COM1口上;如果不亮,再试一下/dev/ttyS1文件。知道了Modem连接的是哪一个串口后,就可以拨号了。拨号的过程实际上是通过Modem建立PPP(点对点通信协议)的连接。
在命令行下,可以使用pppd进行拨号,常见的Linux系统中会安装这个拨号程序,大家可以看一下/etc/ppp目录下是否有相关的脚本文件,如果没有可以下载并安装ppp包ftp://cs.anu.edu.au/pub/software/ppp。将包安装后,可以查找ppp-on和ppp-on-dialer文件,把文件复制到/etc/ppp文件夹下,修改ppp-on文件如下几个地方:
TELEPHONE=270 //ISP提供的上网电话号码
ACCOUNT=user //ISP提供的账号名称
PASSWORD=123 //登录密码
LOCAL_IP=0.0.0.0 //PPP连接的IP地址,0.0.0.0表示由ISP动态分配
REMOTE_IP=0.0.0.0 //远端IP地址,一般为0.0.0.0
NETMASK=255.255.255.0
export TELEPHONE ACCOUNT PASSWORD \
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer \ //查找另一个必须的配置脚本
exec /usr/sbin/pppd lock modem crtscts /dev/ttyS0 115200 \ //设置COM口及速度
asyncmap 0 kdebug 4 \
$LOCAL_IP:$REMOTE_IP noipdefault netmask $NETMASK defaultroute \
connect $DIALER_SCRIPT&
|
给这个文件加上执行权限:
# chmod 700 ppp-on
# ./ppp-on
|
这样就可以拨号上网了。这种方法可以适用于多数的Linux系统,如果是Red Hat Linux,可以使用redhat-config-network命令轻松地在文本界面上配置拨号连接,如图1。

图1 文本界面下的redhat-config-network
如果启动了X-Window,GNOME与KDE都自带图形界面的拨号程序。
2.内置Modem驱动程序的安装
内置Modem比起外置的Modem配置要麻烦一些,下面在Dell D600笔记本安装内置Modem的驱动程序。到下面网址下载驱动http://www.linuxant.com /drivers/hsf/full/downloads.php,选定适合本系统内核版本的驱动程序,下载后是一个RPM包。
#rpm-ivhhsfmodem-6.03.00lnxt04061800full _k2.4.21_4.EL-1rh.i686.rpm
... ...
Config for modem unit 0: /dev/ttySHSF0
Device instance: 0-PCI-8086:24c6-14f1:5422
HW revision : CXT22
HW profile name: hsfmc97ich
Registration ID: 115C-247C-BFC0
License owner : unknown
License key : FREE
License status : FREE (max 14.4kbps data only)
Current region : CHINA (T.35 code: 0026)
The /dev/modem alias (symlink) points to /dev/ttySHSF0
……
|
由上可以看到,安装程序自动建立了一个设备文件/dev/ttySHSF0,并且为它创建了名叫/dev/modem的软链接文件,这个文件与其它的ttyS文件的类型是不同的:
# ls /dev/ttyS0 -l
crw-rw---- 1 root uucp 4, 64 Sep 15 2003 /dev/ttyS
# ls /dev/ttySHSF0 -l
crw-rw-rw- 1 root root 240, 64 Jun 29 02:36 /dev/ttySHSF0
|
由上可以看到,/dev/ttySHSF0文件不是标准的COM口,而是该驱动程序自己注册的240类型的驱动程序。
实际上,驱动内置Modem的过程是先加载驱动程序,模拟一个ttyS的串口设备文件,然后像给普通外置Modem建立PPP链接那样,为内置的Modem建立拨号连接,不过这时要选定/dev/modem作为设备文件。
3.ADSL及宽带连接驱动
ADSL设备通常是通过以太网卡来拨号,建立PPP链接,这时的PPP协议叫做PPPoE,就是PPP over Ethernet(在以太网上的点对点通信协议),一般不需要任何ADSL Modem的驱动,只需直接建立PPPoE连接。
在命令行下,下载ADSL拨号程序rp-pppoe,可以通过http://www.linuxsir.org/postnuke/modules.php?op=modload&name=Downloads&file=index&req=getit&lid=242下载, 或者直接下载RPM包http://www.neweasier.com/software.html?class=4 。
配置非常简单,下载包解压缩后直接运行下面代码:
则出现PPPoE配置向导,会提示输入用户名和密码,然后使用以下命令建立连接:
或者
系统中会在配置完后出现一个SysV的服务:
# chkconfig --list adsl
adsl 0:off 1:off 2:off 3:off 4:off 5:off 6:off
# chkconfig adsl on
|
这样以后每次启动就会启用ADSL拨号。
如果不用rp-pppoe的向导,也可以在X-Window中直接使用下面命令(如图2):

图2 X-Window中运行网络配置工具
或者
上面两个命令是Red Hat Linux中的命令,可以在图形界面下建立PPPoE的连接,其它版本的Linux也应该有自己的ADSL拨号程序。
如图3所示中,单击上面的“New”建立新连接,如VPN、eth、ISDN、Modem等,则出现图4所示页面。

图3 单击建立新连接
图4里的xDSL并不是只有ADSL等DSL的连接,一般的PPPoE连接都可以使用,比如即使是建立类似网通的宽带LAN接入形式也应该选择这一项。单击“Forward”进行下一步。

图4 选择xDSL连接,建立PPPoE连接
输入ADSL或LAN宽带接入的连接信息,如图5所示。然后单击“Forward”。
建立好了链接后,在/etc/sysconfig/network-scripts/ 目录中会出现ifcfg-ppp0的文件,可以通过以下命令让系统通过ADSL拨号上网,建立宽带连接;也可以用刚才的向导拨号上网,如图6。
有些地方提供LAN宽带接入方式也需要进行拨号,如北京网通LAN接入宽带,它实际上使用跟ADSL一样的PPPoE协议,建立连接时与ADSL的拨号方式一样,也可以用rp-pppoe或redhat-config-network来建立拨号连接,运行向导时没有区别。

图5 输入ADSL或LAN宽带接入的连接信息

图6 建立PPPoE连接先选中PPP0再单击上面的Activate按钮
4.常见故障处理
如果在配置网络时出现问题,可遵循以下步骤检查:
(1)用ifconfig看一下网络接口是否启动,IP地址是否绑定,如果网络接口没有启动。例如,PPP0没有启动,可使用ifup ppp0命令。如果IP地址没有绑定,使用命令ifconfig eth0 192.168.1.1设置地址;也可以使用命令netconfig设置IP地址、网关及DNS服务器的地址。然后用service network restart重启网络。
(2)如果网络接口及IP没有问题,但是不能上网,可使用ping 211.XXX的一个外网地址,如果能通,则应该是DNS服务器的问题,更改/etc/resolv.conf文件中的nameserver的地址,换一个能用的DNS服务器的地址。
(3)如果都没有问题就是ping不通外网的IP,可使用命令route -n看一下默认网关是否正确,如果不正确使用route del/add来设置默认网关,使用netconfig可以永久更改默认网关。
从上面的讲解中可以看到,我们遇到的情况可能是千差万别的,安装的方式也是多种多样的。但是,不论哪一种设备应该首先理解这种设备的驱动方式,然后再来了解具体的驱动程序。
|