#!/bin/bash # --------------------------------------------------------------------- # # buildvdimage - Build raw disk image for VirtualBox and install # # debian system on it. So we can start using the new # # virtual machine immediately without to install and # # configure that system manually. # # # # Part of this script was modified from # # http://blog.quinthar.com/2008/07/ # # building-1gb-bootable-qemu-image-using.html # # # # version 0.1 - cj (2010-06-25) init. # # version 0.2 - cj (2010-07-09) ... # # version 0.2e - cj (2010-07-12) various fixed. # # version 0.3 - cj (2010-07-17) various fixed, use with blade{3,4} # # version 0.3a - cj (2010-07-20) add tasksel, and additional pacakages # # version 0.4 - cj (2010-07-26) WUNCA22 version. # # version 0.5 - cj (2010-08-03) ... # --------------------------------------------------------------------- # export LANG=C VBOXHDD="/home/cj/.VirtualBox/HardDisks" DIST="lucid" # SVR="ftp.th.debian.org" SVR="ftp.psu.ac.th" FTPSITE="$SVR" VMFTPSITE="$SVR" # FTPSITE="localhost:3142/$SVR" # VMFTPSITE="10.0.2.2:3142/$SVR" # DEBREPO="http://$SVR/debian" # DEBREPO="file:///var/cache/apt-cacher-ng/$SVR/debian" # DEBREPO="http://$FTPSITE/debian" DEBREPO="http://$FTPSITE/pub/ubuntu" # TASKLIST="thai-desktop" TASKLIST="" # PKGLIST="netcat zenity tshark wireshark" PKGLIST="" USER="me" PASSWORD="********" USERNAME="Who am I" VMHOSTNAME="lucid32" SWAPSIZE=128 BOOTSIZE=128 HOMESIZE=256 MOUNT="mount" dumphdinfo="VBoxManage -q internalcommands dumphdinfo" hdinfo="/tmp/${VMHOSTNAME}.hdinfo" fstab="/tmp/${VMHOSTNAME}.fstab" devlist="/tmp/${VMHOSTNAME}.devlist" parted="/tmp/${VMHOSTNAME}.parted" # --------------------------------------------------------------------- # # Check that whether binary needed for this setup is existed. # # --------------------------------------------------------------------- # check_command() { local CMD="$1" if [ ! -x "$CMD" ]; then echo "$CMD not exist." exit fi } # --------------------------------------------------------------------- # # Create various configuration files # # --------------------------------------------------------------------- # ### ----- /etc/resolv.conf ----- ### # It's difficult to generate /etc/resolv.conf by ourself, # but it should be safe to copy from building host to the VM # since it is likely to be used in the same environment. create_resolv_conf() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: resolv.conf" && exit sudo cp /etc/resolv.conf $MOUNT/etc } ### ----- /etc/hosts ----- ### # Standard /etc/hosts, without self IP address and name... create_hosts() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: hosts" && exit cat << _EOT_ > /tmp/hosts.$$ 127.0.0.1 localhost localhost.localdomain ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters _EOT_ sudo mv -vf /tmp/hosts.$$ $MOUNT/etc/hosts } ### ----- /etc/hostname ----- ### create_hostname() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: hostname" && exit sudo sh -c "(echo '$VMHOSTNAME' > $MOUNT/etc/hostname)" } ### ----- /etc/fstab ----- ### create_fstab() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: fstab" && exit cat << _EOT_ > /tmp/fstab.$$ # proc /proc proc defaults 0 0 _EOT_ cat $fstab >> /tmp/fstab.$$ sudo mv -vf /tmp/fstab.$$ $MOUNT/etc/fstab } ### ----- /etc/kernel-img.conf ----- ### create_kernel_img_conf() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: kernel-img.conf" && exit cat << _EOT_ > /tmp/kernel-img.conf.$$ do_symlinks = yes relative_links = yes do_bootloader = yes do_bootfloppy = no do_initrd = yes link_in_boot = no _EOT_ sudo mv -vf /tmp/kernel-img.conf.$$ $MOUNT/etc/kernel-img.conf } ### ----- /etc/apt/sources.list ----- ### packages update during install ### create_tmp_apt_sources_list() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: sources.list" && exit cat << _EOT_ > /tmp/sources.list.$$ deb http://${FTPSITE}/pub/ubuntu lucid main _EOT_ sudo mv -vf /tmp/sources.list.$$ $MOUNT/etc/apt/sources.list } ### ----- /etc/apt/sources.list ----- ### supposed to be real one ### create_real_apt_sources_list() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: sources.list" && exit cat << _EOT_ > /tmp/sources.list.$$ deb http://${FTPSITE}/pub/ubuntu lucid main _EOT_ sudo mv -vf /tmp/sources.list.$$ $MOUNT/etc/apt/sources.list } ### ----- /etc/apt/sources.list ----- ### real one using under VM ### create_vm_apt_sources_list() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: sources.list" && exit cat << _EOT_ > /tmp/final-sources.list.$$ deb http://${FTPSITE}/put/ubuntu lucid main _EOT_ sudo mv -vf /tmp/final-sources.list.$$ $MOUNT/etc/apt/sources.list } ### ----- /etc/network/interfaces ----- ### create_network_interfaces() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: interfaces" && exit cat << _EOT_ > /tmp/interfaces.$$ auto lo iface lo inet loopback allow-hotplug eth0 iface eth0 inet dhcp _EOT_ sudo mv -f /tmp/interfaces.$$ $MOUNT/etc/network/interfaces } ### ----- various config files in /etc ----- ### create_config_files() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: config files" && exit create_resolv_conf $MOUNT # /etc/resolv.conf create_hosts $MOUNT # /etc/hosts create_hostname $MOUNT # /etc/hostname create_fstab $MOUNT # /etc/fstab create_kernel_img_conf $MOUNT # /etc/kernel_img_conf create_tmp_apt_sources_list $MOUNT # /etc/apt/sources.list create_network_interfaces $MOUNT # /etc/network/interfaces } ### ----- /boot/grub/menu.lst ----- ### create_boot_grub_menu_list() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: menu.list" && exit # check whether if /boot are in different partition local boot="$(grep /boot $fstab)" # No separate boot partition? if [ -z "$boot" ]; then BOOT="/boot" ROOT="/dev/sda1" else BOOT="" ROOT="/dev/sda2" fi cat << _EOT_ > /tmp/menu.lst.$$ timeout 3 default 0 _EOT_ ( cd $MOUNT/boot; for k in vmlinuz-*; do v=$(echo $k | cut -f2- -d-) if [ -f "initrd.img-$v" ]; then cat << _EOT_ >> /tmp/menu.lst.$$ title Debian Linux $v root (hd0,0) kernel $BOOT/vmlinuz-$v root=$ROOT ro verbose initrd $BOOT/initrd.img-$v _EOT_ fi done ) sudo mv -f /tmp/menu.lst.$$ $MOUNT/boot/grub/menu.lst } # --------------------------------------------------------------------- # # create_policy_rc_d Create policy-rc.d for handle tasksel tasks # # install on chroot environment. # # --------------------------------------------------------------------- # create_policy_rc_d() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: policy-rc.d" && exit cat << _EOT_ > /tmp/policy-rc.d.$$ #!/bin/sh exit 101 _EOT_ chmod a+rx /tmp/policy-rc.d.$$ sudo mv -vf /tmp/policy-rc.d.$$ $MOUNT/usr/sbin/policy-rc.d } # --------------------------------------------------------------------- # # config_grub This must be done after grub and kernel has been # # installed to the raw disk device. # # --------------------------------------------------------------------- # config_grub() { local device="$1" MOUNT="$2" [ -z "$device" ] && echo "ERR: device of grub" && exit [ -z "$MOUNT" ] && echo "ERR: grub.input" && exit cat << _EOT_ > /tmp/grub.input device (hd0) $device root (hd0,0) setup --stage2=/boot/grub/stage2 (hd0) quit _EOT_ sudo mkdir $MOUNT/boot/grub sudo cp $MOUNT/usr/lib/grub/i386-pc/* $MOUNT/boot/grub create_boot_grub_menu_list $MOUNT sudo chroot $MOUNT grub --batch --device-map=/dev/null \ < /tmp/grub.input \ > /tmp/grub.log # If first time failed, then try once again, ... if [ "$(grep ^Error /tmp/grub.log)" ]; then sudo chroot $MOUNT grub --batch --device-map=/dev/null \ < /tmp/grub.input \ > /tmp/grub2.log # If it still failed, then we gave up! if [ "$(grep ^Error /tmp/grub2.log)" ]; then echo "Failed to install grub." echo "Please see /tmp/grub.log /tmp/grub2.log" exit fi fi } # --------------------------------------------------------------------- # # binding_mount Binding mount points to chroot environment # # --------------------------------------------------------------------- # binding_mount() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: mount" && exit # Binding mount point echo "Bind /proc to $MOUNT/proc" sudo mount --bind /proc $MOUNT/proc echo "Mount $MOUNT/dev/pts" sudo mount -t devpts none $MOUNT/dev/pts } # --------------------------------------------------------------------- # # binding_umount Un-binding mount points from chroot environment # # --------------------------------------------------------------------- # binding_umount() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: umount" && exit sudo umount $MOUNT/proc sudo umount $MOUNT/dev/pts } # --------------------------------------------------------------------- # # create_vdi - Create the fixed size VDI disk image file. # # --------------------------------------------------------------------- # create_vdi() { local name="$1" size="$2" [ -f "$name" ] && echo "File '$name' already exist." && exit [ -z "$size" ] && echo "ERR: create_vdi size" && exit VBoxManage -q createhd --filename "$name" --size "$size" \ --format VDI --variant Fixed } # --------------------------------------------------------------------- # # verify_vdi - Verify that the vdi is actual fixed size VDI image. # # --------------------------------------------------------------------- # verify_vdi() { local file="$1" [ -z "$file" ] && echo "ERR: verify_vdi filename" && exit $dumphdinfo $file > $hdinfo if [ "$(grep 'Format autodetect failed' $hdinfo)" ]; then echo "File '$file' is not a VDI file." exit fi version=$( grep '^Header: Version=' $hdinfo |\ cut -f3 -d= |\ cut -f1 -d' ' ) [ -z "$version" -o "$version" != "2" ] && \ echo "File '$file' is not a fixed disk VDI image." && \ exit } # --------------------------------------------------------------------- # # loop_dev_setup - Setup loop device for the disk image for # # create partition on the image file. # # --------------------------------------------------------------------- # loop_dev_setup() { local file="$1" [ -z "$file" ] && echo "ERR: loop_dev_setup filename" && exit loopdev=$(sudo losetup -f) offset=$( $dumphdinfo $file |\ grep offStartData |\ cut -f4 -d= ) echo "Setup loop device $loopdev for $file" sudo losetup --offset $offset $loopdev $file sudo losetup -a # We need to do this first to get disksize sudo parted -s $loopdev mklabel msdos disk_size=$(sudo parted -s $loopdev print | grep ^Disk | cut -f3 -d' ') # Check that size should be in MB unit if [ "$(echo $disk_size | sed -e 's/^[0-9]*//')" != "MB" ]; then echo "Disk size '$disk_size' is not in MB unit." exit fi # Get only number part disk_size=$(echo $disk_size | sed -e 's/MB$//') } # --------------------------------------------------------------------- # # set_part_scheme - Set partition scheme. Select the predefine # # partitions, for create that on disk image. # # --------------------------------------------------------------------- # set_part_scheme() { local scheme="$1" case "$scheme" in # --------------------------------------------------------------------- # # /dev/sda1 / ext3 defaults 0 1 -- everything # # --------------------------------------------------------------------- # 1) boot_size=0 swap_size=0 root_size=$disk_size home_size=0 ;; # --------------------------------------------------------------------- # # /dev/sda1 / ext3 defaults 0 1 -- the rest # # /dev/sda5 none swap sw 0 0 -- 128 MB SWAP # # --------------------------------------------------------------------- # 2) boot_size=0 swap_size=$SWAPSIZE root_size=$(( $disk_size - $swap_size )) home_size=0 ;; # --------------------------------------------------------------------- # # /dev/sda1 /boot ext3 defaults 0 1 -- 128 MB /boot # # /dev/sda2 / ext3 defaults 0 1 -- the rest # # /dev/sda5 none swap sw 0 0 -- 128 MB SWAP # # --------------------------------------------------------------------- # 3) boot_size=$BOOTSIZE swap_size=$SWAPSIZE root_size=$(( $disk_size - $boot_size - $swap_size )) home_size=0 ;; # --------------------------------------------------------------------- # # /dev/sda1 /boot ext3 defaults 0 1 -- 128 MB /boot # # /dev/sda2 / ext3 defaults 0 1 -- the rest # # /dev/sda3 /home ext3 defaults 0 1 -- 256 MB /home # # /dev/sda5 none swap sw 0 0 -- 128 MB SWAP # # --------------------------------------------------------------------- # 4) home_size=$HOMESIZE boot_size=$BOOTSIZE swap_size=$SWAPSIZE root_size=$(( $disk_size - $boot_size - $swap_size - $home_size)) ;; *) echo "Invalid scheme" exit ;; esac } # --------------------------------------------------------------------- # # Create parition here. # # --------------------------------------------------------------------- # create_partitions() { [ -z "$loopdev" ] && echo "ERR: create_partitions loopdev" && exit boot_start=0 boot_end=$(($boot_start + $boot_size)) root_start=$boot_end root_end=$(($root_start + $root_size)) home_start=$root_end home_end=$(($home_start + $home_size)) swap_start=$home_end swap_end=$(($swap_start + $swap_size)) ext_start=$swap_start ext_end=$swap_end sudo parted -s $loopdev mklabel msdos # clear temporary fstab file > $fstab devno=1 if [ "$boot_size" != 0 ]; then sudo parted -s $loopdev mkpart primary ext2 $boot_start $boot_end echo "/dev/sda$devno /boot ext3 errors=remount-ro 0 0" >> $fstab devno=$(($devno + 1)) fi if [ "$root_size" != 0 ]; then sudo parted -s $loopdev mkpart primary ext2 $root_start $root_end echo "/dev/sda$devno / ext3 errors=remount-ro 0 0" >> $fstab devno=$(($devno + 1)) fi if [ "$home_size" != 0 ]; then sudo parted -s $loopdev mkpart primary ext2 $home_start $home_end echo "/dev/sda$devno /home ext3 errors=remount-ro 0 0" >> $fstab devno=$(($devno + 1)) fi if [ "$swap_size" != 0 ]; then devno=5 sudo parted -s $loopdev mkpart extended $ext_start $ext_end sudo parted -s $loopdev mkpart logical linux-swap $swap_start $swap_end echo "/dev/sda$devno none swap sw 0 0" >> $fstab fi sudo parted -s $loopdev set 1 boot on sudo parted -s $loopdev print > $parted } # --------------------------------------------------------------------- # # loop_part_mkfs- Make filesystem on each partition accessible by # # loop device. # # This might be the most dangerous part of this script. # # It will format filesystem without asking any question # # --------------------------------------------------------------------- # loop_part_mkfs() { [ -z "$devlist" -o -z "$loopdev" ] && echo "ERR: loop_part_mkfs" && exit # Clean up device list > $devlist sudo sfdisk -uS -l $loopdev |\ sed -e 's/\*//' |\ grep ^/ |\ grep Linux |\ while read line; do start=$(echo $line | awk '{ print $2; }') end=$(echo $line | awk '{ print $3; }') swap=$(echo $line | grep 'swap') offset=$(( $start * 512 )) sizelimit=$(( ($end - $start) * 512 )) looppart=$(sudo losetup -f) sudo losetup --offset $offset --sizelimit $sizelimit \ $looppart $loopdev # Check whether it is a "Linux swap" partition if [ -z "$swap" ]; then echo "Make e2fs on $looppart ..." sudo mke2fs -j $looppart echo "$looppart" >> $devlist else echo "Make swap on $looppart ..." sudo mkswap $looppart echo "#$looppart" >> $devlist fi done } # --------------------------------------------------------------------- # # mount_dev Mount one device # # --------------------------------------------------------------------- # mount_dev() { local dev="$1" mount="$2" [ -z "$dev" ] && echo "device is not defined" && exit [ -z "$mount" ] && echo "mount point is not defined" && exit echo "Try mount '$dev' to '$mount'" sudo mount -t ext3 $dev $mount || { echo "Failed to mount '$dev' to '$mount'" exit } } # --------------------------------------------------------------------- # # loop_part_mount Mount partition from loop device. # # --------------------------------------------------------------------- # # Mount loop device partition for installation loop_part_mount() { local MOUNT="$1" [ -z "$MOUNT" ] && echo "ERR: loop_part_mount" && exit local LOOPDEVLIST="$(cat $devlist | grep -v ^# | tr '\n' ' ')" count=$(echo "$LOOPDEVLIST" | wc -w) p1=$(echo "$LOOPDEVLIST" | awk '{ print $1; }') p2=$(echo "$LOOPDEVLIST" | awk '{ print $2; }') p3=$(echo "$LOOPDEVLIST" | awk '{ print $3; }') case $count in 1) mount_dev $p1 $MOUNT ;; 2) mount_dev $p2 $MOUNT sudo mkdir -p $MOUNT/boot mount_dev $p1 $MOUNT/boot ;; 3) mount_dev $p2 $MOUNT sudo mkdir -p $MOUNT/boot $MOUNT/home mount_dev $p1 $MOUNT/boot mount_dev $p3 $MOUNT/home ;; *) echo "Hmmm, looppartmount found "$count" partition list" echo "List = $LOOPDEVLIST" echo "This is unexpected, bail out" exit ;; esac } # --------------------------------------------------------------------- # # install_tasks Install predefined packages using tasksel # # --------------------------------------------------------------------- # install_tasks() { local MOUNT="$1" local TASKLIST="" [ -z "$MOUNT" ] && echo "ERR: install_tasks" && exit shift TASKLIST="$@" cat << _EOT_ >> /tmp/tasksel.$$ #!/bin/sh DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical LANG=C export DEBIAN_FRONTEND DEBIAN_PRIORITY LANG _EOT_ for task in $TASKLIST; do echo "tasksel --new-install install $task" >> /tmp/tasksel.$$ done chmod a+rx /tmp/tasksel.$$ sudo cp /tmp/tasksel.$$ $MOUNT/tmp/tasksel sudo chroot $MOUNT /tmp/tasksel } # --------------------------------------------------------------------- # # install_packages Install additional packages # # --------------------------------------------------------------------- # install_packages() { local MOUNT="$1" local PKGLIST="" [ -z "$MOUNT" ] && echo "ERR: install_pacakges" && exit shift PKGLIST="$@" echo "Install additional package :: $PKGLIST" sudo chroot $MOUNT apt-get -y install $PKGLIST } # --------------------------------------------------------------------- # # cleanup_loopdev Cleanup loop device # # --------------------------------------------------------------------- # cleanup_loopdev() { local LOOPDEVLIST="$(cat $devlist | tr '#' ' ' | tr '\n' ' ')" [ -z "$loopdev" ] && echo "ERR: cleanup_loopdev." && exit # then umount every loop device for looppart in $LOOPDEVLIST; do if [ "$(mount | grep ^$looppart)" ]; then echo "Unmount $looppart ..." sudo umount $looppart fi done # try again, cause we didn't have looppart arrange in order... for looppart in $LOOPDEVLIST; do if [ "$(mount | grep ^$looppart)" ]; then echo "Unmount $looppart ..." sudo umount $looppart fi done for looppart in $LOOPDEVLIST; do echo "Remove loop device $looppart ..." sudo losetup -d $looppart done sleep 3 echo "Finally remove loop device $loopdev" sudo losetup -d $loopdev C=0 while [ "$(sudo losetup -a | grep $loopdev)" ]; do sleep 3 echo "Remove $loopdev failed, try once again" sudo losetup -d $loopdev C=$(($C + 1)) if [ "$C" -gt 3 ]; then echo "Too many attempts had been made, I gave up." exit fi done } # --------------------------------------------------------------------- # # Main Start Here # # --------------------------------------------------------------------- # [ -z "$3" ] && echo "Usage: $0 file size scheme" && exit file="$1" size="$2" scheme="$3" if [ -z "$(echo $file | grep '\.vdi$')" ]; then echo "Filename should be in form 'file.vdi'" exit fi check_command /sbin/parted check_command /usr/sbin/debootstrap check_command /usr/bin/VBoxManage check_command /bin/mount check_command /sbin/losetup [ "$size" -lt 256 -o "$size" -gt 8192 ] && { echo "Please choose size between 256-8192" exit } case "$scheme" in 1|2|3|4) ;; *) echo "Invalid scheme, please choose [1-4]" exit ;; esac vdifile="$VBOXHDD/$file" # Get rid of the existing one... [ -f $vdifile ] && rm -f $vdifile # OK now create a new one, also do create partition on it. # We will use simple, single partition here, for simplicity. echo "### =====================================================" echo "### Creating VDI file and also setup it as loop device" echo "### =====================================================" create_vdi $file $size verify_vdi $vdifile loop_dev_setup $vdifile echo "### =====================================================" echo "### Select parition scheme" echo "### =====================================================" set_part_scheme $scheme echo "### =====================================================" echo "### Create Partitions" echo "### =====================================================" create_partitions # Create filesystem on loopdevice echo "### =====================================================" echo "### Create filesystem on loop devices" echo "### =====================================================" loop_part_mkfs echo "### =====================================================" echo "### Create mount point '$MOUNT'" echo "### =====================================================" mkdir -p $MOUNT echo "### =====================================================" echo "### Mount filesystem to mount points" echo "### =====================================================" loop_part_mount $MOUNT # Using debootstrap to install debian to raw disk image DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical export DEBIAN_FRONTEND DEBIAN_PRIORITY echo "### =====================================================" echo "### Installing $DIST into $MOUNT" echo "### =====================================================" sudo debootstrap --arch i386 $DIST $MOUNT $DEBREPO # Create various configuration files in mount point echo "### =====================================================" echo "### Create various config files" echo "### =====================================================" create_config_files $MOUNT echo "### =====================================================" echo "### Binding /proc and /dev/pts" echo "### =====================================================" binding_mount $MOUNT # trap exit_cleanup EXIT INT create_policy_rc_d $MOUNT echo "### =====================================================" echo "### Installing kernel into $MOUNT" echo "### =====================================================" sudo chroot $MOUNT apt-get update sudo chroot $MOUNT apt-get -y install sudo gnupg grub linux-image-2.6-686 echo "### =====================================================" echo "### Config grub on device $loopdev via mount point $MOUNT" echo "### =====================================================" config_grub $loopdev $MOUNT echo "### =====================================================" echo "### Install sshd" echo "### =====================================================" sudo chroot $MOUNT apt-get -y install ssh sudo chroot $MOUNT /etc/init.d/ssh stop echo "### =====================================================" echo "### Setup user account and predefined password" echo "### =====================================================" sudo chroot $MOUNT usermod -p '!' root sudo chroot $MOUNT useradd -m -c "$USERNAME" -G sudo $USER echo "$USER:$PASSWORD" | sudo chroot $MOUNT chpasswd $USER echo "### =====================================================" echo "### Setup sudoers" echo "### =====================================================" sudo sh -c "(sed -ie 's/# %sudo/%sudo/' $MOUNT/etc/sudoers)" echo "### =====================================================" echo "### Install root's sshd key" echo "### =====================================================" sudo mkdir -p $MOUNT/root/.ssh if [ -f ~/.ssh/id_rsa.pub ]; then sudo cp ~/.ssh/id_rsa.pub $MOUNT/root/.ssh/authorized_keys fi sudo chmod -R 755 $MOUNT/root/.ssh if [ "$TASKLIST" ]; then echo "### =====================================================" echo "### Install preselected tasks" echo "### =====================================================" install_tasks $MOUNT $TASKLIST fi if [ "$PKGLIST" ]; then echo "### =====================================================" echo "### Install additional packages." echo "### =====================================================" install_packages $MOUNT $PKGLIST fi echo "### =====================================================" echo "### Setup vm's /etc/apt/sources.list" echo "### =====================================================" create_vm_apt_sources_list $MOUNT echo "### =====================================================" echo "### Cleaning up" echo "### =====================================================" binding_umount $MOUNT sudo losetup -a > /tmp/${VMHOSTNAME}.loopdevlist sudo mount | grep ^/dev/loop > /tmp/${VMHOSTNAME}.loopmount # Umounting and Cleaning up loop devices cleanup_loopdev # rm -f $devlist echo "Done." # --------------------------------------------------------------------- # # end of file. # # --------------------------------------------------------------------- #