Skip to content

Instantly share code, notes, and snippets.

@spectra
Last active June 30, 2017 13:18
Show Gist options
  • Save spectra/10301941 to your computer and use it in GitHub Desktop.
Save spectra/10301941 to your computer and use it in GitHub Desktop.
Debian qemu image creation using debootstrap (automated from http://diogogomes.com/2012/07/13/debootstrap-kvm-image/ by Kamil Trzcinski (http://ayufan.eu) with some modifications by me)
#!/bin/bash
# Configs
VSYSTEM=qemu # Either 'qemu' or 'kvm'
INCLUDES='less,vim,sudo,openssh-server,acpid'
MIRROR="http://ftp.br.debian.org/debian"
ARCH=686
clean_debian() {
[ "$MNT_DIR" != "" ] && chroot $MNT_DIR umount /proc/ /sys/ /dev/ /boot/
sleep 1s
[ "$MNT_DIR" != "" ] && umount $MNT_DIR
sleep 1s
[ "$DISK" != "" ] && $VSYSTEM-nbd -d $DISK
sleep 1s
[ "$MNT_DIR" != "" ] && rm -r $MNT_DIR
}
fail() {
clean_debian
echo ""
echo "FAILED: $1"
exit 1
}
cancel() {
fail "CTRL-C detected"
}
if [ $# -lt 3 ]
then
echo "author: Kamil Trzcinski (http://ayufan.eu)"
echo "license: GPL"
echo "usage: $0 <image-file> <hostname> <release> [optional debootstrap args]" 1>&2
exit 1
fi
FILE=$1
HOSTNAME=$2
RELEASE=$3
shift 3
trap cancel INT
echo "Installing $RELEASE into $FILE..."
MNT_DIR=`tempfile`
rm $MNT_DIR
mkdir $MNT_DIR
DISK=
echo "Looking for nbd device..."
modprobe nbd max_part=16 || fail "failed to load nbd module into kernel"
for i in /dev/nbd*
do
if $VSYSTEM-nbd -c $i $FILE
then
DISK=$i
break
fi
done
[ "$DISK" == "" ] && fail "no nbd device available"
echo "Connected $FILE to $DISK"
echo "Partitioning $DISK..."
sfdisk $DISK -q -D -uM << EOF || fail "cannot partition $FILE"
,200,83,*
;
EOF
echo "Creating boot partition..."
mkfs.ext4 -q ${DISK}p1 || fail "cannot create /boot ext4"
echo "Creating root partition..."
mkfs.ext4 -q ${DISK}p2 || fail "cannot create / ext4"
echo "Mounting root partition..."
mount ${DISK}p2 $MNT_DIR || fail "cannot mount /"
echo "Installing Debian $RELEASE..."
debootstrap --include=$INCLUDES $* $RELEASE $MNT_DIR $MIRROR || fail "cannot install $RELEASE into $DISK"
echo "Configuring system..."
cat <<EOF > $MNT_DIR/etc/fstab
/dev/vda1 /boot ext4 sync 0 2
/dev/vda2 / ext4 errors=remount-ro 0 1
EOF
echo $HOSTNAME > $MNT_DIR/etc/hostname
cat <<EOF > $MNT_DIR/etc/hosts
127.0.0.1 localhost
127.0.1.1 $HOSTNAME
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF
cat <<EOF > $MNT_DIR/etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
EOF
mount --bind /dev/ $MNT_DIR/dev || fail "cannot bind /dev"
chroot $MNT_DIR mount -t ext4 ${DISK}p1 /boot || fail "cannot mount /boot"
chroot $MNT_DIR mount -t proc none /proc || fail "cannot mount /proc"
chroot $MNT_DIR mount -t sysfs none /sys || fail "cannot mount /sys"
LANG=C DEBIAN_FRONTEND=noninteractive chroot $MNT_DIR apt-get install -y -q linux-image-$ARCH grub-pc || fail "cannot install linux-image and grub"
chroot $MNT_DIR grub-install $DISK || fail "cannot install grub"
chroot $MNT_DIR update-grub || fail "cannot update grub"
sed -i "s|${DISK}p1|/dev/vda1|g" $MNT_DIR/boot/grub/grub.cfg
sed -i "s|${DISK}p2|/dev/vda2|g" $MNT_DIR/boot/grub/grub.cfg
echo "Enter root password:"
while ! chroot $MNT_DIR passwd root
do
echo "Try again"
done
echo "Finishing grub installation..."
grub-install $DISK --root-directory=$MNT_DIR --modules="biosdisk part_msdos" || fail "cannot reinstall grub"
echo "SUCCESS!"
clean_debian
exit 0
@jalsot
Copy link

jalsot commented Oct 31, 2015

Hi,
Great work, thank you.
I made a few changes, if you are interested in, feel free to merge to yours: https://gist.github.com/jalsot/a24aa543021889ad0c70

Regards,
Tamas

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment