Atomic Host 101 Lab Part 0: Preparation

Introduction

While Atomic Host has been around since 2014 there are still a lot of people that aren’t as familiar with the technology. The Atomic team within Red Hat, along with numerous other upstream contributors, have brought the OSTree and RPM-OSTree technology a long way. At the Fedora user and contributor conference (known as Flock) this week we will be giving a lab on Atomic Host designed to let new users learn about Atomic Host. The audience for this lab is anyone familiar with Linux and interested in learning a new technology.

The entire lab will cover quite a few features of Atomic Host including:

  • Getting Familiar With Atomic Host
  • Viewing Changes To A Deployed System
  • Configuring Storage for Containers
  • Atomic Host Rebasing
  • Atomic Host Upgrades and Rollbacks
  • Browsing OS History
  • Package Layering
  • Experimental Features (livefs, remove, replace)
  • Containerized and Non-Containerized Applications

In Part 0: Preparation we are going to set up an existing Fedora 26 Atomic Host for the rest of the lab sections.

Getting A Fedora 26 Atomic Host

In this lab you’ll need to start with a Fedora 26 Atomic Host. It is recommended you start from the 26.110 (13ed0f2) release. The corresponding media that was built from that release was part of the 26-20170821.0 compose. You can spin up this release by booting in AWS or by spinning up a vagrant box or cloud image. Information on AMIs or links to downloads can be found here.

For demonstration purposes I’ll be using the libvirt vagrant box. If you are on Fedora please see the Fedora Developer Portal for instructions on how to get started with Vagrant.

After downloading the libvirt vagrant box (Fedora-Atomic-Vagrant-26-20170821.0.x86_64.vagrant-libvirt.box) we can now add the box to Vagrant:

$ vagrant box add --name F26AHLab ./Fedora-Atomic-Vagrant-26-20170821.0.x86_64.vagrant-libvirt.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'F26AHLab' (v0) for provider:
    box: Unpacking necessary files from: file:///path/Fedora-Atomic-Vagrant-26-20170821.0.x86_64.vagrant-libvirt.box
==> box: Successfully added box 'F26AHLab' (v0) for 'libvirt'!

I can now bring up and ssh into the Atomic Host:

$ mkdir atomic && cd atomic && vagrant init F26AHLab && vagrant up
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
Bringing machine 'default' up with 'libvirt' provider...
==> default: Creating image (snapshot of base box volume).
...
$ vagrant ssh
[vagrant@localhost ~]$
[vagrant@localhost ~]$ sudo su -
[root@localhost ~]# grep PRETTY_NAME /etc/os-release
PRETTY_NAME="Fedora 26 (Atomic Host)"
[root@localhost ~]#
[root@localhost ~]# rpm-ostree status
State: idle
Deployments:
● fedora-atomic:fedora/26/x86_64/atomic-host
                   Version: 26.110 (2017-08-20 18:10:09)
                    Commit: 13ed0f241c9945fd5253689ccd081b5478e5841a71909020e719437bbeb74424

Extend Root Filesystem

For this lab we are going to be adding some files to the root filesystem and also rebasing to other OSTrees. Let’s add a significant amount of space to the root filesystem to accommodate this:

[root@localhost ~]# lvresize --resizefs --size=+10G /dev/atomicos/root
  Size of logical volume atomicos/root changed from 2.93 GiB (750 extents) to 12.93 GiB (3310 extents).
  Logical volume atomicos/root successfully resized.
...

Download Lab Files Archive

A goal of this lab is to be able to be executed in an offline scenario. This means we have archived a bunch of files of the lab and stored them in a tar.gz for consumption. It also means that a user should be able to execute this lab any time in the future without worrying about missing necessary files that are no longer on the web.

Please download the atomic-host-lab.tar.gz file into the /srv/localweb directory on the running atomic host:

NOTE: If you downloaded the atomic-host-lab.tar.gz file before you started the Atomic Host then you can use scp to copy the file in.

[root@localhost ~]# mkdir /srv/localweb && chmod 777 /srv/localweb
[root@localhost ~]# cd /srv/localweb
[root@localhost localweb]# curl -O https://s3.amazonaws.com/atomic-host-lab/atomic-host-lab.tar.gz
...
[root@localhost localweb]# tar -xf atomic-host-lab.tar.gz
[root@localhost localweb]# rm atomic-host-lab.tar.gz
[root@localhost localweb]# cd
[root@localhost ~]#

Set Up Local Webserver For Archive Files

Throughout this entire lab we’ll use a local webserver to host the files from the archive. Initially this service will use builtin http server modules within Python. Let’s create and start that service now:

[root@localhost ~]# cat <<'EOF' > /etc/systemd/system/localweb.service
[Unit]

[Service]
WorkingDirectory=/srv/localweb
ExecStart=/usr/bin/python3 -m http.server

[Install]
WantedBy=multi-user.target
EOF
[root@localhost ~]#
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable --now localweb.service
Created symlink /etc/systemd/system/multi-user.target.wants/localweb.service → /etc/systemd/system/localweb.service.
[root@localhost ~]# systemctl status localweb.service
● localweb.service
   Loaded: loaded (/etc/systemd/system/localweb.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2017-08-29 16:36:45 UTC; 5s ago
 Main PID: 2974 (python3)
    Tasks: 1 (limit: 4915)
   Memory: 19.6M
      CPU: 342ms
   CGroup: /system.slice/localweb.service
           └─2974 /usr/bin/python3 -m http.server

Aug 29 16:36:45 localhost.localdomain systemd[1]: Started localweb.service.
[root@localhost ~]#
[root@localhost ~]# curl http://localhost:8000/hello.txt
hello world

Configure OSTree/YUM Repositories

Our local webservice is now running and hosting files that are a front for an OSTree repository as well as a YUM repository. Let’s remove the old remote from the system and configure it so that ostree pulls from that local server:

[root@localhost ~]# ostree remote delete fedora-atomic
[root@localhost ~]# ostree remote add --no-gpg-verify local http://localhost:8000/ostreerepo/

Let’s take it one step farther and tell the current deployment on the system to track the fedora/26/x86_64/updates/atomic-host ref from the local remote. We’ll then restart rpm-ostreed to make the system pick up the changes.

[root@localhost ~]# ostree admin set-origin --index 0 local http://localhost:8000/ostreerepo/ fedora/26/x86_64/updates/atomic-host
[root@localhost ~]# systemctl restart rpm-ostreed.service

Finally, we’ll delete all existing YUM repositories and add our localyum repository to the system.

[root@localhost ~]# rm /etc/yum.repos.d/*.repo
[root@localhost ~]# cat <<'EOF' > /etc/yum.repos.d/localyum.repo
[localyum]
baseurl=http://localhost:8000/yumrepo/
enabled=1
gpgcheck=0
EOF

Part 0 Wrap Up

Part 0 of this lab has been specifically to get the system prepared for later sections of the lab. You may have some questions. That’s OK. Hopefully we’ll answer them in the later sections of this lab. In the next post we’ll get more familiar with Atomic Host.