[diskimage-builder] Enable dracut deploy ramdisks

slagle slagle at fedoraproject.org
Mon Oct 20 19:47:40 UTC 2014


commit cbf4ab014bb5293f71a782be49897386d52446bb
Author: James Slagle <jslagle at redhat.com>
Date:   Mon Oct 20 15:47:36 2014 -0400

    Enable dracut deploy ramdisks

 0002-Enable-dracut-deploy-ramdisks.patch |  359 ++++++++++++++++++++++++++++++
 diskimage-builder.spec                   |    7 +-
 2 files changed, 365 insertions(+), 1 deletions(-)
---
diff --git a/0002-Enable-dracut-deploy-ramdisks.patch b/0002-Enable-dracut-deploy-ramdisks.patch
new file mode 100644
index 0000000..86f1410
--- /dev/null
+++ b/0002-Enable-dracut-deploy-ramdisks.patch
@@ -0,0 +1,359 @@
+From 14c86f2e293321531fb36e0da7773096a12c311a Mon Sep 17 00:00:00 2001
+From: Ben Nemec <bnemec at redhat.com>
+Date: Fri, 26 Sep 2014 00:12:32 -0500
+Subject: [PATCH] Enable dracut deploy ramdisks
+
+The element builds dracut from source on Ubuntu because the
+Ubuntu dracut package is broken and very old, so it can't be
+installed properly and causes a number of other issues that
+are fixed by using a newer version of Dracut.
+
+This initial version should work in virtualized environments.
+Further validation of its suitability for real baremetal
+deployments will need to be done in the future, but this should
+be sufficient to enable that work.
+
+Regarding Dracut specifically, in order to limit the changes
+needed in the existing scripts this element continues to use a
+cut down version of the /init script that we were building for the
+existing ramdisk.  However, instead of running it as pid 0 it is
+run as a Dracut pre-mount hook.  This allows Dracut to set up all
+of the hardware and system bits, while falling early enough in the
+Dracut sequence to complete the deployment before Dracut would try
+to boot off the hard disk.
+
+bp tripleo-juno-dracut-ramdisks
+Change-Id: I144c8993fe040169f440bd4f7a428fdbe3d745cf
+---
+ bin/disk-image-create                              |  4 +-
+ elements/deploy-ironic/init.d/80-deploy-ironic     |  8 +--
+ elements/dracut-ramdisk/README.md                  |  5 ++
+ elements/dracut-ramdisk/element-deps               |  3 ++
+ .../environment.d/10-dracut-version.bash           |  2 +
+ .../extra-data.d/scripts/module/deploy-cmdline.sh  | 34 ++++++++++++
+ .../extra-data.d/scripts/module/module-setup.sh    | 17 ++++++
+ .../install.d/20-install-dracut-deps               | 24 +++++++++
+ elements/dracut-ramdisk/pkg-map                    | 15 ++++++
+ .../post-install.d/99-build-dracut-ramdisk         | 63 ++++++++++++++++++++++
+ elements/dracut-ramdisk/source-repository-dracut   |  1 +
+ lib/common-functions                               |  2 +-
+ lib/ramdisk-defaults                               |  1 +
+ lib/ramdisk-functions                              |  4 +-
+ 14 files changed, 177 insertions(+), 6 deletions(-)
+ create mode 100644 elements/dracut-ramdisk/README.md
+ create mode 100644 elements/dracut-ramdisk/element-deps
+ create mode 100644 elements/dracut-ramdisk/environment.d/10-dracut-version.bash
+ create mode 100755 elements/dracut-ramdisk/extra-data.d/scripts/module/deploy-cmdline.sh
+ create mode 100755 elements/dracut-ramdisk/extra-data.d/scripts/module/module-setup.sh
+ create mode 100755 elements/dracut-ramdisk/install.d/20-install-dracut-deps
+ create mode 100644 elements/dracut-ramdisk/pkg-map
+ create mode 100755 elements/dracut-ramdisk/post-install.d/99-build-dracut-ramdisk
+ create mode 100644 elements/dracut-ramdisk/source-repository-dracut
+
+diff --git a/bin/disk-image-create b/bin/disk-image-create
+index 7ea65c4..c38a200 100755
+--- a/bin/disk-image-create
++++ b/bin/disk-image-create
+@@ -63,6 +63,7 @@ function show_options () {
+     echo "    --qemu-img-options -- option flags to be passed directly to qemu-img."
+     echo "       Options need to be comma separated, and follow the key=value pattern."
+     echo "    --root-label label -- label for the root filesystem.  Defaults to 'cloudimg-rootfs'."
++    echo "    --ramdisk-element -- specify the main element to be used for building ramdisks."
+     if [ "$IS_RAMDISK" == "0" ]; then
+         echo "    -n skip the default inclusion of the 'base' element"
+         echo "    -p package[,package,package] -- list of packages to install in the image"
+@@ -87,7 +88,7 @@ function show_options () {
+ INSTALL_PACKAGES=""
+ COMPRESS_IMAGE="true"
+ DIB_ROOT_LABEL=""
+-TEMP=`getopt -o a:ho:t:xucnp: -l no-tmpfs,offline,help,min-tmpfs:,image-size:,image-cache:,max-online-resize:,qemu-img-options:,root-label: -n $SCRIPTNAME -- "$@"`
++TEMP=`getopt -o a:ho:t:xucnp: -l no-tmpfs,offline,help,min-tmpfs:,image-size:,image-cache:,max-online-resize:,qemu-img-options:,ramdisk-element:,root-label: -n $SCRIPTNAME -- "$@"`
+ if [ $? -ne 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
+ 
+ # Note the quotes around `$TEMP': they are essential!
+@@ -112,6 +113,7 @@ while true ; do
+         --offline) shift; export DIB_OFFLINE=1;;
+         --qemu-img-options) QEMU_IMG_OPTIONS=$2; shift 2;;
+         --root-label) export DIB_ROOT_LABEL=$2; shift 2;;
++        --ramdisk-element) RAMDISK_ELEMENT=$2; shift 2;;
+         --) shift ; break ;;
+         *) echo "Internal error!" ; exit 1 ;;
+     esac
+diff --git a/elements/deploy-ironic/init.d/80-deploy-ironic b/elements/deploy-ironic/init.d/80-deploy-ironic
+index f0ba49b..d52ccde 100644
+--- a/elements/deploy-ironic/init.d/80-deploy-ironic
++++ b/elements/deploy-ironic/init.d/80-deploy-ironic
+@@ -35,9 +35,11 @@ if [ "$BOOT_METHOD" = "$VMEDIA_BOOT_TAG" ]; then
+ else
+   TOKEN_FILE=token-$DEPLOYMENT_ID
+ 
+-  if tftp -r $TOKEN_FILE -g $BOOT_SERVER
+-    then TOKEN_HEADER="-H 'X-Auth-Token: $(cat $TOKEN_FILE)'"
+-    else TOKEN_HEADER=""
++  # Allow multiple versions of the tftp client
++  if tftp -r $TOKEN_FILE -g $BOOT_SERVER || tftp $BOOT_SERVER -c get $TOKEN_FILE; then
++      TOKEN_HEADER="-H 'X-Auth-Token: $(cat $TOKEN_FILE)'"
++  else
++      TOKEN_HEADER=""
+   fi
+ fi
+ 
+diff --git a/elements/dracut-ramdisk/README.md b/elements/dracut-ramdisk/README.md
+new file mode 100644
+index 0000000..c3f1918
+--- /dev/null
++++ b/elements/dracut-ramdisk/README.md
+@@ -0,0 +1,5 @@
++Build Dracut-based ramdisks
++
++This is an alternative to the `ramdisk` element that uses
++Dracut to provide the base system functionality instead of
++Busybox.
+diff --git a/elements/dracut-ramdisk/element-deps b/elements/dracut-ramdisk/element-deps
+new file mode 100644
+index 0000000..c07f413
+--- /dev/null
++++ b/elements/dracut-ramdisk/element-deps
+@@ -0,0 +1,3 @@
++pkg-map
++ramdisk-base
++source-repositories
+diff --git a/elements/dracut-ramdisk/environment.d/10-dracut-version.bash b/elements/dracut-ramdisk/environment.d/10-dracut-version.bash
+new file mode 100644
+index 0000000..5b752b6
+--- /dev/null
++++ b/elements/dracut-ramdisk/environment.d/10-dracut-version.bash
+@@ -0,0 +1,2 @@
++# Using 037 because that matches the current Fedora package
++export DRACUT_VERSION=037
+diff --git a/elements/dracut-ramdisk/extra-data.d/scripts/module/deploy-cmdline.sh b/elements/dracut-ramdisk/extra-data.d/scripts/module/deploy-cmdline.sh
+new file mode 100755
+index 0000000..7cd1432
+--- /dev/null
++++ b/elements/dracut-ramdisk/extra-data.d/scripts/module/deploy-cmdline.sh
+@@ -0,0 +1,34 @@
++#!/bin/bash
++
++# NOTE(bnemec): Dracut doesn't like it if we enable these
++# dib-lint: disable=setu sete setpipefail
++
++source /init-func
++
++find_target() {
++    local DISK=$(getarg disk)
++    local target_disk=
++    t=0
++    while ! target_disk=$(find_disk "$DISK"); do
++        if [ $t -eq 10 ]; then
++            break
++        fi
++        t=$(($t + 1))
++        sleep 1
++    done
++    echo $target_disk
++}
++root=$(find_target)
++
++if [ -n "$root" ]; then
++    rootok=1
++fi
++
++# Dracut doesn't correctly parse the ip argument passed to us.
++# Override /proc/cmdline to rewrite it in a way dracut can grok.
++sed 's/\(ip=\S\+\)/\1:::off/' /proc/cmdline > /run/cmdline
++# Map the existing "troubleshoot" kernel param to the Dracut equivalent.
++sed -i 's/troubleshoot=/rd.shell=/' /run/cmdline
++mount -n --bind -o ro /run/cmdline /proc/cmdline
++# Force Dracut to re-read the cmdline args
++CMDLINE=
+diff --git a/elements/dracut-ramdisk/extra-data.d/scripts/module/module-setup.sh b/elements/dracut-ramdisk/extra-data.d/scripts/module/module-setup.sh
+new file mode 100755
+index 0000000..694e8d4
+--- /dev/null
++++ b/elements/dracut-ramdisk/extra-data.d/scripts/module/module-setup.sh
+@@ -0,0 +1,17 @@
++#!/bin/bash
++
++# Dracut is bash too, and it doesn't play nicely with our usual sets
++# dib-lint: disable=setu sete setpipefail
++
++check() {
++    return 0
++}
++
++depends() {
++    return 0
++}
++
++install() {
++    inst_hook cmdline 80 "$moddir/deploy-cmdline.sh"
++    inst_hook pre-mount 50 "$moddir/init.sh"
++}
+diff --git a/elements/dracut-ramdisk/install.d/20-install-dracut-deps b/elements/dracut-ramdisk/install.d/20-install-dracut-deps
+new file mode 100755
+index 0000000..8621d89
+--- /dev/null
++++ b/elements/dracut-ramdisk/install.d/20-install-dracut-deps
+@@ -0,0 +1,24 @@
++#!/bin/bash
++
++set -eux
++set -o pipefail
++
++DRACUT_NETWORK="dracut-network"
++if [ 'ubuntu' = "$DISTRO_NAME" ]; then
++    DRACUT_NETWORK=
++    # Install Dracut from source because the packaged version is
++    # broken and old.  For Dracut builds we throw away the chroot
++    # anyway so it won't matter if we've installed some build deps.
++    install-packages build-essential arping
++    pushd /tmp
++    tar xJvf dracut.tar.xz
++    pushd dracut-$DRACUT_VERSION
++    ./configure
++    make
++    make install
++    popd
++    popd
++fi
++
++PACKAGES=$(pkg-map --element dracut-ramdisk ncat tftp)
++install-packages $DRACUT_NETWORK wget $PACKAGES
+diff --git a/elements/dracut-ramdisk/pkg-map b/elements/dracut-ramdisk/pkg-map
+new file mode 100644
+index 0000000..e3f8316
+--- /dev/null
++++ b/elements/dracut-ramdisk/pkg-map
+@@ -0,0 +1,15 @@
++{
++  "family":{
++    "debian":{
++      "ncat":"netcat-traditional",
++      "tftp":"tftp-hpa"
++    },
++    "redhat":{
++      "ncat":"nmap-ncat"
++    }
++  },
++  "default":{
++    "ncat":"ncat",
++    "tftp":"tftp"
++  }
++}
+\ No newline at end of file
+diff --git a/elements/dracut-ramdisk/post-install.d/99-build-dracut-ramdisk b/elements/dracut-ramdisk/post-install.d/99-build-dracut-ramdisk
+new file mode 100755
+index 0000000..0c5e3fc
+--- /dev/null
++++ b/elements/dracut-ramdisk/post-install.d/99-build-dracut-ramdisk
+@@ -0,0 +1,63 @@
++#!/bin/bash
++
++set -eux
++set -o pipefail
++
++_LIB="/tmp/ramdisk-build"
++
++source "$_LIB/common-defaults"
++source "$_LIB/img-defaults"
++source "$_LIB/ramdisk-defaults"
++
++source "$_LIB/common-functions"
++source "$_LIB/img-functions"
++source "$_LIB/ramdisk-functions"
++
++KERNEL_VERSION="${DIB_KERNEL_VERSION:-$(find_kernel_version)}"
++MODULE_DIR="$MODULE_ROOT/lib/modules/$KERNEL_VERSION"
++FIRMWARE_DIR="$MODULE_ROOT/lib/firmware"
++LIB_UDEV="$LIB_UDEV_ROOT/lib/udev"
++INIT="$_LIB/scripts/init"
++FUNCTIONS_D="$_LIB/scripts/d"
++MODULE="$_LIB/scripts/module"
++# NOTE(bnemec): IMAGE_ELEMENT is normally set in disk-image-create, but we're
++# not using that to build the image here.
++IMAGE_ELEMENT=
++
++mk_build_dir
++mkdir -p "$TMP_BUILD_DIR/mnt"
++export TMP_HOOKS_PATH=/tmp
++export TMP_MOUNT_PATH="$TMP_BUILD_DIR/mnt"
++
++echo "building ramdisk in $TMP_MOUNT_PATH"
++
++populate_init
++SCRIPT_HOME=/tmp/in_target.d/bin TMP_HOOKS_PATH=/tmp/in_target.d run_d ramdisk-install
++MODULE_PATH="/usr/lib/dracut/modules.d"
++cp -r "$MODULE" "$MODULE_PATH/80deploy-ramdisk"
++cp "$TMP_MOUNT_PATH/init" "$MODULE_PATH/80deploy-ramdisk/init.sh"
++
++# Notes on the options passed to Dracut:
++# -N: Do not build a host-specific ramdisk.  We want to be able to run this ramdisk
++#     on as many different machines as possible.
++# --install: A list of the binaries needed by our ramdisk script fragments.
++# --kernel-cmdline: Kernel parameters to pass to the ramdisk.  rd.neednet is required
++#                   to force Dracut to bring up networking even if it isn't passed a
++#                   network target root.  Pre-loading the ahci module is necessary
++#                   on some systems to ensure that SATA disks are recognized.
++# --include: Files from the chroot to include in the ramdisk.
++# --kver: The kernel version to use, as determined above.
++# --add-drivers: Extra kernel modules to include in the ramdisk.
++# -o: Force omission of these dracut modules.  Our scripts are written for bash,
++#     so dash is not desirable, and plymouth was causing some issues on Ubuntu.
++dracut -N \
++    --install 'tail head awk ifconfig cut expr route ping tgtd tgtadm nc wget curl tftp grep' \
++    --kernel-cmdline "rd.shell rd.debug rd.neednet=1 rd.driver.pre=ahci" \
++    --include "$TMP_MOUNT_PATH/init-func" /init-func \
++    --kver "${KERNEL_VERSION}" \
++    --add-drivers "virtio virtio_net virtio_blk" \
++    -o "dash plymouth" \
++    /tmp/ramdisk
++
++cp "/boot/vmlinuz-${KERNEL_VERSION}" /tmp/kernel
++chmod o+r /tmp/kernel
+diff --git a/elements/dracut-ramdisk/source-repository-dracut b/elements/dracut-ramdisk/source-repository-dracut
+new file mode 100644
+index 0000000..d7c1bdc
+--- /dev/null
++++ b/elements/dracut-ramdisk/source-repository-dracut
+@@ -0,0 +1 @@
++dracut file /tmp/dracut.tar.xz https://www.kernel.org/pub/linux/utils/boot/dracut/dracut-$DRACUT_VERSION.tar.xz
+diff --git a/lib/common-functions b/lib/common-functions
+index 6681dc7..f440e5d 100644
+--- a/lib/common-functions
++++ b/lib/common-functions
+@@ -233,7 +233,7 @@ function arg_to_elements() {
+     IMAGE_ELEMENT="base $IMAGE_ELEMENT"
+   fi
+   if [ "$IS_RAMDISK" == "1" ]; then
+-    IMAGE_ELEMENT="ramdisk $IMAGE_ELEMENT"
++    IMAGE_ELEMENT="$RAMDISK_ELEMENT $IMAGE_ELEMENT"
+   fi
+   echo "Building elements: $IMAGE_ELEMENT"
+ 
+diff --git a/lib/ramdisk-defaults b/lib/ramdisk-defaults
+index 893826b..13120f1 100644
+--- a/lib/ramdisk-defaults
++++ b/lib/ramdisk-defaults
+@@ -18,6 +18,7 @@
+ # options for ramdisk-image-create
+ export DIB_NO_TMPFS=${DIB_NO_TMPFS:-1}
+ export DIB_MIN_TMPFS=${DIB_MIN_TMPFS:-1}
++export RAMDISK_ELEMENT=${RAMDISK_ELEMENT:-ramdisk}
+ source $_LIB/common-defaults
+ MODULE_ROOT=${DIB_MODULE_ROOT:-""}
+ LIB_UDEV_ROOT=${DIB_LIB_UDEV_ROOT:-""}
+diff --git a/lib/ramdisk-functions b/lib/ramdisk-functions
+index e41691a..b34e93a 100644
+--- a/lib/ramdisk-functions
++++ b/lib/ramdisk-functions
+@@ -25,7 +25,9 @@ function fullpath() {
+ }
+ 
+ function cleanup () {
+-  unmount_dir "$TMP_BUILD_DIR/mnt"
++  if [ "$RAMDISK_ELEMENT" != "dracut-ramdisk" ]; then
++    unmount_dir "$TMP_BUILD_DIR/mnt"
++  fi
+   if [ -f "$TMP_IMAGE_PATH" ]; then
+     loopdev=`sudo losetup -j "$TMP_IMAGE_PATH" | cut -d: -f1`
+     if [ -n "$loopdev" ]; then
diff --git a/diskimage-builder.spec b/diskimage-builder.spec
index a12a3d5..eacccb9 100644
--- a/diskimage-builder.spec
+++ b/diskimage-builder.spec
@@ -1,13 +1,14 @@
 Name:		diskimage-builder
 Summary:	Image building tools for OpenStack
 Version:	0.1.34
-Release:	1%{?dist}
+Release:	2%{?dist}
 License:	ASL 2.0
 Group:		System Environment/Base
 URL:		https://launchpad.net/diskimage-builder
 Source0:	http://tarballs.openstack.org/diskimage-builder/%{name}-%{version}.tar.gz
 
 Patch0001: 0001-svc-map-requires-PyYAML.patch
+Patch0002: 0002-Enable-dracut-deploy-ramdisks.patch
 
 BuildArch: noarch
 BuildRequires: python2-devel
@@ -28,6 +29,7 @@ Requires: dib-utils
 %setup -q -n %{name}-%{version}
 
 %patch0001 -p1
+%patch0002 -p1
 
 %build
 %{__python} setup.py build
@@ -64,6 +66,9 @@ Components of TripleO that are responsible for building disk images.
 %{_datadir}/%{name}/elements
 
 %changelog
+* Mon Oct 20 2014 James Slagle <jslagle at redhat.com> 0.1.34-2
+- Enable dracut deploy ramdisks
+
 * Mon Oct 20 2014 James Slagle <jslagle at redhat.com> 0.1.34-1
 - Update to upstream 0.1.34
 


More information about the scm-commits mailing list