File: qemu-make-debian-root

package info (click to toggle)
qemu 1%3A5.2%2Bdfsg-10
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, sid
  • size: 201,372 kB
  • sloc: ansic: 2,327,506; pascal: 107,506; asm: 49,545; python: 40,498; sh: 35,286; cpp: 33,587; makefile: 15,209; perl: 6,965; xml: 3,028; objc: 1,460; php: 1,299; tcl: 1,070; yacc: 604; lex: 363; sql: 71; awk: 35; sed: 11
file content (141 lines) | stat: -rwxr-xr-x 3,294 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#! /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
}
which sfdisk >/dev/null || {
    echo "error: missing fdisk package" >&2
    exit 1
}
which mke2fs >/dev/null || {
    echo "error: missing e2fsprogs 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 <<EOF
/dev/hda1 / ext2 errors=remount-ro 0 1
proc /proc proc defaults 0 0
EOF

# Console on ttyS0, not tty1, and no other gettys.
sed 's,1:2345:respawn:/sbin/getty 38400 tty1,1:2345:respawn:/sbin/getty 38400 ttyS0,' < $TMP_DIR/etc/inittab | sed 's,^.:23:respawn.*,,' > $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.