2015年4月18日 星期六

(F21) 安裝 HighPoint RocketRAID 的 Kernel 3.17.4-301 驅動程式

安裝 Fedora 21 後,大概是自已工作上事情稍微多了些。幾台安裝 HighPoint RocketRAID RAID 硬碟加速卡的電腦,一直沒有時間升級。最近有些時間,就想將它們升級為 Fedora 21。
  雖然試了很多次,不過目前只能以 Workstation(工作站)版,將整個 Fedora 21 系統安裝在 RocketRAID 硬碟加速卡所管轄的硬碟組中。Server(伺服器)版只能將「RAID 硬碟組」當做資料碟使用(:目前的嘗試的做法,尚未能在系統安裝前就載入 RokcetRAID 驅動程式)。

  以下就是這幾台電腦的安裝紀錄,這次的升級例子是使用 RocketRAID 1740,詳細步驟如下:

一、編譯驅動程式的核心模組

記得一定要從 HighPoint 官網下載 Linux 的「開放原始碼驅動程式」,才不容易有『後遺症』。不過,這次不用像以前一樣,一列一列去找要修改的地方,在 ubuntu 的一份文件中,有提供一份「修補檔 (patch)」的壓縮檔,『rocketraid-linux-3.11-patch-r2.tar.bz2』,裏面有有許多適用 HighPoint RocketRAID RAID 不同型號硬碟加速卡的「修補檔」。解開壓縮找出適用該型號的「修補檔」。
  接下來的操作例子,是假設將「開放原始碼驅動程式」與「修補檔」都存在使用者的家目錄下的 Temp 目錄中,切換工作目錄到 Temp,接著下這些命令,
tar -xzf rr174x-linux-src-v2.4-091009-1434.tar.gz
tar -tf rocketraid-linux-3.11-patch-r2.tar.bz2
tar -xjf rocketraid-linux-3.11-patch-r2.tar.bz2 rr174x-linux-src-v2.4-kernel-3.11v2.patch
patch -p1 -d rr174x-linux-src-v2.4 < rr174x-linux-src-v2.4-kernel-3.11v2.patch
上例中各列命令的用途說明如下:
  • 『tar -xzf rr174x ...』:將從 HighPoint 官網下載的「開放原始碼驅動程式」解壓縮。
  • 『tar -tf rocketr ...』:列出來自 ubuntu 壓縮檔中所有「修補檔」的檔名,方便下個命令選擇使用。
  • 『tar -xjf rocket ...』:從「修補檔」壓縮合輯中,只將 RocketRAID 1740 的「修補檔」取出。要簡單的話,就將其全部解壓縮,再挑出需要的「修補檔」。
  • 『patch -p1 -d rr ...』:執行對「開放原始碼驅動程式」的修補工作。
這個『修補檔』修正了大部份的版本不合問題,但是編譯時仍會出現這個錯誤,
. . . . .
~/Temp/rr174x-linux-src-v2.4/product/rr1740pm/linux/.build/config.c:26:30: 錯誤:macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
 char driver_ver[] = "v2.4 (" __DATE__ " " __TIME__ ")";
. . . . .
將 ~/Temp/rr174x-linux-src-v2.4/product/rr1740pm/linux/config.c 中,有一列
char driver_ver[] = "v2.4 (" __DATE__ " " __TIME__ ")";
改為
char driver_ver[] = "v2.4 (\" __DATE__ \" \" __TIME__ \")";
再編譯就不會出錯,編譯的命令為,
cd ~/Temp/rr174x-linux-src-v2.4/product/rr1740pm/linux
make KERNELDIR=/lib/modules/3.17.4-301.fc21.x86_64/build/ KERNEL_VER=3.17
就可以得到 rr174x.ko 這個驅動程式核心模組,將它存到隨身碟備用。

二、安裝 Fedora 21 Workstation

依前文〝適用 Fedora 21 的「可選版本 USB 安裝隨身碟」〞製作安裝用的 USB 隨身碟,調整 BIOS 的設定,使電腦由 USB 隨身碟開機。
  1. 當出現安裝選項時,選擇『Fedora 21 Workstation LiveCD』,按【e】鍵修改開機參數。
  2. 在 linux 為首命令末端,加上 modprobe.blacklist=sata_mv 這個參數,同時按【Ctrl】+【x】鍵繼續。
若是只有一個版本的 Live 版 USB 隨身碟,上述步驟不一樣,而是
  1. 當出現《Fedora Live》安裝選項時,選擇《Start Fedora Live》,按【Tab】鍵修改開機參數。
  2. 在 vmlinuz0 為首的命令末端,加上 modprobe.blacklist=sata_mv 這個參數後,按【Enter】鍵繼續。
