diff options
author | Andrew Geissler <geissonator@yahoo.com> | 2018-09-26 16:15:34 -0500 |
---|---|---|
committer | Gunnar Mills <gmills@us.ibm.com> | 2018-10-25 18:51:03 +0000 |
commit | a69423d9b213d55b7380610ff4a49253f4d52b24 (patch) | |
tree | 11c2072f480d1537c64dbc4251c20d73ec2ea892 | |
parent | 84ef2aa26ed0fec5159532279becbcf19a7975df (diff) | |
download | openbmc-docs-a69423d9b213d55b7380610ff4a49253f4d52b24.tar.gz openbmc-docs-a69423d9b213d55b7380610ff4a49253f4d52b24.zip |
dev-doc: Tutorial on adding a new system
Walk through the process of adding a new system
layer in Yocto and customizing it
Change-Id: I740ecdee6a143675859b2b32ed9cf39d711bad66
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
-rw-r--r-- | development/add-new-system.md | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/development/add-new-system.md b/development/add-new-system.md new file mode 100644 index 0000000..f46bbc1 --- /dev/null +++ b/development/add-new-system.md @@ -0,0 +1,265 @@ +# Add a New System to OpenBMC + +**Document Purpose:** How to add a new system to the OpenBMC distribution + +**Audience:** Programmer familiar with OpenBMC + +**Prerequisites:** Completed Development Environment Setup [Document][1] + +## Overview + +This document will describe the following: + +* Review background about Yocto and BitBake +* Creating a new system layer +* Populating this new layer +* Building the new system and testing in QEMU + +## Background + +The OpenBMC distribution is based on [Yocto](https://www.yoctoproject.org/). +Yocto is a project that allows developers to create custom Linux distributions. +OpenBMC uses Yocto to create their embedded Linux distribution to run on +a variety of devices. + +Yocto has a concept of hierarchical layers. When you build a Yocto-based +distribution, you define a set of layers for that distribution. OpenBMC uses +many common layers from Yocto as well as some of its own layers. The layers +defined within OpenBMC can be found with the meta-* directories in OpenBMC +[GitHub](https://github.com/openbmc/openbmc). + +Yocto layers are a combination of different files that define packages to +incorporate in that layer. One of the key file types used in these layers is +[BitBake](https://github.com/openembedded/bitbake/blob/master/README) recipes. + +BitBake is a fully functional language in itself. For this lesson, we will +focus on only the aspects of BitBake required to understand the process of +adding a new system. + +## Start the Initial BitBake + +For this work, you will need to have allocated at least 100GB of space to your +development environment and as much memory and CPU as possible. The initial +build of an OpenBMC distribution can take hours. Once that first build is done +though, future builds will use cached data from the first build, speeding the +process up by orders of magnitude. + +So before we do anything else, let's get that first build going. + +Follow the direction on the OpenBMC GitHub [page](https://github.com/openbmc/openbmc/blob/master/README.md#2-download-the-source) +for the Romulus system (steps 2-4). + +## Create a New System + +While the BitBake operation is going above, let's start creating our new system. +Similar to previous lessons, we'll be using Romulus as our reference. Our new +system will be called romulus-prime. + +From your openbmc repository you cloned above, the Romulus layer is defined +within `meta-ibm/meta-romulus/`. The Romulus layer is defined within the +`conf` subdirectory. Under `conf` you will see a layout like this: + +``` +meta-ibm/meta-romulus/conf/ +├── bblayers.conf.sample +├── conf-notes.txt +├── layer.conf +├── local.conf.sample +└── machine + └── romulus.conf +``` + +To create our new romulus-prime system we are going to start out by copying +our romulus layer. +``` +cp -R meta-ibm/meta-romulus meta-ibm/meta-romulus-prime +``` + +Let's review and modify each file needed in our new layer + +1. meta-ibm/meta-romulus-prime/conf/bblayers.conf.sample + + This file defines the layers to pull into the meta-romulus-prime + distribution. You can see in it a variety of Yocto layers (meta, meta-poky, + meta-openembedded/meta-oe, ...). It also has OpenBMC layers like + meta-phosphor, meta-openpower, meta-ibm, and meta-ibm/meta-romulus. + + The only change you need in this file is to change the two instances of + meta-romulus to meta-romulus-prime. This will ensure your new layer is used + when building your new system. + +2. meta-ibm/meta-romulus-prime/conf/conf-notes.txt + + This file simply states the default target the user will build when working + with your new layer. This remains the same as it is common for all OpenBMC + systems. + +3. meta-ibm/meta-romulus-prime/conf/layer.conf + + The main purpose of this file is to tell BitBake where to look for recipes + (\*.bb files). Recipe files end with a `.bb` extension and are what contain + all of the packaging logic for the different layers. `.bbappend` files are + also recipe files but provide a way to append onto `.bb` files. + `.bbappend` files are commonly used to add or remove something from a + corresponding `.bb` file in a different layer. + + The only change you need in here is to find/replace the "romulus-layer" to + "romulus-prime-layer" + +4. meta-ibm/meta-romulus-prime/conf/local.conf.sample + + This file is where all local configuration settings go for your layer. The + documentation in it is well done and it's worth a read. + + The only change required in here is to change the `MACHINE` to + `romulus-prime`. + +5. meta-ibm/meta-romulus-prime/conf/machine/romulus.conf + + This file describes the specifics for your machine. You define the kernel + device tree to use, any overrides to specific features you will be pulling + in, and other system specific pointers. This file is a good reference for + the different things you need to change when creating a new system (kernel + device tree, MRW, LED settings, inventory access, ...) + + The first thing you need to do is rename the file to `romulus-prime.conf`. + + **Note** If our new system really was just a variant of Romulus, + with the same hardware configuration, then we could have just created a + new machine in the Romulus layer. Any customizations for that system + could be included in the corresponding .conf file for that new machine. For + the purposes of this exercise we are assuming our romulus-prime system has + at least a few hardware changes requiring us to create this new layer. + +## Build New System + +This will not initially compile but it's good to verify a few things from the +initial setup are done correctly. + +Do not start this step until the build we started at the beginning of this +lesson has completed. + +1. Modify the conf for your current build + + Within the shell you did the initial "bitbake" operation you need to reset + the conf file for your build. You can manually copy in the new files or just + remove it and let BitBake do it for you: + ``` + cd .. + rm -r ./build/conf + export TEMPLATECONF=meta-ibm/meta-romulus-prime/conf + . openbmc-env + ``` + + Run your "bitbake" command. + +2. Nothing RPROVIDES 'romulus-prime-config' + + This will be your first error after running "bitbake obmc-phosphor-image" + against your new system. + + The openbmc/skeleton repository was used for initial prototyping of OpenBMC. + Within this repository is a [configs](https://github.com/openbmc/skeleton/tree/master/configs) directory. + + The majority of this config data is no longer used but until it is all + completely removed, you need to provide it. + + Since this repository and file are on there way out, we'll simply do a quick + workaround for this issue. + + Create a config files as follows: + ``` + cp meta-ibm/meta-romulus-prime/recipes-phosphor/workbook/romulus-config.bb meta-ibm/meta-romulus-prime/recipes-phosphor/workbook/romulus-prime-config.bb + + vi meta-ibm/meta-romulus-prime/recipes-phosphor/workbook/romulus-prime-config.bb + + SUMMARY = "Romulus board wiring" + DESCRIPTION = "Board wiring information for the Romulus OpenPOWER system." + PR = "r1" + + inherit config-in-skeleton + + #Use Romulus config + do_make_setup() { + cp ${S}/Romulus.py \ + ${S}/obmc_system_config.py + cat <<EOF > ${S}/setup.py + from distutils.core import setup + + setup(name='${BPN}', + version='${PR}', + py_modules=['obmc_system_config'], + ) + EOF + } + + ``` + + Re-run your "bitbake" command. + +3. Fetcher failure for URL: file://romulus.cfg + + This is the config file required by the kernel. It's where you can put some + additional kernel config parameters. For our purposes here, just modify + romulus-prime to use the romulus.cfg file. We just need to add the `-prime` + to the prepend path. + ``` + vi ./meta-ibm/meta-romulus-prime/recipes-kernel/linux/linux-aspeed_%.bbappend + + FILESEXTRAPATHS_prepend_romulus-prime := "${THISDIR}/${PN}:" + SRC_URI += "file://romulus.cfg" + ``` + + Re-run your "bitbake" command. + +4. No rule to make target arch/arm/boot/dts/aspeed-bmc-opp-romulus-prime.dtb + + The .dtb file is a device tree blob file. It is generated during the Linux + kernel build based on its corresponding .dts file. When you introduce a + new OpenBMC system, you need to send these kernel updates upstream. The + linked email [thread](https://lists.ozlabs.org/pipermail/openbmc/2018-September/013260.html) + is an example of this process. Upstreaming to the kernel is a lesson in + itself. For this lesson, we will simply use the Romulus kernel config files. + ``` + vi ./meta-ibm/meta-romulus-prime/conf/machine/romulus-prime.conf + # Replace the ${MACHINE} variable in the KERNEL_DEVICETREE + + # Use romulus device tree + KERNEL_DEVICETREE = "${KMACHINE}-bmc-opp-romulus.dtb" + ``` + + Re-run your "bitbake" command. + +## Boot New System + +And you've finally built your new system's image! There are more +customizations to be done but let's first verify what you have boots. + +Your new image will be in the following location from where you ran your +"bitbake" command: +``` +./tmp/deploy/images/romulus-prime/obmc-phosphor-image-romulus-prime.static.mtd +``` +Copy this image to where you've set up your QEMU session and re-run the +command to start QEMU (`qemu-system-arm` command from +[dev-environment.md][1]), giving your new file as input. + +Once booted, you should see the following for the login: +``` +romulus-prime login: +``` + +There you go! You've done the basics of creating, booting, and building a new +system. This is by no means a complete system but you now have the base for +the customizations you'll need to do for your new system. + +## Further Customizations + +There are a lot of other areas to customize when creating a new system. +We'll dig into more detail with these (IPMI, HWMON, LED) in future +development guides. + +Although not in the same format as these guides, [Porting_Guide](https://github.com/mine260309/openbmc-intro/blob/master/Porting_Guide.md) +provides a lot of very useful information as well on adding a new system. + +[1]: https://github.com/openbmc/docs/blob/master/development/dev-environment.md |