Linux下设备驱动
本講主要概述Linux設備驅動框架、驅動程序的配置文件及常用的加載驅動程序的方法;并且介紹Red Hat Linux安裝程序是如何加載驅動的,通過了解這個過程, 我們可以自己將驅動程序放到引導盤中;安裝完系統后,使用kudzu自動配置硬件程序。
Linux設備驅動概述
1. 內核和驅動模塊
操作系統是通過各種驅動程序來駕馭硬件設備,它為用戶屏蔽了各種各樣的設備,驅動硬件是操作系統最基本的功能,并且提供統一的操作方式。正如我們查看屏幕上的文檔時,不用去管到底使用nVIDIA芯片,還是ATI芯片的顯示卡,只需知道輸入命令后,需要的文字就顯示在屏幕上。硬件驅動程序是操作系統最基本的組成部分,在Linux內核源程序中也占有較高的比例。
Linux內核中采用可加載的模塊化設計(LKMs ,Loadable Kernel Modules),一般情況下編譯的Linux內核是支持可插入式模塊的,也就是將最基本的核心代碼編譯在內核中,其它的代碼可以選擇是在內核中,或者編譯為內核的模塊文件。
如果需要某種功能,比如需要訪問一個NTFS分區,就加載相應的NTFS模塊。這種設計可以使內核文件不至于太大,但是又可以支持很多的功能,必要時動態地加載。這是一種跟微內核設計不太一樣,但卻是切實可行的內核設計方案。
我們常見的驅動程序就是作為內核模塊動態加載的,比如聲卡驅動和網卡驅動等,而Linux最基礎的驅動,如CPU、PCI總線、TCP/IP協議、APM(高級電源管理)、VFS等驅動程序則編譯在內核文件中。有時也把內核模塊就叫做驅動程序,只不過驅動的內容不一定是硬件罷了,比如ext3文件系統的驅動。
理解這一點很重要。因此,加載驅動時就是加載內核模塊。下面來看一下有關模塊的命令,在加載驅動程序要用到它們:lsmod、modprob、insmod、rmmod、modinfo。
lsmod 列出當前系統中加載的模塊,例如:
| #lsmod (與cat /proc/modules 得出的內容是一致的)Module Size Used by Not taintedradeon 115364 1agpgart 56664 3nls_iso8859-1 3516 1 (autoclean)loop 12120 3 (autoclean)smbfs 44528 2 (autoclean)parport_pc 19076 1 (autoclean)lp 9028 0 (autoclean)parport 37088 1 (autoclean) [parport_pc lp]autofs 13364 0 (autoclean) (unused)ds 8704 2yenta_socket 13760 2pcmcia_core 57184 0 [ds yenta_socket]tg3 55112 1sg 36940 0 (autoclean)sr_mod 18104 0 (autoclean)microcode 4724 0 (autoclean)ide-scsi 12208 0scsi_mod 108968 3 [sg sr_mod ide-scsi]ide-cd 35680 0cdrom 33696 0 [sr_mod ide-cd]nls_cp936 124988 1 (autoclean)nls_cp437 5148 1 (autoclean)vfat 13004 1 (autoclean)fat 38872 0 (autoclean) [vfat]keybdev 2976 0 (unused)mousedev 5524 1hid 22212 0 (unused)input 5888 0 [keybdev mousedev hid]ehci-hcd 20104 0 (unused)usb-uhci 26412 0 (unused)usbcore 79392 1 [hid ehci-hcd usb-uhci]ext3 91592 2jbd 52336 2 [ext3] |
上面顯示了當前系統中加載的模塊,左邊數第一列是模塊名,第二列是該模塊大小,第三列則是該模塊使用的數量。
如果后面為unused,則表示該模塊當前沒在使用。如果后面有autoclean,則該模塊可以被rmmod -a命令自動清洗。rmmod -a命令會將目前有autoclean的模塊卸載,如果這時候某個模塊未被使用,則將該模塊標記為autoclean。如果在行尾的[ ]括號內有模塊名稱,則括號內的模塊就依賴于該模塊。例如:
| cdrom 34144 0 [sr_mod ide-cd] |
其中ide-cd及sr_mod模塊就依賴于cdrom模塊。
系統的模塊文件保存在/lib/modules/2.4.XXX/kerne目錄中,根據分類分別在fs、net等子目錄中,他們的互相依存關系則保存在/lib/modules/2.4.XXX/modules.dep 文件中。
需要注意,該文件不僅寫入了模塊的依存關系,同時內核查找模塊也是在這個文件中,使用modprobe命令,可以智能插入模塊,它可以根據模塊間依存關系,以及/etc/modules.conf文件中的內容智能插入模塊。比如希望加載ide的光驅驅動,則可運行下面命令:
| # modprobe ide-cd |
此時會發現,cdrom模塊也會自動插入。
insmod也是插入模塊的命令,但是它不會自動解決依存關系,所以一般加載內核模塊時使用的命令為modprobe。
rmmod可以刪除模塊,但是它只可以刪除沒有使用的模塊。
Modinfo用來查看模塊信息,如modinfo -d cdrom,在Red Hat Linux系統中,模塊的相關命令在modutils的RPM包中。
2.設備文件
當我們加載了設備驅動模塊后,應該怎樣訪問這些設備呢?Linux是一種類Unix系統,Unix的一個基本特點是“一切皆為文件”,它抽象了設備的處理,將所有的硬件設備都像普通文件一樣看待,也就是說硬件可以跟普通文件一樣來打開、關閉和讀寫。
系統中的設備都用一個設備特殊文件代表,叫做設備文件,設備文件又分為Block(塊)型設備文件、Character(字符)型設備文件和Socket(網絡插件)型設備文件。Block設備文件常常指定哪些需要以塊(如512字節)的方式寫入的設備,比如IDE硬盤、SCSI硬盤、光驅等。
而Character型設備文件常指定直接讀寫,沒有緩沖區的設備,比如并口、虛擬控制臺等。Socket(網絡插件)型設備文件指定的是網絡設備訪問的BSD socket 接口。
| #ls -l /dev/hda /dev/video0 /dev/logbrw-rw---- 1 root disk 3, 0 Sep 15 2003 /dev/hdasrw-rw-rw- 1 root root 0 Jun 3 16:55 /dev/logcrw------- 1 root root 81, 0 Sep 15 2003 /dev/video0 |
上面顯示的是三種設備文件,注意它們最前面的字符,Block型設備為b,Character型設備為c,Socket設備為s。
由此可以看出,設備文件都放在/dev目錄下,比如硬盤就是用/dev/hd*來表示,/dev/hda表示第一個IDE接口的主設備,/dev/hda1表示第一個硬盤上的第一個分區;而/dev/hdc 表示第二個IDE接口的主設備。可以使用下面命令:
| #dd if=/dev/hda of=/root/a.img bs=446 count=1 |
把第一個硬盤上前446個字節的MBR信息導入到a.img文件中。
對于Block和Character型設備,使用主(Major)和輔(minor)設備編號來描述設備。主設備編號來表示某種驅動程序,同一個設備驅動程序模塊所控制的所有設備都有一個共同的主設備編號,而輔設備編號用于區分該控制器下不同的設備,比如,/dev/hda1(block 3/1)、/dev/hda2(block 3/2 )和/dev/hda3( block3/3 )都代表著同一塊硬盤的三個分區,他們的主設備號都是3,輔設備號分別為1、2、3。 這些設備特殊文件用mknod命令來創建:
| # mknod harddisk b 3 0 |
我們就在當前位置創建出一個與 /dev/hda一樣的、可以訪問第一個IDE設備主硬盤的文件,文件名叫做harddisk。
使用下面命令可以查看設備編號:
| #file /dev/hda/dev/hda: block special (3/0) |
其中Block代表/dev/hda是系統的Block型(塊型)設備文件,它的主設備編號為3,輔設備編號為0。
| #ls -l /dev/hda /dev/hdbbrw-rw---- 1 root disk 3, 0 Sep 15 2003 /dev/hdabrw-rw---- 1 root disk 3, 64 Sep 15 2003 /dev/hdb |
使用ls -l也可以看到設備編號,/dev/hdb代表第一個IDE接口的從設備(Slave)也是Block設備,編號為(3/64),還有另外一種設備文件是/dev/tty*。使用如下命令:
| #echo "hello tty1" > /dev/tty1 |
將字符串“hello tty1”輸出到/dev/tty1代表的第一個虛擬控制臺上,此時按“Alt + F1”可以看到該字符出現在屏幕上,這個特殊的文件就代表著我們的第一虛擬控制臺。
| #file /dev/tty1/dev/tty1: character special (4/1) |
由上可以看到,它的類型為Character 型(字符型)設備文件,主設備號為4,輔設備號為1。同樣,/dev/tty2代表著第二個虛擬控制臺,是Character設備,編號為 (4/2)。
當將/dev/cdrom加載到/mnt/cdrom中時,只要訪問/mnt/cdrom系統就會自動引入到/dev/cdrom對應的驅動程序中,訪問實際的數據。
有關設備文件的編號可以看內核文檔/usr/src/linux-2.*/Documentation/devices.txt 文件(在Kernel的源文件解包后的Documentation目錄中),其中詳細敘述了各種設備文件編號的意義。
3.使用/proc目錄中的文件監視驅動程序的狀態
通過設備文件怎樣訪問到相應的驅動程序呢?它們中間有一個橋梁,那就是proc文件系統,它一般會被加載到/proc目錄。訪問設備文件時,操作系統通常會通過查找/proc目錄下的值,確定由哪些驅動模塊來完成任務。如果proc文件系統沒有加載,訪問設備文件時就會出現錯誤。
Linux系統中proc文件系統是內核虛擬的文件系統,其中所有的文件都是內核中虛擬出來的,各種文件實際上是當前內核在內存中的參數。它就像是專門為訪問內核而打開的一扇門,比如訪問/proc/cpuinfo文件,實際上就是訪問目前的CPU的參數,每一次系統啟動時系統都會通過/etc/fstab中設置的信息自動將proc文件系統加載到/proc目錄下:
| # grep proc /etc/fstabnone /proc proc defaults 0 0此外,也可以通過mount命令手動加載:# mount -t proc none /proc |
通過/proc目錄下的文件可以訪問或更改內核參數,可以通過/proc目錄查詢驅動程序的信息。下面先讓我們看一下/proc目錄中的信息:
| # ls /proc1 4725 5032 5100 5248 5292 crypto kcore partitions14 4794 5044 5110 5250 5293 devices kmsg pci2 4810 5075 5122 5252 5295 dma ksyms self3 4820 5079 5132 5254 5345 driver loadavg slabinfo4 4831 5080 5151 5256 6 execdomains locks stat4316 4910 5081 5160 5258 7 fb lvm swaps4317 4912 5082 5170 5262 70 filesystems mdstat sys4318 4924 5083 5180 5271 8 fs meminfo sysrq-trigger4319 4950 5084 5189 5287 9 ide misc sysvipc4620 4963 5085 5232 5288 apm interrupts modules tty4676 5 5086 5242 5289 bus iomem mounts uptime4680 5005 5087 5244 5290 cmdline ioports mtrr version4706 5018 5088 5246 5291 cpuinfo irq net |
需要知道的是,這些文件都是實時產生的虛擬文件,訪問它們就是訪問內存中真實的數據。這些數據是實時變化產生的,可以通過以下命令來查看文件的具體值:
| # cat /proc/interruptsCPU00: 50662 XT-PIC timer1: 3 XT-PIC keyboard2: 0 XT-PIC cascade5: 618 XT-PIC ehci-hcd, eth18: 1 XT-PIC rtc9: 0 XT-PIC usb-uhci, usb-uhci11: 50 XT-PIC usb-uhci, eth012: 16 XT-PIC PS/2 Mouse14: 8009 XT-PIC ide015: 0 XT-PIC ide1NMI: 0ERR: 0 |
其它文件的含意見表1所示。
/proc/sys目錄下的文件一般可以直接更改,相當于直接更改內核的運行參數,例如:
| # echo 1 > /proc/sys/net/ipv4/ip_forward |
上面代碼可以將內核中的數據包轉發功能打開。
另外,Linux系統中提供一些命令來查詢系統的狀態,如free可以查看目前的內存使用情況,ide_info可以查看ide設備的信息,例如:
| #ide_info /dev/had |
類似的命令還有scsi_info,可以查看SCSI設備的信息。這些命令一般也是查詢/proc目錄下的文件,并返回結果。
系統初始化過程驅動程序的安裝
在Linux安裝過程中,系統上的硬件會被檢測,基于檢測到的結果安裝程序會決定哪些模塊需要在引導時被載入。Red Hat的安裝程序為anaconda,它提供了自動檢測硬件,并且安裝的機制。
但是,如果計算機內的某些硬件沒有默認的驅動程序,比如一塊SCSI卡,我們可以在啟動后的boot提示符下,輸入“linux dd”,在加載完內核后,系統會自動提示插入驅動盤,這時就有機會把該硬件的Linux驅動程序裝入。
如果在安裝系統時,某種硬件總是因為中斷沖突(ISA總線的設備較常見,比如一塊ISA網卡)沒法正常驅動,或者是缺少驅動程序,那么可以在boot提示符下輸入“linux noprobe”。在這種模式下,安裝程序不會自動配置找到的硬件,可以自己來選擇現有驅動,配置驅動程序的參數,或者選擇用光盤或軟盤加載驅動程序。
定制引導盤
系統啟動時是如何加載驅動的?下面讓我們來看一下Red Hat的安裝光盤是怎樣引導的。當Linux安裝光盤啟動時,加載位于光盤上isolinux中的內核文件vmlinuz,內核運行完畢后,又將initrd.img的虛擬文件系統加載到內存中。這個文件為ext2文件系統的鏡像,經過gzip壓縮,可以通過以下步驟查看該鏡像中的內容:
| # mount /mnt/cdrom# mkdir /mnt/imgdir# gunzip < /mnt/cdrom/isolinux/initrd.img > /ext2img# mount -t ext2 -o loop /ext2img /mnt/imgdir# cd /mnt/imgdir# ls -Fbin@dev/etc/linuxrc@lost+found/modules/proc/sbin/tmp/var/# cd modules# lsmodule-infomodules.cgzmodules.depmodules.pcimappcitable |
其中modules.dep為模塊的注冊文件,同時有各種模塊的依存關系。modules.cgz為cpio的打包文件,實際的各種驅動模塊就在該文件中。我們可以通過以下命令解包:
| # cpio -idmv < modules.cgz |
由此可以看到,解包出來的目錄2.4.21-4XXX。進入該目錄下的i386目錄,就可以看到當前啟動盤中支持的所以驅動程序:
| # ls3c59x.o3w-xxxx.o8139cp.o8139too.o8390.oaacraid.oacenic.oaic79xx.o…… |
若希望在系統中加入需要的驅動程序,可以相應地修改這些文件,比如在modules.dep中加入該模塊的名字和依存關系,將編譯好的驅動模塊文件加入modules.cgz中,這樣就可以制定自己的安裝光盤。
硬盤上的系統啟動過程與上面類似,但是initrd的鏡像文件要更簡單些,一般在initrd-2.4.XXX.img的虛擬文件系統中,只會在/lib目錄下包含ext3.o jbd.o lvm-mod.o等少數文件,用來驅動硬盤上的ext3的文件系統。加載文件系統后,就可以使用/lib/modules/2.4.XXX/下的modules.dep文件及Kernel目錄中的各種驅動文件。
自動配置安裝
如果安裝完Linux系統后,又添加了新的硬件,那么系統必須載入正確的驅動程序才可以使用它。在Red Hat Linux中,可以使用kudzu來配置硬件。這是PnP設備的檢測程序,當系統使用新硬件引導后,運行kudzu(默認會自動運行),如果新硬件被支持,那么它就會被自動檢測到。該程序還會為它配置驅動模塊,把結果寫入到文件/etc/sysconfig/hwconf中,kudzu可以通過對比這個文件發現新安裝的硬件,并進行配置;也可以通過編輯模塊配置文件/etc/modules.conf來手工指定加載模塊。
Kudzu服務默認每次啟動時都要運行,如果需要縮短啟動時間,使用下面命令可以停止系統啟動時的kudzu服務:
| # chkconfig kudzu off |
如果要安裝新的硬件,可以手動運行kudzu程序。
| # kudzu |
那么kudzu程序如何認識硬件的呢?可以查看/usr/share/hwdata/目錄下的文件,根據這些文件中的PnP信息,kudzu可以識別各種硬件設備。
以上介紹了Linux下驅動程序的大體結構、主要的加載方式和相關配置文件,在安裝Linux時加載驅動程序,并且根據需要定制自己的引導盤,在安裝完成后安裝新的、即插即用硬件。下一講開始,我們將學習具體硬件驅動的安裝方法。
前一節Linux培訓園地:Linux下設備完全驅動之一,大家看過之后相信一定印象深刻。這一節首先講述IDE硬盤及光驅的設置、IDE刻錄機的使用,以及如何安裝SCSI硬盤驅動。然后介紹以太網卡驅動模塊的加載及網絡接口的啟功過程,如何調整網卡的參數,Modem、ADSL和寬帶的驅動安裝,以及PPP連接的設置等。
IDE硬盤及光驅
1.IDE設備的驅動過程
操作系統首先是安裝在塊設備上,沒有對塊設備的支持系統就無法啟動,所以首先介紹常見塊設備的安裝。硬盤就是最常見的塊設備,普通PC上的硬盤通常是IDE接口的,而服務器上的硬盤通常是SCSI接口的。
一般內核中內置對通用IDE控制芯片的支持。下面看一下IDE硬盤在內核中的驅動過程,dmesg命令可以看到內核在啟功和加載內核模塊時的信息:
| # dmesg | less |
在Linux內核啟動過程中,可以發現內核首先驅動初始化CPU、內存、系統時鐘部分,接著加載PCI總線的驅動,然后就加載了通用的IDE驅動程序:
| Uniform Multi-Platform E-IDE driver Revision: 7.00beta4-2.4 |
接著初始化IDE的控制器,IDE控制器集成在Intel的ICH4南橋芯片組中,IDE控制芯片驅動加載后,進行初始化傳輸模式:
| ICH4: chipset revision 1ICH4: not 100% native mode: will probe irqs lateride0: BM-DMA at 0xbfa0-0xbfa7, BIOS settings: hda:DMA, hdb:pioide1: BM-DMA at 0xbfa8-0xbfaf, BIOS settings: hdc:DMA, hdd:pio |
該驅動程序會向核心中注冊主設備號為3的block型設備??梢钥吹?#xff0c;在IDE控制器初始化時,占用的I/O資源及分配給它的中斷號:
| ide0 at 0x1f0-0x1f7,0x3f6 on irq 14ide1 at 0x170-0x177,0x376 on irq 15 |
接著使用IDE控制器查找連接在IDE接口上的設備,如果檢查到硬盤則加載IDE硬盤的驅動程序,設置了該硬盤的基本參數,設置傳輸方式為UDMA(100),也就是ATA100(100Mb/s的傳輸速度),并且根據這個驅動程序檢測硬盤上的分區:
| hda: attached ide-disk driver.hda: host protected area => 1hda: 78140160 sectors (40008 MB) w/7898KiB Cache, CHS=4864/255/63, UDMA(100)ide-floppy driver 0.99.newidePartition check:hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 hda9 > |
/dev/hda代表第一個IDE接口的主設備,它的設備號為block(3/0),而/dev/hda1是這塊硬盤的第一個分區,設備編號是 block (3/1);/dev/hdb代表第一個IDE接口的從設備,設備編號為 block(3/64)。
由此我們可以看到,內核默認可以支持1~63個分區,其中第一個邏輯分區的編號肯定為/dev/hda5。但是,在/dev目錄下查找有hda1~hda32,共32個分區文件,如果需要更多的分區,就需要使用mknod命令來創建更多的設備文件。
/dev/hdc是第二個IDE接口的主設備;/dev/hdd是第二個IDE接口的從設備。
2.安裝、升級常見的IDE驅動程序
通用的IDE控制器可以通過內核這樣加載起來,如果遇到一些較新的芯片組,當前的內核無法完全發揮出新硬件的性能,這時就要向內核中打補丁,例如,2.4.20-8的內核就無法支持VIA VT8237芯片組中的IDE ATA133方式,需要向內核中打補丁。
先到VIA的網站上下載相關補丁,網址為http://www.viaarena.com/?PageID=297#ATA,注意要選擇適合當前自己內核的驅動,接下來是升級內核,給內核打補丁。
| # rpm -ivh kernel-source-<Kernel Version>.i386.rpm |
安裝需要版本的源代碼包。把剛才鏈接中的補丁下載,將這個patch文件解開:
| # tar xzvf VIA IDE ATA133 Patch 8237 ver0.8.gz |
進入解包出來的目錄,將需要的patch文件cp到 /usr/src目錄:
| # cp <Linux OS>-patch-<Kernel Version> /usr/src |
Kernel Version代表內核的版本號,Linux OS代表不同的Linux系統。
| # cd /usr/src# patch -p0 < <Linux OS>-patch-<Kernel Version> |
將patch打入內核中,重新編譯內核:
| # cd /usr/src/linux-<Kernel Version> |
編輯 Makefile文件,把 "EXTRAVERSION=" 改成 "EXTRAVERSION=-test",這是給新的內核命名。
| # cp /boot/config-XXX .config# make menuconfig ( config 或 xconfig也可以 ) |
確定 "ATA/IDE/MFM/RLL support/IDE,ATA and ATAPI Block devices"中的"VIA82CXXX chipset support"被選中。
開始編譯內核:
| # make dep# make clean# make bzImage# make modules# make modules_install# cp arch/i386/boot/bzImage (或 vmlinuz-test) /boot/vmlinuz-test# cp /boot/initrd-< Kernel Version >.img /boot/initrd-test.img |
編輯 /boot/grub/grub.conf文件,在最后添加下面三行:
| title linux-testkernel /boot/vmlinuz-test ro root=/dev/hda1initrd /boot/initrd-test.img |
重新啟動系統,使用剛剛編譯的內核就會發現啟動信息中多出一行“linux-test”。留意啟動時的信息,就會發現有下面一行信息:
| "VP_IDE: VIA vt8237 (rev 00) IDE UDMA133 Controller on pci00:0f.1" |
如果正常啟動,各種服務也都沒有問題,那么以后就可以用這個新的內核了??梢杂? hdparm -i命令來調整硬盤的傳輸方式,檢查硬盤目前的傳輸模式。
| /dev/hda:Model=IC25N040ATCS05-0, FwRev=CS4OA63A, SerialNo=CLP429F4HALVPAConfig={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4BuffType=DualPortCache, BuffSize=7898kB, MaxMultSect=16, MultSect=16CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78140160IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}PIO modes: pio0 pio1 pio2 pio3 pio4DMA modes: mdma0 mdma1 mdma2UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 //這里顯示所支持的硬盤傳輸模式AdvancedPM=yes: mode=0x80 (128) WriteCache=enabledDrive conforms to: ATA/ATAPI-5 T13 1321D revision 3:* signifies the current active mo |
查看一下當前硬盤的工作模式,如果不是ATA133,則可以靈活使用控制硬盤傳輸模式的命令:
| # hdparm -d1 /dev/hda //enable DMA 模式# hdparm -d0 /dev/hda //disable DMA 模式# hdparm -X70 /dev/hda //將傳輸模式切換到UDMA 6 -ATA133模式 |
-X后數字16~18代表SDMA 0~2,32~34代表MDMA 0~2,64~70代表UDMA 0~6。
將最后一行加入到/etc/rc.d/rc.sysinit或/etc/rc.d/rc.local文件中,可以讓硬盤每次啟動都工作在ATA133下。
3.安裝nforce芯片組的驅動程序
AMD64平臺的nforce系列芯片組性能強勁,雖然可以用常規的方法加以驅動,但有可能無法發揮新設備的特性,或者該芯片組的網卡、聲卡無法使用。nVIDIA提供了更方便的RPM文件供使用,其中一些是源代碼tar文件,需要進行編譯;有些是RPM包,直接進行安裝就可以了。
nforce芯片組在Linux下驅動的下載地址為http://www.nvidia.com/object/linux_nforce_1.0-0275.html,其中包含了內核的補丁、芯片組中對網卡及聲卡的驅動程序。下載經過編譯的RPM包可以直接安裝:
| # rpm -ivh NVIDIA_nforce.athlon.rpm |
如果使用的不是SuSE或Red Hat Linux系統,也可以下載帶有源代碼的.src.rpm包經過編譯后再安裝:
| # rpm -ivh NVIDIA_nforce.src.rpm//將驅動程序的源程序文件安裝到系統中# cd /usr/src/redhat/SPECS# rpmbuild -bb NVIDIA_nforce.specs//編譯源驅動程序,編譯成可直接使用的rpm文件# cd /usr/src/redhat/RPM/i386///根據具體包的不同,也可能是i686、noarch等# rpm -ivh NVIDIA_nforce.i386.rpm//程序自動安裝包內的驅動程序,并利用RPM包中的腳本自動配置 |
光驅的驅動及刻錄機的使用
1.光驅的驅動過程
編譯內核時,在ATA/IDE/MFM/RLL選單中都會有IDE/ATAPI CDROM support的選項,通常所見到的內核都將這個部分編譯在了內核中,所以不需設置光驅就可以使用。下面看一下系統啟動時光驅是如何驅動的:
| # dmesg |grep CDhdc: HL-DT-STCD-RW/DVD-ROM GCC-4240N, ATAPI CD/DVD-ROM driveUniform CD-ROM driver Revision: 3.12 |
一般的通用CD/DVD-ROM驅動程序就可以將光驅驅動起來,不需要特別的配置。如果遇到的是SCSI光驅,則一般的內核也可以驅動,因為在編譯內核時,一般會將SCSI的內容編譯出來。
如果沒有SCSI的光驅驅動,則可以自己手動編譯。make menuconfig(或xconfig)時,在SCSI support 選單中只要將SCSI support設置為“Y”或“M”(Y代表該部分編譯在內核中,M表示該部分編譯為內核模塊);SCSI CD-ROM support設置為“Y”或“M”;SCSI generic support設置為“Y”或“M”,這樣就可以驅動SCSI接口的光驅了。
2.CD/DVD刻錄機的驅動及使用
現在CD或DVD刻錄機越來越普及,那么在Linux下如何使用內置的CD或DVD刻錄機呢?默認的情況下,系統會將刻錄機視作只讀的驅動器,只加載普通的CD/DVD-ROM驅動,光驅無法寫入。
因此,需要用ide-scsi 偽設備驅動程序來驅動刻錄機,將普通的IDE接口的設備模擬成一個SCSI接口的設備,這時才能向其中刻錄。我們可以使用三種方式來實現將IDE光驅模擬為SCSI光驅。假設使用GRUB作為bootloader,刻錄機安裝在第二個IDE接口,是主設備,則它默認應該為/dev/hdc 。
(1)更改/boot/grub/grub.conf文件在kernel /boot/vmlinuz-2.XXX ro root=/dev/hda1之后,添hdc=ide-scsi。
(2)更改 /etc/modules.conf文件添加下面兩行:
| ide-cd ignore=\"hdc\"ide-scsi |
(3)直接編譯內核
不編譯ATA/IDE/MFM/RLL選單中的IDE/ATAPI CDROM support部分,但是要編譯對SCSI光驅的支持。
上面三種方法都是不希望系統用自帶的普通CD/DVD-ROM驅動程序去驅動刻錄機,希望將刻錄機模擬成一個SCSI設備,其中第一種方法最簡單,成功后就可以通過以下命令來刻錄CD或DVD光盤。
| # mkisofs -Jv -V examplecd -o example.iso /root/ |
將/root/目錄下的文件做成一個名叫example.iso的光盤鏡像文件,該文件的卷標為xamplecd。
還可通過命令將該文件加載到/mnt/iso文件夾中,可以自由添加刪除鏡像中的文件,但要注意不要超過光盤的容量。
| # mkdir /mnt/iso# mount -t iso9660 -o loop example.iso /mnt/iso |
調整/mnt/iso文件的內容:
| # umount /mnt/iso |
最后使用cdrecord命令來刻錄:
| # cdrecord -scanbus |
查看SCSI總線中刻錄機的配置信息:
| Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J?rg SchillingLinux sg driver version: 3.1.25Using libscg version 'schily-0.7'cdrecord: Warning: using inofficial libscg transport code version(schily - Red Hat-scsi-linux-sg.c-1.75-RH '@(#)scsi-linux-sg.c1.75 02/10/21 Copyright 1997 J. Schilling').scsibus0:0,0,0 0) 'HL-DT-ST' 'RW/DVD GCC-4240N' 'E112' Removable CD-ROM0,1,0 1) *0,2,0 2) *0,3,0 3) *0,4,0 4) *0,5,0 5) *0,6,0 6) *0,7,0 7) * |
可以看到目前的光驅在SCSI總線的參數,然后根據參數來輸入下面的命令刻錄光盤:
| # cdrecord -v -eject speed=24 dev=0,0,0 example.iso |
speed=24是以24倍速來刻錄光盤,dev=后加上剛才顯示的刻錄機的SCSI參數。
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提示符出現時進入安裝模式:
| boot: linux dd |
(4)按照向導提示,將剛才制作的驅動軟盤插入。
以后的安裝過程就沒有什么不同了。安裝向導實際上將軟盤上的驅動程序放到了initrd的RAMDISK(內存磁盤鏡像)文件中,每次內核啟動后,都最先加載這個內存虛擬硬盤的鏡像,利用里面的SCSI驅動程序來驅動SCSI RAID卡和卡上連接的硬盤。
2. Linux系統已經安裝到一個IDE的硬盤上
這種情況跟其它的驅動程序沒有太大的區別,用modprobe或insmod將SCSI卡的驅動模塊加載到內存中。(1)查看系統是否能訪問PCI設備:
| # lspci -v | grep -i i2o |
(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.confalias eth0 8139tooalias sound-slot-0 i810_audiopost-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-uhcialias 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-eth0DEVICE=eth0ONBOOT=yesBOOTPROTO=noneIPADDR=192.168.0.1NETMASK=255.255.255.0TYPE=Ethernet |
以上就為eth0設備綁定了192.168.0.1的IP地址。
| # cat /etc/sysconfig/network-scripts/ifcfg-eth0:1DEVICE=eth0:1ONBOOT=yesBOOTPROTO=noneIPADDR=192.168.1.1NETMASK=255.255.255.0TYPE=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的驅動模塊。
| # modprobe ./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-tooleth0: negotiated 100baseTx-FD flow-control, link ok |
(2)顯示當前的網卡支持的所有以太網類型。
| # mii-tool -veth0: negotiated 100baseTx-FD flow-control, link okproduct info: vendor 00:08:18, model 22 rev 2basic mode: autonegotiation enabledbasic status: autonegotiation complete, link okcapabilities: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HDadvertising: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-controllink 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 -Rresetting the transceiver... |
Modem和ADSL驅動安裝及PPP連接設置
1.外置Modem的驅動程序安裝
Modem分為外置和內置兩種。比較而言,外置的Modem配置較容易,使用方便。Modem一般接在串口上,在Linux中串口對應的設備文件為/dev/ttyS*,如果是COM1口,則對應/dev/ttyS0。如果不知道連接的是哪一個COM口,可以先給Modem加電,用以下命令測試:
| # echo AT > /dev/ttyS0 |
如果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.0NETMASK=255.255.255.0export 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/ttySHSF0Device instance: 0-PCI-8086:24c6-14f1:5422HW revision : CXT22HW profile name: hsfmc97ichRegistration ID: 115C-247C-BFC0License owner : unknownLicense key : FREELicense 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 -lcrw-rw---- 1 root uucp 4, 64 Sep 15 2003 /dev/ttyS# ls /dev/ttySHSF0 -lcrw-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 。
配置非常簡單,下載包解壓縮后直接運行下面代碼:
| # ./go |
則出現PPPoE配置向導,會提示輸入用戶名和密碼,然后使用以下命令建立連接:
| # adsl-start |
或者
| # ifup ppp0 |
系統中會在配置完后出現一個SysV的服務:
| # chkconfig --list adsladsl 0:off 1:off 2:off 3:off 4:off 5:off 6:off# chkconfig adsl on |
這樣以后每次啟動就會啟用ADSL撥號。
如果不用rp-pppoe的向導,也可以在X-Window中直接使用下面命令(如圖2):
| #neat |
或者
| #redhat-config-network |
上面兩個命令是Red Hat Linux中的命令,可以在圖形界面下建立PPPoE的連接,其它版本的Linux也應該有自己的ADSL撥號程序。
如圖3所示中,單擊上面的“New”建立新連接,如VPN、eth、ISDN、Modem等,則出現圖4所示頁面。
圖4里的xDSL并不是只有ADSL等DSL的連接,一般的PPPoE連接都可以使用,比如即使是建立類似網通的寬帶LAN接入形式也應該選擇這一項。單擊“Forward”進行下一步。
輸入ADSL或LAN寬帶接入的連接信息,如圖5所示。然后單擊“Forward”。
建立好了鏈接后,在/etc/sysconfig/network-scripts/ 目錄中會出現ifcfg-ppp0的文件,可以通過以下命令讓系統通過ADSL撥號上網,建立寬帶連接;也可以用剛才的向導撥號上網,如圖6。
| # ifup ppp0 |
有些地方提供LAN寬帶接入方式也需要進行撥號,如北京網通LAN接入寬帶,它實際上使用跟ADSL一樣的PPPoE協議,建立連接時與ADSL的撥號方式一樣,也可以用rp-pppoe或redhat-config-network來建立撥號連接,運行向導時沒有區別。
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可以永久更改默認網關。
從上面的講解中可以看到,我們遇到的情況可能是千差萬別的,安裝的方式也是多種多樣的。但是,不論哪一種設備應該首先理解這種設備的驅動方式,然后再來了解具體的驅動程序。
圖形化的界面能讓我們方便地享用Linux的強大功能,而且現在Linux的圖形化界面已經越來越完善。Linux中經常使用的圖形顯示系統是X-Window,但是由于其與常見的MS Windows系統有很大的差異,所以在使用時常會遇到一些問題,比如無法驅動顯卡、顯示器參數錯誤、花屏和圖形界面無法啟動等。
因此,本文將在簡介X-Window的基礎上,介紹如何安裝常見顯卡和聲卡的驅動程序、相關的配置文件,以及參數調整等內容。
X-Window概述
X-Window是一套顯示系統,包括Server端和Client端,他們之間使用X協議互相通信。X誕生于1984年,在較短的時間內它就發布到了11個版本—X11。X11經過多年的發展,現在已經發布到X11R6。
X Client將希望顯示的圖形發送到X Server,X Server將圖形顯示在顯示器上,同時為X Client提供鼠標、鍵盤的輸入服務。因為C/S結構,可以將X的Server和Client分別運行在兩臺計算機上,甚至可以安裝一些軟件,讓Windows作為X Server,讓Linux作為Client,將KDE或GNOME等桌面環境顯示到Windows主機上來。
使用Xmanager 1.3.9,在Windows XP上運行X Server,然后運行一臺Linux主機下的startkde,將KDE桌面環境顯示在Windows XP下。
使用startx命令可以啟動X-Window系統。實際上,是在一臺計算機上同時運行Server和Client,在運行startx之后,首先啟動的是XFree86,它是Linux平臺上最常用的X Server端;然后,又運行X的Client程序,如startkde(KDE的啟動腳本)或gnome-session(GNOME的啟動腳本)。
它們利用X協議連接本機的X Server,將圖形顯示出來。
Linux上經常使用的X
Server程序就是XFree86,它的任務是驅動顯示卡、顯示器、鼠標、鍵盤等設備,為X Client提供顯示、輸入服務等。
XFree86的主要文件目錄如下:
XFree86文件所在的主要目錄為/usr/X11R6;
XFree86的可執行程序文件目錄為/usr/X11R6/bin;
XFree86自帶的驅動程序所在目錄為/usr/X11R6/lib/modules/drivers;
X的配置文件及啟動腳本所在目錄為/etc/X11;
XFree86的啟動配置文件目錄為/etc/X11/XF86Config或XF86Config-4,如果這兩個文件都存在,XF86Config-4文件優先。
XFree86自帶了一些設備的驅動,具體位置在/usr/X11R6/lib/modules/drivers,如果機器顯示卡太新,無法使用X-Window,比如使用了Intel的855GM芯片組中集成的顯卡無法啟動X,則可以考慮升級XFree86。
當前XFree86成熟的版本是4.3,最新的版本4.4正在完善之中。從以下的鏈接中可獲得4.3版的XFree86所支持的所有顯卡列表http://xfree86.linuxforum.net/4.3.0/RELNOTES2.html#3。
XFree86官方版本下載網站是http://www.xfree86.org/downloads.html ,中國的鏡像網站是http://xfree86.linuxforum.net/downloads.html。
也可以從中科紅旗網站http://www.redflag-linux.com/source/download/XFree86_driver4.3.tgz下載。
下載后安裝tgz包:
| # tar zxvf XFree86_driver4.3.tgz# sh install.sh |
安裝Intel i865G芯片組顯卡驅動
Intel i865G是一種比較新的顯卡芯片組,它內置了顯示模塊,但是安裝較早的Linux版本X-Window有可能無法啟動。處理這個問題的方法是,一種是直接升級到XFree86 4.3;另一種是通過Intel官方的網站http://downloadfinder. intel.com/scripts-df/support_ intel.asp?iid=HPAGE+header_support_download&下載驅動程序。
在該鏈接的下載頁面可以選擇下載RPM包,也可以選擇下載tar.gz的壓縮文檔。盡管這兩種的安裝方式略有不同,但是經過以下三步基本上可以讓顯卡在X-Window中正常使用。
1.安裝驅動程序
(1)選擇下載RPM包:
| # rpm -Uvh --force intelgraphics_ 20040607_i386.rpm |
(2)選擇下載的是tar.gz壓縮包要執行下面代碼:
| # tar xzvf IntelGraphics_060704.tar.gz# cd dripkg# ./install.sh |
這時程序將自動安裝,安裝程序將更新/usr/X11R6/modules/drivers/i810_drv.o的驅動程序,使其支持新的i865G芯片組中的顯卡。
2.選擇驅動程序
有三種方法可以選擇驅動程序:
(1)如果是Red Hat系統則可以運行下面代碼:
| # redhat-config-xfree86 |
圖2顯示為使用redhat-config-xfree86。這個命令可以自動偵測顯卡、配置分辨率和色深,以及選擇Advanced頁面,然后單擊Video Card的Configure按鈕,選擇正確的顯卡。但是,如果是Red Hat Linux 8.0之前版本,則沒有這個命令,應該運行下面代碼:
| # Xconfigurator |
這樣程序會一步步提示選擇正確的驅動程序。
這兩種方法都會將結果寫入/etc/X11/XF86Config配置文件。
(2)直接更改XFree86的配置文件
直接更改XFree86的配置文件這種方法在Linux系統中比較通用,運行下面命令:
| # vi /etc/X11/XF86Config或者XF86Config-4 |
在其中找到下面代碼,將Driver后面改為i810,表示使用i810_drv.o驅動程序:
| Section "Device"Identifier "Videocard0"Driver "i810"VendorName "Videocard vendor"BoardName "Intel 865"EndSection |
該配置文件中其它需要注意的地方如下:
| Section "Monitor"Identifier "Monitor0"VendorName "Monitor Vendor"ModelName "Unknown monitor"HorizSync 31.5 - 37.9VertRefresh 50.0 - 70.0Option "dpms"EndSection |
上面這個部分是設置顯示器的類型,不知道自己的顯示器叫什么名字沒關系,但需要將顯示器的垂直刷新率和水平刷新率正確設置,這兩個參數可以查看顯示器的說明書。以上是15英寸顯示器最常用的頻率,如果這個參數設置錯誤,顯示器就會花屏或黑屏。
| Section "Screen"Identifier "Screen0"Device "Videocard0"Monitor "Monitor0"DefaultDepth 16SubSection "Display"Depth 16Modes "1024x768" "800x600" "640x480" //默認會使用最高的分辨率EndSubSectionEndSection |
| # man XF86Config |
(3)讓XFree86自己生成XF86Config文件
運行下面命令:
| # XFree86 -configure |
XFree86將自動偵測顯卡及顯示器,在用戶的主目錄下生成一個名叫XF86Config.new的文件??梢杂靡韵旅顪y試這個文件運行是否正常:
| # XFree86 -xf86config ~/XF86Config.new |
這個代碼是指定X Server使用 ~/XF86Config.new作為配置文件。
如果有白色X型的光標顯示,就可以按“Ctrl+Alt+Backspace”結束X。然后運行下面的命令,用新的配置文件來替換系統配置文件。
| # cp ~/XF86Config.new /etc/X11/XF86Config |
3.啟動X-Window
運行startx,啟動X-Window。這種方式依賴于控制臺(tty),將X-Window作為當前控制臺的Shell子進程來運行。
另一種方法是運行桌面管理程序gdm(GNOME桌面管理程序)、kdm(KDE的桌面管理程序)或xdm(XFree86的桌面管理程序)。這種方式不依賴于當前的Shell,即使當前Shell關閉,X-Window一樣會繼續運行。
以上三步是Linux下安裝X-Window顯卡驅動程序的通常步驟,絕大多數顯卡都可以經過以上的步驟正常使用,所不同的是下載地址和具體的驅動程序的生成方式可能不一樣。 比如,筆記本電腦上常用的Intel 815集成顯卡的安裝,我們同樣可從Intel網站上下載815顯卡部分的RPM包,網址為http://downloadfinder.intel.com/scripts-df/filter_results.asp?strOSs=39&strTypes= DRV%2CARC&ProductID=797&OSFullName= Linux*&submit=Go%21。
| # rpm -ivh xfcom_i810-1.2-3.i386.rpm |
然后重復以上的第二至第三步:
| # redhat-config-xfree86 //選擇正確的驅動程序# startx //啟動X-Window |
安裝其它顯卡的驅動
1. 安裝GeForce FX 6800顯卡驅動
如果購買了GeForce FX 6800顯卡(包含其它nVIDIA顯卡),希望玩玩剛剛發布的DOOM3,結果卻發現X-Window無法啟動,這時可以去nVIDIA網站http://www.nvidia.com/object/linux.html下載最新的顯卡驅動。
nVIDIA的Linux驅動程序做得相當精細,下載后得到文件NVIDIA-Linux-x86-1.0-6106-pkg1.run,運行它就可以看到一個tui(文本用戶界面):
| # chmod 700 NVIDIA-Linux-x86-1.0-6106-pkg1.run //設置執行權限# ./ NVIDIA-Linux-x86-1.0-6106-pkg1.run. //運行安裝程序 |
程序將會一步步提示安裝nVIDIA的驅動。該驅動包含兩部分:一部分是內核驅動,用于命令行界面的驅動,在安裝這部分時,如果不是它支持的幾種內核版本需要編譯內核;另一部分是針對XFree86的驅動。
運行中常常出現的錯誤是在編譯內核時找不到內核的源文件,用以下方法可以解決這個問題。先下載安裝Kernel的源文件:
| # rpm -ivh kernel-sourceXXX.rpm //在Red Hat安裝光盤上或者# tar zxvf linux-2.XXX.tar.gz //可以從網上下載,比如kernel.org |
指定源文件位置:
| # ./ NVIDIA-Linux-x86-1.0-6106-pkg1.run. --kernel-source-path=<kernel 源文件目錄的位置> |
安裝驅動程序后,如果有問題可以參考剛才安裝Inter i865顯示驅動的方法,來調整顯卡的驅動和參數,運行 redhat-config-xfree86、XFree86 -configure或直接更改/etc/X11下的XF86Config文件。另外,如果希望直接得到nVIDIA的驅動程序,不想自動安裝,可以運行以下命令將包中的文件解開。
| # ./ NVIDIA-Linux-x86-1.0-6106-pkg1.run -x |
在./NVIDIA-Linux-x86-1.0-6106-pkg1/usr/share/doc目錄下,有一個XF86Config.example的文件,如果遇到XF86Config文件配置有問題,可以直接查看該文件中的顯卡驅動部分內容。
2.安裝ATI 9800顯卡驅動
從下面地址http://www2.ati.com/drivers/linux/fglrx-4.3.0-3.11.1.i386.rpm可以下載ATI 9800顯卡驅動fglrx-4.3.0-3.11.1.i386.rpm文件,然后執行:
| # rpm -Uvh --force fglrx-4.3.0-3.11.1.i386.rpm //強制升級/安裝驅動程序包 |
注意,要看看是否有錯誤發生,如果有請仔細查看出錯信息。
| # fglrxconfig //使用ATI的配置工具配置驅動程序 |
該程序會提問一些問題,當問到是否創建一個XF86Config-4文件時,要回答“y”,這樣就可以生成新的配置文件。
| # startx //重新啟動X# fglrxinfo //可以查看驅動程序是否安裝成功 |
3.常見顯卡驅動的下載地址
◆nVIDIA顯卡驅動程序地址http://www.nvidia.com/object/linux.html。
◆ATI顯卡驅動程序地址http://www.ati.com/support/driver.html(ATI網站訪問速度較慢,可以多試幾次)。
◆VIA芯片集成顯卡驅動程序http://www.viaarena.com/?PageID=296。
◆SIS顯卡驅動程序地址http://www.mypcera.com/qu/2/soft1/xsis.rpm。
◆Intel芯片組顯卡驅動程序地址http://downloadfinder.intel.com/scripts-df/support_intel.asp?iid=HPAGE+ header_support_download&。
◆Intel筆記本迅馳顯示驅動程序地址http://downloadfinder.intel.com/scripts-df/filter_results.asp?strOSs=39&strTypes=DRV%2CARC&ProductID= 922&OSFullName= Linux*&submit=Go%21。
ATI系列筆記本驅動程序要升級XFree86。
如果實在找不到顯卡驅動程序,可以試著按照上面的介紹升級XFree86到4.3或4.4。它自帶有一些顯卡驅動程序,如ATI M9000筆記本顯卡、SIS顯卡等驅動程序。
4.內核支持顯示模式調整
在命令行界面下,可以調整內核的顯示模式,讓它使用較高分辨率,設置方法如下。
(1)使用GRUB作為boot loader,則運行命令:
| # vi /boot/grub/grub.conf |
在kernel /vmlinuz-2.4.21-4.EL ro root=LABEL=/行后添加vga=0x314。這是設置顯示模式,vga是Kernel的參數,0x314表示的是16進制的314換算成10進制為788,所以vga=788跟與vga=0x314是一樣的。我們把該行改為下面一行:
| kernel /vmlinuz-2.4.21-4.EL ro root=LABEL=/ vga=0x314 |
這時會發現Linux啟動時顯示一個企鵝圖標,使用的是800×600分辨率,vga參數含意如表1。
(2)使用LILO作為boot loader,則在/etc/lilo.conf文件中將append處改為如下一行:
| append=" root=LABEL=/ vga=0x314" |
之后運行下面命令:
| # lilo -v |
使用新的配置文件更新MBR。
常見顯卡故障的處理
當無法啟動X-Window時,應該仔細查看出錯信息。以下為X-Window啟動不成功的常見原因。
1.當屏幕為全黑或花屏時,一般是顯示器參數設置有誤。首先應該按“Ctrl+Alt+Backspace”,結束X-Window。然后查看顯示器說明書,在/etc/X11/XF86Config-4或XF86Config文件中,將水平和垂直刷新率改成正確的值,或者運行redhat-config-xfree86和XFree86-configure。
2.XF86Config文件損壞或丟失,運行redhat-config-xfree86或XFree86 -configure。
3.沒有控制臺所有權。比如,以shrek用戶登陸,然后用命令“su - joan”切換為用戶joan,這時使用startx就會出錯,提示沒有該控制臺的所有權。這時,可以用exit退出joan的Shell,然后再運行startx。
4.硬盤沒有空間。在使用KDE或GNOME時,每次啟動X-Window都要占用一定空間放臨時文件,如果/tmp或主目錄下無法寫入文件,這時X-Window就會出現一些奇怪的錯誤。
5.顯卡驅動有問題。下載安裝正確的驅動,運行redhat-config-xfree86或XFree86 -configure。
6.xfs服務沒有啟動。xfs是字體服務,它不啟動則X-Window無法啟動。使用下面命令可以啟動該服務:
| # service xfs start |
或者
| # /etc/rc.d/init.d/xfs start |
如果希望該服務每次自動啟動,則使用下面命令:
| #chkconfig xfs on |
聲卡驅動程序概述
Linux下聲卡的驅動是作為普通內核模塊來加載的,系統內置的聲卡驅動在/lib/modules/2.XXX/kernel/drivers/sound/目錄下。以下是系統內置的聲卡驅動模塊:
| # ls /lib/modules/2.XXX/kernel/drivers/sound/ac97_codec.o cs4232.o forte.o uart401.oac97.o cs4281 i810_audio.o via82cxxx_audio.oad1848.o cs46xx.o maestro3.o ymfpci.oad1889.o emu10k1 rme96xx.oaudigy es1370.o soundcore.ocmpci.o es1371.o sound.o |
結合前一篇所介紹的內容可以知道,系統在啟動時會通過以下兩個文件來加載模塊:/etc/modules.conf和/etc/rc.d/rc.sysinit,聲卡也是在這里加載的。如果新安裝了一塊聲卡,在Red Hat Linux中則可以使用kudzu命令來搜索聲卡,并且自動配置。如果系統中沒有內置的驅動程序,則可以按以下步驟來安裝(以VIA的8237南橋集成聲卡為例)。
從VIA的網站http://www.viaarena.com/?PageID=294上下載最新的驅動程序LinuxAudiov230.gz。
解壓縮:
| # tar xzvf LinuxAudiov230.gz |
編譯src.rpm包:
| # rpmbuild --rebuild viaudiocombo-2.2-3.src.rpm |
如果沒有rpmbuild命令則運行:
| # rpm --rebuild viaudiocombo-2.2-3.src.rpm# cd /usr/src/RPM/RPMS/iX86 //這里的X-Window根據機器情況而不同# rpm -ivh --force viaudiocombo-2.2-3.iX86.rpm //安裝編譯好的驅動程序 |
Intel主板的集成聲卡一般使用的是i810_audio.o作為驅動,目前新版本Linux內置的驅動可以直接支持。
Linux“萬能聲卡驅動”安裝
計算機中的聲卡千差萬別,除了Intel、VIA等大廠的聲卡外,大多數聲卡都沒有專門寫Linux下的聲卡驅動程序。那么怎樣在Linux中使用找不到驅動程序的聲卡呢?可以試一試Linux下的“萬能聲卡驅動”,它可以驅動大量的聲卡。
目前主要有兩種萬能聲卡驅動:一種是ALSA(Advanced Linux Sound Architecture),它采用GPL,針對Linux系統源代碼公開,主頁是http://www.alsa-project.org/;另一種是OSS(Open Sound System),它是商用軟件,針對主流Unix系統,Linux也在它的支持之列,主頁是http://www.opensound.com/。
1.安裝ALSA驅動程序
(1)查找聲卡型號
從http://www.alsa-project.org/alsa-doc/處查找是否有使用的聲卡型號,如果有則一定要從此處點擊后面“details”鏈接來查找安裝方法。這里以安裝創新Soundblaster Audigy聲卡的驅動為例,其它的聲卡請查看details中的具體方法。
在安裝之前需要安裝內核的源代碼包,可以從Red Hat光盤上安裝kernel-sourceXXX.rpm包,或者從kernel.org網站上下載當前系統版本的源代碼包。
安裝源碼包:
| # rpm -ivh kernel-soureXXX.rpm |
或者
| # tar zxvf kernel-2.XXX.tar.gz# cd /usr/src/linux2.XXX/ //到源代碼的目錄中# cp /boot/config-2.XXX ./.config //將當前版本的內核配置文件拷貝至源碼目錄 |
(2)下載驅動程序
從http://www.alsa-project.org/alsa/ftp/driver/下載驅動程序alsa-dirver-1.0.6rc1.tar.bz2;從http://www.alsa-project.org/alsa/ftp/lib/下載庫文件alsa-lib-1.0.6rc1.tar.bz2;從http://www.alsa-project.org/alsa/ftp/utils/下載工具alsa-utils-1.0.6rc1.tar.bz2。
(3)安裝驅動
| # cd /usr/src# mkdir alsa# cd alsa# cp alsa* ./# tar -xjvf alsa-driver-1.0.6rc1.tar.bz2# cd alsa-driver-1.0.6rc1# ./configure --with-cards=emu10k1 --with-sequencer=yes;# make# make install# chmod a+rw /dev/dsp /dev/mixer /dev/sequencer /dev/midi |
安裝lib包和utils包:
| # cd ..# tar -jxvf alsa-lib-1.0.6rc1.tar.bz2# cd alsa-lib-1.0.6rc1# ./configure# make# make install# cd ..# tar -jxvf alsa-utils-1.0.6rc1.tar.bz2# cd alsa-utils-1.0.6rc1# ./configure# make# make install |
(4)更改配置文件
| # vi /etc/modules.confalias char-major-116 sndalias snd-card-0 snd-emu10k1# module options should go herealias char-major-14 soundcorealias sound-slot-0 snd-card-0alias sound-service-0-0 snd-mixer-ossalias sound-service-0-1 snd-seq-ossalias sound-service-0-3 snd-pcm-ossalias sound-service-0-8 snd-seq-ossalias sound-service-0-12 snd-pcm-oss |
但是,ALSA驅動后的聲卡默認是不發聲的,可以用ALSA mixer來開啟。直接運行以下命令可以全部開啟所有的音量:
| #./audunmute |
也可以使用以下命令來設置音量的大小:
| # amixer -c 0 sset 'Master',0 100%,100% unmute# amixer -c 0 sset 'PCM ',0 100% unmute |
可以編輯/etc/modules.conf文件,添加如下一行讓聲卡每次啟動時調整音量為100%:
| post-install snd-card-0 amixer -c 0 sset 'Master',0 100%,100% unmute && amixer -c 0 sset 'PCM ',0 100% unmute |
2.設置OSS聲卡驅動
(1)從http://www.opensound.com/download.cgi選擇下載OSS的版本,如針對2.4內核的驅動,或者針對2.6內核的驅動。
以下是2.4內核驅動的下載地址ftp://www.se.opensound.com/pub/oss/linux/oss3991e-linux-x86-v24.tar.gz。
(2)安裝驅動程序:
| # tar zxvf oss3991e-linux-x86-v24.tar.gz#./oss-install |
將會自動安裝其中包含的驅動程序。安裝驅動模塊前,請使用命令modprobe -r或rmmod把原有的驅動程序卸載。
以上為Linux聲卡驅動的大致安裝過程。因為Linux下的聲卡眾多,不可能有一個固定的安裝步驟,但大致的步驟是,先編譯出針對目前內核版本的驅動模塊,然后再使用insmod或modprobe加載上去,更多的是通過/etc/modules.conf文件自動加載。
理解/etc/modules.conf文件很重要,這是大多數Linux系統加載模塊的文件,有些Linux是/etc/conf.modules文件。如果聲卡是非即插即用的,可以在/etc/modules.conf文件中使用options snd-card-0 io=0x300 irq=5來設置I/O資源及中斷號。
盡管各種數碼設備越來越多,但是Linux在對它們的配置上還沒有做到像Windows一樣方便,很多人正是因為心愛的數碼相機無法在Linux下使用,而不得不保留一個Windows系統。所以,掌握如優盤、移動硬盤、數碼相機等設備在Linux下的驅動方法,對于熟練使用Linux而言是必備的技能。
這一講將會介紹常見USB、IEEE1394、PCMCIA等移動設備的驅動概念和安裝技巧,為讀者更好地配置和使用這些設備提供幫助。
USB設備驅動概述
USB是通用串行總線(Universal Serial Bus),是在1994年由Intel、NEC、微軟和IBM等公司共同提出的。USB的目的在于將眾多的接口(串口、并口、PS2口等),改為通用的標準。它僅僅使用一個4針插頭作為標準插頭,并通過這個標準接頭連接各種外設,如鼠標、鍵盤、游戲手柄、打印機、數碼相機等。USB接口的特點是支持熱插拔,支持單接口上接多個設備等。
USB的優點此處不再贅述,我們主要來看一看Linux對USB的支持。USB采用串行方式傳輸數據,USB 1.1最大數據傳輸率為12Mbps,Linux內核為2.4以上版本都可以支持。
USB 2.0規范是由USB 1.1規范演變而來的,它理論上速度較1.1提高了40倍,達到了480Mb/s,但目前常見的USB 2.0設備只能達到理論值的一半。 Linux內核2.4.19版本開始對USB 2.0進行支持。
除了內核的版本要對USB接口進行支持之外,還要確定目前的系統是否編譯了USB的驅動模塊。如果讓Linux系統支持USB設備,還需要一些驅動模塊。我們都知道內置的驅動程序一般都在 /lib/modules/2.4XXX/kernel/drivers目錄中。這個目錄中會有usb及幾個子目錄,可以從中找到以下的幾個USB關鍵基礎模塊:
usbcore.o 所有USB設備都需要的基本驅動模塊;
host/ehci-hcd.o USB 2.0設備支持;
host/usb-uhci.o Intel VIA等芯片組USB部分的驅動;
host/usb-ohci.o iMac、SiS、Ali等非Intel芯片組USB部分的驅動;
storage/usb-storage.o USB接口的存儲設備,如移動硬盤、U盤等都會用到;
hid.o USB接口的鍵盤、鼠標等人機交互設備的基礎支持。
在該目錄下還有一些具體設備的驅動程序,分別驅動不同設備:
| # ls -p /lib/modules/2.4.21-4.EL/kernel/drivers/usb/acm.o CDCEther.o hpusbscsi.o microtek.o rtl8150.o usbcore.o wacom.oaudio.o dabusb.o kaweth.o pegasus.o scanner.o usb-midi.obrlvger.o hid.o kbtab.o powermate.o serial/ usbnet.ocatc.o host/ mdc800.o printer.o storage/ uss720.o |
usb-storage.o USB對與存儲部分的驅動模塊;
scsi_mod.o 對SCSI設備的支持;
sd_mod.o 對SCSI硬盤支持模塊,針對USB硬盤;
sr_mod.o 對SCSI光盤支持模塊,針對USB光驅;
sg.o SCSI序列的通用支持模塊;
ide-scsi.o 該模塊可以把IDE設備模擬成SCSI接口。
通過查看/lib/modules/2.XXX/modules.dep文件,可以查看上述這些模塊是否存在。一般情況下這些模塊已經被編譯,否則需要重新編譯內核模塊。
在正確地裝載了驅動以后,可以通過訪問/dev/sd?設備來訪問優盤或移動硬盤。通常情況下,通過訪問sda1來訪問移動硬盤或優盤的第一個分區。在USB基本驅動存在的情況下插入優盤,就可以看到如下信息:
| usb.c: USB device 7 (vend/prod 0xea0/0x6803) is not claimed by any active driver.Starting timer : 0 0Vendor: Netac Model: OnlyDisk Rev: 1.11Type: Direct-Access ANSI SCSI revision: 02Starting timer : 0 0Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0SCSI device sda: 32256 512-byte hdwr sectors (17 MB)sda: Write Protect is off |
上面這一段是usb-storage.o和SCSI驅動在起作用,我們可以看到優盤被認成是sda,要使用它可以先查看分區表:
| # fdisk -l /dev/sdaDisk /dev/sda: 16 MB, 16515072 bytes2 heads, 32 sectors/track, 504 cylindersUnits = cylinders of 64 * 512 = 32768 bytesDevice Boot Start End Blocks Id System/dev/sda1 * 1 503 16080 1 FAT12# mkdir /mnt/usb# mount -t msdos /dev/sda1 /mnt/usb 該優盤得類型為FAT12 |
之后就可以通過訪問/mnt/usb來訪問優盤了。注意,如果要拔掉優盤或移動存儲設備,請先umount然后再拔出,這樣可以保證數據全部被寫入,否則系統會出錯,數據可能不完整。
| # umount /mnt/usb |
USB數碼相機的驅動
數碼相機類型繁多,但是在Linux下使用數碼相機有比較簡便的方法。我們知道USB接口是數碼相機的主要接口,在Linux中訪問數碼相機,通??梢酝ㄟ^下面兩種方法。
1.使用專門軟件
Red Hat Linux中自帶的gtkam軟件是一個提供了數碼照相機圖形化界面的程序,它支持100多種數碼相機。gtkam可以直接與數碼照相機相連,允許直接打開、查看、并刪除圖像。在Red Hat 9.0的光盤中,有gtkam的RPM包:
| # ls gtkam*gtkam-XXXX.i386.rpm gtkam-gimp-XXXX.i386.rpm# rpm -ivh --aid gtkam*# rpm -ivh --aid --force gphoto2-XXXX.i386.rpm |
gtkam基于gphoto,有時無法使用gtkam的原因是因為gphoto沒有安裝或模塊被覆蓋,所以需要重新安裝gphoto。安裝完畢后,在X-Window中運行gtkam就可以看到如圖1所示界面。
| # gtkam |
在圖1中,單擊gtkam的“camera”→“Add Camera”可以添加數碼相機,然后在彈出的窗體中單擊“Detect”,測試數碼相機的連接類型。最后單擊“OK”,就可以看到數碼相機中的照片了。
圖2所示使用gtkam連接Kodak DX6340相機,看到存儲卡中的照片。選擇照片,單擊保存就可以把照片保存到硬盤上。
我們也可以從http://sourceforge.net/project/showfiles.php?group_id=8874&release_id=209817獲得gtkam的最新版本及源代碼,下載后可以使用其中的install.sh來進行安裝。
2.把數碼相機當做是USB存儲設備還有一種方式就是把數碼相機當做是USB存儲設備,如優盤、讀卡器等,這樣就可以像訪問優盤那樣來訪問數碼相機:
| # mount -t vfat /dev/sda1 /mnt/usb |
但是,采用這種方式極有可能遇到不能支持的數碼相機,比如筆者使用的Kodak DX6340數碼相機,插入USB口之后出現以下信息:
| usb.c: USB device 2 (vend/prod 0x40a/0x570)is not claimed by any active driver. |
對這種問題的解決辦法不只是可以驅動不支持的數碼相機,像不支持的存儲設備也都可以使用,比如優盤、讀卡器等。
(1)使用lsmod確定USB基本驅動模塊已經裝載,如果沒有使用以上的命令裝載:
| # modprobe ehci-hcd; modprobe usb-uhci;modprobe usb-storage# modprobe ide-scsi; modprobe scsi_mod;modprobe sd_mod |
(2)使用cat /proc/bus/usb/devices得到當前系統USB總線上的設備信息,尤其注意Vendor、ProdID、Product等信息:
| C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mAI: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hubE: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=255msT: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1P: Vendor=040a ProdID=0570 Rev= 1.00S: Manufacturer=Eastman Kodak CompanyS: Product=KODAK EasyShare DX6340 Zoom Digital CameraS: SerialNumber=KCKCJ33400274 |
數碼相機也是一種存儲設備,然而對于Linux下的移動存儲設備都是通過usb-storage.o驅動的,然后模擬為 SCSI設備。如果數碼相機無法使用,通常是usb-storage驅動未包括此廠商識別和產品識別信息(在類似skel_probe的USB最初探測時被屏蔽了)。對于USB存儲設備的硬件訪問部分,通常是一致的。所以,要支持數碼相機,僅需要修改usb-storage中關于廠商識別和產品識別列表部分。
USB設備識別信息中重要的部分如下:
| P: Vendor=040a ProdID=0570 Rev= 1.00S: Manufacturer=Eastman Kodak CompanyS: Product=KODAK EasyShare DX6340 Zoom Digital Camera |
若/proc/bus/usb下沒有相應USB設備信息,應輸入以下命令將USB設備文件系統手動掛裝到/proc/bus/usb:
| # mount -t usbdevfs none /proc/bus/usb |
(3)編輯drivers/usb/storage/unusual_devs.h文件。下面是所有已知的USB產品登記列表,格式如下:
| UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax,vendor_name,product_name,use_protocol, use_transport, init_function,Flags). |
usb-storage.o就是根據這個列表來識別各種設備。這樣,可以將剛才/proc/bus/usb/devices文件中得出的信息添加在上面,重新編譯模塊,讓usb-storage驅動去認識和發現它。
| UNUSUAL_DEV( 0x040a, 0x0570, 0x0001, 0x0001,"Eastman Kodak Company","KODAK EasyShare DX6340 Zoom Digital Camera",US_SC_SCSI, US_PR_CB, NULL,US_FL_FIX_INQUIRY | US_FL_START_STOP | US_FL_MODE_XLATE ), |
注意,添加以上幾句代碼的位置一定要正確。經過比較發現,usb-storage驅動對所有注冊都是按idVendor、 idProduct數值從小到大排列的,因此添加代碼也要放在相應位置。
(4)重新編譯模塊,之后插入的數碼相機就可以像其它優盤一樣作為USB存儲設備去訪問。
| # make dep# make modules# make modules_install |
USB攝像頭的驅動
在內核源文件中,自帶了一部分攝像頭的驅動,目前大量的雜牌攝像頭都可以使用OV511的驅動模塊。如果USB攝像頭無法使用,則可以試試重新編譯模塊。下面就以一個沒有驅動程序的攝像頭為例,嘗試使用OV511驅動模塊驅動。
1. 獲取內核源碼
先從Red Hat光盤或kernel.org獲取當前版本的內核源碼,并安裝:
| # rpm -ivh kernel-source-2.XXX.rpm |
或者
| # tar zxvf linux-2.XXX.tar.gz |
2. 運行
到源碼目錄中運行:
| # make menuconfig |
或者
| # make xconfig //需要在X-Window下 |
3. 選擇USB的模塊
選擇USB的模塊如圖3所示。
選擇要編譯的驅動可以查看說明書,確定攝像頭芯片是什么型號,如圖4所示,選定OV511攝像頭的支持。在USB support下可以選擇多種驅動的模塊,比如常用的OV511芯片的攝像頭驅動、USB打印機的驅動等。
4. 保存、編譯和安裝
| # make dep# make modules# make modules_install |
5. 加載驅動
| # modprobe ehci-hcd# modprobe usb-uhci# modprobe ov511cat /proc/devices |
接著運行gnomemeeting等工具,選擇/dev/video0或/dev/video1作為攝像頭設備文件,這樣攝像頭就可以使用了。
外置USB光驅及刻錄機的驅動
USB光驅與其它的USB存儲設備使用類似,只不過USB光驅會被識別為SCSI光驅,如/dev/sr0或/dev/scd0等設備,它需要sr_mod.o(SCSI CD-ROM設備)驅動模塊。
| # modprobe sr_mod //如果sr_mod模塊沒有編譯,請重新編譯內核,在SCSI部分# mount -t iso9660 /dev/scd0 /mnt/cdrom |
關于外置刻錄機驅動詳見本刊今年第8期“Linux完全驅動(二)”:
| # mkisofs -Jv -V examplecd -o example.iso /root/ |
將/root/目錄下的文件做成一個名叫example.iso的光盤鏡像文件,該文件的卷標為examplecd;還可通過下面命令將該文件加載到/mnt/iso文件夾中。
| # mkdir /mnt/iso# mount -t iso9660 -o loop example.iso /mnt/iso |
在調整完/mnt/iso文件的內容后使用下面命令:
| # umount /mnt/iso |
最后使用cdrecord命令刻錄:
| # cdrecord -scanbus |
查看SCSI總線中刻錄機的配置信息:
| Cdrecord 2.0 (i686-pc-linux-gnu) Copyright(C) 1995-2002 J?rg SchillingLinux sg driver version: 3.1.25Using libscg version 'schily-0.7'cdrecord: Warning: using inofficiallibscg transport code version(schily - Red Hat-scsi-linux-sg.c-1.75-RH '@(#)scsi-linux-sg.c1.75 02/10/21 Copyright 1997 J. Schilling').scsibus0:0,0,0 0) 'HL-DT-ST' 'RW/DVD GCC-4240N' 'E112' Removable CD-ROM0,1,0 1) *0,2,0 2) *0,3,0 3) *0,4,0 4) *0,5,0 5) *0,6,0 6) *0,7,0 7) * |
從上面可以看到目前光驅在SCSI總線的參數,然后根據參數輸入下面的命令刻錄光盤:
| # cdrecord -v -eject speed=24 dev=0,0,0 example.iso |
“speed=24”是以24速來刻錄光盤,“dev=”后加上剛才顯示的刻錄機的SCSI參數。如果是外置DVD,則應使用dvdrecord命令,其用法與cdrecord相同。
| # rpm -ivh dvdrecord-0.1.2-12.i386.rpm# man dvdrecord 查看幫助 |
1.鼠標的驅動
在Red Hat Linux中,可以使用mouseconfig命令來配置鼠標,選擇USB接口鼠標即可,如圖5所示。
圖5 使用mouseconfig配置USB接口鼠標
| # mouseconfig |
如果使用手動的方式來配置,可以人工加入以下模塊:
| # modprobe hid# modprobe input# modprobe usbmouse# modprobe mousedev |
2.USB鍵盤的驅動
| # modprobe hid# modprobe input# modprobe usbkbd# modprobe keybdev |
IEEE1394設備的驅動
IEEE1394又稱Firewire(火線)、i-Link(Sony的叫法),它跟USB接口類似,目前可以提供400Mb/s的帶寬,雖然在理論上它較USB 2.0的480Mb/s的速度慢一些,但是在實際使用中,Firewire要比USB 2.0的設備快不少,所以仍然有很多設備配備這種接口,如DV(數字攝像機)和移動硬盤等。
與USB相比,Firewire的通用性不夠強,得到的支持也較少。一般主板上不帶該Firewire的芯片,通常是購買帶1394接口的PCI卡來支持1394的設備。對于1394設備,Linux內核2.4.10之后的版本都可以支持。IEEE1394的驅動放在以下位置:
| # ls /lib/modules/2.XXX/kernel/drivers/ieee1394amdtp.o dv1394.o ieee1394.o raw1394.o video1394.ocmp.o eth1394.o ohci1394.o sbp2.o |
IEEE1394的驅動方式較USB大同小異,只是首先加載的是對1394總線的驅動(ieee1394.o)和1394芯片的驅動(ohci1394.o)。如果使用1394卡連接DV,那么需要1394視頻驅動(video1394.o)和DV視頻I/O驅動(dv1394.o);如果需要訪問的是1394外接硬盤或CD-ROM、刻錄機等,則需要對SBP-2協議的支持(sbp2.o);如果使用1394接口的以太網卡,則需要加載驅動eth1394.o。
如果沒有某種設備的驅動,則可以重新編譯內核模塊,選擇以下模塊:
| # cd /usr/src/linux-2.XXX# make xconfig |
選擇其中的IEEE1394選項,如圖6所示,然后重新編譯模塊:
| # make dep# make modules# make modules_install |
驅動IEEE1394接口的硬盤或光驅時,需要預先加載的驅動有ieee1394.o和ohci1394.o:
| # modprobe ohci1394 |
上面代碼會將兩樣驅動全部裝載上,因為ohci1394依賴于ieee1394。
硬盤需要的驅動是sbp2.o,插入硬盤后它應該會自動加載。與USB設備相同,硬盤會被模擬成SCSI設備,請留意屏幕上顯示的信息,看看是被模擬為sda還是其它的設備。使用以下命令使用硬盤:
| # mkdir /mnt/1394# mount -t vfat /dev/sda1 /mnt/1394 |
scsi_mod.o 對SCSI設備的支持; sd_mod.o 對SCSI硬盤支持模塊,對應硬盤;
sr_mod.o 對SCSI光盤支持模塊,對應光驅;
sg.o SCSI序列的通用支持模塊。
IEEE1394光驅驅動與USB下相應的設備驅動非常相似,這里就不再贅述了。
現在各種移動設備層出不窮,花樣繁多,目前國內網站上的資料不是很全,使用google搜索英文網站往往能得到許多自己需要的東西。
優盤或USB硬盤常見問題解決方法
1. 加載/dev/sda1時出錯
這是因為較早的優盤不分區,它們使用/dev/sda,也有可能使用/dev/sda2或sda3等設備文件,請仔細觀察fdisk -l /dev/sda的輸出結果,看一看優盤的分區到底是哪一個。
2. 主機中已有SCSI或USB設備
主機中已經有SCSI或USB設備,比如/dev/sda硬盤或另一個優盤,這時可以嘗試sdb或sdc等設備。實際上每一次在插入優盤時可以留意一下屏幕上顯示的信息,那個優盤被轉換成哪一個sd設備。
3. 優盤插入后沒有反應,訪問/dev/sd設備也沒有反應
這時可以查看相關模塊是否已經加載,如果沒有加載可以手動加載,然后重新插入該設備,看看是否有反應:
| # modprobe ehci-hcd; modprobe usb-uhci; modprobe usb-storage.o# modprobe ide-scsi; modprobe scsi_mod.o; modprobe sd_mod.o |
4. 設備驅動已經加載,如何知道訪問哪個設備文件
對比加載驅動前和加載驅動后的/proc/devices文件,多出的那一行就是這種驅動程序注冊的主設備號。例如,對比OV511加載前后/proc/devices文件的變化,就會發現多出如下一行:
| # cat /proc/devicesCharacter devices:...81 video_capture... |
上面代碼表示C型設備、主設備號為81的設備文件是訪問OV511驅動的入口,再對照/usr/src/Documentation/devices.txt中查找C類型的主設備號81,就可以知道對應如下設備文件:
| 81 char video4linux0 = /dev/video0 Video capture/overlay device |
上面簡要介紹了Linux下常用的USB、IEEE1394、PCMCIA設備驅動的安裝與配置,希望能對讀者安裝與使用這些設備提供幫助。
上一篇:利用U盤加載控制器驅動來安裝Linux系統
下一篇:如何編寫Linux下的設備驅動程序
相關熱門文章- 3d打印機軟件僅售1606元...
- objet3d打印機便捷地將信息拖...
- 科技感導航按鈕 三星Objet光敏...
- uPrint SE打印機使打印機足夠...
- KTV包房裝修設計如何對音響調...
- linux 常見服務端口
- 【ROOTFS搭建】busybox的httpd...
- 什么是shell
- linux socket的bug??
- linux的線程是否受到了保護?...
- 請教想查12個月的數據條數,看...
- new/delete 和malloc/free 有...
- ubuntu下hadoop環境的搭建...
- 求助:如何用Linux架設ISATAP...
- redhat圖形界面不出先登錄界面...
總結
以上是生活随笔為你收集整理的Linux下设备驱动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智联+影音,AITO问界M7想干翻的不止
- 下一篇: 解决Linux QQ闪退和扫码无法登陆的