diff --git a/baremetal-mkinitrd.sh b/baremetal-mkinitrd.sh deleted file mode 100755 index 9dffb2cd..00000000 --- a/baremetal-mkinitrd.sh +++ /dev/null @@ -1,157 +0,0 @@ -#!/bin/bash - -# 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. - -if [ $# -lt 2 ]; then - cat <&2 - echo "Please install it" - exit 1 - fi - done - FLAVOUR_BINARIES="${FLAVOUR_BINARIES} ${HWDISCOVERY_BINARIES}" -fi - -if [[ "$FLAVOUR" == *hwburnin* ]] ; then - HWDISCOVERY_BINARIES="spew memtester" - for binary in ${HWDISCOVERY_BINARIES} ; do - LOCATION=$(which $binary) - if [ -z "$LOCATION" ]; then - echo "$binary is not found in PATH" 1>&2 - echo "Please install it" - exit 1 - fi - done - FLAVOUR_BINARIES="${FLAVOUR_BINARIES} ${HWDISCOVERY_BINARIES}" -fi - - -BUSYBOX=${BUSYBOX:-$(which busybox)} -if [ -z "$BUSYBOX" ]; then - echo "busybox is not found in PATH" 1>&2 - echo "Please set environment variable BUSYBOX to path to busybox executable" 1>&2 - exit 1 -fi - -function fullpath() { - local f=$1 - if [ "${f#/}" = "$f" ]; then - echo `pwd`/"$f" - else - echo "$f" - fi -} - -DIR=`dirname "$0"` -INIT="$DIR/scripts/init" -FUNCTIONS_D="$DIR/scripts/d" -LIB_UDEV="$DIR/udev" - -DEST=`fullpath "$1"` -KERNEL_VERSION=$2 -MODULE_ROOT=${3:-""} -MODULE_DIR=$MODULE_ROOT/lib/modules/$KERNEL_VERSION -FIRMWARE_DIR=$MODULE_ROOT/lib/firmware - -if [ ! -d "$MODULE_DIR" ]; then - echo "ERROR: kernel module directory not found at $MODULE_DIR" - return 1 -fi - -INITRD_DIR=`mktemp -t -d baremetal-mkinitrd.XXXXXXXX` -if [ $? -ne 0 ]; then - exit 1 -fi -function cleanup() { - rm -r "$INITRD_DIR" -} -trap cleanup EXIT -echo "working in $INITRD_DIR" - -mkdir -p "$INITRD_DIR/bin" -ln -s bin "$INITRD_DIR/sbin" -mkdir -p "$INITRD_DIR/lib" -ln -s lib "$INITRD_DIR/lib64" -mkdir -p "$INITRD_DIR/lib/modules" -mkdir -p "$INITRD_DIR/etc" -mkdir -p "$INITRD_DIR/etc/udev" - -cp -a "$LIB_UDEV" "$INITRD_DIR/lib/udev" - -mkdir -p "$INITRD_DIR/etc/modprobe.d" -echo "blacklist evbug" > "$INITRD_DIR/etc/modprobe.d/blacklist.conf" - -mkdir -p "$INITRD_DIR/etc/udev" -cat >"$INITRD_DIR/etc/udev/udev.conf" </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" "$INITRD_DIR/bin/" - if l=`ldd "$path"`; then - l=$( echo "$l" | grep '/' | tr "\t" " " ) - l=$( echo "$l" | sed 's/^.* => \([^ ]*\).*$/\1/' ) - l=$( echo "$l" | sed 's/^ *\([^ ]*\) *(0x[0-9a-f]*)/\1/' ) - l=$( echo "$l" | tr " " "\n" ) - libs=$( printf "%s\n%s\n" "$l" "$libs" | sort | uniq ) - fi -done -cp $libs "$INITRD_DIR/lib/" - -for i in $( "$BUSYBOX" --list ); do - if [ -f "$INITRD_DIR/bin/$i" ]; then - echo "skip $i" - continue - fi - ln -s busybox "$INITRD_DIR/bin/$i" -done - -cp -a "$MODULE_DIR" "$INITRD_DIR/lib/modules/$KERNEL_VERSION" - -cp -a "$FIRMWARE_DIR" "$INITRD_DIR/lib/firmware" - -cp "$INIT" "$INITRD_DIR/init" -chmod +x $INITRD_DIR/init -for F in "$FUNCTIONS_D"/* ; do - cp "$F" "$INITRD_DIR" -done - -(cd "$INITRD_DIR"; find . | cpio -o -H newc | gzip > "$DEST" ) - diff --git a/bin/disk-image-create b/bin/disk-image-create index b2dbdea4..9f0c394d 100755 --- a/bin/disk-image-create +++ b/bin/disk-image-create @@ -34,6 +34,7 @@ done for arg do IMAGE_FLAVOUR="$IMAGE_FLAVOUR $arg" ; done source $_LIB/img-defaults +source $_LIB/common-functions source $_LIB/img-functions echo "Building flavours: $IMAGE_FLAVOUR" diff --git a/bin/ramdisk-image-create b/bin/ramdisk-image-create new file mode 100755 index 00000000..23dd0ba5 --- /dev/null +++ b/bin/ramdisk-image-create @@ -0,0 +1,91 @@ +#!/bin/bash + +# XXX: Only portions of this are the NTT original, much is now HP work + +# 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. + +set -e + +SCRIPTNAME=$(basename $0) +export _DIR=$(dirname $0) +export _LIB=${_DIR}/../lib +source $_LIB/die + +function show_options () { + echo "Options:" + echo " -m PATH -- Path to find lib/modules. Default /" + echo " -k VERSION -- Kernel version. Default $(uname -r)" + echo " -h -- This help" + echo " -o FILENAME -- Output file" + echo " -x -- turn on tracing" + exit 0 +} + +TEMP=$(getopt -o m:k:ho:x -n $SCRIPTNAME -- "$@") +if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi + +# Note the quotes around `$TEMP': they are essential! +eval set -- "$TEMP" + +while true ; do + case "$1" in + -m) export MODULE_ROOT=$2; shift 2 ;; + -k) export KERNEL_VERSION=$2; shift 2 ;; + -o) export IMAGE_NAME=$2; shift 2 ;; + -h) show_options;; + -x) shift; set -x;; + --) shift ; break ;; + *) echo "Internal error!" ; exit 1 ;; + esac +done +for arg do RAMDISK_FLAVOUR="$RAMDISK_FLAVOUR $arg" ; done + +source $_LIB/ramdisk-defaults +source $_LIB/common-functions +source $_LIB/ramdisk-functions + +echo "Building flavour(s): ${RAMDISK_FLAVOUR}" + +echo "Discovering binary dependencies" +ensure_binaries + +mk_build_dir + +INIT="$_DIR/../scripts/init" +FUNCTIONS_D="$_DIR/../scripts/d" +LIB_UDEV="$_DIR/../udev" + +MODULE_DIR=$MODULE_ROOT/lib/modules/$KERNEL_VERSION +FIRMWARE_DIR=$MODULE_ROOT/lib/firmware + +if [ ! -d "$MODULE_DIR" ]; then + echo "ERROR: kernel module directory not found at $MODULE_DIR" + return 1 +fi + +mk_build_dir +mkdir -p $TMP_BUILD_DIR/mnt +TMP_MOUNT_PATH=$TMP_BUILD_DIR/mnt + +echo "working in $TMP_MOUNT_PATH" + +create_base +populate_lib +populate_busybox +populate_init +finalise_image +save_image $IMAGE_NAME + diff --git a/flavours/baremetal/binary-deps b/flavours/baremetal/binary-deps new file mode 100644 index 00000000..a1a4c366 --- /dev/null +++ b/flavours/baremetal/binary-deps @@ -0,0 +1 @@ +busybox diff --git a/flavours/hwburnin/binary-deps b/flavours/hwburnin/binary-deps new file mode 100644 index 00000000..42021cb3 --- /dev/null +++ b/flavours/hwburnin/binary-deps @@ -0,0 +1,2 @@ +spew +memtester diff --git a/flavours/hwdiscovery/binary-deps b/flavours/hwdiscovery/binary-deps new file mode 100644 index 00000000..2fb3acae --- /dev/null +++ b/flavours/hwdiscovery/binary-deps @@ -0,0 +1 @@ +lshw diff --git a/lib/common-functions b/lib/common-functions new file mode 100644 index 00000000..736657e8 --- /dev/null +++ b/lib/common-functions @@ -0,0 +1,36 @@ +function mk_build_dir () { + export TMP_BUILD_DIR=$(mktemp -t -d image.XXXXXXXX) + [ $? -eq 0 ] || die "Failed to create tmp directory" + trap cleanup EXIT + echo Building in $TMP_BUILD_DIR + export TMP_IMAGE_PATH=$TMP_BUILD_DIR/image + export TMP_HOOKS_PATH=$TMP_BUILD_DIR/hooks +} + +function save_image () { + # TODO: this really should rename the old file + if [ -f $1 ] ; then + echo "Old Image file Found REMOVING" + rm -f $1 + fi + + cp $TMP_IMAGE_PATH $1 + rm -r $TMP_BUILD_DIR + # All done! + trap EXIT + echo "Image file $1 created..." +} + +function generate_hooks () { + mkdir -p $TMP_HOOKS_PATH + for _FLAVOUR in $IMAGE_FLAVOUR ; do + [ -d $FLAVOURS_DIR/$_FLAVOUR ] || die "The flavour does not exist." ; + cp -t $TMP_HOOKS_PATH -a $FLAVOURS_DIR/$_FLAVOUR/* ; + done +} + +# Check that a real flavour has been chosen (prevents foot-guns) +function check_flavour () { + [ -d $TMP_HOOKS_PATH ] || generate_hooks +} + diff --git a/lib/img-functions b/lib/img-functions index 926b5f5e..2f865427 100644 --- a/lib/img-functions +++ b/lib/img-functions @@ -23,15 +23,6 @@ function cleanup () { rm -rf $TMP_BUILD_DIR } -function mk_build_dir () { - export TMP_BUILD_DIR=$(mktemp -t -d image.XXXXXXXX) - [ $? -eq 0 ] || die "Failed to create tmp directory" - trap cleanup EXIT - echo Building in $TMP_BUILD_DIR - export TMP_IMAGE_PATH=$TMP_BUILD_DIR/image - export TMP_HOOKS_PATH=$TMP_BUILD_DIR/hooks -} - function ensure_nbd () { NBD=`which qemu-nbd` if [ -z "$NBD" ]; then @@ -101,19 +92,6 @@ function run_in_target() { sudo -E chroot $TMP_MOUNT_PATH "$@" } -function generate_hooks () { - mkdir -p $TMP_HOOKS_PATH - for _FLAVOUR in $IMAGE_FLAVOUR ; do - [ -d $FLAVOURS_DIR/$_FLAVOUR ] || die "The flavour does not exist." ; - cp -t $TMP_HOOKS_PATH -a $FLAVOURS_DIR/$_FLAVOUR/* ; - done -} - -# Check that a real flavour has been chosen (prevents foot-guns) -function check_flavour () { - [ -d $TMP_HOOKS_PATH ] || generate_hooks -} - # Helper function to run a directory of scripts inside the chroot function run_d_in_target() { check_flavour @@ -171,20 +149,6 @@ function compress_image () { mv $TMP_IMAGE_PATH-new $TMP_IMAGE_PATH } -function save_image () { - # TODO: this really should rename the old file - if [ -f $1 ] ; then - echo "Old Image file Found REMOVING" - rm -f $1 - fi - - cp $TMP_IMAGE_PATH $1 - rm -r $TMP_BUILD_DIR - # All done! - trap EXIT - echo "Image file $1 created..." -} - function block_apt_translations () { # Configure APT not to fetch translations files sudo dd of=$TMP_MOUNT_PATH/etc/apt/apt.conf.d/95no-translations <&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" + ln -s lib "$TMP_MOUNT_PATH/lib64" + mkdir -p "$TMP_MOUNT_PATH/lib/modules" + mkdir -p "$TMP_MOUNT_PATH/etc" + mkdir -p "$TMP_MOUNT_PATH/etc/udev" + + cp -a "$LIB_UDEV" "$TMP_MOUNT_PATH/lib/udev" + + mkdir -p "$TMP_MOUNT_PATH/etc/modprobe.d" + echo "blacklist evbug" > "$TMP_MOUNT_PATH/etc/modprobe.d/blacklist.conf" + + mkdir -p "$TMP_MOUNT_PATH/etc/udev" + cat >"$TMP_MOUNT_PATH/etc/udev/udev.conf" </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/" + if l=`ldd "$path"`; then + l=$( echo "$l" | grep '/' | tr "\t" " " ) + l=$( echo "$l" | sed 's/^.* => \([^ ]*\).*$/\1/' ) + l=$( echo "$l" | sed 's/^ *\([^ ]*\) *(0x[0-9a-f]*)/\1/' ) + l=$( echo "$l" | tr " " "\n" ) + libs=$( printf "%s\n%s\n" "$l" "$libs" | sort | uniq ) + fi + done + cp $libs "$TMP_MOUNT_PATH/lib/" + + 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" + # XXX: This needs to understand flavours and the pre-shipped init needs to split up + cp "$INIT" "$TMP_MOUNT_PATH/init" + chmod +x $TMP_MOUNT_PATH/init + for F in "$FUNCTIONS_D"/* ; do + cp "$F" "$TMP_MOUNT_PATH" + done +} + +function finalise_image () { + echo "Finalising image" + (cd "$TMP_MOUNT_PATH"; find . | cpio -o -H newc | gzip > "$TMP_IMAGE_PATH" ) +} +