OpenBMC 一些雜項


OpenBMC 備忘錄

我的博客
本文檔旨在提供一些常用的 OpenBMCrecipe 客制化任務,本文只是對 原始文檔 的部分翻譯,不一定貼合實際情況,需要實事求是。

構建一個指定的機型配置

如果你希望構建一個不同的系統配置:

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 程序,但是使用的卻是 PPCx86 系統,可以構建 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.linuxgit 的克隆
    • git2/github.com.openbmc.linux.done 已經克隆的標識

BitBake 在編譯過程中,將會提取代碼到工作目錄,因此 downloads 目錄可以被系統上的不同構建所共享:

  • 通過修改 build/conf/local.conf 文件來設置 BitBakeDL_DIR 變量到你的共享下載目錄
    DL_DIR ?= "path_to_existing_downloads"
    
  • 創建一個鏈接
    ln -sf path_to_existing_downloads build/downloads
    

然后再進行編譯,這樣會因為無需下載代碼而節省很多時間。

使用 git 代理

如果你在中國,那么可能會因為網絡原因,在下載過程中崩潰,可以使用 git 代理來加速代碼獲取。
可以 google git-proxy-wrapper 找到合適的 git 協議代理。

devtool

devtoolYocto 中方便的工具,來對本地目錄做出修改,通常的使用方法是:

# 在工作區中構建 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 本地修改、編譯並測試的方法:

  1. 使用 devtool 提取出代碼倉庫:
    devtool modify phosphor-ipmi-host
    
    devtool 克隆倉庫到 build/workspace/sources/phosphor-ipmi-host,創建 devtool 分支
  2. 對倉庫做出修改
  3. 現在可以編譯整個固件了
    bitbake obmc-phosphor-image # build the whole image
    bitbake phosphor-ipmi-host  # build the recipe
    
  4. 為了測試做出的修改,可以燒錄整個固件,或用新的包替換原本的二進制包,注意到,修改的代碼編譯為 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
    
  5. 現在你可以看到你做出的修改的內容了

開發 linux 內核

使用 devtool 開發 linux 內核

開發內核也可以使用 devtool 工具,當然會有一些不同點。
注意: 在新的 ac72846 中內核名修改稱為 linux-aspeed,依據不同的版本靈活使用 linux-obmclinux-aspeed

  1. devtool 不會創建 devtool 分支,它會檢出 recipe 中指定的分支
  2. 如果有補丁,devtool 會直接將它們打到分支上
  3. devtool 復制 defconfg 以及 machine-specific configoe-workdir
  4. 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 為例:

  1. build/tmp/deploy/images/romulus/fitImage-obmc-phosphor-initramfs-romulus.bin 到一個 tftp 服務器,將它名命為 fitImage
  2. 重啟 BMC 並進入 uboot
  3. 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 啟動
    

現在你運行了新的內核了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM