1# OpenBMC Development Environment 2 3**Document Purpose:** How to set up an OpenBMC development environment 4 5**Audience:** Programmer familiar with Linux and BMCs 6 7**Prerequisites:** Current Linux, Mac, or Windows system 8 9## Overview 10 11OpenBMC uses the [Yocto](https://www.yoctoproject.org/) Project as its 12underlying building and distribution generation framework. The main 13OpenBMC [README](https://github.com/openbmc/openbmc/blob/master/README.md) 14provides information on getting up and going with Yocto and OpenBMC. 15There are mechanisms to use this process to build your changes but it can be 16slow and cumbersome for initial debug and validation of your software. This 17guide focuses on how to test new changes quickly using the OpenBMC Software 18Development Kit (SDK) and [QEMU](https://www.qemu.org/). 19 20The SDK is a group of packages that are built during a BitBake operation. 21BitBake is the tool used to build Yocto based distributions. The SDK provides 22all required libraries and cross compilers to build OpenBMC applications. The 23SDK is not used to build entire OpenBMC flash images, it provides a mechanism to 24compile OpenBMC applications and libraries that you can then copy onto a running 25system for testing. 26 27QEMU is a software emulator that can be used to run OpenBMC images. 28 29This doc walks through the recommended steps for setting up an OpenBMC 30development environment and installing the needed SDK. 31 32For testing purposes, this guide uses the Romulus system as the default because 33this is the system tested for each CI job, which means it's the most stable. 34 35## Install Linux Environment 36 37If you are running Linux, and are ok with installing some additional packages, 38then you can skip to step 3. 39 40The recommended OpenBMC development environment is the latest Ubuntu LTS 41release. Other versions of Linux may work but you are using that at your own 42risk. If you have Windows or Mac OS then VirtualBox is the recommended 43virtualization tool to run the development environment. 44 451. Install either [VirtualBox](https://www.virtualbox.org/wiki/Downloads) or 46[VMware](https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html) 47onto your computer (Mac, Windows, Linux) 48 49 Both have free versions available for what you need. VirtualBox is what the 50 majority of core OpenBMC development is using. **Note:** If you want to use 51 this VM to BitBake a full OpenBMC image, you'll want to allocate as many 52 resources as possible. Ideal minimum resources are 8 threads, 16GB memory, 53 200GB hard drive. Just using for SDK builds and QEMU should work fine with the 54 normal defaults on a VM. 55 562. Install the latest Ubuntu LTS release 57 58 The majority of OpenBMC development community uses Ubuntu. The qemu below 59 is built on [18.04](http://releases.ubuntu.com/18.04/) but whatever is most 60 recent *should* work. The same goes for other Linux distributions like 61 Fedora but again, these are not tested nearly as much by the core OpenBMC 62 team as Ubuntu. 63 64 **VirtualBox Tips** - You'll want copy/paste working between your VM and Host. 65 To do that, once you have your VM up and running: 66 - Devices -> Insert Guest Additions CD Image (install) 67 - Devices -> Shared Clipboard -> Bidirectional 68 - reboot (the VM) 69 703. Install required packages 71 72 Refer to 73 [Prerequisite](https://github.com/openbmc/openbmc/blob/master/README.md#1-prerequisite) 74 link. 75 76 **Note** - In Ubuntu, a "sudo apt-get update" will probably be needed before 77 installing the packages. 78 79## Download and Install SDK 80 81The OpenBMC Software Development Kit (SDK) contains a cross-toolchain and a set 82libraries for working on OpenBMC applications. The SDK is installed on the 83machine you will use to develop applications for OpenBMC and not on the BMC 84itself. 85 86Generally, SDKs for one BMC cannot be used for developing software for other 87BMCs. This can be due to platform ABI, libc or kernel differences, or any other 88number of choices made in the configuration of the firmware. 89 90Romulus is the BMC platform used for the purpose of this walk-through. 91 92To begin working with the SDK: 93 941. Download the latest SDK to your system. It's recommended that you create a 95 directory to store your SDK scripts and installation directories to keep your 96 workspace organised. 97 98 ``` 99 mkdir -p ~/sdk 100 cd ~/sdk 101 102 wget https://jenkins.openbmc.org/job/latest-master-sdk/label=docker-builder,target=romulus/lastSuccessfulBuild/artifact/deploy/sdk/oecore-x86_64-arm1176jzs-toolchain-nodistro.0.sh 103 chmod u+x oecore-x86_64-arm1176jzs-toolchain-nodistro.0.sh 104 ``` 105 1062. Install the SDK 107 108 Choose an appropriate location and name. It's a good idea to include the date 109 and system supported by that SDK in the directory name. For example: 110 111 ``` 112 mkdir -p ~/sdk/romulus-`date +%F` 113 ``` 114 115 Run the following command to install the SDK. When command asks you to 116 "Enter target directory for SDK", enter the directory you created in the 117 previous step. 118 119 ``` 120 ./oecore-x86_64-arm1176jzs-toolchain-nodistro.0.sh 121 ``` 122 123 The installation script will indicate progress and give completion messages 124 like this: 125 ``` 126 SDK has been successfully set up and is ready to be used. 127 Each time you wish to use the SDK in a new shell session, you need to source 128 the environment setup script e.g. $ . /...path-to-sdk.../environment-setup-arm1176jzs-openbmc-linux-gnueabi 129 ``` 130 1313. Source yourself into the SDK 132 133 Ensure no errors. The command to do this will be provided at the end of 134 installation. To make your shell use the new SDK environment, you must source 135 its `environment-setup` script which was created in the previous step. You 136 may wish to save the required command, for example, cut/paste the text above 137 into a README. 138 139That's it, you now have a working development environment for OpenBMC! 140 141## Download and Start QEMU Session 142 1431. Download latest openbmc/qemu fork of QEMU application 144 145 ``` 146 wget https://jenkins.openbmc.org/job/latest-qemu-x86/lastSuccessfulBuild/artifact/qemu/build/qemu-system-arm 147 148 chmod u+x qemu-system-arm 149 ``` 150 1512. Download the Romulus image. 152 153 ``` 154 wget https://jenkins.openbmc.org/job/latest-master/label=docker-builder,target=romulus/lastSuccessfulBuild/artifact/openbmc/build/tmp/deploy/images/romulus/obmc-phosphor-image-romulus.static.mtd 155 ``` 156 1573. Start QEMU with downloaded Romulus image 158 159 **Note** - For REST, SSH and IPMI to work into your QEMU session, you must connect 160 up some host ports to the REST, SSH and IPMI ports in your QEMU session. In this 161 example, it just uses 2222, 2443, 2623. You can use whatever you prefer. 162 ``` 163 ./qemu-system-arm -m 256 -M romulus-bmc -nographic -drive file=./obmc-phosphor-image-romulus.static.mtd,format=raw,if=mtd -net nic -net user,hostfwd=:127.0.0.1:2222-:22,hostfwd=:127.0.0.1:2443-:443,hostfwd=udp:127.0.0.1:2623-:623,hostname=qemu 164 ``` 165 166 **Note** - By default, Jenkins and openbmc-test-automation use SSH and HTTPS 167 ports 22 and 443, respectively. For the IPMI port 623 is used. SSH connection 168 to use a user-defined port 2222 might not be successful. To use SSH port 22, 169 HTTPS port 443 and IPMI port 623: 170 ``` 171 ./qemu-system-arm -m 256 -machine romulus-bmc -nographic -drive file=./obmc-phosphor-image-romulus.static.mtd,format=raw,if=mtd -net nic -net user,hostfwd=:127.0.0.1:22-:22,hostfwd=:127.0.0.1:443-:443,hostfwd=tcp:127.0.0.1:80-:80,hostfwd=tcp:127.0.0.1:2200-:2200,hostfwd=udp:127.0.0.1:623-:623,hostfwd=udp:127.0.0.1:664-:664,hostname=qemu 172 ``` 173 1744. Wait for your QEMU-based BMC to boot 175 176 Login using default root/0penBmc login (Note the 0 is a zero). 177 1785. Check the system state 179 180 You'll see a lot of services starting in the console, you can start running 181 the obmcutil tool to check the state of the OpenBMC state services. When you 182 see the following then you have successfully booted to "Ready" state. 183 184 ``` 185 root@openbmc:~# obmcutil state 186 CurrentBMCState : xyz.openbmc_project.State.BMC.BMCState.Ready 187 CurrentPowerState : xyz.openbmc_project.State.Chassis.PowerState.Off 188 CurrentHostState : xyz.openbmc_project.State.Host.HostState.Off 189 ``` 190 191 **Note** To exit (and kill) your QEMU session run: `ctrl+a x` 192 193## Alternative yocto QEMU 194 195 yocto has tools for building and running qemu. These tools avoid some of the 196 configuration issues that come from downloading a prebuilt image, and 197 modifying binaries. Using yocto qemu also uses the [TAP 198 interface](https://www.kernel.org/doc/Documentation/networking/tuntap.txt) 199 which some find be more stable. This is particularly useful when debugging 200 at the application level. 201 202 - set up a bmc build environment 203 ``` 204 source setup romulus myBuild/build 205 ``` 206 - add the qemu x86 open embedded machine for testing 207 ``` 208 MACHINE ??= "qemux86" 209 ``` 210 - Make the changes to the build (ie devtool modify bmcweb, devtool add gdb) 211 ``` 212 devtool modify bmcweb myNewLocalbmcweb/ 213 ``` 214 - build open bmc for the qemu x86 machine 215 ``` 216 MACHINE=qemux86 bitbake obmc-phosphor-image 217 ``` 218 - run qemu they way yocto provides 219 ``` 220 runqemu myBuild/build/tmp/deploy/images/qemux86/ nographic \ 221 qemuparams="-m 2048" 222 ``` 223 - after that the all the a TAP network interface is added, and protocol like 224 ssh, scp, http work well. 225 226 227