mirror of
https://github.com/clearlinux/clear-linux-documentation.git
synced 2026-09-04 21:01:33 +00:00
In Example 7: - Remove 'tutorial' subsection as it was not clear that it was an example of the advanced example of manual format bump. - Roll existing tutorial content under 'advanced' as it is the advanced example. - Result is a basic and advance example for Example 7: execute format bump Signed-off-by: Kristal Dale <kristal.dale@intel.com>
1113 lines
38 KiB
ReStructuredText
1113 lines
38 KiB
ReStructuredText
.. _mixer:
|
||
|
||
mixer
|
||
#####
|
||
|
||
**mixer** is the tool used by the |CL-ATTR| team to generate official update
|
||
content and releases. The update content generated by mixer is then consumed
|
||
by swupd on a downstream client. The same mixer tool is available as part of
|
||
|CL| to create your own customized update content and releases.
|
||
|
||
.. contents::
|
||
:local:
|
||
:depth: 1
|
||
|
||
Description
|
||
***********
|
||
|
||
mixer uses the following sources as inputs to generate update content:
|
||
|
||
* Upstream |CL| bundles with their corresponding RPM packages
|
||
* Locally-defined bundles with their corresponding local RPM packages
|
||
* Locally-defined bundles with upstream RPM packages
|
||
|
||
Using the mixer tool, you select which set of content from these sources
|
||
will be part of your update. You can select content from each of these sources to make a unique combination of functionality for your custom update content, known as a **mix**.
|
||
|
||
The update content that mixer generates consists of various pieces of OS
|
||
content, update metadata, as well as a complete image. The OS content
|
||
includes all files in an update, as well as zero- and delta-packs for improved update performance. The update metadata, stored as manifests, describes all of the bundle information for the update. Update content produced by mixer is then published to a web server and consumed by clients via :command:`swupd`. Refer to :ref:`swupd <swupd-guide>` for additional information regarding updates and update content.
|
||
|
||
How it works
|
||
************
|
||
|
||
Learn the mixer tool set up and workflow.
|
||
|
||
.. contents::
|
||
:local:
|
||
:depth: 1
|
||
|
||
Prerequisites
|
||
=============
|
||
|
||
* :command:`mixer` bundle
|
||
|
||
Add the mixer tool by installing the :command:`mixer` bundle. Refer to
|
||
:ref:`swupd-guide` for more information on installing bundles.
|
||
|
||
* Docker\* container
|
||
|
||
mixer by default runs all build commands in a Docker container to ensure
|
||
the correct tool versions are used. This also allows custom mixes to
|
||
automatically perform downstream format bumps when the upstream releases a
|
||
format bump. See `Format version`_ for additional information regarding
|
||
format bumps.
|
||
|
||
Refer to `Configure and enable Docker`_ for instruction.
|
||
|
||
* Docker proxy (optional)
|
||
|
||
If you use a proxy server, you must set your proxy environment variables and
|
||
create a proxy configuration file for the Docker daemon and container.
|
||
|
||
Consult your IT department for the correct values if you are behind a
|
||
corporate proxy.
|
||
|
||
Refer to `Configure Docker proxy info`_ for instruction.
|
||
|
||
* Location to host the update content and images
|
||
|
||
In order for :command:`swupd` to make use of your mix, the update content for your mix must be hosted on a web server. Your mix will be configured with an update location URL, which :command:`swupd` will use to pull down updates.
|
||
|
||
Refer to `Set up a nginx web server for mixer`_ for an simple example of
|
||
setting up an update location.
|
||
|
||
Mix setup
|
||
==========
|
||
|
||
Follow these steps to create and initialize the mixer workspace. Complete
|
||
the setup before you create a mix.
|
||
|
||
#. Create workspace.
|
||
|
||
The mixer tool uses a simple workspace to contain all input and output in a
|
||
basic directory structure. The workspace is simply an empty folder from
|
||
which you execute the mixer commands. Each mix uses its own separate
|
||
workspace.
|
||
|
||
#. Initialize the workspace and mix.
|
||
|
||
Before you create a mix, you must explicitly initialize the mixer workspace.
|
||
During initialization, the mixer workspace is configured and the base for
|
||
your mix is defined. By default, your mix is based on the latest
|
||
upstream version and starts with the minimum set of bundles. Your first custom
|
||
mix version number starts at 10. Alternatively, you can select other
|
||
versions or bundle sets from which to start.
|
||
|
||
Initialization creates the directory structure within the workspace and adds
|
||
the :file:`builder.conf` file, which is used to configure the mixer tool.
|
||
|
||
View the `mixer.init man page`_ for more information on mixer
|
||
initialization.
|
||
|
||
View the list of suitable `releases`_ from which to mix.
|
||
|
||
#. Edit builder.conf.
|
||
|
||
:file:`builder.conf` tells the mixer tool how to configure the mix. For
|
||
example, it allows you to configure where mixer output is located and where swupd update content will be located.
|
||
|
||
At minimum, set the URL of your update server so your custom OS knows where to get update content.
|
||
|
||
Refer to the `builder.conf`_ section for more information.
|
||
|
||
Create a mix
|
||
============
|
||
|
||
A mix is created with the following steps:
|
||
|
||
#. Add custom RPMs and set up local repo (optional).
|
||
|
||
If you are adding custom RPMs to your mix, you must add the RPMs to
|
||
your mix workspace and set up a corresponding local repository.
|
||
|
||
Go to the :ref:`autospec<autospec>` guide to learn to build RPMs from
|
||
scratch. If the RPMs are not built on |CL|, make sure your
|
||
configuration and toolchain builds them correctly for |CL|. Otherwise there
|
||
is no guarantee they will be compatible.
|
||
|
||
Refer to the :ref:`autospec` guide for more information on using autospec to
|
||
build RPMs.
|
||
|
||
#. Update and build bundles.
|
||
|
||
Add, edit, or remove bundles that will be part of your content and build
|
||
them. mixer automatically updates the :file:`mixbundles` file when you
|
||
update the bundles in your mix.
|
||
|
||
View the `mixer.bundle man page`_ for more information on configuring bundles
|
||
in a mix.
|
||
|
||
View the `mixer.build man page`_ for more information on building bundles.
|
||
|
||
View the `Bundles`_ section for more information on how mixer manages
|
||
bundles.
|
||
|
||
#. Create the update content.
|
||
|
||
mixer creates update content with this step. Zero-packs are created
|
||
automatically, and delta-packs can be optionally created at the same time
|
||
(for all builds after version 0).
|
||
|
||
A zero-pack is the full set of content needed to go from mix version 0
|
||
(nothing) to the mix version for which you just built content.
|
||
|
||
A delta-pack provides the content *delta* between a `PAST_VERSION` to a
|
||
`MIX_VERSION` that allows the transition from one mix version to another.
|
||
|
||
View :ref:`swupd-guide` for more information on update content.
|
||
|
||
#. Create image.
|
||
|
||
mixer creates a bootable image from your updated content using
|
||
the :ref:`ister` tool. In this step you can specify which bundles you want
|
||
*preinstalled* in the image. Users can later install other bundles available
|
||
in your mix.
|
||
|
||
#. Make update available.
|
||
|
||
Deploy update content and images to your update server.
|
||
|
||
View the `Example 5: Deploy updates to target`_ for a simple deployment
|
||
scenario.
|
||
|
||
Maintain or modify mix
|
||
======================
|
||
|
||
Update or modify your content to a new version by following the steps to
|
||
create a mix. Increment the mix version number for the next mix.
|
||
|
||
Examples
|
||
********
|
||
|
||
The following examples are designed to work together and in order. The examples
|
||
use:
|
||
|
||
* A stock installation of |CL|.
|
||
* A web server that comes with |CL| to host the content updates.
|
||
* A simple VM that updates against the locally produced content created in
|
||
Example 2.
|
||
|
||
Complete all `Prerequisites`_ before using these examples.
|
||
|
||
Example 1: Mix set up
|
||
=====================
|
||
|
||
This example shows the basic steps for the first-time setup of
|
||
mixer for a new mix.
|
||
|
||
#. Create a directory to use as a workspace for mixer:
|
||
|
||
.. code-block:: bash
|
||
|
||
mkdir ~/mixer
|
||
|
||
#. In your mixer workspace, generate an initial mix based on the latest
|
||
upstream |CL| version, with minimum bundles. In the initialization
|
||
output, be aware that your initial mix version is set to 10 and that the
|
||
minimum bundles have been added.
|
||
|
||
.. code-block:: bash
|
||
|
||
cd ~/mixer
|
||
mixer init
|
||
|
||
.. note::
|
||
|
||
If you want to add all upstream bundles in your mix,
|
||
initialize your mix as shown below.
|
||
|
||
.. code-block:: bash
|
||
|
||
mixer init --all-upstream
|
||
|
||
#. Look up your IP address:
|
||
|
||
.. code-block:: bash
|
||
|
||
networkctl status
|
||
|
||
#. Copy the IP “Address”, from above, for the next step.
|
||
|
||
.. note::
|
||
|
||
In this example, we put `mixer` and `nginx` on the same system. In a production environment, they would likely reside on different systems.
|
||
|
||
#. Edit :file:`builder.conf`. Paste the IP address from the previous step
|
||
as the value after \http:// for CONTENTURL and VERSIONURL. For example:
|
||
|
||
.. code-block:: console
|
||
|
||
CONTENTURL="http://192.168.25.52"
|
||
VERSIONURL="http://192.168.25.52"
|
||
|
||
#. `Set up a nginx web server for mixer`_.
|
||
|
||
|
||
Example 2: Create a simple mix
|
||
==============================
|
||
|
||
This example shows how to create a simple custom mix using upstream content.
|
||
We'll create an image for a QEMU virtual machine that we can use later to
|
||
test our mix.
|
||
|
||
We can use the default bundles that were added during initialization, but
|
||
these include the :command:`native-kernel` bundle that is intended to be
|
||
used on a bare metal system instead of a VM. So we will modify the default
|
||
bundle set to get a smaller kernel image, which will also be faster to load.
|
||
|
||
The only bundles available to :command:`swupd` for a given release are those
|
||
that were added to the mix during build time. A mix doesn’t automatically
|
||
inherit upstream bundles.
|
||
|
||
#. Assure that you have run `mixer init`, shown in Example 1.
|
||
|
||
#. Update bundles in mix:
|
||
|
||
.. code-block:: bash
|
||
|
||
mixer bundle remove kernel-native
|
||
mixer bundle add kernel-kvm
|
||
|
||
.. note::
|
||
The mixer bundle commands operate on the bundle description files but not on the bundle contents. To remove bundle contents and their tracking completely, follow `Example 6: Remove a bundle from client system`_, Advanced.
|
||
|
||
#. In this case, we will add the `editors` bundle from upstream, but we will
|
||
remove the :command:`joe` editor.
|
||
|
||
.. code-block:: bash
|
||
|
||
mixer bundle add editors
|
||
mixer bundle edit editors
|
||
|
||
#. Use an editor and manually remove `joe` from the bundle definition.
|
||
|
||
.. code-block:: bash
|
||
|
||
$EDITOR ./local-bundles/editors
|
||
|
||
#. List the bundles in the mix again to confirm removal of :command:`joe`.
|
||
|
||
.. code-block:: bash
|
||
|
||
mixer bundle list --tree
|
||
|
||
#. Build bundles:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo mixer build bundles
|
||
|
||
#. First, browse to web server from Example 1. The web page appears yet
|
||
has no update content. Build the update content:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo mixer build update
|
||
|
||
After that is completed, on your web server, you can see the update
|
||
content for mix version 10.
|
||
|
||
Example 3: Create an update for your mix
|
||
========================================
|
||
|
||
Next, let’s create a new version of the mix. We’ll add a new bundle.
|
||
|
||
#. Create a new version of your mix, for the live image to
|
||
update to. Increment your mix version by 10:
|
||
|
||
.. code-block:: bash
|
||
|
||
mixer versions update
|
||
|
||
#. Add the upstream :command:`curl` bundle to version 20 of the mix:
|
||
|
||
.. code-block:: bash
|
||
|
||
mixer bundle add curl
|
||
|
||
#. Build your next mix version that incorporates the new bundle.
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo mixer build bundles
|
||
sudo mixer build update
|
||
|
||
#. Optionally, you can build delta-packs, which help reduce client update
|
||
time:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo mixer build delta-packs --from 10 --to 20
|
||
|
||
Refresh your web server to see the update content for mix version 20.
|
||
|
||
You can also look in ~/mixer/update/www/<mix version> to see the update
|
||
content in your workspace.
|
||
|
||
|
||
Example 4: Build an image
|
||
=========================
|
||
|
||
This example shows how to build a bootable image containing the
|
||
:command:`kernel-kvm`, :command:`os-core`, and the :command:`os-core-update`
|
||
bundles from Example 2. Underneath, mixer uses `ister`_ to generate the
|
||
image.
|
||
|
||
#. Change directory into your mix.
|
||
|
||
#. Configure image.
|
||
|
||
Edit the ister configuration file for your image to include all of the bundles you want pre-installed in the image. If this is the first time creating an image, first get a copy of the
|
||
:file:`release-image-config.json` template file:
|
||
|
||
.. code-block:: bash
|
||
|
||
curl -O https://raw.githubusercontent.com/bryteise/ister/master/release-image-config.json
|
||
|
||
For this example, make the following revisions
|
||
:file:`release-image-config.json`:
|
||
|
||
* Set root partition size to "5G"
|
||
* Replace the "kernel-native" bundle with "kernel-kvm"
|
||
* Set the version to 10 (as an integer)
|
||
|
||
.. note::
|
||
When creating an image, select a subset of the bundles that are part of your mix. All the bundles that are *not* part of this subset are available for consumers of that image to install afterwards via swupd.
|
||
|
||
.. code-block:: bash
|
||
:linenos:
|
||
:emphasize-lines: 5,11-12
|
||
|
||
{
|
||
"DestinationType" : "virtual",
|
||
"PartitionLayout" : [ { "disk" : "release.img", "partition" : 1, "size" : "32M", "type" : "EFI" },
|
||
{ "disk" : "release.img", "partition" : 2, "size" : "16M", "type" : "swap" },
|
||
{ "disk" : "release.img", "partition" : 3, "size" : "5G", "type" : "linux" } ],
|
||
"FilesystemTypes" : [ { "disk" : "release.img", "partition" : 1, "type" : "vfat" },
|
||
{ "disk" : "release.img", "partition" : 2, "type" : "swap" },
|
||
{ "disk" : "release.img", "partition" : 3, "type" : "ext4" } ],
|
||
"PartitionMountPoints" : [ { "disk" : "release.img", "partition" : 1, "mount" : "/boot" },
|
||
{ "disk" : "release.img", "partition" : 3, "mount" : "/" } ],
|
||
"Version": 10,
|
||
"Bundles": ["kernel-kvm", "os-core", "os-core-update"]
|
||
}
|
||
|
||
#. Build the image.
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo mixer build image
|
||
|
||
The output from this step will be :file:`release.img`, which is a live
|
||
image.
|
||
|
||
Example 5: Deploy updates to target
|
||
===================================
|
||
|
||
The image created in Example 4 is directly bootable in QEMU. In this example,
|
||
we'll boot the image and verify it. Then we'll update the image from
|
||
mix version 10 to mix version 20.
|
||
|
||
#. Set up the QEMU environment.
|
||
|
||
Install the :command:`kvm-host` bundle to your |CL|:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo swupd bundle-add kvm-host
|
||
|
||
#. Get the virtual EFI firmware, download the image launch script, and make
|
||
it executable:
|
||
|
||
.. code-block:: bash
|
||
|
||
curl -O https://download.clearlinux.org/image/OVMF.fd
|
||
curl -O https://download.clearlinux.org/image/start_qemu.sh
|
||
chmod +x start_qemu.sh
|
||
|
||
#. Start your VM image (created in Example 4):
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo ./start_qemu.sh release.img
|
||
|
||
#. Log in as root and set a password.
|
||
|
||
#. To avoid adding a flag each time, enter:
|
||
|
||
.. code-block:: bash
|
||
|
||
mkdir -p /etc/swupd
|
||
cat > /etc/swupd/config << EOF
|
||
[GLOBAL]
|
||
allow_insecure_http=true
|
||
EOF
|
||
|
||
.. note:
|
||
|
||
By default, the swupd client is designed to communicate with an
|
||
*\https* server. For development purposes, the swupd client can talk to
|
||
an *\http* server if you add the flag :command:`--allow-insecure-http`.
|
||
|
||
#. Try out your mix.
|
||
|
||
Take a look at the default bundles installed in your mix:
|
||
|
||
.. code-block:: bash
|
||
|
||
swupd info
|
||
swupd bundle-list
|
||
|
||
#. List available bundles on your update server.
|
||
|
||
|
||
.. code-block:: bash
|
||
|
||
swupd bundle-list -a
|
||
|
||
#. Now we will add the :command:`editors` bundle that we modified.
|
||
|
||
.. code-block:: bash
|
||
|
||
swupd bundle-add editors
|
||
|
||
#. Try to start the :command:`joe` editor.
|
||
|
||
.. code-block:: bash
|
||
|
||
joe
|
||
|
||
It should not appear. We removed it from the original
|
||
:command:`editors` bundle.
|
||
|
||
#. Next we will update from version 10 to 20 to capture the newly
|
||
available bundles.
|
||
|
||
.. code-block:: bash
|
||
|
||
swupd check-update
|
||
swupd update
|
||
swupd bundle-list -a
|
||
|
||
#. Now your mix should be at version 20 and curl is available. Try using
|
||
curl. This will fail because curl is not yet installed:
|
||
|
||
.. code-block:: console
|
||
|
||
curl: command not found
|
||
To install curl use: swupd bundle-add curl
|
||
|
||
#. Add the new bundle from your update server to your VM. Retry curl.
|
||
It works!
|
||
|
||
.. code-block:: bash
|
||
|
||
swupd bundle-add curl
|
||
curl -O https://download.clearlinux.org/image/start_qemu.sh
|
||
|
||
#. Shutdown your VM:
|
||
|
||
.. code-block:: bash
|
||
|
||
poweroff
|
||
|
||
Example 6: Remove a bundle from client system
|
||
=============================================
|
||
|
||
Removing a bundle in a future release requires more steps than deleting the
|
||
bundle description file, as shown in Example 2. After a bundle is built in
|
||
the mix, you must assure all of the files that are part of the bundle are
|
||
removed from the client where that bundle is installed. To do this, create a
|
||
version of this bundle in which all of its content is marked for deletion.
|
||
|
||
In the following example, we show how to remove the contents of the `editors`
|
||
bundle that we added to our mix in Example 2.
|
||
|
||
#. First update your mix version. This will set the mix to the next version.
|
||
|
||
.. code-block:: bash
|
||
|
||
mixer versions update
|
||
|
||
.. note::
|
||
Run this command every time that you want to build a new version.
|
||
|
||
#. Navigate to local-bundles:
|
||
|
||
.. code-block:: bash
|
||
|
||
cd local-bundles
|
||
|
||
#. Open the `editors` bundle with an editor and delete
|
||
**all lines** that follow after the `[MAINTAINERS]` line.
|
||
|
||
#. Afterward, it should look like this:
|
||
|
||
.. code-block:: console
|
||
|
||
# [TITLE]: editors
|
||
# [DESCRIPTION]: Run popular terminal text editors.
|
||
# [STATUS]: Active
|
||
# [CAPABILITIES]:
|
||
# [TAGS]: Tools and Utilities, Editor
|
||
# [MAINTAINER]: Developer <developer@intel.com>
|
||
|
||
#. Save and exit.
|
||
|
||
#. Next, run a build to capture recently edited bundles and update your mix.
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo mixer build all
|
||
|
||
.. note::
|
||
:command:`mixer build all` runs both :command:`mixer build bundles` and :command:`mixer build update` in one step.
|
||
|
||
At this point the new mix, version 30, is complete. All the content of the
|
||
editors bundles is marked as deleted. If any clients of this mix upgraded to
|
||
mix build version 30, the content of the editors bundle would be removed.
|
||
Note that the bundle still exists and is being tracked by :command:`swupd`,
|
||
but it contains no files.
|
||
|
||
Example 7: Execute a format bump
|
||
================================
|
||
|
||
As a maintainer of your mix, you must execute a format bump if you wish to:
|
||
|
||
* Track upstream’s format bump on your downstream derivative
|
||
* Delete any custom bundles that were added
|
||
|
||
Follow the appropriate use case below depending on your needs.
|
||
|
||
Basic
|
||
-----
|
||
|
||
If you maintain your own downstream derivative and you want to track
|
||
upstream, you need to do a format bump when one occurs on upstream. This
|
||
method helps you track the latest changes on upstream; however, it does not
|
||
change any local content that was added or deleted. For example, if you
|
||
deprecated bundles, this method will **not remove the bundle tracking**.
|
||
Refer to `Advanced`_ for help on managing your local mix and removing bundle
|
||
tracking.
|
||
|
||
In this example, we show a mix version that was initialized to upstream
|
||
version 29740 (format 27). You need to update your mix to upstream version
|
||
30700 (format 28). To do so, you will go through a format bump.
|
||
|
||
#. Change to your mix location and verify the current version of the mix and
|
||
its format.
|
||
|
||
.. code-block:: bash
|
||
|
||
mixer versions
|
||
|
||
#. Update to upstream version, which has a newer format.
|
||
|
||
.. code-block:: bash
|
||
|
||
mixer versions update --upstream-version 30700
|
||
|
||
The output will look like this:
|
||
|
||
.. code-block:: console
|
||
|
||
Old mix: 10
|
||
Old upstream: 29740 (format: 27)
|
||
|
||
New mix: 20
|
||
New upstream: 30700 (format: 28)
|
||
[...]
|
||
|
||
Read the output carefully:
|
||
|
||
* The Old mix shows the current version (10) of your mix.
|
||
|
||
* The Old upstream shows the version and format (27) on which it’s based.
|
||
|
||
* The New mix shows the new version (20) of your mix.
|
||
|
||
* The New upstream shows the version and format (28) on which it’s based.
|
||
|
||
#. Given that the format in the output differs, you need to run a
|
||
format bump:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo mixer build upstream-format --new-format 28
|
||
|
||
.. note::
|
||
|
||
You specify the :command:`--new-format` to indicate the format (28) to which you transition.
|
||
|
||
#. Your mix is now synchronized with the new format (28); however, you must
|
||
still advance to the desired or latest version.
|
||
|
||
.. code-block:: bash
|
||
|
||
mixer versions update --upstream-version 30700
|
||
|
||
Advanced
|
||
--------
|
||
|
||
To properly remove a bundle from being tracked by :command:`swupd`,
|
||
do a manual format bump. This process can also be used to perform
|
||
customizations during the update, such as:
|
||
|
||
* Adjustment in the command parameters
|
||
|
||
* Change the content of the chroot
|
||
|
||
Use the `afb.sh reference script`_ to learn how to do a manual format bump.
|
||
The :file:`afb.sh` script shows an example of how to:
|
||
|
||
* Create a mix
|
||
|
||
* Add a bundle
|
||
|
||
* Deprecate a bundle
|
||
|
||
* Do a format bump to remove the deprecated bundle
|
||
|
||
Read the comments above each line for an explanation of each step as you
|
||
execute commands. Use this same process on your mix if you need to remove a
|
||
bundle and its tracking.
|
||
|
||
|
||
|
||
.. Example: Create a mix with custom RPM
|
||
.. -------------------------------------
|
||
.. TODO future example to show copy into local-rpms...
|
||
|
||
References
|
||
**********
|
||
|
||
Reference the `mixer man page`_ for details regarding mixer commands and options.
|
||
|
||
.. contents::
|
||
:local:
|
||
:depth: 1
|
||
|
||
.. rst-class:: content-collapse
|
||
|
||
builder.conf
|
||
============
|
||
|
||
mixer initialization creates a :file:`builder.conf` that stores the basic
|
||
configuration for the mixer tool. The items of primary interest are CONTENTURL
|
||
and VERSIONURL, which will be used by systems updating against your custom
|
||
content.
|
||
|
||
.. code-block:: console
|
||
|
||
#builder.conf
|
||
|
||
#VERSION 1.0
|
||
|
||
[Builder]
|
||
CERT = "/home/clr/mix/Swupd_Root.pem"
|
||
SERVER_STATE_DIR = "/home/clr/mix/update"
|
||
VERSIONS_PATH = "/home/clr/mix"
|
||
YUM_CONF = "/home/clr/mix/.yum-mix.conf"
|
||
|
||
[Swupd]
|
||
BUNDLE = "os-core-update"
|
||
CONTENTURL = "<URL where the content will be hosted>"
|
||
VERSIONURL = "<URL where the version of the mix will be hosted>"
|
||
|
||
[Server]
|
||
DEBUG_INFO_BANNED = "true"
|
||
DEBUG_INFO_LIB = "/usr/lib/debug"
|
||
DEBUG_INFO_SRC = "/usr/src/debug"
|
||
|
||
[Mixer]
|
||
LOCAL_BUNDLE_DIR = "/home/clr/mix/local-bundles"
|
||
LOCAL_REPO_DIR = ""
|
||
LOCAL_RPM_DIR = ""
|
||
DOCKER_IMAGE_PATH = "clearlinux/mixer"
|
||
|
||
Additional explanation of variables in :file:`builder.conf` is provided in Table
|
||
1.
|
||
|
||
+-------------------------------+----------------------------------------------------------+
|
||
| **Variable** | **Explanation** |
|
||
+-------------------------------+----------------------------------------------------------+
|
||
| `CERT` | Sets the path where mixer stores the certificate file |
|
||
| | used to sign content for verification. mixer |
|
||
| | automatically generates the certificate if you do not |
|
||
| | provide the path to an existing one, and signs the |
|
||
| | :file:`Manifest.MoM` file to provide security for the |
|
||
| | updated content you create. |
|
||
| | |
|
||
| | chroot-builder uses the certificate file to sign |
|
||
| | the root :file:`Manifest.MoM` file to provide |
|
||
| | security for content verification. |
|
||
| | |
|
||
| | swupd uses this certificate to verify the |
|
||
| | :file:`Manifest.MoM` file's signature. |
|
||
| | |
|
||
| | For now, we strongly recommend that you do not modify |
|
||
| | this variable, as swupd expects a certificate with a |
|
||
| | very specific configuration to sign and verify |
|
||
| | properly. |
|
||
+-------------------------------+----------------------------------------------------------+
|
||
| `CONTENTURL` and `VERSIONURL` | Set these variables to the IP address of the web server |
|
||
| | hosting the update content. |
|
||
| | |
|
||
| | VERSIONURL is the IP address where the swupd client |
|
||
| | looks to determine if a new version is available. |
|
||
| | |
|
||
| | CONTENTURL is the location from which swupd pulls |
|
||
| | content updates. |
|
||
| | |
|
||
| | If the web server is on the same machine as the |
|
||
| | SERVER_STATE_DIR directory, you can create a symlink to |
|
||
| | the directory in your web server's document root to |
|
||
| | easily host the content. |
|
||
| | |
|
||
| | These URLs are embedded in the images created by mixer. |
|
||
+-------------------------------+----------------------------------------------------------+
|
||
| `DOCKER_IMAGE_PATH` | Sets the base name of the docker image that mixer pulls |
|
||
| | down to run builds in the proper container. |
|
||
+-------------------------------+----------------------------------------------------------+
|
||
| `LOCAL_BUNDLE_DIR` | Sets the path where mixer stores the local bundle |
|
||
| | definition files. The bundle definition files include |
|
||
| | any new, original bundles you create, along with any |
|
||
| | edited versions of upstream bundles. |
|
||
+-------------------------------+----------------------------------------------------------+
|
||
| `SERVER_STATE_DIR` | Sets the path to which mixer outputs content. By |
|
||
| | default, mixer automatically sets the path. |
|
||
+-------------------------------+----------------------------------------------------------+
|
||
| `VERSIONS_PATH` | Sets the path for the mix version and upstream version's |
|
||
| | two state files: :file:`mixversion` and |
|
||
| | :file:`upstreamversion`. mixer creates both files for |
|
||
| | you when you set up the workspace. |
|
||
+-------------------------------+----------------------------------------------------------+
|
||
| `YUM_CONF` | Sets the path where mixer automatically generates the |
|
||
| | :file:`.yum-mix.conf` file. |
|
||
| | |
|
||
| | The yum configuration file points the chroot-builder to |
|
||
| | where the RPMs are stored. |
|
||
+-------------------------------+----------------------------------------------------------+
|
||
| **Table 1**: *Variables in builder.conf* |
|
||
+-------------------------------+----------------------------------------------------------+
|
||
|
||
Format version
|
||
--------------
|
||
|
||
Compatible versions of an OS are tracked with an OS *compatibility epoch*.
|
||
Versions of an OS within an epoch are fully compatible and can update to any
|
||
other version within that epoch. The compatibility epoch is set as the
|
||
`Format` variable in the :file:`mixer.state` file. Variables in the
|
||
:file:`mixer.state` are used by mixer between executions and should not be
|
||
manually changed.
|
||
|
||
Format bump
|
||
-----------
|
||
|
||
Mixer needs to produce content that is consumable by swupd. For swupd to
|
||
consume the content, it needs a consistent protocol that describes the
|
||
requirements of the Manifest.
|
||
|
||
If the `Format` increments to a new epoch (a "format bump"), the underlying
|
||
`swupd` protocol has changed such that updating from one build version in an
|
||
old format to a new build version in a new format is **only** allowed if one
|
||
performs a corresponding format bump.
|
||
|
||
Format bumps are “checkpoints” (see Figure 1). The first release (20) is
|
||
built on the previous format with a `swupd` that is capable of interpreting
|
||
the next format. The second release (30) has the same content, but it’s
|
||
built in the new format.
|
||
|
||
Suppose you have build version 10, but you need the tools in build version
|
||
40. Whereas version 10 belongs to Format 27, version 40 belongs to Format
|
||
28. The swupd client needs to follow formats sequentially. First, you must
|
||
update to version 20, which effectively enables a format bump to version 30.
|
||
Doing a format bump bridges the gap so your mix can progress to build
|
||
version 40.
|
||
|
||
.. figure:: ../../_figures/mixer/format-bump.png
|
||
:alt: Format bump
|
||
|
||
Figure 1: Format bump
|
||
|
||
.. note::
|
||
if you update to build 20 and then check which format of the distro is
|
||
used, the new build version will show 30, and the new format will show 28.
|
||
|
||
.. rst-class:: content-collapse
|
||
|
||
Bundles
|
||
=======
|
||
|
||
mixer stores information about the bundles included in a mix in a flat file
|
||
called :file:`mixbundles`, which is located in the path set by the VERSIONS_PATH variable in :file:`builder.conf`. :file:`mixbundles` is automatically created when the mix is initiated. mixer will refresh the file each time you change the bundles in the mix.
|
||
|
||
Bundles can include other bundles. Nested bundles can themselves include
|
||
other bundles. If you see an unexpected bundle in your mix, it is likely a
|
||
nested bundle in one of the bundles you explicitly added.
|
||
|
||
A bundle will fill into one of two categories: upstream or local. Upstream
|
||
bundles are those provided by |CL|. Local bundles are either modified upstream bundles or new local bundles.
|
||
|
||
Upstream bundles
|
||
----------------
|
||
|
||
mixer automatically downloads and caches upstream bundle definition files.
|
||
These definition files are stored in the upstream-bundles directory in the
|
||
workspace. Do not modify the files in this directory. This directory is
|
||
simply a mirror for mixer to use. mixer will automatically delete the
|
||
contents of this directory before repopulating it on-the-fly if a new
|
||
version must be downloaded.
|
||
|
||
The mixer tool automatically caches the bundles for the |CL| version
|
||
configured in the :file:`upstreamversion` file. mixer also cleans up old
|
||
versions once they are no longer needed.
|
||
|
||
Local bundles
|
||
-------------
|
||
|
||
Local bundles are bundles that you create, or are edited versions of upstream
|
||
bundles. Local bundle definition files are stored in the local-bundles
|
||
directory in the workspace. The LOCAL_BUNDLE_DIR variable sets the path of this directory in the :file:`builder.conf` file.
|
||
|
||
*mixer always checks for local bundles first and the upstream bundles
|
||
second.* So bundles in the local-bundles directory will always take
|
||
precedence over any upstream bundles that have the same name. This
|
||
precedence enables you to copy upstream bundles locally, and edit into a
|
||
local variation.
|
||
|
||
Bundle configuration
|
||
--------------------
|
||
|
||
mixer provides commands to configure the bundles for a mix, such as to add a
|
||
bundle to a mix, to create a new bundle for a mix, or to remove a bundle from a
|
||
mix. View the `mixer.bundle man page`_ for a full list of commands and more
|
||
information on configuring bundles in a mix.
|
||
|
||
Editing an existing local bundle is as simple as opening the bundle definition
|
||
file in your favorite editor, making the desired edits, and saving your changes.
|
||
|
||
.. note::
|
||
|
||
Removing bundles from a mix: By default, removing a bundle will only
|
||
remove the bundle from the mix. The local bundle definition file will
|
||
still remain. To completely remove a bundle, including its local bundle definition file, use the :command:`--local` flag.
|
||
|
||
If you remove the bundle definition file for a local, edited version of an
|
||
upstream bundle in a mix, the mix reverts to reference the original upstream version of the bundle.
|
||
|
||
.. rst-class:: content-collapse
|
||
|
||
Configure and enable Docker
|
||
===========================
|
||
|
||
Use these steps to enable Docker for the mixer tool. Make sure to
|
||
`Configure Docker proxy info`_ first if needed.
|
||
|
||
#. Start the Docker daemon:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo systemctl start docker
|
||
sudo chmod 777 /var/run/docker.sock
|
||
sudo docker info
|
||
|
||
#. Add user to the docker group
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo usermod -G docker -a <username>
|
||
|
||
Pull Docker container manually (optional)
|
||
-----------------------------------------
|
||
|
||
By default, mixer automatically pulls a Docker container for mixing if one
|
||
does not already exist. If you need to troubleshoot the mixer container, it
|
||
may be useful to manually pull a mixer Docker container.
|
||
|
||
Versions of the mixer Docker container are available under the tags for the
|
||
`clearlinux/mixer repo <https://hub.docker.com/r/clearlinux/mixer/tags/>`_
|
||
on Docker Hub. Each version of the mixer Docker container is named after the
|
||
associated |CL| upstream format version. Refer to `Format version`_ for
|
||
additional information on upstream format versions.
|
||
|
||
Use the following steps to manually pull a mixer Docker container:
|
||
|
||
#. Find the version of the container you need by viewing the tags for the
|
||
`clearlinux/mixer repo <https://hub.docker.com/r/clearlinux/mixer/tags/>`_
|
||
on Docker Hub.
|
||
|
||
#. Pull the latest container version:
|
||
|
||
.. code-block:: bash
|
||
|
||
docker pull clearlinux/mixer:<upstream-format-version>
|
||
|
||
#. View local docker images:
|
||
|
||
.. code-block:: bash
|
||
|
||
docker images
|
||
|
||
.. rst-class:: content-collapse
|
||
|
||
Configure Docker proxy info
|
||
===========================
|
||
|
||
If needed, use these steps to configure the Docker proxy information.
|
||
|
||
#. Create the Docker daemon proxy config directory:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo mkdir -p /etc/systemd/system/docker.service.d
|
||
|
||
#. Create :file:`/etc/systemd/system/docker.service.d/http-proxy.conf` and
|
||
add the following using your own proxy values:
|
||
|
||
.. code-block:: console
|
||
|
||
[Service]
|
||
Environment="HTTP_PROXY=<HTTP proxy URL>:<port number>"
|
||
Environment="HTTPS_PROXY=<HTTPS proxy URL>:<port number>"
|
||
|
||
#. Reload the Docker daemon:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo systemctl daemon-reload
|
||
|
||
Configure the Docker container proxies, to pass proxy settings to
|
||
containers:
|
||
|
||
#. Create a directory for your container config:
|
||
|
||
.. code-block:: bash
|
||
|
||
mkdir ~/.docker
|
||
|
||
#. Create the config file :file:`~/.docker/config.json` and add the following
|
||
entries, using your own proxy values:
|
||
|
||
.. code-block:: console
|
||
|
||
{
|
||
"proxies":
|
||
{
|
||
"default":
|
||
{
|
||
"httpProxy": "<proxy-url>:<port>",
|
||
"httpsProxy": "<proxy-url>:<port>"
|
||
}
|
||
}
|
||
}
|
||
|
||
#. Set ownership and permission on the docker config directory:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
|
||
sudo chmod g+rwx "$HOME/.docker" -R
|
||
|
||
Configure proxies to allow mixer to access upstream content from behind
|
||
a firewall.
|
||
|
||
#. Open your :file:`$HOME/.bashrc` file and add proxy and port values for the
|
||
following:
|
||
|
||
.. code-block:: console
|
||
|
||
export http_proxy="<proxy-url>:<port>"
|
||
export https_proxy="<proxy-url>:<port>"
|
||
export HTTP_PROXY="<proxy-url>:<port>"
|
||
export HTTPS_PROXY="<proxy-url>:<port>"
|
||
export no_proxy="<...>"
|
||
|
||
#. Log out and log back in for the proxies to take effect.
|
||
|
||
.. rst-class:: content-collapse
|
||
|
||
Set up a nginx web server for mixer
|
||
===================================
|
||
|
||
A web server is needed to host your update content. In this example, we use
|
||
the nginx web server, which comes with |CL|.
|
||
|
||
Set up a nginx web server for mixer with the following steps:
|
||
|
||
#. Install the :command:`nginx` bundle:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo swupd bundle-add nginx
|
||
|
||
#. Make the directory where mixer updates will reside:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo mkdir -p /var/www
|
||
|
||
#. Create a symbolic link between your workspace updates and the updates on
|
||
the local nginx web server. In this example, `$HOME/mixer` is the
|
||
workspace for the mix.
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo ln -sf $HOME/mixer/update/www /var/www/mixer
|
||
|
||
#. Set up ``nginx`` configuration:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo mkdir -p /etc/nginx/conf.d
|
||
|
||
#. Copy the default example configuration file:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo cp -f /usr/share/nginx/conf/nginx.conf.example /etc/nginx/nginx.conf
|
||
|
||
#. Configure the mixer update server. Create and add the following server
|
||
configuration content to :file:`/etc/nginx/conf.d/mixer.conf` (sudo required):
|
||
|
||
.. code-block:: console
|
||
|
||
server {
|
||
server_name localhost;
|
||
location / {
|
||
root /var/www/mixer;
|
||
autoindex on;
|
||
}
|
||
}
|
||
|
||
#. Restart the daemon, enable nginx on boot, and start the service.
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo systemctl daemon-reload
|
||
|
||
sudo systemctl enable nginx
|
||
|
||
sudo systemctl start nginx
|
||
|
||
#. Verify the web server is running at \http://<ip-address>,
|
||
where <ip-address> is the same one that you captured in
|
||
`Example 1: Mix set up`_.
|
||
|
||
Related topics
|
||
**************
|
||
|
||
* :ref:`autospec`
|
||
* :ref:`bundles-guide`
|
||
* :ref:`swupd-guide`
|
||
|
||
.. _Docker Hub: https://hub.docker.com/r/clearlinux/mixer/tags/
|
||
.. _mixer man page: https://github.com/clearlinux/mixer-tools/blob/master/docs/mixer.1.rst
|
||
.. _mixer.init man page: https://github.com/clearlinux/mixer-tools/blob/master/docs/mixer.init.1.rst
|
||
.. _mixer.bundle man page: https://github.com/clearlinux/mixer-tools/blob/master/docs/mixer.bundle.1.rst
|
||
.. _mixer.build man page: https://github.com/clearlinux/mixer-tools/blob/master/docs/mixer.build.1.rst
|
||
.. _releases: https://github.com/clearlinux/clr-bundles/releases
|
||
.. _afb.sh reference script: https://github.com/clearlinux/mixer-tools/blob/master/afb.sh
|
||
|
||
.. _ister: https://github.com/bryteise/ister |