2008年1月10日

在Ubuntu上安裝兩張HP FC1142SR 4Gb PCI-e HBA Card實現Failover的功能

原本在Ubuntu 7.10上所提供的HBA (Fibre Channel Host Bus Adapter) module並不支援Failover的功能,所以只好Download HP官方的Package下來試試看,沒想到HP的RPM Package只支援RedHat及SuSe。與RPM Package裡的Install Scripts奮鬥了許多天及經歷了無數次的失敗,自尊心備受打擊的我只好放棄HP的RPM Package,轉而去尋找新的解決辦法,正巧看到QLogic的官方網站所提供的原始碼可以在別的平台上編譯,下載下來後試著編譯看看,發現感覺還不賴,裡面提供的Install Scripts不會讓我已經很脆弱的自尊心再次受到打擊,Readme檔案裡寫的安裝步驟也是屬於Monkey等級 (只要是Monkey看的懂,照著做就一定會成功的等級)很適合禁不起任何打擊的我,但是愉快的過程總是短暫的,在編譯的時候居然跳出了錯誤的訊息,說找不到Linux的Source Code,仔細看了一下錯誤的訊息,發現Install Scripts去找Linux Source Code的路徑不對,但是我也懶的改了,所以就只單純建了一個symbolic link想騙過Install Scripts,沒想到還真的騙過去了 (真不愧是Monkey Level),最後編譯完成後也同時更新了initrd的image就懷著滿心的期待把系統Reboot了,沒想到開機完成後SAN的設備居然告訴我Link Failure,還好這時我的自尊心已經恢復的差不多了,看一下開機時的訊息(使用dmesg的指令)發現HBA的Module 在initalize時發生了錯誤,無法被載入到Kernel裡,發生錯誤的Function為"pci_module_init()",請示過Google大神後,Google大神回覆說可以把pci_module_init()pci_register_driver()置換就可以了,所以我又回到放有原始碼的QLogic目錄裡尋找Source Code裡有使用到pci_module_init()的檔案(用grep -r pci_module_init *.c的指令)發現有5的檔案,分別是ql2100.cql2200.cql2300.cql2322.c以及ql2400.c。將這些檔案修改後從新再編譯一次,之後再從新更新一次initrd image。更新完initrd image後重新開機後就發現可以將SAN給掛在上了,真是可喜可賀啊,差點就要開香檳慶祝了。以下是我的步驟:
  1. 先變身成Super User (sudo su -)
  2. 安裝build-essential (apt-get install build-essential)
  3. 安裝linux-headers-2.6.22-14-generic (apt-get install linux-headers-2.6.22-14-generic)
  4. 安裝linux-source-2.6.22 (apt-get install linux-source-2.6.22)
  5. 解開在/usr/src/linux-source的Package (tar -xvjf linux-source-2.6.22.tar.bz2)
  6. /lib/modules/2.6.22-14-generic目錄裡建立一個symbolic link名稱為source,連結指到/usr/src/linux-source-2.6.22 (ln -s /usr/src/linux-source-2.6.22 /lib/modules/2.6.22-14-generic/source)
  7. 在QLogic的官方網站下載qla2xxx-v8.01.07.15-2-dist.tgz (wget http://download.qlogic.com/drivers/60471/qla2xxx-v8.01.07.15-2-dist.tgz)
  8. 解開qla2xxx-v8.01.07.15-2-dist.tgz (tar -xvzf qla2xxx-v8.01.07.15-2-dist.tgz)
  9. 解開後進入到目錄裡 (cd qlogic)
  10. 執行./drvrsetup
  11. 執行完畢後會產生名稱為qla2xxx-8.01.07.15的目錄
  12. 切換到qla2xxx-8.01.07.15目錄裡 (cd qla2xxx-8.01.07.15)
  13. 因原先寫的原始碼在載入module時所使用的function並不適用於目前的kernel,所以要修正一下,先執行grep -r pci_module_init *將不符合的檔案列出,並修改列出的檔案,把pci_module_init置換成pci_register_driver
  14. 執行extras/build.sh new進行編譯module的動作
  15. 若編譯的過程中沒有錯誤的話,就可以執行extras/build.sh install來安裝module
  16. 安裝完後要執行update-initramfs -c建立新的initrd影像檔
  17. reboot來啟用新的initrd
以上是我安裝的過程,可能並不適合所有環境。

沒有留言: