#!/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.$$
# <file system> <mount point> <types> <options> <dump> <pass>
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. #
# --------------------------------------------------------------------- #
Comments