#!/bin/sh -ex # Add one or more files to the initramfs, with parent directories # $@: path to files initrd_add_file() { cp -a --parents "$@" /tmp/initrd } # Add kernel module files with dependencies # $@: kernel module names initrd_add_mod() { if [ "$KERNEL_BUILD" = 1 ]; then # Custom kernel will be built, don't add any modules from the # distribution's kernel to the initramfs. return fi local kernel="$(basename /lib/modules/*)" local files="$(modprobe \ -a \ --dry-run \ --show-depends \ --set-version="$kernel" \ "$@" \ | sort -u \ | cut -d ' ' -f 2)" initrd_add_file $files # Save the list of modules, so initrd-init.sh can load all of them for i in $@; do echo "$i" >> /tmp/initrd/modules done } # Add binaries with depending libraries # $@: paths to binaries initrd_add_bin() { local bin local bin_path local file for bin in "$@"; do local bin_path="$(which "$bin")" if [ -z "$bin_path" ]; then echo "ERROR: file not found: $bin" exit 1 fi lddtree_out="$(lddtree -l "$bin_path")" if [ -z "$lddtree_out" ]; then echo "ERROR: lddtree failed on '$bin_path'" exit 1 fi for file in $lddtree_out; do initrd_add_file "$file" # Copy resolved symlink if [ -L "$file" ]; then initrd_add_file "$(realpath "$file")" fi done done } # Add command to run inside the initramfs # $@: commands initrd_add_cmd() { local i if ! [ -e /tmp/initrd/cmd.sh ]; then echo "#!/bin/sh -ex" > /tmp/initrd/cmd.sh chmod +x /tmp/initrd/cmd.sh fi for i in "$@"; do echo "$i" >> /tmp/initrd/cmd.sh done } mkdir -p /tmp/initrd cd /tmp/initrd mkdir -p \ dev/net \ proc \ sbin \ sys \ tmp \ usr/bin \ usr/sbin initrd_add_bin \ busybox initrd_add_mod \ virtio_net \ virtio_pci initrd_add_file \ /lib/modules/*/modules.dep # Required for osmo-ggsn mknod dev/net/tun c 10 200 cp /kernel-test/initrd-init.sh init # Add project specific files (e.g. osmo-ggsn and gtp kernel module) . /cache/kernel-test/initrd-project-script.sh find . -print0 \ | cpio --quiet -o -0 -H newc \ | gzip -1 > /cache/kernel-test/initrd