接下來的步驟都一樣,
  1. 當桌面跳出一個《Welcome to Fedora》視窗時,點選左邊的《Try Fedora》,再按【Close】鈕繼續,就會進入與一般使用的「GNOME 桌面」相似的 Live 執行環境。
  2. 同時按【ALT】+【Ctrl】+【F2】三鍵,切換到另一個「虛擬控制台」,以 root 身份登入,應該是不用密碼就可以進到「虛擬控制台」。
  3. 查詢、記錄目前已使用的硬碟編號,
    ls /dev/sd?
    會列出目前已使用的硬碟編號。
  4. 強制載入剛才在『步驟一』編譯好的驅動程式,
    insmod /run/initramfs/live/rr174x.ko
  5. 再查詢一次目前已使用的硬碟編號,
    ls /dev/sd?
    如果 RocketRAID 正確被驅動,會看到一個新增的硬碟編號,記下來待會要用。
  6. 再同時按【ALT】+【Ctrl】+【F1】切回原來「GNOME 桌面」的畫面。
  7. 由左上角《Activities》按《Install to Hard Drive》開始安裝,過程依照一般安裝說明,在此就略過不再說明。
注意:不要急著重開機,還要把接下的兩個步驟完成才可以重開機;不然,就不好處理了。

三、將驅動程式核心模組加裝入 Linux 的核心

前一個步驟完成後,只是將 Fedora 21 安裝至 RocketRAID 驅動的 RAID 硬碟組,而目前 Linux 核心中並無 RocketRAID 的驅動模組,直接重開機就無法使用 RAID 硬碟組;因此,還有兩個步驟要進行才可。
  先來說明將「驅動程式核心模組」加入 Linux 系統核心的操作過程,同時按【ALT】+【Ctrl】+【F2】三個鍵,切換到另一個「虛擬控制台」,以 root 身份登入。接著再輸入以下的命令,
cp /run/initramfs/live/rr174x.ko /mnt/sysimage/lib/modules/3.17.4-301.fc21.x86.64/kernel/drivers/scsi
chroot /mnt/sysimage
mv /boot/initramfs-3.17.4-301.fc21.x86.64.img /boot/initramfs-3.17.4-301.fc21.x86.64.img.save
depmod -a 3.17.4-301.fc21.x86.64
dracut --add-drivers rr174x.ko --omit-drivers sata_mv /boot/initramfs-3.17.4-301.fc21.x86.64.img 3.17.4-301.fc21.x86.64
exit
上例中各列命令的用途說明如下:
  • 『cp /run/initram ...』:將在步驟一編譯好且存放在 USB 隨身碟的「驅動程式核心模組」複製到『新安裝』Linux 核心的驅動程式目錄。
  • 『chroot /mnt/sys ...』:暫時將 Linux 系統的根目錄切換到新安裝的系統,以利處理新系統的核心。
  • 『mv /boot/initra ...』:修改新系統的 Linux 核心的名稱,留作備份之用。
  • 『depmod -a 3.17. ...』:記錄目錄使用中的核心模組,為修改 Linux 核心之用。
  • 『dracut --add-dr ...』:重製一份新的 Linux 載入核心,加上 RAID 硬碟組的驅動程式,去除不用的 sata_mv 模組。
  • 『exit』:將 Linux 系統的根目錄切換為原來 Live CD。
完成後,新安裝的系統已經適合 RAID 硬碟組之用,但因系統載入的描述檔未修正,仍不用正常開機,繼續下個步驟。

三、修改開機時載入 Linux 核心的描述檔

