# Copyright 2012 Hewlett-Packard Development Company, L.P. # Copyright (c) 2012 NTT DOCOMO, INC. # # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. function fullpath() { local f=$1 if [ "${f#/}" = "$f" ]; then echo `pwd`/"$f" else echo "$f" fi } function cleanup () { sudo umount -f $TMP_BUILD_DIR || true rm -rf "$TMP_BUILD_DIR" } function ensure_binaries() { BINARY_DEPS="${BUSYBOX}" for _FLVR in ${RAMDISK_ELEMENT} ; do for dir in $(echo $ELEMENTS_PATH | tr ":" " ") ; do [ -d $dir/$_FLVR ] || continue _FILE="${dir}/${_FLVR}/binary-deps" if [ -a $_FILE ]; then for _LINE in $(cat $_FILE) ; do BINARY_DEPS="${BINARY_DEPS} $_LINE" done fi break done done for _BIN in $BINARY_DEPS ; do _LOCATION=$(which "$_BIN" || echo "") if [ -z "$_LOCATION" ]; then echo "$_BIN is not found in your PATH" 1>&2 echo "Please install it on your system" exit 1 fi done export BINARY_DEPS } function create_base () { echo "Creating base system" mkdir -p "$TMP_MOUNT_PATH/bin" ln -s bin "$TMP_MOUNT_PATH/sbin" mkdir -p "$TMP_MOUNT_PATH/lib" mkdir -p "$TMP_MOUNT_PATH/lib/modules" mkdir -p "$TMP_MOUNT_PATH/etc" mkdir -p "$TMP_MOUNT_PATH/etc/udev" # cjk adding for discovery support mkdir -p "$TMP_MOUNT_PATH/var/lib/dhcp" mkdir -p "$TMP_MOUNT_PATH/var/run" mkdir -p "$TMP_MOUNT_PATH/lib/udev/rules.d" cp -a "$LIB_UDEV/rules.d/50-firmware.rules" "$TMP_MOUNT_PATH/lib/udev/rules.d" cp -a "$LIB_UDEV/rules.d/80-drivers.rules" "$TMP_MOUNT_PATH/lib/udev/rules.d" if [ -a $LIB_UDEV/firmware ]; then cp -a "$LIB_UDEV/firmware" "$TMP_MOUNT_PATH/lib/udev" fi # cjk adding for hwdiscovery support cp "/sbin/dhclient-script" "$TMP_MOUNT_PATH/sbin" mkdir -p "$TMP_MOUNT_PATH/etc/modprobe.d" echo "blacklist evbug" > "$TMP_MOUNT_PATH/etc/modprobe.d/blacklist.conf" # cjk adding for hwdiscovery support touch "$TMP_MOUNT_PATH/etc/fstab" mkdir -p "$TMP_MOUNT_PATH/etc/udev" cat >"$TMP_MOUNT_PATH/etc/udev/udev.conf" < /lib/x86_64-linux-gnu/libc.so.6 (0x00007f095e784000) # 2. only path # /lib64/ld-linux-x86-64.so.2 (0x00007f095ef79000) # 3. path to path # /lib64/ld-linux-x86-64.so.2 => /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 (0x00007facff857000) # 4. name to empty (vdso) # linux-vdso.so.1 => (0x00007fff0c5ff000) for i in `echo "$ldd_out" | sed -e 's/^\t*//'`; do local ref=$( echo "$i" | awk -F '[ ]' '{print $1}') local real=$( echo "$i" | awk -F '[ ]' '$2 == "=>" {print $3} $2 != "=>" {print $1}') if [ -z "$real" ]; then continue fi if [ "$ref" = "${ref#/}" ]; then ref=/lib/$ref fi dest=/lib/`basename "$real"` cp -Ln "$real" "$TMP_MOUNT_PATH/$dest" # Create a symbolic link if the shared library is referred # by the different name if [ "$ref" != "$dest" ]; then local link_path=$TMP_MOUNT_PATH/$ref if ! [ -e "$link_path" -o -L "$link_path" ]; then mkdir -p `dirname "$link_path"` ln -s "$dest" "$link_path" fi fi done } function populate_lib () { echo "Populating /lib" # find udevd UDEVD= for f in /sbin/udevd /lib/udev/udevd /lib/systemd/systemd-udevd \ /usr/lib/systemd/systemd-udevd \ /usr/lib/udev/udevd; do if [ -x "$f" ]; then UDEVD="$f" break fi done UDEV_FIRMWARE= if [ -a $LIB_UDEV/firmware ]; then UDEV_FIRMWARE="$LIB_UDEV/firmware" fi for i in "$BUSYBOX" bash lsmod modprobe udevadm \ wget reboot shutdown $UDEVD $UDEV_FIRMWARE \ $BINARY_DEPS ; do if "$BUSYBOX" --list | grep "^$i\$" >/dev/null; then continue fi path=`which $i 2>/dev/null` || path=$i if ! [ -x "$path" ]; then echo "$i is not found in PATH" 2>&1 exit 1 fi cp -L "$path" "$TMP_MOUNT_PATH/bin/" copy_required_libs "$path" done cp -a "$MODULE_DIR" "$TMP_MOUNT_PATH/lib/modules/$KERNEL_VERSION" cp -a "$FIRMWARE_DIR" "$TMP_MOUNT_PATH/lib/firmware" } function populate_busybox () { echo "Creating symlinks for busybox binaries" for i in $( "$BUSYBOX" --list ); do if [ -f "$TMP_MOUNT_PATH/bin/$i" ]; then echo "skip $i" continue fi ln -s busybox "$TMP_MOUNT_PATH/bin/$i" done } function populate_init () { echo "Installing init" cp "$INIT" "$TMP_MOUNT_PATH/init" chmod +x $TMP_MOUNT_PATH/init for F in "$FUNCTIONS_D"/* ; do cp "$F" "$TMP_MOUNT_PATH" done # Append /init with any element fragments that are present for _FLVR in ${RAMDISK_ELEMENT} ; do for dir in $(echo $ELEMENTS_PATH | tr ":" " ") ; do [ -d $dir/$_FLVR ] || continue _FILE="${dir}/${_FLVR}/init" if [ -a $_FILE ]; then cat >>$TMP_MOUNT_PATH/init <>$TMP_MOUNT_PATH/init fi break done done # Add our final steps to /init cat <${INIT}-end >>$TMP_MOUNT_PATH/init } function finalise_image () { echo "Finalising image" (cd "$TMP_MOUNT_PATH"; find . | cpio -o -H newc | gzip > "$TMP_IMAGE_PATH" ) } function populate_udev () { echo "Installing udev rules" for _FLVR in ${RAMDISK_ELEMENT} ; do for dir in $(echo $ELEMENTS_PATH | tr ":" " ") ; do [ -d $dir/$_FLVR ] || continue _DIR="${dir}/${_FLVR}/udev" if [ -d $_DIR ]; then find $_DIR -type f -exec cp -v {} $TMP_MOUNT_PATH/lib/udev/rules.d/ \; fi break done done }