IBM ServeRAID M5015のFWを書き換えてLSI MegaRAID M9260-8i化

投稿者: | 2022-03-05

表題の通りです。
普段使用している自作機にHDDを増設しようと思い立ちましたが、マザーボードのSATAポートがすでに埋まっており、増設を考えました。

過去に何度かSATAインターフェースカードを使用して増設したことがありますが、この手のカードはなぜか安定性が低く、ハングしたり、ドライブを見失ったりという思い出があります。

そこで考えたのがRAIDカードです。
RAIDカードなら、サーバで使用している信頼性もありますし、少し古い物なら格安で入手可能です。

ということでとりあえず入手してみたのがこちら。
IBM ServeRAID M5015(46M0851)
2009年あたりのモデルで、中身はLSI MegaRAID 9260-8iのようです。
NECのOEMと違って、メモリ量などの削減はありません。512MB搭載です。

裏面です。

端子はMini-SAS(SFF-8087)で、SAS-SATAx4のケーブルを購入すれば、2本で8台までのSATAデバイスを接続できます。

そのへんのテスト機に装着して起動してみます。

取り付けて起動してみるとこんな感じです。
RAIDカードなので、BIOSが走ってイニシャライズ、そのあとドライブのチェックとスピンアップの待機時間があり、想像以上に長いブート時間がかかります。

この画面でしばらく待機すると、バラバラっとメッセージが流れ、この画面でCtrl+Hを押すとWebBIOS(設定画面)に入れます。

設定画面です。装着されているRAIDカードが一覧で表示されています。
ServeRAID M5015と表示されています。あっていますね。

さて、ブート時間が非常に長いので、対策します。
LSIのFWに書き換えると、ブート時間が短くなるとの話もありましたので書き換えてみます。
まずは海外のフォーラムサイトから、ダウンロードします。

https://forums.laptopvideo2go.com/topic/32418-lsi-sas-controller-firmware/

今回は、9260-8iなのでSAS2108、書き換えに必要なLSI_DOSの二つをダウンロード、解凍します。

次に、LSIのサイト(現Broadcomのサイト)からFWをダウンロード、解凍します。
最新版は12.15.0-0239、2015年が最終更新です。

https://docs.broadcom.com/docs/12.15.0-0239zip

USBメモリ等でDOSブートできるものを作成(FreeDOSでもMSDOSでも。Rufasが簡単です)し、ルートディレクトリにLSI_DOSの中身をすべてと、2108フォルダはそのまま配置します。
BroadcomのサイトからダウンロードしたFWファイル(mr2108fw.rom)もルートディレクトリに配置します。配置するとこんな感じです。

では書き換えに入ります。
このUSBメモリをRAIDカードを装着したPCに差し込み、ブートします。
FreeDOSが起動します。DIRコマンドでルートディレクトリを一覧しています。

まずはCDコマンドで、ディレクトリを変更します。そのあとでDIRコマンドで一覧を出力しています。
C:\>CD 2108

続いて、ブランクのSBRを書き込みます。
C:\2108>megarec -writesbr 0 sbrempty.bin
“Success”が表示されたら完了です。

次に、9260-8iのSBRを書き込みます。
C:\2108>megarec -writesbr 0 sbr9260.bin
“Success”が表示されたら完了です。

次にflash領域を消去します。
C:\2108>megarec -cleanflash 0

完了したら、一度再起動します。FWがBIOSごとありませんので、RAIDのBIOS表示はなく、高速に起動すると思います。

ではFWを書き込みます。
C:\2108>megarec -m0flash 0 mr2108fw.rom

書き込みが始まります。

“Success”が表示されたら完了です。

再起動します。とりあえず壊れていません。

しばらく待機します。初回起動は非常に長いです。
MegaRAID 9260-8iの表示があります。成功しているようです。

Ctrl+HでWebBIOSに入ってみます。こちらでも問題なく9260-8iで認識しています。

さて、肝心の起動時間ですが、確かに短くなりました。
とはいえ、RAIDカードですので結構長いですが…。

後から調べて気づきましたが、このブート時間の効果はおそらくFWを書き換えたことに起因するものではないと思われます。megaoem.exeを使用して、RAIDカードのコンフィグを見るとわかります。
以下のようにコマンドを打ち込みます。
C:\>megaoem -adpsettings write -f test.ini -a0
これで、現在のカードの設定がルートディレクトリに”test.ini”として出力されます。

以下が、LSIのFWに書き換えた後のコンフィグです。

# MegaSAS CLI utility generated ini file for MFC programming.

