docker-playground/scripts/kernel-test/initrd-build.sh

115 lines
2.1 KiB
Bash
Executable File

#!/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