Be aware: the master branch, from release 2021.11 on contains upgraded software components that break backwards compatibility with most machine builds and require a Debian 10 build environment. For clarity, a list of ONIE branches and build environments for all machine targets is maintained here: onie/build-config/scripts/onie-build-targets.json
For some context about the upgrade process, see the 2021 ONIE Status Update
Machine targets that have not yet been upgraded for the master branch, can still be built from the 2021.08 release branch or the Debian9BuildEnvironment tag by using a Debian 9 build environment. This process can be made much easier by using a Docker container - see below.
ONIE build environments can be either configured directly on the host machine (see “Preparing a New Build Machine” below) or run in Docker containers for systems that have either docker.io (from Debian) or docker-ce (from Docker) installed.
The latter approach is preferred, as building ONIE will require build environments based off of Debian 10 Buster for the 2021.11 release on, or Debian 9 Stretch for backwards compatible builds before the 2021.08 release,
Since developing while logged in to a Docker container can be frustrating, in that a developer’s configuration isn’t present, host file systems have to be explicitly mounted to save files, etc, ONIE build images are available with Dedicated User Environment DUE
DUE is the recommended environment for building ONIE as it has been used for debug and release generation since 2019.
This MIT licensed open source project can create Docker (or Podman) ONIE build environments from different Debian releases, and preserves the user’s identity and home directory while running them, creating the experience of very little changing from a developers native environment. Additionally, users will be building in the same environment that has been used to build ONIE releases, vastly simplifying the process of debugging build issues.
While DUE is available via apt in Debian 11 Bullseye, the source code https://github.com/cumulusnetworks/DUE can be run from its checkout directory on Red Hat and Ubuntu systems as well.
To get started with DUE, configuration instructions can be found at ONIE build environment creation example, and there is a video tutorial available at this YouTube link.
If you want to use Docker containers without DUE, the ONIE project provides a Debian build environment as a Docker image. For more info, see the Docker image README.
That is a good starting point, but for long term development you may
want to install the development packages natively on your system.
Have a look at the top-level Makefile
and the
$(DEBIAN_BUILD_HOST_PACKAGES)
variable. Then install the
corresponding packages for your distribution that provide the same
tools.
The ONIE build environment requires a number of standard development packages.
For a Debian-based system, a Makefile target exists that installs the required packages on your build machine.
For other distributions, a Debian Docker image is available to use as a starting point.
The ONIE project maintains a Makefile target for the current stable
version of Debian. This target requires the use of sudo(8)
, since
package installation requires root privileges:
$ cd build-config
$ sudo apt-get update
$ sudo apt-get install build-essential
$ make debian-prepare-build-host
The user account for compiling ONIE must have /sbin
and /usr/sbin
in the $PATH
environment variable. As an example, when using the
bash
shell add the following near the end of $HOME/.bashrc
:
export PATH="/sbin:/usr/sbin:$PATH"
In order to compile ONIE for a particular platform, you need the
platform’s machine definition, located in
$ONIE_ROOT/machine/<vendor>/<vendor>_<model>
.
See the INSTALL file in machine/<vendor>/<vendor>_<model>
for
additional information about a particular platform.
The ONIE build process generates and uses a cross-compiling toolchain based on gcc and uClibc. The crosstool-NG project is used to manage the build of the toolchain.
A number of packages are downloaded from the Internet by the ONIE
build process and cached for subsequent builds. You can set up your
own local mirror for these packages by setting up
onie/build-config/local.make
. See the sample file,
onie/build-config/local.make.example
, and the ONIE_MIRROR
and
CROSSTOOL_ONIE_MIRROR
variables for examples.
Also see the FAQ entry What is the easiest way to set up a build environment?.
To compile ONIE, first change directories to build-config
and then
type make MACHINEROOT=../machine/<vendor> MACHINE=<vendor>_<model>
all
, specifying the target machine. For example:
$ cd build-config
$ make -j4 MACHINEROOT=../machine/<vendor> MACHINE=<vendor>_<model> all
When complete, the following ONIE binaries are created in the build/images
directory:
File | Purpose |
---|---|
onie-<platform>-<revision>.bin | Raw binary, suitable for NOR flash programming |
onie-updater-<platform>-<revision> | ONIE updater, for use with the ONIE update mechanism |
See the INSTALL
file in machine/<platform>
for additional information
about how to install the ONIE binary on a particular platform.
The ONIE source code layout is as follows:
onie
├── build
│ └── docs
│ ├── doctrees
│ └── html
├── build-config
│ ├── arch
│ ├── conf
│ ├── make
│ └── scripts
├── contrib
│ └── onie-server
├── demo
├── docs
├── installer
├── machine
│ └──<platform>
│ ├── demo
│ ├── kernel
│ ├── test
│ └── u-boot
├── patches
│ ├── busybox
│ ├── crosstool-NG
│ ├── e2fsprogs
│ ├── kernel
│ └── u-boot
├── rootconf
│ └── default
│ ├── bin
│ ├── etc
│ │ ├── init.d
│ │ ├── rc3.d
│ │ └── rcS.d
│ ├── root
│ ├── sbin
│ └── scripts
├── test
│ ├── bin
│ ├── lib
│ └── tests
└── upstream
Directory | Purpose |
---|---|
build/docs | The final documentation is placed here. |
build-config | Builds are launched from this directory. The main Makefile is here. |
build-config/arch | Contains configurations for CPU architectures. |
build-config/conf | Contains configurations common to all platforms. |
build-config/make | Contains makefile fragments included by the main Makefile. |
build-config/scripts | Scripts used by the build process. |
contrib/onie-server | A standalone DHCP+HTTP Python-based server for simple installs. |
demo | A sample ONIE-compliant installer and OS. See README.demo for details. |
docs | What you are reading now. |
installer | Files for building an ONIE update installer. |
machine | Contains platform-specific machine definition files. More details below. |
patches | Patch sets applied to upstream projects, common to all platforms. |
rootconf | Files copied into the final sysroot image. The main ONIE discovery
and execution application lives here. More details below. |
test/bin | Contains the ONIE testing harness (Python unit test-based). |
test/lib | Common Python classes for writing ONIE tests. |
test/tests | ONIE tests. |
upstream | Local cache of upstream project tarballs. |
The machine
directory layout is as follows:
onie/machine
└── <vendor>
└── <vendor>_<model>
├── demo
│ └── platform.conf
├── INSTALL
├── kernel
│ ├── config
│ ├── platform-<platform>.patch
│ └── series
├── machine.make
├── onie-rom.conf
└── u-boot
├── platform-<platform>.patch
└── series
The machine/nxp/nxp_p2020rbdpca directory contains all the files necessary to build ONIE for the NXP P2020RBD-PCA reference platform.
File | Purpose |
---|---|
demo/platform.conf | Platform-specific codes for creating the demo OS. |
INSTALL | Platform-specific ONIE installation instructions. |
kernel/config | Additional kernel config appended to the core kernel config. |
kernel/platform-<platform>.patch | Kernel platform-specific patch(es). |
kernel/series | List of kernel platform-specific patch(es) in order. |
machine.make | Platform-specific makefile. |
onie-<platform>-rom.conf | Layout of the ONIE binary image(s). |
u-boot/platform-<platform>.patch | U-Boot platform-specific patch(es). |
u-boot/series | List of U-Boot platform-specific patch(es) in order. |
rootconf
Directory¶The rootconf
directory layout is as follows:
onie/rootconf
├── default
│ ├── bin
│ │ ├── discover
│ │ ├── exec_installer
│ │ ├── onie-nos-install
│ │ ├── onie-console
│ │ ├── support
│ │ ├── uninstaller
│ │ ├── onie-self-update
│ │ └── onie-stop
│ ├── etc
│ │ ├── init.d
│ │ │ ├── discover.sh
│ │ │ ├── dropbear.sh
│ │ │ ├── makedev.sh
│ │ │ ├── networking.sh
│ │ │ ├── rc
│ │ │ ├── rc.local
│ │ │ ├── syslogd.sh
│ │ │ └── telnetd.sh
│ │ ├── inittab
│ │ ├── issue
│ │ ├── issue.null
│ │ ├── mtab
│ │ ├── passwd
│ │ ├── profile
│ │ ├── rc3.d
│ │ │ ├── S10dropbear.sh -> ../init.d/dropbear.sh
│ │ │ ├── S10telnetd.sh -> ../init.d/telnetd.sh
│ │ │ └── S50discover.sh -> ../init.d/discover.sh
│ │ ├── rcS.d
│ │ │ ├── S01makedev.sh -> ../init.d/makedev.sh
│ │ │ ├── S05rc.local -> ../init.d/rc.local
│ │ │ ├── S10networking.sh -> ../init.d/networking.sh
│ │ │ └── S20syslogd.sh -> ../init.d/syslogd.sh
│ │ └── syslog.conf
│ ├── root
│ ├── sbin
│ │ └── boot-failure
│ └── scripts
│ ├── functions
│ ├── udhcp4_net
│ └── udhcp4_sd
└── install
The contents of the default
directory are copied to the sysroot
verbatim during the build process.
File | Purpose |
---|---|
bin/discover | Image discovery script. Feeds into exec_installer . |
bin/exec_installer | Downloads and executes an installer image. |
bin/onie-nos-install | CLI for explicitly specifying an NOS URL to use for the install. |
bin/support | CLI that generates a tarball of useful system information. |
bin/uninstaller | Executed during uninstall operations. |
bin/onie-self-update | CLI for explicit specifying an ONIE update URL to use for the install. |
bin/onie-stop | CLI for disabling discovery mode. Terminates the discovery process. |
etc/init.d | Various initialization scripts. |
etc/inittab | Standard Linux initialization script. |
etc/issue | Standard Linux logon customization file. |
etc/mtab | Standard Linux file listing mounted file systems. |
etc/passwd | Standard Linux database file listing users authorized to access the system. |
etc/profile | Standard Linux file listing users of the system. |
etc/rcS.d/S01makedev.sh | Creates the usual Linux kernel devices and file systems. |
etc/rcS.d/S05rc.local | Standard Linux script to start rc.local . |
etc/rcS.d/S10networking.sh | Brings up the Ethernet management interface. |
etc/rcS.d/S20syslogd.sh | Starts the syslogd service. |
etc/rc3.c/S10dropbear.sh | Starts the dropbear SSH service. |
etc/rc3.d/S10telnetd.sh | Starts the telnet service. |
etc/rc3.d/S50discover.sh | Starts the ONIE discovery service. |
install | The installer file. |
scripts | General helper scripts, sourced by other scripts. |