Update coreos flavor stage1
This guide will guide you through updating the version of the coreos flavor of stage1. We usually want to do this to update the systemd version used by the stage1.
The process is quite manual because it's not done often, but improvements are welcomed.
Extract the root filesystem of the image
Let's assume you want to update CoreOS Container Linux from version 991.0.0 to version 1032.0.0.
First, you need to download and verify the image. Make sure you trust the CoreOS Image Signing Key.
Since 1032.0.0 is currently only available in the Alpha channel, we'll use the alpha URL:
$ mkdir /tmp/coreos-image
$ curl -O https://alpha.release.core-os.net/amd64-usr/1032.0.0/coreos_production_pxe_image.cpio.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 222M 100 222M 0 0 7769k 0 0:00:29 0:00:29 --:--:-- 7790k
$ curl -O http://alpha.release.core-os.net/amd64-usr/1032.0.0/coreos_production_pxe_image.cpio.gz.sig
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 543 100 543 0 0 495 0 0:00:01 0:00:01 --:--:-- 495
$ gpg --verify coreos_production_pxe_image.cpio.gz.sig
gpg: assuming signed data in 'coreos_production_pxe_image.cpio.gz'
gpg: Signature made Thu 28 Apr 2016 04:54:00 AM CEST using RSA key ID 1CB5FA26
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: PGP
gpg: depth: 0 valid: 5 signed: 5 trust: 0-, 0q, 0n, 0m, 0f, 5u
gpg: depth: 1 valid: 5 signed: 0 trust: 3-, 0q, 0n, 0m, 2f, 0u
gpg: next trustdb check due at 2017-01-19
gpg: Good signature from "CoreOS Buildbot (Offical Builds) <buildbot@coreos.com>" [ultimate]
Then you need to extract it:
$ gunzip coreos_production_pxe_image.cpio.gz
$ cpio -i < coreos_production_pxe_image.cpio
457785 blocks
$ unsquashfs usr.squashfs
Parallel unsquashfs: Using 4 processors
13445 inodes (14861 blocks) to write
write_xattr: could not write xattr security.capability for file squashfs-root/bin/arping because you're not superuser!
write_xattr: to avoid this error message, either specify -user-xattrs, -no-xattrs, or run as superuser!
Further error messages of this type are suppressed!
[======================================================================================================================================-] 14861/14861 100%
created 12391 files
created 1989 directories
created 722 symlinks
created 0 devices
created 0 fifos
You should have now the rootfs of the image in the squashfs-root
directory.
Update the manifest files
Back to the rkt repo, in the directory stage1/usr_from_coreos/manifest.d
, there are some manifest files that define which files are copied from the Container Linux image to the stage1 image.
You need to go through all of them and check that the files listed correspond to files that are in the actual rootfs of the image (which we extracted in the previous step). Do this from your root directory:
for f in $(cat stage1/usr_from_coreos/manifest-amd64-usr.d/*.manifest); do
fspath=/tmp/coreos-image/squashfs-root/$f
if [ ! -e $fspath -a ! -h $fspath ]; then
echo missing: $f
fi
done
Usually, there are some updated libraries which need an update on their version numbers. In our case, there are no updates and all the files mentioned in the manifest are present in the updated Container Linux image.
If any of the manifest files have been modified run the script scripts/sort-stage1-manifests.sh
to keep the manifest files in sorted order.
Update the coreos flavor version used by the build system
In the file stage1/usr_from_coreos/coreos-common.mk
, we define which Container Linux image version we use for the coreos flavor.
Update CCN_IMG_RELEASE
to 1032.0.0 and CCN_SYSTEMD_VERSION
to the systemd version shipped with the image (in our case, v229).
diff --git a/stage1/usr_from_coreos/coreos-common.mk b/stage1/usr_from_coreos/coreos-common.mk
index b5bfa77..f864f56 100644
--- a/stage1/usr_from_coreos/coreos-common.mk
+++ b/stage1/usr_from_coreos/coreos-common.mk
@@ -9,9 +9,9 @@ _CCN_INCLUDED_ := x
$(call setup-tmp-dir,CCN_TMPDIR)
# systemd version in coreos image
-CCN_SYSTEMD_VERSION := v225
+CCN_SYSTEMD_VERSION := v229
# coreos image version
-CCN_IMG_RELEASE := 991.0.0
+CCN_IMG_RELEASE := 1032.0.0
# coreos image URL
CCN_IMG_URL := https://alpha.release.core-os.net/amd64-usr/$(CCN_IMG_RELEASE)/coreos_production_pxe_image.cpio.gz
# path to downloaded pxe image
Check that things work
Once you're finished updating the manifest files and coreos-common.mk
, we'll do some sanity checks.
First, do a clean build.
Test all binaries
Make sure that every binary links:
for f in $(cat stage1/usr_from_coreos/manifest-amd64-usr.d/*.manifest); do
if [[ $f =~ ^bin/ ]]; then
sudo chroot build*/aci-for-coreos-flavor/rootfs /usr/lib64/ld-linux-x86-64.so.2 --list $f >/dev/null
st=$?
if [ $st -ne 0 ] ; then
echo $f failed with exit code $st
break
fi
fi
done
run rkt
Run a quick smoketest:
sudo build*/target/bin/rkt run quay.io/coreos/alpine-sh
Fixing errors
If there are some new libraries missing from the image, you need to add them to the correspoding manifest file.
For example, this update breaks systemd. When you try to run rkt, you get this error:
/usr/lib/systemd/systemd: error while loading shared libraries: libpam.so.0: cannot open shared object file: No such file or directory
This means that we need to add libpam to the systemd manifest file:
diff --git a/stage1/usr_from_coreos/manifest.d/systemd.manifest b/stage1/usr_from_coreos/manifest.d/systemd.manifest
index fca30bb..51d5fbc 100644
--- a/stage1/usr_from_coreos/manifest.d/systemd.manifest
+++ b/stage1/usr_from_coreos/manifest.d/systemd.manifest
@@ -61,6 +61,9 @@ lib64/libmount.so.1
lib64/libmount.so.1.1.0
lib64/libnss_files-2.21.so
lib64/libnss_files.so.2
+lib64/libpam.so
+lib64/libpam.so.0
+lib64/libpam.so.0.84.1
lib64/libpcre.so
lib64/libpcre.so.1
lib64/libpcre.so.1.2.4
Then build and test again.