#! /bin/sh -e # # $Id: qemu-make-debian-root 353 2008-10-16 20:28:22Z aurel32 $ # # Script to make a debian root image. # set -e which debootstrap >/dev/null || { echo "error: missing debootstrap package" >&2 exit 1 } KEEPFS=0 SPARSE=0 while :; do case "$1" in -k) KEEPFS=1 ;; -s) SPARSE=1 ;; -ks|-sk) KEEPFS=1 SPARSE=1 ;; *) break ;; esac shift done if [ $# -lt 4 ]; then echo Usage: "$0 [-ks] size-in-MB distrib deburl image [files_to_copy_in_/root]" >&2 echo "eg $0 150 sid http://proxy:10000/debian qemu" >&2 echo "-k keep file system -s sparse image" >&2 echo "$0 is normally run as root." >&2 exit 1 fi SIZE=$1 # In Mib DISTRO=$2 URL=$3 IMAGE=$4 shift 4 # now files to copy are in "$@". We don't put them in a variable # because that would coufuse spaces-in-filenames with # whitespace-separation. if [ $SIZE -lt 130 ]; then echo 'Size must be at least 130 megabytes (Debian unstable takes 100)' >&2 exit 1 fi cleanup() { echo Cleaning up... >&2 umount -d $TMP_DIR || true losetup -d $LOOP || true rm -f $IMAGE } trap cleanup EXIT # Create a filesystem: one track for partition table. if [ "$SPARSE" = "1" ]; then truncate -s ${SIZE}M "$IMAGE" else dd bs=1M count=$SIZE if=/dev/zero of=$IMAGE fi SECT=63 # first sector of a partition # Partition so one partition covers entire disk. echo "$SECT," | sfdisk -uS -L $IMAGE # Find an unused loop device and set it up. LOOP=`losetup -f` losetup -o $(($SECT*512)) $LOOP $IMAGE # Create filesystem. mke2fs -q -m1 $LOOP TMP_DIR="$(mktemp -d /tmp/mount.XXXXXX)" || \ { echo >&2 "Failed to create temporary directory"; exit 1; } # Mount it. mount $LOOP $TMP_DIR # Do debian install on it. debootstrap --variant=minbase $DISTRO $TMP_DIR $URL # Final configuration. cat > $TMP_DIR/etc/fstab < $TMP_DIR/etc/inittab.new mv $TMP_DIR/etc/inittab.new $TMP_DIR/etc/inittab # Set hostname to base of image name. basename $IMAGE > $TMP_DIR/etc/hostname # Create /etc/shadow chroot $TMP_DIR pwconv # Set root password to "root" sed 's/^root:[^:]*/root:$1$aybpiIGf$cB7iFDNZvViQtQjEZ5HFQ0/' < $TMP_DIR/etc/shadow > $TMP_DIR/etc/shadow.new mv $TMP_DIR/etc/shadow.new $TMP_DIR/etc/shadow # Remove packages we don't need chroot $TMP_DIR /usr/bin/dpkg --remove console-common console-tools console-data base-config man-db manpages # Try to remove all libraries: some won't be removable. chroot $TMP_DIR dpkg --remove `chroot $TMP_DIR dpkg --get-selections | sed -n 's/^\(lib[^ \t]*\)[\t ]*install/\1/p'` 2>/dev/null || true # Copy wanted files to /root if asked to if [ $# -gt 0 ]; then cp -a "$@" $TMP_DIR/root/ fi umount -d $TMP_DIR trap "" EXIT echo Done.