2015年7月26日 星期日

(F22) 安裝 HighPoint RocketRAID 的 Kernel 4.0.4-301 驅動程式

之前在“(F21) 安裝 HighPoint RocketRAID 1740 的 Kernel 3.17.4-301 驅動程式”一文中,記錄了安裝 HighPoint RocketRAID 的「驅動程式核心模組」的步驟。在當時的只能以 Live CD 的方式加載「驅動程式核心模組」,因此只能先安裝「GNOME 3 桌面」,當再安裝「MATE 桌面」時,又要解決“GNOME 與 MATE 程式選單同時出現”的問題。若平常不用「GNOME 3 桌面」時,又佔用不少寶貴的硬碟空間。這次利用安裝 Fedora 22 的機會,再找找更好的解決辦法。
  在 Fedora 22 安裝程式 Anaconda 的參數中找到一些新線索,就用這些新發現的參數試了一下,最後成功地在 HighPoint RocketRAID 1740 的 RAID 硬碟組中,安裝一個『只有 MATE 桌面的 Fedora 22』,詳細步驟說明如下:(為方便讀者參考,與前文重覆步驟仍予以保留)

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

再提醒:記得一定要從 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 …執行對「開放原始碼驅動程式」的修補工作。若未安裝可以命令
dnf install patch
安裝它。
這個『修補檔』修正了大部份的版本不合問題,但是編譯時仍會出現這幾個錯誤,

A. 未支援的 Linux 核心版本

參考之前的文件修改,新的編譯的命令應該是
cd ~/Temp/rr174x-linux-src-v2.4/product/rr1740pm/linux
make KERNELDIR=/lib/modules/4.0.4-301.fc22.x86_64/build/ KERNEL_VER=4.0
下了命令後,會出現這個版本錯誤的訊息
../../../inc/linux/Makefile.def:100: *** Only kernel 2.4/2.6/3.x is supported but you use 4.0.  Stop.
這是編譯前的版本檢查時,發現這個『驅動程式原始碼』的支援版本與目前的 Linux 核心版本不合所致。但是,根據 Linus Torvalds 的說明,似乎 Linux 的核心版本調整到 4.0,只是因為『時間到了』、『次版本編號太大』而已,所以將版本檢查放鬆一些,應該可以解決。
  用熟悉的文字編輯器開啟 ~/Temp/rr174x-linux-src-v2.4/inc/linux/Makefile.def 這個檔案,將 97 ~ 103 這幾列,原為
ifneq ($(MAJOR), 3)
ifneq ($(KERNEL_VER), 2.6)
ifneq ($(KERNEL_VER), 2.4)
$(error Only kernel 2.4/2.6/3.x is supported but you use $(KERNEL_VER))
endif
endif
endif
修改為
ifneq ($(MAJOR), 4)
ifneq ($(MAJOR), 3)
ifneq ($(KERNEL_VER), 2.6)
ifneq ($(KERNEL_VER), 2.4)
$(error Only kernel 2.4/2.6/3.x is supported but you use $(KERNEL_VER))
endif
endif
endif
endif
再編譯就不會出現版本錯誤了。但是,仍有其它錯誤訊息,要繼續做些修改才行。

B. 語法不正確

如果讀者已經參考過上一篇發文,這個修改就不會再發生,可以略過這段。但若是第一次參考本部落格的發文,在下編譯的命令時(:與上一步驟的命令相同)
cd ~/Temp/rr174x-linux-src-v2.4/product/rr1740pm/linux
make KERNELDIR=/lib/modules/4.0.4-301.fc22.x86_64/build/ KERNEL_VER=4.0
會出現這個錯誤訊息
. . . . .
~/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 中,約在 26 列這個位置,原為
char driver_ver[] = "v2.4 (" __DATE__ " " __TIME__ ")";
的這一列,改為
char driver_ver[] = "v2.4 (\" __DATE__ \" \" __TIME__ \")";
即讓『__DATE__』『__TIME__』這兩個巨集函數沒有作用,再編譯就不會出錯,並可得到 rr174x.ko 這個驅動程式核心模組,將它存到隨身碟備用。

二、安裝 Fedora 22 Server

依前文〝適用 Fedora 22 的「可選版本 USB 安裝隨身碟」〞製作安裝用的 USB 隨身碟,調整 BIOS 的設定,使電腦由 USB 隨身碟開機。
  1. 當出現安裝選項時,選擇『Install Fedora 22 (Server ...)』,按【Tab】鍵修改開機參數。
  2. 在載入開機映像檔的命令列(/F22_SVR_ … quiet)的末端,加上 modprobe.blacklist=sata_mv inst.sshd inst.gpt 這幾個參數,同時按【Enter】鍵繼續。參數作用為
    modprobe.blacklist=sata_mv抑制原 Linux 核心預載的「驅動程式核心模組」,此模組只有 SATA 擴充卡功能,沒有 RAID 功能。
    inst.sshd啟動 SSHD 服務,可在安裝過程中由另一台電腦登入。
    inst.gpt若 RAID 模組的硬碟總空間在 2.2TB 以上時,就要使用 GPT 來分割硬碟了,若未超過限制可以不用加這個參數。