subVendorId=0x1014                # sub-vendor ID for this board (Readonly)
subDeviceId=0x3b2                # sub-vendor ID for this board (Readonly)
OEM = 9                        # OEM Name of controller (Readonly)
SUBOEM = 0x00                 # SUBOEM ID of controller (Readonly)
phyPolarity = 0                # polarity for each possible PHY (bitmap...1=inverted) - used with phyPolaritySplit
phyPolaritySplit = 0           # polarity for TX/RX pair is different (bitmap...0=RX/TX same, 1=RX/TX different; phyPolarity.x=RX)
backGroundRate = 30             # default rebuild rate for this card (0-100)
stripeSize = 8                 # default LD strip size (per DDF: 4=8K, 5=16K, 7=64K, 11=1MB, etc.)
flushTime = 4                  # default cache flush time in seconds
writeBack = 1                  # default LD is WriteBack (0=WT, 1=WB, 2=Adaptive)
readAhead = 0                  # default LD read-ahead policy (0=none, 1=RA, 2=Adaptive)
cacheWhenBbuBad = 0            # default LD setting for enabling WB when BBU bad - 1=enable WB even when BBU bad
cachedIo = 0                   # default LD is cached
smartMode = 0                  # default smart mode (0=mode 6, 1=disable, 2=mode 2)
alarmDisable = 1               # default alarm to disabled if set
coercion = 2                   # 0=none, 1=128M, 2=1G, 3=reserved
zcrConfig = 0                  # ZCR configuration data (0=unknown, 1=RADIOS, 16-31=IDSEL for ZCR)
dirtyLedShowsDriveActivity = 0 # 1=change dirty LED to show drive activity
biosContinueOnError = 0        # 1=continue BIOS boot on error - default
spindownMode = 0               # drive spindown mode on shutdown (0=none, 1=internal only, 2=external only, 3=all)
allowedDeviceTypes = 0         # 0=SAS/SATA mix, 1=no SATA(SAS only), 2=no SAS(SATA only)
allowMixInEnclosure = 1        # allow SAS/SATA mix within an enclosure
allowMixInLD = 0               # allow SAS/SATA HDD mix within an LD
allowSataInCluster = 0         # allow SATA drives to be used in a cluster configuration
allowSSDMixInLD = 0            # allow SAS/SATA SSD mix within an LD
allowMixSSDHDDInLD = 0         # allow SSD/HDD mix within an LD
maxChainedEnclosures = 16       # maximum number of enclosures that may be chained
disableCtrlR = 1               # 1=disable Ctrl-R configuration utility, 0=enable Ctrl-R utility
enableWebBios = 1              # 1=enable WebBIOS configuration utility, 0=disable WebBIOS utility
directPdMapping = 0            # 1=enable direct PD mapping, 0=persistent PD mapping
biosEnumerateLds = 1           # 1=BIOS to display LDs at POST
restoreHotSpareOnInsertion = 0 # HSP kicks in, insert the failed drive, it becomes HSP
exposeEnclosureDevices = 1     # 1=device driver should expose enclosure devices, 0=hide enclosure devices
maintainPdFailHistory = 1      # 1=enable tracking of bad PDs across reboot; will also show failed LED status for missing bad drives
disablePuncturing = 1          # 1=Don't puncture LBA's in PD's. 0=okay to puncture. This is for SAS drives
zeroBasedEnclEnumeration = 0   # 1=Enclosure enumeration start with Zero. 0=Enclosure enumeration start with One.
disableBootCLI = 0             # 0=enable pre boot CLI tool, 1=disable pre boot CLI.
quadPortConnectorMap = 0       # Bitmap defining connector map for 8 quad-ports, 0=Internal connector/unused, 1=External connector/SAS MUX control.
driveActivityLed = 0           # 0=No LED for drive activity, 1=Show all drive activity.
disableAutoDetectBackplane = 0 # 0=SGPIO/i2c SEP enabled, 1=disable auto detect SGPIO,2=disable i2c SEP auto detect,3=disable both auto detect.
enableLedHeaders = 0            # 0=No LED for drive faults, 1=enable LED for drive faults.
useFdeOnly = 1                 # 0=FDE and controller encryption (if HW supports) is allowed, 1=Only support FDE encryption, disallow controller encryption.
delayPOST = 0                  # intentional delay to be introduced during FW POST. Possible coded values: 0 to 7,which gives a value of 0,15,30,45,60,75,90,105 seconds
enableCrashDump = 0            # 1=enable collection of system core in event of a controller crash
disableOnlineCtrlReset = 0     # 1=disable online controller resets, 0=allow online controller resets
enableLDBBM = 0                # 1=enable LD Bad block management
allowUnCertifiedHDDs = 1       # 1=allow, 0=block, 2=Warn & allow
treatR1EAsR10 = 0              # 1=treat single span R1E as R10
maxLdsPerArray = 0             # 0=16 LDs per array, 1=64 LDs per array
                                # bit-0=Don't spin down unconfigured drives, bit-1=Don't spin down Hot spares, bit-2=Don't auto spin down configured drives, 
                                # bit-3=Apply settings to all drives - don't allow individual PD/LD configuration, bit-4 =Disallow MAX power saving option for LDs - only T10 power conditions are to be used, 
                                # bit-5=Don't use cached writes for spun down VDs, bit-6=Provide option to schedule disable power savings at controller level 
