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