1 |
1 |
#!/bin/bash
|
2 |
2 |
|
3 |
3 |
set -e
|
4 |
|
set -x
|
5 |
4 |
|
6 |
5 |
. @osdir@/common.sh
|
7 |
6 |
|
8 |
7 |
CACHE_FILE="$HELPER_DIR/cache.tar"
|
9 |
8 |
ARCH=amd64
|
10 |
|
EXTRA_PKGS="linux-image-amd64,e2fsprogs,ntfs-3g,xmlstarlet"
|
|
9 |
EXTRA_PKGS="linux-image-amd64,e2fsprogs,ntfs-3g,ntfsprogs,xmlstarlet,python"
|
11 |
10 |
|
|
11 |
if [ ! -e "$HELPER_PKG" ]; then
|
|
12 |
log_error "Helper package \`$HELPER_PKG' not found."
|
|
13 |
log_error "You need to provide this for the script to work"
|
|
14 |
exit 1
|
|
15 |
fi
|
|
16 |
cat >&1 <<EOF
|
|
17 |
This program will overwrite the following files:
|
|
18 |
\`$HELPER_DIR/initrd'
|
|
19 |
\`$HELPER_DIR/kernel'
|
|
20 |
\`$HELPER_DIR/image'
|
|
21 |
EOF
|
|
22 |
|
|
23 |
while [[ 1 ]]; do
|
|
24 |
echo -n "Do you want to continue [y/N]?"
|
|
25 |
read answer
|
|
26 |
[ "$(echo -n "$answer" | tr [A-Z] [a-z])" = "y" ] && break
|
|
27 |
if [ -z "$answer" -o "$(echo -n "$answer" | tr [A-Z] [a-z])" = "n" ]; then
|
|
28 |
log_error "Abord."
|
|
29 |
exit 1
|
|
30 |
fi
|
|
31 |
done
|
|
32 |
|
|
33 |
rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image"
|
|
34 |
|
|
35 |
echo -n "Allocating space for helper disk image..."
|
12 |
36 |
helper_img=$(mktemp $HELPER_DIR/image.XXXXXXXX)
|
13 |
37 |
|
14 |
|
dd if=/dev/zero of=$helper_img bs=1k count=400000
|
|
38 |
dd if=/dev/zero of=$helper_img bs=1k count=400000 &> /dev/null
|
|
39 |
echo "done"
|
|
40 |
|
15 |
41 |
blockdev=$(losetup -sf $helper_img)
|
16 |
42 |
CLEANUP+=("losetup -d $blockdev")
|
17 |
43 |
|
|
44 |
sleep 1 # sometimes losetup returns and the device is still busy..
|
|
45 |
|
|
46 |
echo -n "Creating partitions..."
|
18 |
47 |
format_disk0 $blockdev "extdump"
|
|
48 |
echo "done"
|
19 |
49 |
|
20 |
50 |
root_dev=$(map_disk0 $blockdev)-1
|
21 |
51 |
CLEANUP+=("unmap_disk0 $blockdev")
|
... | ... | |
28 |
58 |
mount $root_dev $TMPDIR
|
29 |
59 |
CLEANUP+=("umount $root_dev")
|
30 |
60 |
|
|
61 |
echo "Checking for cached root filesystem file \`$CACHE_FILE'..."
|
31 |
62 |
if [ -f "$CACHE_FILE" ]; then
|
|
63 |
echo "found"
|
32 |
64 |
tar xf "$CACHE_FILE" -C $TMPDIR
|
33 |
65 |
else
|
|
66 |
echo "not found"
|
|
67 |
echo "Debootstraping to create a new root filesystem:"
|
34 |
68 |
debootstrap --arch "$ARCH" --include $EXTRA_PKGS --variant=minbase \
|
35 |
69 |
squeeze $TMPDIR
|
36 |
70 |
|
... | ... | |
43 |
77 |
mv -f "$TMP_CACHE" "$CACHE_FILE"
|
44 |
78 |
fi
|
45 |
79 |
|
|
80 |
echo -n "Configureing filesystem..."
|
46 |
81 |
echo helper > $TMPDIR/etc/hostname
|
47 |
82 |
|
48 |
83 |
cat > $TMPDIR/etc/fstab <<EOF
|
... | ... | |
52 |
87 |
/dev/sda1 / ext3 defaults 0 1
|
53 |
88 |
proc /proc proc defaults 0 0
|
54 |
89 |
EOF
|
|
90 |
echo "done"
|
55 |
91 |
|
|
92 |
echo -n "Extracting kernel..."
|
56 |
93 |
if [ ! -L "$TMPDIR/vmlinuz" -o ! -L "$TMPDIR/vmlinuz" ]; then
|
57 |
94 |
|
58 |
95 |
log_error "vmlinuz or initrd.img link in root is missing."
|
59 |
96 |
log_error "I don't know how to find a usable kernel/initrd pair."
|
60 |
97 |
exit 1
|
61 |
98 |
fi
|
|
99 |
echo "done"
|
62 |
100 |
|
63 |
101 |
kernel=$(readlink -en $TMPDIR/vmlinuz)
|
64 |
102 |
initrd=$(readlink -en $TMPDIR/initrd.img)
|
... | ... | |
73 |
111 |
|
74 |
112 |
rm $TMPDIR/vmlinuz $TMPDIR/initrd.img
|
75 |
113 |
|
|
114 |
echo "Installing snf-image-helper pkg in the new image..."
|
|
115 |
cp $HELPER_PKG $TMPDIR/tmp/
|
|
116 |
pkg_name=$(basename "$HELPER_PKG")
|
|
117 |
CLEANUP+=("rm $TMPDIR/tmp/$pkg_name")
|
|
118 |
chroot ${TMPDIR} dpkg -i /tmp/$pkg_name
|
|
119 |
echo "done"
|
|
120 |
|
76 |
121 |
cleanup
|
77 |
122 |
|
78 |
123 |
mv $helper_img $HELPER_DIR/image
|