之前有篇發文提及升級後的新系統不能正常啟動(參考:解決「安裝在 DMRAID 硬碟的 Fedora,升級後不能正確掛載目錄」的問題),這步驟要做的事和它類似。
  在步驟二安裝前才手動載入 RocketRAID 硬碟組的驅動模組,也就是從這時開始它才被 Linux 辨認到並加以編號(步驟二.7),而 USB 隨身碟早已經被辨認並編號了,所以 Linux 核心載入描述檔中的 RocketRAID 硬碟組編號不正確,要先加以修正才行。
  1. 同時按【ALT】+【Ctrl】+【F1】切回原來「GNOME 桌面」的畫面。
  2. 由《Activities》→《Show Applications》點選 gedit 開啟「文字編輯器」。
  3. 由《Open》→《Other Documents》→《Computer》→《mnt》→《sysimage》→《boot》→《grub2》的 grub.cfg 這個 Linux 核心載入描述檔。
  4. 尋找這段文字,其中紅色標示的文字,就是要修改的地方,假設 RocketRAID 硬碟組的編號原為『/dev/sdb』而 USB 隨身碟的編號為『/dev/sda』,所以未修改時的硬碟編號,在拔除 USB 隨身碟重開機時,RocketRAID 硬碟組的編號會變為『/dev/sda』。這將導致 Linux 的核心不能正確載入而錯誤。
    . . . . .
    menuentry 'Fedora, with Linux 3.17.4-301.fc21.x86_64' --class fedora --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.17.4-301.fc21.x86_64-advanced-23f990f7-dfef-4f0e-9b81-16f7cc2be6d5' {
       load_video
       set gfxpayload=keep
       insmod gzio
       insmod part_msdos
       insmod ext2
       set root='hd0,msdos1'
       if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 7fdc2ba9-4ccb-430a-b0eb-d32e31acacb1
       else
          search --no-floppy --fs-uuid --set=root 7fdc2ba9-4ccb-430a-b0eb-d32e31acacb1
       fi
       linux16 /vmlinuz-3.17.4-301.fc21.x86_64 root=/dev/sda2 ro rhgb quiet LANG=zh_TW.UTF-8
       initrd16 /initramfs-3.17.4-301.fc21.x86_64.img
    }
    . . . . .
    上面的例子看起來有些複雜,簡單的說就是這三個替換工作,
    • 將 hd1 換成 hd0
    • 將 ahci1 換成 ahci0
    • 將 sdb2 換成 sda2
  5. 修改好後存回就完成了。
這時可以重開機了。

四、Linux 核心升級時,驅動程式模組的編譯、安裝

Linux 系統如有核心更新,則驅動程式核心模組就要重新編譯一次,同時也要再加入 Linux 核心,操作的過程很制式。假設更新後的 Linux 核心版本為 3.19.3-200.fc21.x86_64,則過程將如下所列,
cd ~/Temp/rr174x-linux-src-v2.4/product/rr1740pm/linux/
make clean
make KERNELDIR=/lib/modules/3.19.3-200.fc21.x86_64/build/ KERNEL_VER=3.19
su

cp rr174x.ko /lib/modules/3.19.3-200.fc21.x86_64/kernel/drivers/scsi/
depmod -a 3.19.3-200.fc21.x86_64
mv /boot/initramfs-3.19.3-200.fc21.x86_64.img /boot/initramfs-3.19.3-200.fc21.x86_64.img.save
depmod -a 3.19.3-200.fc21.x86_64
dracut --add-drivers rr174x --omit-drivers sata_mv /boot/initramfs-3.19.3-200.fc21.x86_64.img 3.19.3-200.fc21.x86_64
上例中各列命令的用途說明如下:
  • 『cd ~/Temp/rr174 ...』:以使用者身份,切換到家目錄下的編譯工作目錄。
  • 『make clean』:將舊的編譯暫存資料清除,在小版本更新時很有用。
  • 『make KERNELDIR= ...』:編譯的命令及參數。
  • 『su』:切換到 root 身份,但不改變目錄位置,方便接下來的操作。
  • 『cp rr174x.ko /l ...』:將編譯好的「驅動程式核心模組」複製到『更新版』Linux 核心的驅動程式目錄。
  • 『mv /boot/initra ...』:修改新系統的 Linux 核心的名稱,留作備份之用。
  • 『depmod -a 3.17. ...』:記錄目錄使用中的核心模組,為待會修改 Linux 核心之用。
  • 『dracut --add-dr ...』:重製一份新的 Linux 載入核心,加上 RAID 硬碟組的驅動程式,去除不用的 sata_mv 模組。
註一:通常筆者是將操作命令先貼到「文字編輯器」,修改好版本後,再貼到「終端機」。
註二:需要製作「驅動程式核心模組」的更新,必需確認已將「驅動模組」加入 Linux 核心,否則不能重新以新版開機。

相關發文:

參考以前幾篇與 HighPoint RocketRAID 有關的發文,將本篇內容略做修改應該也會適用。過一陣子有空再試。先把這幾篇發文列表於下:

後記:

  • 2015-4-21 : 以同樣步驟測試(只修改「驅動程式原始碼」的目錄、檔案名),可成功編譯 RocketRAID 2220、2320 的「驅動程式核心模組」。尚未安裝測試。
  • 2015-4-22 : 為修正一部使用 RocketRAID 2220 伺服器的 「根目錄」之 inode 問題(註:不正常關機造成),用 Fedora 21 Workstation 開機並修護,使用上述步驟建立之 RocketRAID 2220「驅動程式核心模組」(名稱為:hptmv6.ko),可正常驅動之。

已測試版本:

  • HighPoint RocketRAID 1740
  • Fedora 21 Workstation
    • Linux kernel: 3.19.5-200

參考資料:

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)