wiki:jazz/09-05-20

Version 14 (modified by jazz, 15 years ago) (diff)

--

2009-05-20

  • [專案]
    • 狀況:由於作業系統是在硬體 RAID 啟動狀態下安裝的,因此每當重開,系統又會回歸到原始狀態,故需要重新安裝。
    • 安裝 pre-built lustre package - http://www.pdsi-scidac.org/repository/debian/
      bio:~# echo "deb http://www.pdsi-scidac.org/repository/debian testing main" > /etc/apt/sources.list.d/lustre.list
      bio:~# apt-get update
      bio:~# apt-get install pdsi-scidac-keyring
      bio:~# apt-get install linux-image-2.6.22.19-lustre-686 lustre-modules-2.6.22.19-lustre-686 lustre-utils 
      
    • 安裝 firmware-bnx2
      bio:~# apt-get install firmware-bnx2
      
    • 解析 firmware-bnx2 安裝前與安裝後的 initrd.img 差異
      bio:~$ mkdir -p temp temp2
      bio:~$ cd temp
      bio:~/temp$ cat /boot/initrd.img-2.6.22.19-lustre-686.bak | gunzip | cpio -i
      27903 block
      bio:~/temp$ cd ../temp2
      bio:~/temp2$ cat /boot/initrd.img-2.6.22.19-lustre-686 | gunzip | cpio -i
      28313 blockss
      bio:~/temp2$ cd ..
      bio:~$ diff -r temp temp2
      只在 temp2/lib 存在:firmware
      只在 temp2/lib/udev 存在:firmware.agent
      bio:~$ ls temp2/lib/firmware/
      bnx2-06-4.0.5.fw  bnx2-09-4.0.5.fw
      bio:~$ cat temp2/lib/udev/firmware.agent 
      
      #!/bin/sh -e
      #
      # firmware loader agent
      #
      
      cd /lib/udev/
      . ./hotplug.functions
      
      if [ ! -e /sys/$DEVPATH/loading ]; then
          mesg "/sys/$DEVPATH/ does not exist"
          exit 1
      fi
      
      for DIR in $FIRMWARE_DIRS; do
          [ -e "$DIR/$FIRMWARE" ] || continue
          echo 1 > /sys/$DEVPATH/loading
          cat "$DIR/$FIRMWARE" > /sys/$DEVPATH/data
          echo 0 > /sys/$DEVPATH/loading
          exit 0
      done
      
      # the firmware was not found
      echo -1 > /sys/$DEVPATH/loading
      
      debug_mesg "Cannot find the $FIRMWARE firmware"
      exit 1
      
    • 其中 firmware.agent 是屬於 udev 套件
      bio:~$ dpkg -S firmware.agent
      udev: /lib/udev/firmware.agent
      
    • 手工打造支援 firmware-bnx 的 initrd-pxe.2.6.22.19-lustre-686.img
      • 首先要先瞭解 drblsrv-offline 所產生的 initrd-pxe.2.6.22.19-lustre-686.img 與系統產生的 initrd.img-2.6.22.19-lustre-686 有何差別
        bio:~$ uname -a
        Linux bio 2.6.22.19-lustre-686 #2 SMP Tue Aug 26 00:01:59 UTC 2008 i686 GNU/Linux
        bio:~$ sudo /opt/drbl/sbin/drblsrv-offline -s `uname -r`
        bio:~$ mkdir -p temp temp2
        bio:~$ cd temp
        bio:~/temp$ cat /boot/initrd.img-2.6.22.19-lustre-686 | gunzip | cpio -i
        bio:~/temp$ cd ..
        bio:~$ cd temp2/
        bio:~/temp2$ cat /tftpboot/nbi_img/initrd-pxe.2.6.22.19-lustre-686.img | gunzip | sudo cpio -i
        
      • 光是從 diff -r temp temp2 的結果來看,兩者的差異很大。而 firmware.agent 在系統產生的 initrd.img 中,是透過 udev 的 rules 被執行的。
        bio:~/temp$ grep firmware.agent * -r --color
        etc/udev/rules.d/80-drivers.rules:SUBSYSTEM=="firmware",				RUN+="firmware.agent"
        
      • 從以上資訊,大致上可以猜出為什麼使用 DRBL 產生的 initrd-pxe.img 會無法取得 firmware,因為 bnx2 這個核心模組並不會自動去檔案系統裡去找 /lib/firmware 裡有沒有需要的檔案。而是透過 udev 去執行 firmware.agent 把 /lib/firmware 裡的檔案塞到 /sys/$DEVPATH/data 去。因此如果要讓 initrd-pxe.img 也支援這樣的機制,有兩種作法,第一種 initrd-pxe.img 全面改用 udev,第二種是自己補拷貝 /sys/$DEVPATH/data 那一段。
      • 附帶值得一提的是我在 Debian Lenny 的 2.6.26-2-amd64 核心模組上看到 firmware-class 這個奇特的模組。看樣子 Linux 核心對於這些非公開的韌體處理方式目前仍處於混亂的局面。
        jazz@hadoop:~$ lsb_release -a
        No LSB modules are available.
        Distributor ID:	Debian
        Description:	Debian GNU/Linux 5.0.1 (lenny)
        Release:	5.0.1
        Codename:	lenny
        jazz@hadoop:~$ uname -a
        Linux hadoop 2.6.26-2-amd64 #1 SMP Fri Mar 27 04:02:59 UTC 2009 x86_64 GNU/Linux
        jazz@hadoop:~$ lsmod | grep bnx2
        bnx2                   63496  0 
        firmware_class         12544  1 bnx2
        jazz@hadoop:~$ sudo modinfo firmware_class
        [sudo] password for jazz: 
        filename:       /lib/modules/2.6.26-2-amd64/kernel/drivers/base/firmware_class.ko
        license:        GPL
        description:    Multi purpose firmware loading support
        author:         Manuel Estrada Sainz
        depends:        
        vermagic:       2.6.26-2-amd64 SMP mod_unload modversions
        
      • 關於 bnx2 到底怎麼知道自己需要的韌體檔案呢?? 答案藏在 modinfo 裡,有 firmware 的參數會紀錄相關資訊。
        jazz@hadoop:~$ sudo modinfo bnx2
        filename:       /lib/modules/2.6.26-2-amd64/kernel/drivers/net/bnx2.ko
        firmware:       bnx2-09-4.0.5.fw
        firmware:       bnx2-06-4.0.5.fw
        version:        1.7.5
        license:        GPL
        description:    Broadcom NetXtreme II BCM5706/5708 Driver
        author:         Michael Chan <mchan@broadcom.com>
        srcversion:     AA4F7411285F32C5C55775A
        alias:          pci:v000014E4d0000163Asv*sd*bc*sc*i*
        alias:          pci:v000014E4d00001639sv*sd*bc*sc*i*
        alias:          pci:v000014E4d000016ACsv*sd*bc*sc*i*
        alias:          pci:v000014E4d000016AAsv*sd*bc*sc*i*
        alias:          pci:v000014E4d000016AAsv0000103Csd00003102bc*sc*i*
        alias:          pci:v000014E4d0000164Csv*sd*bc*sc*i*
        alias:          pci:v000014E4d0000164Asv*sd*bc*sc*i*
        alias:          pci:v000014E4d0000164Asv0000103Csd00003106bc*sc*i*
        alias:          pci:v000014E4d0000164Asv0000103Csd00003101bc*sc*i*
        depends:        firmware_class
        vermagic:       2.6.26-2-amd64 SMP mod_unload modversions 
        parm:           disable_msi:Disable Message Signaled Interrupt (MSI) (int)
        
    • [想法] 在 firemware.agent 裡加入 debug_msg 看執行的實際時機跟路徑,就可以瞭解它是怎麼餵 firmware 檔案給 bnx2 模組。
    • [機制] 要追蹤核心開機資訊,可以查 /var/log/kern.log 。先決條件是有打開 rsyslogd
      • 修改前的 kern.log
        May 20 21:05:49 bio kernel: [    3.846723] Broadcom NetXtreme II Gigabit Ethernet Driver bnx2 v1.7.5 (April 29, 2008)
        May 20 21:05:49 bio kernel: [    3.846723] ACPI: PCI Interrupt 0000:39:02.0[A] -> GSI 18 (level, low) -> IRQ 18
        May 20 21:05:49 bio kernel: [    3.846723] firmware: requesting bnx2-06-4.0.5.fw
        May 20 21:05:49 bio kernel: [    4.054384] eth0: Broadcom NetXtreme II BCM5706 1000Base-T (A2) PCI-X 64-bit 100MHz found at mem e2000000, IRQ 18, node addr 00:1a:64:60:25:b2
        May 20 21:05:49 bio kernel: [    4.054384] sata_svw 0000:38:0e.0: version 2.3
        May 20 21:05:49 bio kernel: [    4.055558] ACPI: PCI Interrupt 0000:39:03.0[A] -> <6>ACPI: PCI Interrupt 0000:38:0e.0[A] -> GSI 10 (level, low) -> IRQ 10
        May 20 21:05:49 bio kernel: [    4.055558] GSI 17 (level, low) -> IRQ 17
        May 20 21:05:49 bio kernel: [    4.055558] firmware: requesting bnx2-06-4.0.5.fw
        
  • [結果] 耍寶了!! 2.6.22 的核心模組根本就不會要 firmware :(
    jazz@bio:~$ sudo modinfo bnx2
    [sudo] password for jazz: 
    filename:       /lib/modules/2.6.22.19-lustre-686/kernel/drivers/net/bnx2.ko
    version:        1.5.11
    license:        GPL
    description:    Broadcom NetXtreme II BCM5706/5708 Driver
    author:         Michael Chan <mchan@broadcom.com>
    srcversion:     31FD34F2725D1F250205072
    alias:          pci:v000014E4d0000163Asv*sd*bc*sc*i*
    alias:          pci:v000014E4d00001639sv*sd*bc*sc*i*
    alias:          pci:v000014E4d000016ACsv*sd*bc*sc*i*
    alias:          pci:v000014E4d000016AAsv*sd*bc*sc*i*
    alias:          pci:v000014E4d000016AAsv0000103Csd00003102bc*sc*i*
    alias:          pci:v000014E4d0000164Csv*sd*bc*sc*i*
    alias:          pci:v000014E4d0000164Asv*sd*bc*sc*i*
    alias:          pci:v000014E4d0000164Asv0000103Csd00003106bc*sc*i*
    alias:          pci:v000014E4d0000164Asv0000103Csd00003101bc*sc*i*
    depends:        
    vermagic:       2.6.22.19-lustre-686 SMP mod_unload K7 
    parm:           disable_msi:Disable Message Signaled Interrupt (MSI) (int)