diskimage-builder/diskimage_builder/elements/dracut-ramdisk/post-install.d/99-build-dracut-ramdisk
Ian Wienand 97c01e48ed Move elements & lib relative to diskimage_builder package
Currently we have all our elements and library files in a top-level
directory and install them into
<root>/share/diskimage-builder/[elements|lib] (where root is either /
or the root of a virtualenv).

The problem with this is that editable/development installs (pip -e)
do *not* install data_files.  Thus we have no canonical location to
look for elements -- leading to the various odd things we do such as a
whole bunch of guessing at the top of disk-image-create and having a
special test-loader in tests/test_elements.py so we can run python
unit tests on those elements that have it.

data_files is really the wrong thing to use for what are essentially
assets of the program.  data_files install works well for things like
config-files, init.d files or dropping documentation files.

By moving the elements under the diskimage_builder package, we always
know where they are relative to where we import from.  In fact,
pkg_resources has an api for this which we wrap in the new
diskimage_builder/paths.py helper [1].

We use this helper to find the correct path in the couple of places we
need to find the base-elements dir, and for the paths to import the
library shell functions.

Elements such as svc-map and pkg-map include python unit-tests, which
we do not need tests/test_elements.py to special-case load any more.
They just get found automatically by the normal subunit loader.

I have a follow-on change (I69ca3d26fede0506a6353c077c69f735c8d84d28)
to move disk-image-create to a regular python entry-point.

Unfortunately, this has to move to work with setuptools.  You'd think
a symlink under diskimage_builder/[elements|lib] would work, but it
doesn't.

[1] this API handles stuff like getting files out of .zip archive
modules, which we don't do.  Essentially for us it's returning
__file__.

Change-Id: I5e3e3c97f385b1a4ff2031a161a55b231895df5b
2016-11-01 17:27:41 -07:00

77 lines
2.9 KiB
Bash
Executable File

#!/bin/bash
if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
set -x
fi
set -eu
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"
mv "$TMP_MOUNT_PATH/init" "$MODULE_PATH/80deploy-ramdisk/init.sh"
# NOTE(bnemec): Workaround for bug in Dracut. This fix has been proposed to
# Dracut as well in https://github.com/haraldh/dracut/pull/34 , and once it has
# been released for all of our supported platforms we can remove this. Until then
# this makes --include work correctly and will be a noop if we're running a fixed
# Dracut version.
sed -i 's|cp --reflink=auto --sparse=auto -fa -t "$s" "$i"$|cp --reflink=auto --sparse=auto -fa -t "${initdir}/${tgt}" "$i"|g' $(which dracut)
# 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 "$(cat /etc/dib_binary_deps)" \
--kernel-cmdline "rd.shell rd.debug rd.neednet=1 rd.driver.pre=ahci" \
--include "$TMP_MOUNT_PATH/" / \
--kver "${KERNEL_VERSION}" \
--add-drivers "$(cat /etc/dib_dracut_drivers)" \
-o "dash plymouth" \
/tmp/ramdisk
cp "/boot/vmlinuz-${KERNEL_VERSION}" /tmp/kernel
chmod o+r /tmp/kernel
# We don't want to run cleanup (set in mk_build_dir above) when this exits
trap EXIT