spinDownTime = 30			   # Default spin down time in minutes
snapVDSpace = 3                # % of source LD to be reserved for snapshot in snap VD
autoSnapVDSpace = 8            # % of source LD to be reserved for auto snapshot in snap VD
viewSpace = 4                  # snapshot writeable VIEWs capacity in 7314310f src VD capacity. 0 - READ only
failPdOnSMARTer = 0			   # 1=fail a PD that's reached SMART failure threshold, if it doesn't take an LD offline
nonRevertibleSpares = 0		   # 1=hot spares are not revertible
enableJBOD = 1                 # 1=enable JBOD mode, 0=disable JBOD mode by default
detectCMETimer = 60         #Time in seconds taken to detect CME. 15-60 are valid values. 
ttyLogInFlash = 0              # 1=tty logs are maintained in flash
autoEnhancedImport = 0         # 1=import foreign configuration automatically, at boot
breakMirrorRAIDSupport = 0     # 0=supported for all redundant RAID level - R1, R10 (PRL1 & PRL11), and triple mirror R6, 1=single span R1 (PRL1), 2=All R1 and R10 combinations (PRL1 & PRL11)
disableJoinMirror = 0          # 1=join LD mirror operation is not supported

delayPOST = 0
となっている部分が重要で、LSIのカード(9260-8i)ではデフォルトが”0″なのか、書き換えた後に0になっています。delayPOSTは、0-7の値が設定でき、それぞれ 0,15,30,45,60,75,90,105秒 の設定になります。
読んで名のごとく、POSTの遅延時間の設定です。
ちなみに以下が、IBM ServeRAID (M5015)のコンフィグです。

# MegaSAS CLI utility generated ini file for MFC programming.

