6377c723aa
It is reasonable that elements may need to include additional kernel modules in a dracut ramdisk. This is done with the --add-drivers option to dracut, but previously the value passed was hard-coded. This change allows an element to put a file containing its desired drivers in a dracut-drivers.d directory, and the list there will be added to the list of drivers added. This functions in essentially the same way as the binary-deps.d directory that already exists for including additional executables in a ramdisk. Change-Id: Ie892b908d36c175a469f7cde7dd803ad4b1942b6
77 lines
2.9 KiB
Bash
Executable File
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
|