111 lines
2.0 KiB
Bash
Executable File
111 lines
2.0 KiB
Bash
Executable File
#!/bin/sh -e
|
|
DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
DIR_INITRD="$DIR/_initrd"
|
|
SRC_LIBS="$(realpath "$DIR/../../src/.libs/")"
|
|
TOOLS_LIBS="$(realpath "$DIR/../../tools/.libs/")"
|
|
|
|
# Add one or more files to the initramfs, with parent directories.
|
|
# usr-merge: resolve symlinks for /lib -> /usr/lib etc. so "cp --parents" does
|
|
# not fail with "cp: cannot make directory '/tmp/initrd/lib': File exists"
|
|
# $@: path to files
|
|
initrd_add_file() {
|
|
local i
|
|
|
|
for i in "$@"; do
|
|
case "$i" in
|
|
/bin/*|/sbin/*|/lib/*|/lib64/*)
|
|
cp -a --parents "$i" "$DIR_INITRD"/usr
|
|
;;
|
|
*)
|
|
cp -a --parents "$i" "$DIR_INITRD"
|
|
;;
|
|
esac
|
|
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 "$DIR_INITRD"/cmd.sh ]; then
|
|
echo "#!/bin/sh -ex" > "$DIR_INITRD"/cmd.sh
|
|
chmod +x "$DIR_INITRD"/cmd.sh
|
|
fi
|
|
|
|
for i in "$@"; do
|
|
echo "$i" >> "$DIR_INITRD"/cmd.sh
|
|
done
|
|
}
|
|
|
|
rm -rf "$DIR_INITRD"
|
|
mkdir -p "$DIR_INITRD"
|
|
cd "$DIR_INITRD"
|
|
|
|
for dir in bin sbin lib lib64; do
|
|
ln -s usr/"$dir" "$dir"
|
|
done
|
|
|
|
mkdir -p \
|
|
dev/net \
|
|
proc \
|
|
run \
|
|
sys \
|
|
tmp \
|
|
usr/bin \
|
|
usr/sbin
|
|
|
|
initrd_add_bin \
|
|
busybox \
|
|
ip
|
|
|
|
initrd_add_cmd \
|
|
"export LD_LIBRARY_PATH=$SRC_LIBS:$LD_LIBRARY_PATH"
|
|
|
|
export LD_LIBRARY_PATH="$SRC_LIBS:$LD_LIBRARY_PATH"
|
|
|
|
for i in gtp-link gtp-tunnel; do
|
|
initrd_add_bin "$TOOLS_LIBS"/"$i"
|
|
ln -s "$TOOLS_LIBS"/"$i" usr/bin/"$i"
|
|
done
|
|
|
|
mkdir tests
|
|
cp "$DIR"/*.sh tests
|
|
|
|
cp "$DIR"/initrd-init.sh init
|
|
|
|
find . -print0 \
|
|
| cpio --quiet -o -0 -H newc \
|
|
| gzip -1 > "$DIR"/_initrd.gz
|