subVendorId=0x1014                # sub-vendor ID for this board (Readonly)
subDeviceId=0x3b2                # sub-vendor ID for this board (Readonly)
OEM = 9                        # OEM Name of controller (Readonly)
SUBOEM = 0x00                 # SUBOEM ID of controller (Readonly)
phyPolarity = 0                # polarity for each possible PHY (bitmap...1=inverted) - used with phyPolaritySplit
phyPolaritySplit = 0           # polarity for TX/RX pair is different (bitmap...0=RX/TX same, 1=RX/TX different; phyPolarity.x=RX)
backGroundRate = 30             # default rebuild rate for this card (0-100)
stripeSize = 8                 # default LD strip size (per DDF: 4=8K, 5=16K, 7=64K, 11=1MB, etc.)
flushTime = 4                  # default cache flush time in seconds
writeBack = 1                  # default LD is WriteBack (0=WT, 1=WB, 2=Adaptive)
readAhead = 0                  # default LD read-ahead policy (0=none, 1=RA, 2=Adaptive)
cacheWhenBbuBad = 0            # default LD setting for enabling WB when BBU bad - 1=enable WB even when BBU bad
cachedIo = 0                   # default LD is cached
smartMode = 0                  # default smart mode (0=mode 6, 1=disable, 2=mode 2)
alarmDisable = 1               # default alarm to disabled if set
coercion = 2                   # 0=none, 1=128M, 2=1G, 3=reserved
zcrConfig = 0                  # ZCR configuration data (0=unknown, 1=RADIOS, 16-31=IDSEL for ZCR)
dirtyLedShowsDriveActivity = 0 # 1=change dirty LED to show drive activity
biosContinueOnError = 0        # 1=continue BIOS boot on error - default
spindownMode = 0               # drive spindown mode on shutdown (0=none, 1=internal only, 2=external only, 3=all)
allowedDeviceTypes = 0         # 0=SAS/SATA mix, 1=no SATA(SAS only), 2=no SAS(SATA only)
allowMixInEnclosure = 1        # allow SAS/SATA mix within an enclosure
allowMixInLD = 0               # allow SAS/SATA HDD mix within an LD
allowSataInCluster = 0         # allow SATA drives to be used in a cluster configuration
allowSSDMixInLD = 0            # allow SAS/SATA SSD mix within an LD
allowMixSSDHDDInLD = 0         # allow SSD/HDD mix within an LD
maxChainedEnclosures = 16       # maximum number of enclosures that may be chained
disableCtrlR = 1               # 1=disable Ctrl-R configuration utility, 0=enable Ctrl-R utility
enableWebBios = 1              # 1=enable WebBIOS configuration utility, 0=disable WebBIOS utility
directPdMapping = 0            # 1=enable direct PD mapping, 0=persistent PD mapping
biosEnumerateLds = 1           # 1=BIOS to display LDs at POST
restoreHotSpareOnInsertion = 0 # HSP kicks in, insert the failed drive, it becomes HSP
exposeEnclosureDevices = 1     # 1=device driver should expose enclosure devices, 0=hide enclosure devices
maintainPdFailHistory = 1      # 1=enable tracking of bad PDs across reboot; will also show failed LED status for missing bad drives
disablePuncturing = 1          # 1=Don't puncture LBA's in PD's. 0=okay to puncture. This is for SAS drives
zeroBasedEnclEnumeration = 0   # 1=Enclosure enumeration start with Zero. 0=Enclosure enumeration start with One.
disableBootCLI = 0             # 0=enable pre boot CLI tool, 1=disable pre boot CLI.
quadPortConnectorMap = 0       # Bitmap defining connector map for 8 quad-ports, 0=Internal connector/unused, 1=External connector/SAS MUX control.
driveActivityLed = 0           # 0=No LED for drive activity, 1=Show all drive activity.
disableAutoDetectBackplane = 0 # 0=SGPIO/i2c SEP enabled, 1=disable auto detect SGPIO,2=disable i2c SEP auto detect,3=disable both auto detect.
enableLedHeaders = 0            # 0=No LED for drive faults, 1=enable LED for drive faults.
useFdeOnly = 1                 # 0=FDE and controller encryption (if HW supports) is allowed, 1=Only support FDE encryption, disallow controller encryption.
delayPOST = 0                  # intentional delay to be introduced during FW POST. Possible coded values: 0 to 7,which gives a value of 0,15,30,45,60,75,90,105 seconds
enableCrashDump = 0            # 1=enable collection of system core in event of a controller crash
disableOnlineCtrlReset = 0     # 1=disable online controller resets, 0=allow online controller resets
enableLDBBM = 0                # 1=enable LD Bad block management
allowUnCertifiedHDDs = 1       # 1=allow, 0=block, 2=Warn & allow
treatR1EAsR10 = 0              # 1=treat single span R1E as R10
maxLdsPerArray = 0             # 0=16 LDs per array, 1=64 LDs per array
                                # bit-0=Don't spin down unconfigured drives, bit-1=Don't spin down Hot spares, bit-2=Don't auto spin down configured drives, 
                                # bit-3=Apply settings to all drives - don't allow individual PD/LD configuration, bit-4 =Disallow MAX power saving option for LDs - only T10 power conditions are to be used, 
                                # bit-5=Don't use cached writes for spun down VDs, bit-6=Provide option to schedule disable power savings at controller level 
spinDownTime = 30			   # Default spin down time in minutes
snapVDSpace = 3                # % of source LD to be reserved for snapshot in snap VD
autoSnapVDSpace = 8            # % of source LD to be reserved for auto snapshot in snap VD
viewSpace = 4                  # snapshot writeable VIEWs capacity in 7314310f src VD capacity. 0 - READ only
failPdOnSMARTer = 0			   # 1=fail a PD that's reached SMART failure threshold, if it doesn't take an LD offline
nonRevertibleSpares = 0		   # 1=hot spares are not revertible
enableJBOD = 1                 # 1=enable JBOD mode, 0=disable JBOD mode by default
detectCMETimer = 60         #Time in seconds taken to detect CME. 15-60 are valid values. 
ttyLogInFlash = 0              # 1=tty logs are maintained in flash
autoEnhancedImport = 0         # 1=import foreign configuration automatically, at boot
breakMirrorRAIDSupport = 0     # 0=supported for all redundant RAID level - R1, R10 (PRL1 & PRL11), and triple mirror R6, 1=single span R1 (PRL1), 2=All R1 and R10 combinations (PRL1 & PRL11)
disableJoinMirror = 0          # 1=join LD mirror operation is not supported

M5015はdelayPOST = 4 なので60秒の遅延があります。
M5015のままでも、このコンフィグだけ読みだしてdelayPOST = 0とし、書き込んでやれば起動時間は解決しそうです。コンフィグファイルの書き込みは以下のコマンドです。
C:\megaoem -adpsettings read -f test.ini -a0

ただし結局、このカードだとITモード(RAIDを使用せず、ただのIFカードとして使用するモード)が使用できないのでRAID0などを組んで運用する必要があること、またOS上からSMART情報が見えないなどの理由で、別のカードを購入しました。それはまた次回。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です