在 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/config.c 中,約在 26 列這個位置,原為
~/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__ ")";
. . . . .
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 隨身碟開機。- 當出現安裝選項時,選擇『Install Fedora 22 (Server ...)』,按【Tab】鍵修改開機參數。
- 在載入開機映像檔的命令列(/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 來分割硬碟了,若未超過限制可以不用加這個參數。
- 當出現《Fedora 22》安裝選項時,選擇《Install Fedora 22》,按【Tab】鍵修改開機參數。
- 在載入開機映像檔的命令列(vmlinux … quiet)末端,加上 modprobe.blacklist=sata_mv inst.sshd inst.gpt 這幾個參數後,按【Enter】鍵繼續。
- 桌面跳出一個《Welcome to Fedora 22》的畫面時,選擇欲安裝的語言選項後,按【繼續 (Continue)】。
- 接著是《安裝摘要》的畫面,這時暫停一下,不要急著安裝。
- 這幾個步驟有些差異,在 Fedora 22 安裝時無法切換到另一個「虛擬控制台」(註:在 Fedora 21 安裝時就發現這個問題)。
- 先確認這台電腦的「網路位址」(即:IP 位址),可點選【網路與主機名稱】查看網路設定。
- 由另一台電腦以 SSH 連至這台電腦,埠號為 22,帳號為 root。
ssh xxx.xxx.xxx.xxx -l root
- 不用輸入密碼就可登入(註:強力建議電腦要在安全的網域安裝,才不會讓駭客有可趁之機),萬一不能登入請參考前文。
- 查詢、記錄目前已使用的硬碟編號,
ls /dev/sd?
會列出目前已使用的硬碟編號。 - 強制載入剛才在『步驟一』編譯好的驅動程式,
insmod /run/install/isodir/rr174x.ko
- 再查詢一次目前已使用的硬碟編號,
ls /dev/sd?
如果 RocketRAID 正確被驅動,會看到一個新增的硬碟編號,記下來待會要用。 - 回到剛才的《安裝摘要》畫面,選擇欲安裝的語言選項,按【繼續 (Continue)】。
- 接著就會進入安裝程序,過程依照一般安裝說明,在此就略過不再說明。 注意:不要急著重開機,還要把接下的兩個步驟(二、三)都完成才可以重開機;不然,就不好處理了。
三、將「驅動程式核心模組」加入 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 連線會斷開。 |
四、修改開機時載入 Linux 核心的描述檔
之前有篇發文提及升級後的新系統不能正常啟動(參考:解決「安裝在 DMRAID 硬碟的 Fedora,升級後不能正確掛載目錄」的問題),這步驟要做的事和它類似。在步驟二安裝前才手動載入 RocketRAID 硬碟組的驅動模組,也就是從這時開始它才被 Linux 辨認到並加以編號(步驟二.4.f),而 USB 隨身碟早已經被辨認並編號了,所以 Linux 核心載入描述檔中的 RocketRAID 硬碟組編號不正確,要先加以修正才行。
- 確認仍在 SSH 的連線狀態,若不小心斷線,就再登入一次即可。
- 步驟二中,若已執行過『exit』命令,則編輯的命令為
vi /mnt/sysimage/boot/grub2/grub.cfg
若未執行過『exit』命令,則還在新安裝的系統根目錄下,其編輯命令為vi /boot/grub2/grub.cfg
用『vi』編輯檔案,一般人初次接觸都不容易,接下來的說明有些煩,請小心操作。 - 用方向鍵【↑】、【↓】、【←】及【→】控制游標的位置。
- 按【i】鍵,下方出現『-- INSERT --』進入輸入模式,可以修改、刪除字元。
- 按【ESC】鍵,下方的『-- INSERT --』消失,離開輸入模式。
- 按【:】鍵,下方出現『:』,接著按【w】及【q】鍵,執行寫入、並結束編輯。
- 按【:】鍵,接著按【q】及【!】鍵,不執行寫入、並結束編輯。
- 尋找這段文字,其中紅色標示的文字,就是要修改的地方,假設 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。
五、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 有關的發文,將本篇內容略做修改應該也會適用。過一陣子有空再試。先把這幾篇發文列表於下:- (F22) 安裝只有『MATE 桌面』(無 GNOME 3) 的 Fedora
- 適用 Fedora 22 的「可選版本 USB 安裝隨身碟」
- (F21) 安裝 HighPoint RocketRAID 的 Kernel 3.17.4-301 驅動程式
- 解決「成功編譯的『驅動模組 (driver module)』卻掛載失敗」的問題
- 在 Fedora 18 (3.11.10) 安裝 RocketRAID 2220 的驅動程式
- 安裝 HighPoint RocketRAID 2220 的 Kernel 3.9 驅動程式
- 安裝 HighPoint RocketRAID 2220 的 Kernel 3.8 驅動程式
- 安裝 Fedora 「編譯『核心模組』」所需套件
- 在 Fedora 安裝 HighPoint RocketRAID 的驅動程式
- 安裝 Fedora 的某特定版本之套件
後記:
- 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.)