summaryrefslogtreecommitdiffstats
path: root/qemu/hw/i386
AgeCommit message (Expand)AuthorFilesLines
2016-05-18These changes are the raw update to qemu-2.6.José Pekkarinen31-14155/+2397
2015-12-08kvmclock: add a new function to update env->tsc.WW-2015-52Liang Li1-16/+2
2015-09-01Add qemu 2.4.0Yang Zhang33-0/+25858
106' href='#n106'>106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
#!/bin/bash

# Copyright (c) 2016-2017 Intel Corporation
#
# 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.

# samplevnf-img-dpdk-nsb-modify - download and modify a Ubuntu cloud image
#
# The actual customization is done by a script passed with an absolute path as
# the only single argument. The command needs to be invoked as sudo
#
# Example invocation:
# samplevnf-img-dpdk-nsb-modify /home/samplevnf/tools/ubuntu-server-cloudimg-nsb-modify.sh
#
# Warning: the script will create files by default in:
#   /tmp/workspace/samplevnf
# the files will be owned by root!
#
# TODO: image resize is needed if the base image is too small
#
set -e
set -x

die() {
    echo "error: $1" >&2
    exit 1
}

test $# -eq 1 -o $# -eq 2 || die "no image specific script as argument"
test $(id -u) -eq 0 || die "should invoke using sudo"

cmd=$1
RELEASE=$2
test -x $cmd
mountdir="/mnt/samplevnf"
workspace=${WORKSPACE:-"/tmp/workspace/samplevnf"}
host=${HOST:-"cloud-images.ubuntu.com"}
release=${RELEASE:-"xenial"}
boot_mode="disk1"
YARD_IMG_ARCH="amd64"
if [[ "${YARD_IMG_ARCH}" = "arm64" ]]; then
    boot_mode="uefi1"
fi

image_path="${release}/current/${release}-server-cloudimg-${YARD_IMG_ARCH}-${boot_mode}.img"
image_url=${IMAGE_URL:-"https://${host}/${image_path}"}
sha256sums_path="${release}/current/SHA256SUMS"
sha256sums_url=${SHA256SUMS_URL:-"https://${host}/${sha256sums_path}"}

imgfile="${workspace}/samplevnf-image.img"
raw_imgfile_basename="samplevnf-${release}-server.raw"
raw_imgfile="${workspace}/${raw_imgfile_basename}"
filename=$(basename $image_url)
YARD_IMG_ARCH="amd64" #Neha added this just for testing
apt-get install -y parted

# download and checksum base image, conditionally if local copy is outdated
download() {
    test -d $workspace || mkdir -p $workspace
    cd $workspace
    rm -f SHA256SUMS # always download the checksum file to a detect stale image
    wget $sha256sums_url
    test -e $filename || wget -nc --progress=dot:giga $image_url
    grep $filename SHA256SUMS | sha256sum -c ||
    if [ $? -ne 0 ]; then
        rm $filename
        wget -nc --progress=dot:giga $image_url
        grep $filename SHA256SUMS | sha256sum -c
    fi

    for i in $(seq 0 9); do
        [ -a /dev/loop$i ] || mknod -m 660 /dev/loop$i b 7 $i
    done

    qemu-img convert $filename $raw_imgfile
    cd -
}

# mount image
setup() {
#    qemu-img resize $raw_imgfile +5GB
    mkdir -p $mountdir

    loopdevice=$(kpartx -l $raw_imgfile | head -1 | cut -f1 -d ' ')

    kpartx -av $raw_imgfile

    # for trouble shooting
    sleep 2
    dmsetup ls
    fuser -c /dev/loop0
    fuser -f /dev/loop0
    parted -l /dev/${loopdevice:0:5} || true
    mount /dev/mapper/$loopdevice $mountdir
    mount -t proc none $mountdir/proc

    sudo resize2fs /dev/mapper/$loopdevice
    cp $cmd $mountdir/$(basename $cmd)
    YARD_IMG_ARCH="amd64" #Neha added this just for testing
    if [ "${YARD_IMG_ARCH}" = "arm64" ]; then
        cp /usr/bin/qemu-aarch64-static $mountdir/usr/bin
    fi
}

# modify image running a script using in a chrooted environment
modify() {
    # resolv.conf does not exist in base image, pass nameserver value from host
    nameserver_ip=$(grep -m 1 '^nameserver' \
        /etc/resolv.conf | awk '{ print $2 '})

    # prevent init scripts from running during install
    echo $'#!/bin/sh\nexit 101' >$mountdir/usr/sbin/policy-rc.d
    chmod a+x $mountdir/usr/sbin/policy-rc.d

    chroot $mountdir /$(basename $cmd) $nameserver_ip

    rm -rf $mountdir/usr/sbin/policy-rc.d

    umount -f $mountdir/proc
    umount -l $mountdir

    qemu-img convert -c -o compat=0.10 -O qcow2 $raw_imgfile $imgfile

    if dmsetup table | grep $loopdevice; then
       dmsetup clear $loopdevice || true
    fi
}

# cleanup (umount) the image
cleanup() {
    # designed to be idempotent
    mount | grep $mountdir/proc && umount -l $mountdir/proc
    mount | grep $mountdir && umount -l $mountdir
    mount | grep "/mnt/${release}" && umount -l "/mnt/${release}"

    if [ -f "${raw_imgfile}" ]; then
        #kpartx -dv $raw_imgfile sometimes failed, we should checked it agein.
        #if [ -z "$(kpartx -l $raw_imgfile | grep 'loop deleted')" ]; then
        #    kpartx -dv $raw_imgfile
        #fi
        kpartx -dv $raw_imgfile || true
    fi

    rm -f $raw_imgfile
    rm -rf $mountdir
}

exitcode=""
error_trap()
{
    local rc=$?

    set +e

    if [ -z "$exitcode" ]; then
        exitcode=$rc
    fi

    dmesg -T | tail -50

    cleanup

    echo "Image build failed with $exitcode"

    exit $exitcode
}

main() {
    cleanup

    trap "error_trap" EXIT SIGTERM

    download
    setup
    modify

    trap - EXIT SIGTERM
    cleanup

    echo "the modified image is found here: $imgfile"
}

main