From c69c6c5a84da59bf3f7d6b8e79063d70d0ff4fe6 Mon Sep 17 00:00:00 2001 From: Markos Chandras Date: Fri, 30 Sep 2016 11:13:09 +0100 Subject: [PATCH] Add zypper-minimal element Add a new zypper-minimal element to bootstrap SUSE-based distributions Change-Id: Id63397e412a929d61247cfd3d9f8d4e758c1248a --- elements/zypper-minimal/README.rst | 19 ++++ elements/zypper-minimal/element-deps | 3 + .../zypper-minimal/install.d/15-zypper-fstab | 27 ++++++ elements/zypper-minimal/package-installs.yaml | 10 +++ .../zypper-minimal/root.d/08-zypper-chroot | 87 +++++++++++++++++++ 5 files changed, 146 insertions(+) create mode 100644 elements/zypper-minimal/README.rst create mode 100644 elements/zypper-minimal/element-deps create mode 100755 elements/zypper-minimal/install.d/15-zypper-fstab create mode 100644 elements/zypper-minimal/package-installs.yaml create mode 100755 elements/zypper-minimal/root.d/08-zypper-chroot diff --git a/elements/zypper-minimal/README.rst b/elements/zypper-minimal/README.rst new file mode 100644 index 000000000..d9c8fd323 --- /dev/null +++ b/elements/zypper-minimal/README.rst @@ -0,0 +1,19 @@ +============== +zypper-minimal +============== +Base element for creating minimal SUSE-based images + +This element is incomplete by itself so you probaby want to use it along +with the opensuse-minimal one. It requires 'zypper' to be installed on the +host. + +Repositories +------------ + +This element expects the `ZYPPER_REPOS` variable to be exported by the +operating system element. This variable contains repository mappings in +the following format: `${repo_name}==>${repo_url}`. For example:: + + ZYPPER_REPOS="update=>http://download.opensuse.org/update/leap/42.1/oss/ " + ZYPPER_REPOS+="oss=>http://download.opensuse.org/distribution/leap/42.1/repo/oss/" + export ZYPPER_REPOS diff --git a/elements/zypper-minimal/element-deps b/elements/zypper-minimal/element-deps new file mode 100644 index 000000000..846428bd8 --- /dev/null +++ b/elements/zypper-minimal/element-deps @@ -0,0 +1,3 @@ +dib-run-parts +package-installs +zypper diff --git a/elements/zypper-minimal/install.d/15-zypper-fstab b/elements/zypper-minimal/install.d/15-zypper-fstab new file mode 100755 index 000000000..cffbe1df5 --- /dev/null +++ b/elements/zypper-minimal/install.d/15-zypper-fstab @@ -0,0 +1,27 @@ +#!/bin/bash +# +# Copyright 2015 Hewlett-Packard Development Company, L.P. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# + +if [ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]; then + set -x +fi +set -eu +set -o pipefail + +cat << EOF > /etc/fstab +proc /proc proc nodev,noexec,nosuid 0 0 +LABEL=${DIB_ROOT_LABEL} / ${FS_TYPE} errors=remount-ro 0 1 +EOF diff --git a/elements/zypper-minimal/package-installs.yaml b/elements/zypper-minimal/package-installs.yaml new file mode 100644 index 000000000..d2ccc1605 --- /dev/null +++ b/elements/zypper-minimal/package-installs.yaml @@ -0,0 +1,10 @@ +# kernel +linux-image-generic: +# And a few useful tools. Some are pulled +# as dependencies but that may change so lets +# be explicit. +bash: +lsb-release: +openssl: +sed: +sudo: diff --git a/elements/zypper-minimal/root.d/08-zypper-chroot b/elements/zypper-minimal/root.d/08-zypper-chroot new file mode 100755 index 000000000..e6d55c30a --- /dev/null +++ b/elements/zypper-minimal/root.d/08-zypper-chroot @@ -0,0 +1,87 @@ +#!/bin/bash +# +# Copyright 2016 SUSE Linux Products Gmb +# Copyright 2015 Hewlett-Packard Development Company, L.P. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# + +# dib-lint: disable=safe_sudo + +if [ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]; then + set -x +fi +set -eu +set -o pipefail + +[ -n "${ZYPPER_REPOS}" ] + +function cleanup() { + sudo umount $TMP_MOUNT_PATH/var/cache/zypp +} + +trap cleanup EXIT + +ZYPPER_TARGET_OPTS="--non-interactive --gpg-auto-import-keys --root $TARGET_ROOT" +ZYPPER_INSTALL_OPTS="--no-confirm --no-recommends" + +for repo in ${ZYPPER_REPOS}; do + reponame=repo-${repo%%=>*} + repouri=${repo##*=>} + sudo zypper ${ZYPPER_TARGET_OPTS} addrepo --name ${reponame} --keep-packages ${repouri} ${reponame} +done + +# Refresh it +sudo zypper ${ZYPPER_TARGET_OPTS} refresh + +# It appears that zypper will clean up the repo's cache when it (re-)adds the +# repo so we need to add the cache now, once the repos are added. This is +# similar to what the zypper/50-zypper-cache script does +ZYPPER_CACHE_DIR=$DIB_IMAGE_CACHE/zypper +mkdir -p $ZYPPER_CACHE_DIR + +sudo mkdir -p $TMP_MOUNT_PATH/var/cache/zypp +sudo mount --bind $ZYPPER_CACHE_DIR $TMP_MOUNT_PATH/var/cache/zypp + +# Install filesystem, base and useful tools +sudo zypper ${ZYPPER_TARGET_OPTS} install ${ZYPPER_INSTALL_OPTS} filesystem +# Install basic components in order +sudo zypper ${ZYPPER_TARGET_OPTS} install ${ZYPPER_INSTALL_OPTS} -t pattern base +# Install a few useful tools +sudo zypper ${ZYPPER_TARGET_OPTS} install ${ZYPPER_INSTALL_OPTS} python zypper + +# Put in a dummy /etc/resolv.conf over the temporary one we used +# to bootstrap. systemd has a bug/feature [1] that it will assume +# you want systemd-networkd as the network manager and create a +# broken symlink to /run/... if the base image doesn't have one. +# This broken link confuses things like dhclient. +# [1] https://bugzilla.redhat.com/show_bug.cgi?id=1197204 +echo -e "# This file intentionally left blank\n" | \ + sudo tee $TARGET_ROOT/etc/resolv.conf + +# set the most reliable UTF-8 locale +echo -e 'LANG="en_US.UTF-8"' | \ +sudo tee $TARGET_ROOT/etc/locale.conf +# default to UTC +sudo -E chroot $TARGET_ROOT ln -sf /usr/share/zoneinfo/UTC \ + /etc/localtime + +# RPM doesn't know whether files have been changed since install +# At this point though, we know for certain that we have changed no +# config files, so anything marked .rpmnew is just a bug. +for newfile in $(sudo find $TARGET_ROOT -type f -name '*rpmnew') ; do + sudo mv $newfile $(echo $newfile | sed 's/.rpmnew$//') +done + +# Unmounting of the /var/cache/zypp is handled by the cleanup EXIT +# handler so there is nothing else to do here