close
Warning:
Can't synchronize with repository "(default)" (Unsupported version control system "svn": /usr/lib/python2.7/dist-packages/libsvn/_delta.so: cannot map zero-fill pages: Cannot allocate memory). Look in the Trac log for more information.
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
- [改法] 在 firmware.agent 裡加進 DEBUG 資訊
-
|
old
|
new
|
|
| 12 | 12 | fi |
| 13 | 13 | |
| 14 | 14 | for DIR in $FIRMWARE_DIRS; do |
| | 15 | mesg "[DEBUG] FIRMWARE_DIRS = $FIRMWARE_DIRS" |
| 15 | 16 | [ -e "$DIR/$FIRMWARE" ] || continue |
| | 17 | mesg "[DEBUG] firmware = $DIR/$FIRMWARE" |
| | 18 | mesg "[DEBUG] echo 1 > /sys/$DEVPATH/loading" |
| 16 | 19 | echo 1 > /sys/$DEVPATH/loading |
| | 20 | mesg "[DEBUG] cat "$DIR/$FIRMWARE" > /sys/$DEVPATH/data" |
| 17 | 21 | cat "$DIR/$FIRMWARE" > /sys/$DEVPATH/data |
| | 22 | mesg "[DEBUG] echo 0 > /sys/$DEVPATH/loading" |
| 18 | 23 | echo 0 > /sys/$DEVPATH/loading |
| 19 | 24 | exit 0 |
| 20 | 25 | done |
- [結果] 耍寶了!! 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:v000014E4d0 000164Asv*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)
- 測試 Lustre - 參考 3D 果蠅腦實驗叢集 Lustre 效能測試安裝紀錄(by rider/rock), GTD Cloud Lustre 的指令
- 把 DRBL Server 當 MDT 與 MGS,並拿第二顆硬碟當 Metadata 存放的空間。
bio:~$ sudo mkfs.lustre --fsname=bio --mdt --mgs /dev/sdb1
bio:~$ sudo mkdir -p /mnt/mdt
bio:~$ sudo mount -t lustre /dev/sdb1 /mnt/mdt/
- 把 DRBL Client 當 OST,並把兩顆硬碟都貢獻出來當儲存空間。
bio102:~$ sudo mkfs.lustre --fsname=bio --ost --mgsnode=bio@tcp0 /dev/sda
bio102:~$ sudo mkfs.lustre --fsname=bio --ost --mgsnode=bio@tcp0 /dev/sdb
bio103:~$ sudo mkfs.lustre --fsname=bio --ost --mgsnode=bio@tcp0 /dev/sda
bio103:~$ sudo mkfs.lustre --fsname=bio --ost --mgsnode=bio@tcp0 /dev/sdb
bio104:~$ sudo mkfs.lustre --fsname=bio --ost --mgsnode=bio@tcp0 /dev/sda
bio104:~$ sudo mkfs.lustre --fsname=bio --ost --mgsnode=bio@tcp0 /dev/sdb
bio105:~$ sudo mkfs.lustre --fsname=bio --ost --mgsnode=bio@tcp0 /dev/sda
bio105:~$ sudo mkfs.lustre --fsname=bio --ost --mgsnode=bio@tcp0 /dev/sdb
bio102:~$ sudo mkdir -p /mnt/ost/
bio103:~$ sudo mkdir -p /mnt/ost/
bio104:~$ sudo mkdir -p /mnt/ost/
bio105:~$ sudo mkdir -p /mnt/ost/
bio102:~$ sudo mount -t
- [狀況] 無法連上 MGS
mount.lustre: mount /dev/sda at tcp:/datafs at /mnt/ost failed: Input/output error
Is the MGS running?
- [原因] lnet 的網路設定錯誤(應該用 DRBL 對內的網路, 而非對外的網路)
$ sudo lctl list_nids
192.168.1.13@tcp0
- [參考] http://lists.lustre.org/pipermail/lustre-discuss/2007-July/003647.html
- [參考] Lustre 1.6 管理手冊 第二章 Understanding Lustre Networking
- [參考] 文傑所使用的指令都是歸屬在 1.6 版以後才有的 Mount Configuration
- [解法] 用 ip2nets 參數指定不同網段給不同 nids
bio:~# modprobe lnet ip2nets="tcp0(eth0),tcp1(eth1) 192.168.1.13,192.168.129.1"
bio:~# lctl
lctl > network up
lctl > list_nids
192.168.1.13@tcp
192.168.129.1@tcp1
- [備忘] 停用 lnet 的方法
# lctl network unconfigure
# lctl modules | awk '{print $2}' | xargs rmmod ### 註: 必須停止 network 跟 lustre 才可以做這樣的動作
Download in other formats: