OpenBMC 備忘錄
我的博客
本文檔旨在提供一些常用的 OpenBMC
的 recipe
客制化任務,本文只是對 原始文檔 的部分翻譯,不一定貼合實際情況,需要實事求是。
構建一個指定的機型配置
如果你希望構建一個不同的系統配置:
meta-<layer>/meta-<system>/conf/machine/machineA.conf
meta-<layer>/meta-<system>/conf/machine/machineB.conf
你可以通過設置 MACHINE
環境變量,配置想要構建的機型:
cd openbmc
TEMPLATECONF=meta-<layer>/meta-<system>/conf . openbmc-env
export MACHINE="machineB"
bitbake obmc-phosphor-image
構建 OpenBMC 的 SDK
想要編譯 ARM
程序,但是使用的卻是 PPC
或 x86
系統,可以構建 sdk
來接受一個 fakeroot
環境:
bitbake -c populate_sdk obmc-phosphor-image
./tmp/deploy/sdk/ \
openbmc-phosphor-glibc-x86_64-obmc-phosphor-image-armv5e-toolchain-2.1.sh
依據提示,在它默認安裝后,設置的環境會與如下的命令相似:
. /opt/openbmc-phosphor/2.1/environment-setup-armv5e-openbmc-linux-gnueabi
使用 D-Bus CLI 工具
busctl 是一個很好的命令行工具,運行:
busctl call <path> <interface> <object> <method> <parameters>
使用 QEMU
QEMU
具有一個 palmetto-bmc
機型,來啟動一個 Linux Kernel 設備。OpenBMC
也維護一個樹來增強 QEMU
的兼容性。
qemu-system-arm -m 256 -M palmetto-bmc -nographic \
-drive file=<path>/flash-palmetto,format=raw,if=mtd \
-net nic \
-net user,hostfwd=:127.0.0.1:2222-:22,hostfwd=:127.0.0.1:2443-:443,hostname=qemu
如果沒有錯誤,且 QEMU
啟動了,那么與 BMC
通訊時,只需要修改正確的端口就好了:
curl -c cjar -b cjar -k -H "Content-Type: application/json" \
-X POST https://localhost:2443/login -d "{\"data\": [ \"root\", \"0penBmc\" ] }"
或
ssh -p 2222 root@localhost
退出時,按下 ^a c
,來切換 QEMU 監視器,然后 quit
退出。
通過 QEMU 橋接設備
使用橋設備的一個好處是,你的 qemu
會話運行在橋接子網,在訪問設備的時候就不需要端口了。但是需要額外的包來提供 virbr0
,比如:
apt-get install -y libvirt libvirt-bin bridge-utils uml-utilities qemu-system-common
qemu-system-arm -m 256 -M palmetto-bmc -nographic \
-drive file=<path>/flash-palmetto,format=raw,if=mtd \
-net nic,macaddr=C0:FF:EE:00:00:02,model=ftgmac100 \
-net bridge,id=net0,helper=/usr/lib/qemu-bridge-helper,br=virbr0
在進行橋接時,可能會遇到一些問題,可以參考一下下面的配置、命令:
$ cat /etc/qemu/bridge.conf
allow virbr0
$ qemu-system-arm --help | grep helper
[,br=bridge][,helper=helper][,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off]
use network helper 'helper' (default=/usr/lib/qemu/qemu-bridge-helper) to -netdev bridge,id=str[,br=bridge][,helper=helper]
using the program 'helper (default=/usr/lib/qemu/qemu-bridge-helper)
我驗證成功的一個命令:
sudo qemu-system-arm -m 256 -M romulus-bmc -nographic -drive file=./tmp/deploy/images/romulus/obmc-phosphor-image-romulus.static.mtd,format=raw,if=mtd -net nic,macaddr=C0:FF:EE:00:00:02,model=ftgmac100 -net bridge,id=net0,helper=/usr/lib/qemu/qemu-bridge-helper,br=virbr0
共享下載目錄
在初次構建 OpenBMC
時,需要花費很長的時間,會從網上下載不同的倉庫下來。
檢查 build/download
目錄,來查看下載的倉庫。
- 如果文件是單獨的文檔,那么它看起來會是:
zlib-1.2.11.tar.xz
即下載的文件zlib-1.2.11.tar.xz.done
文件已經下載的標識
- 如果一個倉庫通過
git
管理,那么它看起來像是:git2/github.com.openbmc.linux
對git
的克隆git2/github.com.openbmc.linux.done
已經克隆的標識
BitBake 在編譯過程中,將會提取代碼到工作目錄,因此 downloads
目錄可以被系統上的不同構建所共享:
- 通過修改
build/conf/local.conf
文件來設置BitBake
的DL_DIR
變量到你的共享下載目錄DL_DIR ?= "path_to_existing_downloads"
- 創建一個鏈接
ln -sf path_to_existing_downloads build/downloads
然后再進行編譯,這樣會因為無需下載代碼而節省很多時間。
使用 git 代理
如果你在中國,那么可能會因為網絡原因,在下載過程中崩潰,可以使用 git
代理來加速代碼獲取。
可以 google git-proxy-wrapper
找到合適的 git
協議代理。
devtool
devtool
是 Yocto
中方便的工具,來對本地目錄做出修改,通常的使用方法是:
# 在工作區中構建 recipe 的代碼,修改編譯它
devtool modify <recipe>
cd /build/workspace/sources/<recipe>
bitbake obmc-phosphor-image
# 移除修改的內容
devtool reset <recipe>
下面是使用 devtool
工具的一個例子,如果想要在 ipmi
中實現一個新的功能,可能需要修改 phosphor-host-ipmid
進程的代碼,查看食譜,你確定是 phosphor-ipmi-host.bb
下面是使用 devtool
本地修改、編譯並測試的方法:
- 使用
devtool
提取出代碼倉庫:devtool modify phosphor-ipmi-host
devtool
克隆倉庫到build/workspace/sources/phosphor-ipmi-host
,創建devtool
分支 - 對倉庫做出修改
- 現在可以編譯整個固件了
bitbake obmc-phosphor-image # build the whole image bitbake phosphor-ipmi-host # build the recipe
- 為了測試做出的修改,可以燒錄整個固件,或用新的包替換原本的二進制包,注意到,修改的代碼編譯為
libapphandler.so
它同時被host
以及net ipmi
守護進程使用,推薦復制修改的二進制包到BMC
因為更方便測試:# 替換 BMC 中的 libapphandler.so.0.0.0 scp build/workspace/sources/phosphor-ipmi-host/oe-workdir/package/usr/lib/ipmid-providers/libapphandler.so.0.0.0 root@bmc:/usr/lib/ipmid-providers/ systemctl restart phosphor-ipmi-host.service # 重啟 ipmi 守護進程 # 如果想要測試 net ipmi,那么可以 systemctl restart phosphor-ipmi-net.service
- 現在你可以看到你做出的修改的內容了
開發 linux 內核
使用 devtool 開發 linux 內核
開發內核也可以使用 devtool
工具,當然會有一些不同點。
注意: 在新的 ac72846 中內核名修改稱為 linux-aspeed
,依據不同的版本靈活使用 linux-obmc
與 linux-aspeed
。
devtool
不會創建devtool
分支,它會檢出recipe
中指定的分支- 如果有補丁,
devtool
會直接將它們打到分支上 devtool
復制defconfg
以及machine-specific config
到oe-workdir
devtool
基於上面的配置生成.config
文件
你可以調整代碼,並像以往一樣編譯內核:
bitbake linux-aspeed -c build
修改配置
如果你需要修改配置,並保留它為 defconfig
以方便后面使用:
bitbake linux-aspeed -c menuconfig
# 編輯 configs 之后保存
# .config.new 作為新的內核配置文件
bitbake linux-aspeed -c savedefconfig
# 保存新的 defconfig 到 oe-workdir/linux-aspeed-<version>/defconfig
測試 linux 內核
在編譯完成之后,可以燒錄鏡像來測試新的內核,然而這個過程可能非常緩慢。可以通過網絡的方式調試新內核,OpenBMC
內核編譯生成 fit
鏡像,包括內核 kernel
,設備樹 dtb
以及文件系統 initramfs
。通常我們可以通過 tftp
載入它,以 romulus
為例:
- 將
build/tmp/deploy/images/romulus/fitImage-obmc-phosphor-initramfs-romulus.bin
到一個tftp
服務器,將它名命為fitImage
- 重啟
BMC
並進入uboot
- 在
uboot
中:setenv ethaddr <mac:addr> # 設置 mac 地址 setenv ipaddr 102.168.0.80 # 設置 BMC IP setenv serverip 192.168.0.11 # 設置 tftp 服務器 IP tftp 0x83000000 fitImage # 將 fitImage 載入到 ram 中,若芯片是 AST2400 使用 0x43000000 bootm 0x83000000 # 從 fitImage 啟動
現在你運行了新的內核了。