若是參考〝用「可選版本 USB 安裝隨身碟」安裝失敗,原因探討〞(即:用 dd 複製 ISO 檔至 USB 隨身碟),則上述步驟不一樣,而是
  1. 當出現《Fedora 22》安裝選項時,選擇《Install Fedora 22》,按【Tab】鍵修改開機參數。
  2. 在載入開機映像檔的命令列(vmlinux … quiet)末端,加上 modprobe.blacklist=sata_mv inst.sshd inst.gpt 這幾個參數後,按【Enter】鍵繼續。
接下來的步驟都一樣
  1. 桌面跳出一個《Welcome to Fedora 22》的畫面時,選擇欲安裝的語言選項後,按【繼續 (Continue)】。
  2. 接著是《安裝摘要》的畫面,這時暫停一下,不要急著安裝。
    1. 這幾個步驟有些差異,在 Fedora 22 安裝時無法切換到另一個「虛擬控制台」(:在 Fedora 21 安裝時就發現這個問題)。
    2. 先確認這台電腦的「網路位址」(即:IP 位址),可點選【網路與主機名稱】查看網路設定。
    3. 由另一台電腦以 SSH 連至這台電腦,埠號為 22,帳號為 root。
      ssh xxx.xxx.xxx.xxx -l root
    4. 不用輸入密碼就可登入(:強力建議電腦要在安全的網域安裝,才不會讓駭客有可趁之機),萬一不能登入請參考前文
    5. 查詢、記錄目前已使用的硬碟編號,
      ls /dev/sd?
      會列出目前已使用的硬碟編號。
    6. 強制載入剛才在『步驟一』編譯好的驅動程式,
      insmod /run/install/isodir/rr174x.ko
    7. 再查詢一次目前已使用的硬碟編號,
      ls /dev/sd?
      如果 RocketRAID 正確被驅動,會看到一個新增的硬碟編號,記下來待會要用。
  3. 回到剛才的《安裝摘要》畫面,選擇欲安裝的語言選項,按【繼續 (Continue)】。
  4. 接著就會進入安裝程序,過程依照一般安裝說明,在此就略過不再說明。
  5. 注意:不要急著重開機,還要把接下的兩個步驟(二、三)都完成才可以重開機;不然,就不好處理了。

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

前一個步驟完成後,只是將 Fedora 22 安裝至 RocketRAID 驅動的 RAID 硬碟組,而目前 Linux 核心中並無 RocketRAID 的驅動模組,直接重開機就無法使用 RAID 硬碟組;因此,還有兩個步驟要進行才可。

A.由另一部電腦以 SSH 登入安裝中的電腦

如果步驟二中的登入尚未登出,就繼續下一步驟 B.,否則就再登入一次,
ssh xxx.xxx.xxx.xxx -l root

B.將 RocketRAID 驅動核心模組加入 Linux 核心

在安裝過程中登入後身份就是 root,所以可直接輸入以下的命令,
cp /run/install/isodir/rr174x.ko /mnt/sysimage/lib/modules/4.0.4-301.fc22.x86_64/kernel/drivers/scsi/
chroot /mnt/sysimage
mv /boot/initramfs-4.0.4-301.fc22.x86_64.img /boot/initramfs-4.0.4-301.fc22.x86_64.img.save
depmod -a 4.0.4-301.fc22.x86_64
dracut --add-drivers rr174x.ko --omit-drivers sata_mv /boot/initramfs-4.0.4-301.fc22.x86_64.img 4.0.4-301.fc22.x86_64
exit
上例中各列命令的用途說明如下:
cp /run/install …將在步驟一編譯好且存放在 USB 隨身碟的「驅動程式核心模組」複製到『新安裝』Linux 核心的驅動程式目錄。
chroot /mnt/sys …暫時將 Linux 系統的根目錄切換到新安裝的系統,以利處理新系統的核心。
mv /boot/initra …修改新系統的 Linux 核心的名稱,留作備份之用。
depmod -a 4.0.4 …記錄目錄使用中的核心模組,為修改 Linux 核心之用。
dracut --add-dr …重製一份新的 Linux 載入核心映像檔,加上 RAID 硬碟組的驅動程式,去除不用的 sata_mv 模組。
exit將 Linux 系統的根目錄切換為原來的安裝時核心。
註一:暫時不下『exit』命令,待步驟三結束再下也可以。
註二:下兩次『exit』命令,則 SSH 連線會斷開。
完成後,新安裝的系統已經適合 RAID 硬碟組之用,但因系統載入的描述檔未修正,仍不用正常開機,繼續下個步驟。

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

之前有篇發文提及升級後的新系統不能正常啟動(參考:解決「安裝在 DMRAID 硬碟的 Fedora,升級後不能正確掛載目錄」的問題),這步驟要做的事和它類似。
  在步驟二安裝前才手動載入 RocketRAID 硬碟組的驅動模組,也就是從這時開始它才被 Linux 辨認到並加以編號(步驟二.4.f),而 USB 隨身碟早已經被辨認並編號了,所以 Linux 核心載入描述檔中的 RocketRAID 硬碟組編號不正確,要先加以修正才行。
  1. 確認仍在 SSH 的連線狀態,若不小心斷線,就再登入一次即可。
  2. 步驟二中,若已執行過『exit』命令,則編輯的命令為
    vi /mnt/sysimage/boot/grub2/grub.cfg
    若未執行過『exit』命令,則還在新安裝的系統根目錄下,其編輯命令為
    vi /boot/grub2/grub.cfg
    用『vi』編輯檔案,一般人初次接觸都不容易,接下來的說明有些煩,請小心操作。
    1. 用方向鍵【↑】、【↓】、【←】及【→】控制游標的位置。
    2. 按【i】鍵,下方出現『-- INSERT --』進入輸入模式,可以修改、刪除字元。
    3. 按【ESC】鍵,下方的『-- INSERT --』消失,離開輸入模式。
    4. 按【:】鍵,下方出現『:』,接著按【w】及【q】鍵,執行寫入、並結束編輯。
    5. 按【:】鍵,接著按【q】及【!】鍵,執行寫入、並結束編輯。
  3. 尋找這段文字,其中紅色標示的文字,就是要修改的地方,假設 RocketRAID 硬碟組的編號原為『/dev/sdb』而 USB 隨身碟的編號為『/dev/sda』,所以未修改時的硬碟編號,在拔除 USB 隨身碟重開機時,RocketRAID 硬碟組的編號會變為『/dev/sda』。這將導致 Linux 的核心不能正確載入而錯誤。
    . . . . .
    menuentry 'Fedora, with Linux 4.0.4-301.fc22.x86_64' --class fedora --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-4.0.4-301.fc22.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-4.0.4-301.fc22.x86_64 root=UUID=23f990f7-dfef-4f0e-9b81-16f7cc2be6d5 ro rhgb quiet LANG=zh_TW.UTF-8
       initrd16 /initramfs-4.0.4-301.fc22.x86_64.img
    }
    . . . . .
    上面的例子看起來有些複雜,簡單的說就是這三個替換工作,
    • 將 hd1 換成 hd0
    • 將 ahci1 換成 ahci0
    • 將 root= 換成 root=UUID=

    :上例中的 msdos 是指使用 MBR 分割表,若是用 GPT 則會出現 gpt。

  4. 修改好後存回就完成了。
這時可以重開機了。

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

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

cp rr174x.ko /lib/modules/4.0.8-300.fc22.x86_64/kernel/drivers/scsi/
depmod -a 4.0.8-300.fc22.x86_64
mv /boot/initramfs-4.0.8-300.fc22.x86_64.img /boot/initramfs-4.0.8-300.fc22.x86_64.img.save
depmod -a 4.0.8-300.fc22.x86_64
dracut --add-drivers rr174x --omit-drivers sata_mv /boot/initramfs-4.0.8-300.fc22.x86_64.img 4.0.8-300.fc22.x86_64
上例中各列命令的用途說明如下:
cd ~/Temp/rr174 ...以使用者身份,切換到家目錄下的編譯工作目錄。
make clean將舊的編譯過程中暫存的資料清除,在 Linux 核心是小版本更新時很有用。
make KERNELDIR= ...編譯的命令及參數。
su切換到 root 身份,但不改變目前的工作目錄位置,方便接下來的操作。
cp rr174x.ko /l ...將剛編譯好的「驅動程式核心模組」複製到『更新版』Linux 核心的驅動程式目錄。
mv /boot/initra ...更改新更新的 Linux 核心檔案的名稱,留作備份之用。
depmod -a 4.0.8 ...記錄目前使用中的「驅動程式核心模組」,為待會修改 Linux 核心檔案之用。
dracut --add-dr ...重製一份新的 Linux 載入核心,加上 RAID 硬碟組的驅動程式,去除不用的 sata_mv 模組。

註一:筆者通常是先將命令貼到「文字編輯器」,修改好版本後,再轉貼到「終端機」。
註二:需要製作「驅動程式核心模組」的更新時,必需確認已將新編譯的「驅動模組」加入 Linux 核心,否則不能重新以更新後的 Linux 系統開機。
註三:若以更新後的 Linux 系統開機,因「驅動程式核心模組」不合而失敗時,先用舊版開機,再做一次「驅動程式核心模組」的編譯、安裝步驟。

相關發文:

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

後記:

  • 2015-7-26 : 以同樣步驟測試(只修改「驅動程式原始碼」的目錄、檔案名),可成功編譯 RocketRAID 2220 (hptmv6.ko)、2320 (rr232x.ko) 的「驅動程式核心模組」。尚未安裝測試。
  • 2015-8-8: RocketRAID 2320 (rr232x.ko) 「驅動程式核心模組」安裝測試成功。

已測試版本:

  • HighPoint RocketRAID 1740
  • Fedora 22 Server
    。Linux kernel:4.1.7-200, 4.1.5-200, 4.1.4-200, 4.1.2-200

    4.0.8-300, 4.0.7-300, 4.0.4-301

參考資料:

沒有留言:

張貼留言

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