initramfs掃瞄磁碟前改變磁碟上電順序

2022-08-18 20:33:10 字數 1536 閱讀 7197

背景:

機械硬碟需要12v 5v電源,此前設計是硬體電路預設5v有效、12v無效,然後系統通過驅動上12v電,對磁碟來說相當於先上5v後上12v,這種方式對大部分磁碟是可以的,但對於日立 hgst磁碟,冷啟動(或未使能12v後reboot,使能12v後reboot會由於12v 5v都使能,重啟(熱啟動)後會正確probe磁碟),系統在掃瞄磁碟時(執行initramfs中的init指令碼中的`udevadm settle`)會檢測到磁碟,但是由於12v未上,所以導致probe磁碟失敗,由於驅動會迴圈四次probe磁碟(考慮到磁碟可能沒準備好,所以多嘗試幾次),所以會由此導致系統啟動過慢,這說明此類磁碟需要先上12v 然後再上5v或同時上電。

解決:由於掃瞄磁碟是在initramfs中進行的,所以需要在掃瞄之前先關掉5v 然後使能12v 再開啟5v,然後再掃瞄。

initramfs檔案是由cpio打包gzip壓縮的檔案,先修改字尾後解壓:

# mv initramfs-2.6.32-431.20.3.el6.x86_64.img initramfs-2.6.32-431.20.3.el6.x86_64.gz

# gunzip initramfs-2.6.32-431.20.3.el6.x86_64.gz

# cpio -id initramfs-2.6.32-431.20.3.el6.x86_64

首先將關5v和開12v的驅動tca6416-nosh-low.ko、slotpower.ko及其依賴的i2c控制器驅動i2c-i801.ko放入解包後產生的lib/modules/2.6.32-431.20.3.el6.x86_64下面任意目錄下,然後執行`depmod -b .`(掃瞄當前lib/modules/`uname -r`目錄,非系統的此類目錄;然後生成所有此目錄下驅動的依賴等資訊,並儲存在此目錄下modules.dep等檔案中),然後在init檔案的while迴圈中、udevsettle語句之前加入:

sysfs_gpio="/sys/class/gpio"

while :; do

echo "before modprobe"

modprobe i2c_i801

modprobe tca6416_nosh_low

modprobe slotpower

[ -d $sysfs_gpio ] && /gpio[0-9]*`

doecho 1 > $/value

done

}注意:modprobe是通過modules.dep檔案來獲取載入驅動的位置的;用modprobe載入驅動只能寫驅動的名字不能加.ko字尾,否則會提示找不到驅動;另外,modprobe不區分驅動檔名中的「-」和「_」;如上。

儲存init檔案後打包壓縮當前目錄,生成initramfs檔案,並替換系統/boot目錄下相應的initramfs檔案後重啟:

# find . | cpio -co | gzip -c > ../initramfs.cpio.gz

# mv ../initramfs.cpio.gz /boot/initramfs-2.6.32-431.20.3.el6.x86_64.img

# reboot

磁碟介面的型別與磁碟掃瞄

硬碟介面分為ide sata scsi 光纖通道四種。ideide的英文全稱為 integrated drive electronics 即 電子整合驅動器 它的本意是指把 硬碟控制器 與 盤體 整合在一起的硬碟驅動器。把盤體與控制器整合在一起的做法減少了硬碟介面的電纜數目與長度,資料傳輸的可靠性得...

磁碟排程 迴圈掃瞄(CSCAN)

scan演算法既能獲得較好的尋道效能,又能防止飢餓現象。但是存在這樣的問題 當磁頭剛從裡向外移動而超越了某一磁軌時,恰好又有一程序請求訪問此磁軌,這時該程序必須等待。將磁頭繼續從裡向外,然後再從外向裡掃瞄完處於外面的所有要訪問的磁軌後,才處理該程序的請求,致使該請求的請求被大大的推遲。為此,csca...

Linux中磁碟掃瞄流程描述

通常scsi匯流排介面卡作為pci裝置的形式存在,其在計算機體系結構中的位置如下圖所示 圖1 scis host及device在計算機體系結構中的位置 在系統初始化時會掃瞄系統pci匯流排,由於scsi host adapter掛接在pci匯流排上,因此會被pci掃瞄軟體掃瞄得到,並且生成乙個pci...