#!/bin/bash # mkinitrd # # Written by Erik Troan # # Contributors: # Elliot Lee # Miguel de Icaza # Christian 'Dr. Disk' Hechelmann # Michael K. Johnson # Pierre Habraken # Jakub Jelinek # Carlo Arenas Belon (carenas@chasqui.lared.net.pe> # Keith Owens # Bernhard Rosenkraenzer # Matt Wilson # Trond Eivind Glomsrød # Jeremy Katz # Preston Brown # Bill Nottingham # Guillaume Cottenceau PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH export PATH VERSION=4.1.18 compress=1 allowmissing="" target="" kernel="" force="" verbose="" MODULES="" img_vers="" builtins="" pivot=1 initramfs="" modulefile=/etc/modules.conf rc=0 IMAGESIZE=8000 PRESCSIMODS="scsi_mod sd_mod unknown" fstab="/etc/fstab" if [ -f /etc/udev/udev.conf ]; then USE_UDEV="yes" UDEV_TMPFS="yes" UDEV_KEEP_DEV="yes" . /etc/udev/udev.conf [ -x /sbin/udev.static ] || USE_UDEV= fi usage () { echo "usage: `basename $0` [--version] [-v] [-f] [--preload ]" >&2 echo " [--omit-scsi-modules] [--omit-raid-modules] [--omit-lvm-modules]" >&2 echo " [--with=] [--image-version] [--fstab=] [--nocompress]" >&2 echo " [--builtin=] [--nopivot] " >&2 echo "" >&2 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" >&2 exit 1 } moduledep() { if [ ! -f "/lib/modules/$kernel/modules.dep" ]; then echo "No dep file found for kernel $kernel" >&2 exit 1 fi [ -n "$verbose" ] && echo -n "Looking for deps of module $1" deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \ function modname(filename) { match(filename, /\/([^\/]+)\.k?o:?$/, ret); return ret[1] } \ function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \ /^\/lib/ { show(); \ orig=modname($1); dep=""; \ if ($2) { for (i = 2; i <= NF; i++) { dep=sprintf("%s %s", dep, modname($i)); } } } \ /^ / { dep=sprintf("%s %s", dep, modname($1)); } \ END { show(); exit(rc) }' /lib/modules/$kernel/modules.dep $1) [ -n "$verbose" ] && echo -e "\t$deps" } findmodule() { skiperrors="" if [ $1 == "--skiperrors" ]; then skiperrors=--skiperrors shift fi local modName=$1 if [ "$modName" = "off" -o "$modName" = "null" ]; then return fi if [ $(echo $modName | cut -b1) = "-" ]; then skiperrors=--skiperrors modName=$(echo $modName | cut -b2-) fi if echo $builtins | egrep -q '(^| )'$modName'( |$)' ; then [ -n "$verbose" ] && echo "module $modName assumed to be built in" set +x return fi # special cases if [ "$modName" = "i2o_block" ]; then findmodule i2o_core findmodule -i2o_pci modName="i2o_block" elif [ "$modName" = "ppa" ]; then findmodule parport findmodule parport_pc modName="ppa" elif [ "$modName" = "sbp2" ]; then findmodule ieee1394 findmodule ohci1394 modName="sbp2" else moduledep $modName for i in $deps; do findmodule $i done fi for modExt in o.gz o ko ; do if [ -d /lib/modules/$kernel/updates ]; then fmPath=`(cd /lib/modules/$kernel/updates; echo find . -name $modName.$modExt -type f | /sbin/nash --quiet) | /bin/awk {'print $1; exit;'}` fi if [ -f /lib/modules/$kernel/updates/$fmPath ]; then fmPath=updates/$fmPath break fi fmPath=`(cd /lib/modules/$kernel; echo find . -name $modName.$modExt -type f | /sbin/nash --quiet) | /bin/awk {'print $1; exit;'}` if [ -f /lib/modules/$kernel/$fmPath ]; then break fi done if [ ! -f /lib/modules/$kernel/$fmPath ]; then if [ -n "$skiperrors" ]; then return fi # ignore the absence of the scsi modules for n in $PRESCSIMODS; do if [ "$n" = "$modName" ]; then return; fi done; if [ -n "$allowmissing" ]; then echo "WARNING: No module $modName found for kernel $kernel, continuing anyway" >&2 return fi echo "No module $modName found for kernel $kernel, aborting." >&2 exit 1 fi # only need to add each module once if ! echo $MODULES | grep -q "$fmPath" 2>/dev/null ; then MODULES="$MODULES $fmPath" fi } inst() { if [ "$#" != "2" ];then echo "usage: inst " return fi [ -n "$verbose" ] && echo "$1 -> $2" cp $1 $2 } while [ $# -gt 0 ]; do case $1 in --fstab*) if echo $1 | grep -q '=' ; then fstab=`echo $1 | sed 's/^--fstab=//'` else fstab=$2 shift fi ;; --with-usb) withusb=yes ;; --with*) if echo $1 | grep -q '=' ; then modname=`echo $1 | sed 's/^--with=//'` else modname=$2 shift fi basicmodules="$basicmodules $modname" ;; --builtin*) if echo $1 | grep -q '=' ; then modname=`echo $1 | sed 's/^--builtin=//'` else modname=$2 shift fi builtins="$builtins $modname" ;; --version) echo "mkinitrd: version $VERSION" exit 0 ;; -v) verbose=-v ;; --nocompress) compress="" ;; --nopivot) pivot="" ;; --ifneeded) # legacy ;; -f) force=1 ;; --preload*) if echo $1 | grep -q '=' ; then modname=`echo $1 | sed 's/^--preload=//'` else modname=$2 shift fi PREMODS="$PREMODS $modname uhci-hcd ehci-hcd" ;; --omit-scsi-modules) PRESCSIMODS="" noscsi=1; ;; --omit-raid-modules) noraid=1; ;; --omit-lvm-modules) nolvm=1 ;; --image-version) img_vers=yes ;; --noudev) USE_UDEV= ;; --allow-missing) allowmissing=yes ;; *) if [ -z "$target" ]; then target=$1 elif [ -z "$kernel" ]; then kernel=$1 else usage fi ;; esac shift done if [ -z "$target" -o -z "$kernel" ]; then usage fi if [ -n "$img_vers" ]; then target="$target-$kernel" fi if [ -z "$force" -a -f $target ]; then echo "$target already exists." >&2 exit 1 fi if [ ! -d /lib/modules/$kernel ]; then echo "/lib/modules/$kernel is not a directory." >&2 exit 1 fi if [ $UID != 0 ]; then echo "mkinitrd must be run as root" exit 1 fi kernelmajor=`echo $kernel | cut -d . -f 1,2` if [ "$kernelmajor" == "2.4" ]; then if [ -n "$verbose" ]; then echo "Creating old-style initrd"; fi USE_UDEV= else if [ -n "$verbose" ]; then echo "Creating initramfs"; fi modulefile=/etc/modprobe.conf initramfs=1 pivot="" fi # if we're not using udev, don't set any of the other bits [ -z "$USE_UDEV" ] && UDEV_TMPFS= && UDEV_KEEP_DEV= # find a temporary directory which doesn't use tmpfs TMPDIR="" for t in /tmp /var/tmp /root ${PWD}; do if [ ! -d $t ]; then continue; fi if ! echo access -w $t | /sbin/nash --quiet; then continue; fi fs=$(df -T $t 2>/dev/null | awk '{line=$1;} END {printf $2;}') if [ "$fs" != "tmpfs" ]; then TMPDIR=$t break fi done if [ -z "$TMPDIR" ]; then echo "no temporary directory could be found" >&2 exit 1 fi if [ $TMPDIR = "/root" -o $TMPDIR = "${PWD}" ]; then echo "WARNING: using $TMPDIR for temporary files" >&2 fi for n in $PREMODS; do findmodule $n done needusb="" if [ -n "$withusb" ]; then # If / or /boot is on a USB device include the driver. With root by # label we could still get some odd behaviors for fs in / /boot ; do esc=$(echo $fs | sed 's,/,\\/,g') dev=$(mount | awk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//' | cut -d/ -f3) if [ "$(echo $dev | cut -c1-2)" = sd ]; then if [ `which kudzu 2>/dev/null` ]; then host=$(kudzu --probe -b scsi | gawk '/^device: '${dev}'/,/^host:/ { if (/^host/) { print $2; exit; } }') if [ -d /proc/scsi/usb-storage-${host} -o -f /proc/scsi/usb-storage/${host} ]; then needusb=1 fi fi fi done fi if [ -n "$needusb" ]; then drivers=$(awk '/^alias[[:space:]]+usb-controller[0-9]* / { print $3}' < $modulefile) if [ -n "$drivers" ]; then for driver in $drivers; do findmodule $driver done findmodule scsi_mod findmodule sd_mod findmodule usb-storage fi fi if [ -z "$noscsi" ]; then if [ ! -f $modulefile ]; then modulefile=/etc/conf.modules fi if [ -f $modulefile ]; then scsimodules=`grep "alias[[:space:]]\+scsi_hostadapter" $modulefile | grep -v '^[ ]*#' | LC_ALL=C sort -u | awk '{ print $3 }'` if [ -n "$scsimodules" ]; then for n in $PRESCSIMODS; do findmodule $n done for n in $scsimodules; do # for now allow scsi modules to come from anywhere. There are some # RAID controllers with drivers in block/ findmodule $n done fi fi fi # If we have ide devices and module ide, do the right thing ide=/proc/ide/ide* if [ -n "$ide" ]; then findmodule -ide-disk fi # If we use LVM, include lvm-mod if [ -z "$nolvm" ]; then if [ -f /proc/lvm/global ]; then if grep -q '^VG:' /proc/lvm/global ; then if [ "$kernelmajor" == "2.4" ]; then findmodule -lvm-mod else findmodule -dm-mod fi fi fi if [ -x /sbin/dmsetup -a -e /dev/mapper/control ]; then dmout=$(/sbin/dmsetup ls 2>/dev/null) if [ "$dmout" != "No devices found" -a "$dmout" != "" ]; then findmodule -dm-mod fi fi fi # If we have dasd devices, include the necessary modules (S/390) if [ -d /proc/dasd ]; then findmodule -dasd_mod findmodule -dasd_eckd_mod findmodule -dasd_fba_mod fi if [ -z "$noraid" -a -f /proc/mdstat ]; then # load appropriate raid devices if necessary -- we'll load whatever # /proc/mdstat suggests # note that the awk below contains a space and a tab for level in $(awk '/^md[0-9][0-9]*[ ]*:/ { print $4 }' \ /proc/mdstat | sort -u); do case $level in linear) findmodule linear startraid=1 ;; multipath) findmodule multipath startraid=1 ;; raid[01456]) findmodule $level startraid=1 ;; *) echo "raid level $level (in /proc/mdstat) not recognized" >&2 ;; esac done if [ -n "$startraid" ]; then raiddevices=$(awk '/^md[0-9][0-9]*[ ]*:/ { print $1 }' \ /proc/mdstat | sort) fi fi # check to see if we need to set up a loopback filesystem rootdev=$(awk '/^[ \t]*[^#]/ { if ($2 == "/") { print $1; }}' $fstab) if echo $rootdev | cut -d/ -f3 | grep -q loop ; then key="^# $(echo $rootdev | cut -d/ -f3 | tr '[a-z]' '[A-Z]'):" if ! grep "$key" $fstab > /dev/null; then echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2 echo "for this device. Consult the mkinitrd man page for more information" 2>&2 exit 1 fi line=$(grep "$key" $fstab) loopDev=$(echo $line | awk '{print $3}') loopFs=$(echo $line | awk '{print $4}') loopFile=$(echo $line | awk '{print $5}') basicmodules="$basicmodules -loop" if [ "$loopFs" = "vfat" -o "$loopFs" = "msdos" ]; then basicmodules="$basicmodules -fat" fi basicmodules="$basicmodules -${loopFs}" # check if the root fs is on a logical volume elif ! echo $rootdev | cut -c1-6 |grep -q "LABEL=" ; then rootdev=$(echo "readlink $rootdev" | /sbin/nash --quiet) major=`ls -l $rootdev | sed -e "s/.* \\([0-9]\+\\), *[0-9]\+.*/\\1/"` [ "$major" != "58" ] || root_lvm=1 if echo $rootdev |grep -q /dev/mapper 2>/dev/null ; then root_lvm=1 ; fi fi rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}' $fstab) rootopts=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $4; }}' $fstab) # in case the root filesystem is modular findmodule -${rootfs} if [ -n "$root_lvm" ]; then if [ "$kernelmajor" == "2.4" ]; then findmodule -lvm-mod else findmodule -dm-mod # DM requires all of these to be there in case someone used the # feature. broken. (#132001) findmodule -dm-mirror findmodule -dm-zero findmodule -dm-snapshot fi fi for n in $basicmodules; do findmodule $n done if [ -n "$verbose" ]; then echo "Using modules: $MODULES" fi MNTIMAGE=`mktemp -d ${TMPDIR}/initrd.XXXXXX` IMAGE=`mktemp ${TMPDIR}/initrd.img.XXXXXX` if [ -z "$initramfs" ]; then MNTPOINT=`mktemp -d ${TMPDIR}/initrd.mnt.XXXXXX` RCFILE=$MNTIMAGE/linuxrc else RCFILE=$MNTIMAGE/init fi if [ -z "$MNTIMAGE" -o -z "$IMAGE" ]; then echo "Error creating temporaries. Try again" >&2 exit 1 fi if [ -z "$initramfs" ]; then dd if=/dev/zero of=$IMAGE bs=1k count=$IMAGESIZE 2> /dev/null || exit 1 LODEV=$(echo findlodev | /sbin/nash --quiet) if [ -z "$LODEV" ]; then rm -rf $MNTIMAGE $MNTPOINT $IMAGE echo "All of your loopback devices are in use." >&2 exit 1 fi losetup ${LODEV} $IMAGE || exit 1 # We have to "echo y |" so that it doesn't complain about $IMAGE not # being a block device echo y | mke2fs $LODEV $IMAGESIZE >/dev/null 2>/dev/null tune2fs -i0 $LODEV >/dev/null if [ -n "$verbose" ]; then echo "Using loopback device $LODEV" fi mkdir -p $MNTPOINT mount -t ext2 $LODEV $MNTPOINT || { echo "Can't get a loopback device" exit 1 } # We don't need this directory, so let's save space rmdir $MNTPOINT/lost+found >/dev/null 2>&1 fi mkdir -p $MNTIMAGE mkdir -p $MNTIMAGE/lib mkdir -p $MNTIMAGE/bin mkdir -p $MNTIMAGE/etc mkdir -p $MNTIMAGE/dev mkdir -p $MNTIMAGE/loopfs mkdir -p $MNTIMAGE/proc mkdir -p $MNTIMAGE/sys mkdir -p $MNTIMAGE/sysroot ln -s bin $MNTIMAGE/sbin inst /sbin/nash "$MNTIMAGE/bin/nash" inst /sbin/insmod.static "$MNTIMAGE/bin/insmod" ln -s /sbin/nash $MNTIMAGE/sbin/modprobe if [ -n "$USE_UDEV" ]; then inst /sbin/udev.static $MNTIMAGE/sbin/udev ln -s udev $MNTIMAGE/sbin/udevstart mkdir -p $MNTIMAGE/etc/udev inst /etc/udev/udev.conf $MNTIMAGE/etc/udev/udev.conf ln -s /sbin/nash $MNTIMAGE/sbin/hotplug fi for MODULE in $MODULES; do if [ -x /usr/bin/strip ]; then /usr/bin/strip -g $verbose /lib/modules/$kernel/$MODULE -o $MNTIMAGE/lib/$(basename $MODULE) else cp $verbose -a /lib/modules/$kernel/$MODULE $MNTIMAGE/lib fi done echo Copying libraries TLS_LIBS="libm.so.6 libpthread.so.0 libc.so.6 librt.so.1" for i in $TLS_LIBS ; do cp $verbose /lib/tls/$i $MNTIMAGE/lib done LIBS="libattr.so.1 libselinux.so.1 libacl.so.1 ld-linux.so.2 \ libtermcap.so.2 libdl.so.2" for i in $LIBS ; do cp $verbose /lib/$i $MNTIMAGE/lib done cp $verbose /sbin/sfdisk $MNTIMAGE/sbin cp $verbose /bin/ls $MNTIMAGE/bin cp $verbose /bin/sh $MNTIMAGE/bin # mknod'ing the devices instead of copying them works both with and # without devfs... mknod $MNTIMAGE/dev/console c 5 1 mknod $MNTIMAGE/dev/null c 1 3 mknod $MNTIMAGE/dev/ram b 1 1 mknod $MNTIMAGE/dev/systty c 4 0 for i in 1 2 3 4; do mknod $MNTIMAGE/dev/tty$i c 4 $i done #addon mknod $MNTIMAGE/dev/sda b 8 0 for i in 1 2 3 4; do mknod $MNTIMAGE/dev/sda$i b 8 $i done # FIXME -- this won't work if you're using devfs if [ -n "$root_lvm" -a "$kernelmajor" == "2.4" ]; then pvs=$(/sbin/pvscan | grep " PV " | /bin/awk {'print $5;'} |sed 's/"//g') for pv in $pvs; do cp $verbose --parents -a $pv $MNTIMAGE/ done inst /sbin/vgwrapper "$MNTIMAGE/bin/vgwrapper" ln "$MNTIMAGE/bin/vgwrapper" "$MNTIMAGE/bin/vgscan" ln "$MNTIMAGE/bin/vgwrapper" "$MNTIMAGE/bin/vgchange" mknod $MNTIMAGE/dev/lvm b 109 0 fi if [ -n "$root_lvm" -a "$kernelmajor" == "2.6" ]; then inst /sbin/lvm.static "$MNTIMAGE/bin/lvm" if [ -f /etc/lvm/lvm.conf ]; then cp $verbose --parents /etc/lvm/lvm.conf $MNTIMAGE/ fi fi echo "#!/bin/nash" > $RCFILE echo "" >> $RCFILE echo "mount -t proc /proc /proc" >> $RCFILE echo "setquiet" >> $RCFILE echo "echo Mounted /proc filesystem" >> $RCFILE if [ "$kernelmajor" != "2.4" ]; then echo "echo Mounting sysfs" >> $RCFILE echo "mount -t sysfs none /sys" >> $RCFILE fi if [ -n "$USE_UDEV" ]; then if [ -n "$UDEV_TMPFS" ]; then cat >> $RCFILE <> $RCFILE < /proc/sys/kernel/hotplug EOF fi for MODULE in $MODULES; do text="" module=`echo $MODULE | sed "s|.*/||" | sed "s/.k\?o$//"` fullmodule=`echo $MODULE | sed "s|.*/||"` options=`sed -n -e "s/^options[ ][ ]*$module[ ][ ]*//p" $modulefile 2>/dev/null` if [ -n "$verbose" ]; then if [ -n "$options" ]; then text=" with options $options" fi echo "Loading module $module$text" fi echo "echo \"Loading $fullmodule module\"" >> $RCFILE echo "insmod /lib/$fullmodule $options" >> $RCFILE # Hack - we need a delay after loading usb-storage to give things # time to settle down before we start looking a block devices if [ "$module" = "usb-storage" ]; then echo "sleep 5" >> $RCFILE fi if [ "$module" = "zfcp" -a -f /etc/zfcp.conf ]; then echo "sleep 2" >> $RCFILE cat /etc/zfcp.conf | grep -v "^#" | tr "A-Z" "a-z" | while read DEVICE SCSIID WWPN SCSILUN FCPLUN; do echo "echo -n $WWPN > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/port_add" >>$RCFILE echo "echo -n $FCPLUN > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/$WWPN/unit_add" >>$RCFILE echo "echo -n 1 > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/online" >>$RCFILE done fi done # HACK: module loading + device creation isn't necessarily synchronous... # this will make sure that we have all of our devices before trying # things like RAID or LVM if [ -n "$USE_UDEV" ]; then echo "/sbin/udevstart" >> $RCFILE fi if [ -n "$startraid" ]; then for dev in $raiddevices; do cp -a /dev/${dev} $MNTIMAGE/dev echo "raidautorun /dev/${dev}" >> $RCFILE done fi if [ -z "$USE_UDEV" ]; then echo "echo Creating block devices" >> $RCFILE echo "mkdevices /dev" >> $RCFILE fi if [ -n "$loopDev" ]; then mkdir /initrd cp -a $loopDev $MNTIMAGE/dev cp -a $rootdev $MNTIMAGE/dev echo "echo Mounting device containing loopback root filesystem" >> $RCFILE echo "mount -t $loopFs $loopDev /loopfs" >> $RCFILE echo "echo Setting up loopback device $rootdev" >> $RCFILE echo "losetup $rootdev /loopfs$loopFile" >> $RCFILE elif [ -n "$root_lvm" ]; then if [ "$kernelmajor" == "2.4" ]; then echo "echo Scanning logical volumes" >> $RCFILE echo "vgscan" >> $RCFILE echo "echo Activating logical volumes" >> $RCFILE echo "vgchange -ay" >> $RCFILE else echo "echo Making device-mapper control node" >> $RCFILE echo "mkdmnod" >> $RCFILE echo "echo Scanning logical volumes" >> $RCFILE echo "lvm vgscan" >> $RCFILE echo "echo Activating logical volumes" >> $RCFILE echo "lvm vgchange -ay" >> $RCFILE echo "echo Making device nodes" >> $RCFILE echo "lvm vgmknodes" >> $RCFILE fi fi #addon cat >> $RCFILE << EOF mknod /dev/sda b 8 0 mknod /dev/sda1 b 8 1 mknod /dev/sda2 b 8 2 mknod /dev/sda3 b 8 3 mknod /dev/sda4 b 8 4 mknod /dev/sdb b 8 16 mknod /dev/sdb1 b 8 17 mknod /dev/sdb2 b 8 18 mknod /dev/sdb3 b 8 19 mknod /dev/sdb4 b 8 20 mknod /dev/sdc b 8 32 mknod /dev/sdc1 b 8 33 mknod /dev/sdc2 b 8 34 mknod /dev/sdc3 b 8 35 mknod /dev/sdc4 b 8 36 EOF echo "sleep 10" >> $RCFILE echo "echo Running sfdisk to re-read the partition table" >> $RCFILE echo "/sbin/sfdisk -R /dev/sda" >> $RCFILE echo "/sbin/sfdisk -R /dev/sdb" >> $RCFILE echo "/sbin/sfdisk -R /dev/sdc" >> $RCFILE # end of addon echo "echo Creating root device" >> $RCFILE echo "mkrootdev /dev/root" >> $RCFILE rootdev=/dev/root if [ "$kernelmajor" != "2.4" ]; then echo "umount /sys" >> $RCFILE fi if [ -n "$initramfs" ]; then echo "echo Mounting root filesystem" >> $RCFILE echo "mount -o $rootopts --ro -t $rootfs $rootdev /sysroot" >> $RCFILE [ -n "$UDEV_KEEP_DEV" ] && echo "mount -t tmpfs --bind /dev /sysroot/dev" >> $RCFILE echo "echo Switching to new root" >> $RCFILE echo "switchroot /sysroot" >> $RCFILE else if [ -n "$pivot" ]; then echo "echo 0x0100 > /proc/sys/kernel/real-root-dev" >> $RCFILE echo "echo Mounting root filesystem" >> $RCFILE echo "mount -o $rootopts --ro -t $rootfs $rootdev /sysroot" >> $RCFILE echo "pivot_root /sysroot /sysroot/initrd" >> $RCFILE echo "umount /initrd/proc" >> $RCFILE else echo "umount /proc" >> $RCFILE fi fi [ -n "$UDEV_TMPFS" ] && echo "umount /initrd/dev" >> $RCFILE chmod +x $RCFILE if [ -z "$initramfs" ]; then (cd $MNTIMAGE; tar cf - .) | (cd $MNTPOINT; tar xf -) || exit 1 umount $MNTPOINT losetup -d $LODEV else (cd $MNTIMAGE; find . | cpio --quiet -c -o) > $IMAGE || exit 1 fi if [ -n "$compress" ]; then gzip -9 < $IMAGE > $target || rc=1 else cp -a $IMAGE $target || rc=1 fi rm -rf $MNTIMAGE $IMAGE if [ -n "$MNTPOINT" ]; then rm -rf $MNTPOINT ; fi exit $rc