一般我們在安裝服務器過程中需要加載一些scsi卡或raid卡驅動,以便操作系統可以檢測到硬盤。
常規的安裝方式是要用到軟驅,其實我們也是可以通過U盤來進行加載的。
裝Linux控制器驅動往往都是*.dd或者*.img結尾的文件,我們都可以在linux下通過dd命令來寫入到U盤中,比如驅動的名字為megaraid_sas.img
假設有一台Linux機器,先把文件拷貝到/tmp,U盤的設備名為sdb.
dd if=/tmp/megaraid_sas.img of=/dev/sdb
cat命令也可以實現dd的作用,注意這裡是sdb而不是sdb1,是設備而不是分區,如果你把文件寫入到sdb1,你可以嘗試加載驅動會失敗。
Linux可以寫裸設備而windows不可以,也就是說如果U盤在windows下是未分區的(此時windows是無法寫的)但是在linux下還是可以寫的。
在 of=/dev/sdb 的時候是從U盤的最開始位置寫的,結果把它模擬成了一個軟盤,前446Bytes即“boot code”定義了它的類型。此時你把這個U盤拿到windows機器上,在磁盤管理裡邊可以看到1G的容量,但是右鍵屬性發現容量為1.38,即成了一個軟盤,也可以說是四不像,其實是欺騙了windows.
這個時候你可以把U盤格式化,然後把megaraid_sas.img在windows下用第三方工具解壓後發送到U盤之後,安裝系統過程中還是可以正常加載驅動的。
這是為什麼呢?
因為我們在windows下對這時的U盤操作時,windows會先讀取U盤的“boot code”,認為它是一個軟盤,因為軟盤是沒有分區的概念即沒有partition table,把其後邊的空間格式化了,簡單的說,再怎麼樣也不會把“boot code”給改了。
這時再拿到linux下,linux仍可以讀出其中的數據,但在用 fdisk -l /dev/sdb 的時候會發現U盤的Partition table有問題,可以在用fdisk /dev/sdb 進入交互界面後用一個命令“w”重新改寫,把U盤變成一個沒有分區的U盤。
有很重要的一點補充,現在很多人再買到服務器之後要裝linux系統,但是沒有linux環境,無法按照上邊的步驟來把驅動寫到U盤上去,經測試發現可以用redhat的第一張盤來創造這樣一個linux環境,假設現在要加載的驅動為LSI sas raid卡的驅動
步驟如下:
1、先在windows環境中把驅動拷貝到U盤上去,
2、用redhat的第一張盤引導,當出現提示你是否加載hard driver時,選擇skip,這是OS沒有檢測到硬盤的提示,此時就可以skip,接著就要加載圖形化界面了,這時候我們就可以按CTRL+ALT+F2切換到控制台了,
(有一點補充,硬盤的驅動是在出現圖形化界面之前就已經加載了,對於這個問題我還請了前輩一瓶水,我們可以在出現控制台後切換到F3,F4就可以看到內核和安裝的詳細過程)
3、在內存中建兩個目錄mkdir /a /b
4、mount /dev/sda1 /a
5、cp /a/megaraid_sas-rhel40-all.img /b
6、umount /a
7、dd if=/b/megaraid_sas-rhel40-all.img of=/dev/sda
8、再次啟動服務器,當出現boot之後輸入linux dd,然後按照提示選擇從/dev/sda中添加驅動,就會找到硬盤(如果出現多個sdx設備,可以按CTRL+ALT+F4來看到底你的U盤是哪個設備)
後話:
因為工作能接觸到不同cpu的服務器,發現此種方法在AMD cpu的機器上無法實現,intel的機器沒有問題,intel的cpu可以在找不到硬盤的情況下仍然可以加載圖形界面,AMD的cpu如果找不到硬盤就不可以繼續,而且即使用dd命令把驅動寫到U盤上去,驅動還是不能正常的加載的,也就是說無法用U盤給AMD cpu的機器加載硬盤的驅動。
Linux在檢測不同cpu時反饋的結果差別還是真的很大,不能說是redhat或者AMD的問題