Statistics
| Branch: | Tag: | Revision:

root / snf-image-host / snf-image-create-helper.in @ master

History | View | Annotate | Download (6.2 kB)

1 34e34e80 Nikos Skalkotos
#!/bin/bash
2 34e34e80 Nikos Skalkotos
3 fc8cbf90 Nikos Skalkotos
# Copyright (C) 2011 GRNET S.A.
4 34e34e80 Nikos Skalkotos
#
5 34e34e80 Nikos Skalkotos
# This program is free software; you can redistribute it and/or modify
6 34e34e80 Nikos Skalkotos
# it under the terms of the GNU General Public License as published by
7 34e34e80 Nikos Skalkotos
# the Free Software Foundation; either version 2 of the License, or
8 34e34e80 Nikos Skalkotos
# (at your option) any later version.
9 34e34e80 Nikos Skalkotos
#
10 34e34e80 Nikos Skalkotos
# This program is distributed in the hope that it will be useful, but
11 34e34e80 Nikos Skalkotos
# WITHOUT ANY WARRANTY; without even the implied warranty of
12 34e34e80 Nikos Skalkotos
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 34e34e80 Nikos Skalkotos
# General Public License for more details.
14 34e34e80 Nikos Skalkotos
#
15 34e34e80 Nikos Skalkotos
# You should have received a copy of the GNU General Public License
16 34e34e80 Nikos Skalkotos
# along with this program; if not, write to the Free Software
17 34e34e80 Nikos Skalkotos
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 34e34e80 Nikos Skalkotos
# 02110-1301, USA.
19 34e34e80 Nikos Skalkotos
20 34e34e80 Nikos Skalkotos
set -e
21 34e34e80 Nikos Skalkotos
set -o pipefail
22 34e34e80 Nikos Skalkotos
set -o errtrace
23 34e34e80 Nikos Skalkotos
24 34e34e80 Nikos Skalkotos
. @osdir@/common.sh
25 34e34e80 Nikos Skalkotos
26 34e34e80 Nikos Skalkotos
usage() {
27 34e34e80 Nikos Skalkotos
    local rc="$1"
28 34e34e80 Nikos Skalkotos
29 34e34e80 Nikos Skalkotos
    cat <<EOF
30 34e34e80 Nikos Skalkotos
31 34e34e80 Nikos Skalkotos
Usage: $0 [options]
32 34e34e80 Nikos Skalkotos
33 cdf83672 Nikos Skalkotos
This script runs multistrap and creates a small Debian image populated with
34 cdf83672 Nikos Skalkotos
the snf-image-helper package. This image is needed for ganeti's \`snf-image'
35 cdf83672 Nikos Skalkotos
guest OS type to work.
36 34e34e80 Nikos Skalkotos
37 34e34e80 Nikos Skalkotos
OPTIONS:
38 34e34e80 Nikos Skalkotos
    -d DIRECTORY
39 34e34e80 Nikos Skalkotos
        Use this directory to host the created files, instead of the default
40 34e34e80 Nikos Skalkotos
        [default: $HELPER_DIR]
41 34e34e80 Nikos Skalkotos
42 34e34e80 Nikos Skalkotos
    -h  Print this message
43 34e34e80 Nikos Skalkotos
44 34e34e80 Nikos Skalkotos
    -p PACKAGE
45 34e34e80 Nikos Skalkotos
        Install this deb package in the helper image, instead of the default
46 34e34e80 Nikos Skalkotos
47 34e34e80 Nikos Skalkotos
    -y  Assume Yes to all queries and do not prompt
48 34e34e80 Nikos Skalkotos
49 34e34e80 Nikos Skalkotos
EOF
50 34e34e80 Nikos Skalkotos
51 34e34e80 Nikos Skalkotos
    exit "$rc"
52 34e34e80 Nikos Skalkotos
}
53 34e34e80 Nikos Skalkotos
54 2c8bf79a Nikos Skalkotos
while getopts "d:hp:y" opt; do
55 34e34e80 Nikos Skalkotos
    case $opt in
56 34e34e80 Nikos Skalkotos
        d) HELPER_DIR="$OPTARG"
57 34e34e80 Nikos Skalkotos
            ;;
58 34e34e80 Nikos Skalkotos
        h) usage 0
59 34e34e80 Nikos Skalkotos
            ;;
60 34e34e80 Nikos Skalkotos
        p) HELPER_PKG="$OPTARG"
61 34e34e80 Nikos Skalkotos
            ;;
62 34e34e80 Nikos Skalkotos
        y) NO_PROMPT="yes"
63 34e34e80 Nikos Skalkotos
            ;;
64 34e34e80 Nikos Skalkotos
        ?) log_error "Use \`-h' for help"; exit 1
65 34e34e80 Nikos Skalkotos
            ;;
66 34e34e80 Nikos Skalkotos
    esac
67 34e34e80 Nikos Skalkotos
done
68 34e34e80 Nikos Skalkotos
69 34e34e80 Nikos Skalkotos
echo
70 fc8cbf90 Nikos Skalkotos
echo "This is the helper image creation script for snf-image."
71 34e34e80 Nikos Skalkotos
echo "If you don't know what to do, use \`-h'."
72 34e34e80 Nikos Skalkotos
echo
73 34e34e80 Nikos Skalkotos
74 34e34e80 Nikos Skalkotos
if [ ! -d "$HELPER_DIR" -o ! -w "$HELPER_DIR" ]; then
75 34e34e80 Nikos Skalkotos
    log_error "Helper directory \`$HELPER_DIR' does not exist or the script" \
76 34e34e80 Nikos Skalkotos
    "has no write permission on it."
77 34e34e80 Nikos Skalkotos
    exit 1
78 34e34e80 Nikos Skalkotos
fi
79 34e34e80 Nikos Skalkotos
80 34e34e80 Nikos Skalkotos
if [ ! -e "$MULTISTRAP_CONFIG" ]; then
81 34e34e80 Nikos Skalkotos
    log_error "Multistrap configuration file: \`$MULTISTRAP_CONFIG' does not" \
82 34e34e80 Nikos Skalkotos
    "exist or is not readable by the script."
83 34e34e80 Nikos Skalkotos
    exit 1
84 34e34e80 Nikos Skalkotos
fi
85 34e34e80 Nikos Skalkotos
86 34e34e80 Nikos Skalkotos
cat >&1 <<EOF
87 34e34e80 Nikos Skalkotos
This program will overwrite the following files if present:
88 34e34e80 Nikos Skalkotos
  \`$HELPER_DIR/initrd'
89 34e34e80 Nikos Skalkotos
  \`$HELPER_DIR/kernel'
90 34e34e80 Nikos Skalkotos
  \`$HELPER_DIR/image'
91 34e34e80 Nikos Skalkotos
  \`$HELPER_DIR/packages'
92 34e34e80 Nikos Skalkotos
EOF
93 34e34e80 Nikos Skalkotos
94 34e34e80 Nikos Skalkotos
while [[ 1 ]]; do
95 34e34e80 Nikos Skalkotos
    echo -n "Do you want to continue [y/N]? "
96 34e34e80 Nikos Skalkotos
    if [ "x$NO_PROMPT" = "xyes" ]; then
97 34e34e80 Nikos Skalkotos
        echo "y";
98 34e34e80 Nikos Skalkotos
        break;
99 34e34e80 Nikos Skalkotos
    fi
100 34e34e80 Nikos Skalkotos
101 34e34e80 Nikos Skalkotos
    read answer
102 34e34e80 Nikos Skalkotos
    [ "$(echo -n "$answer" | tr [A-Z] [a-z])" = "y" ] && break
103 34e34e80 Nikos Skalkotos
    if [ -z "$answer" -o "$(echo -n "$answer" | tr [A-Z] [a-z])" = "n" ]; then
104 34e34e80 Nikos Skalkotos
        log_error "Abort."
105 34e34e80 Nikos Skalkotos
        exit 1
106 34e34e80 Nikos Skalkotos
    fi
107 34e34e80 Nikos Skalkotos
done
108 34e34e80 Nikos Skalkotos
109 34e34e80 Nikos Skalkotos
rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image"
110 34e34e80 Nikos Skalkotos
111 34e34e80 Nikos Skalkotos
echo -n "Allocating space for helper disk image..."
112 34e34e80 Nikos Skalkotos
helper_img=$(mktemp "$HELPER_DIR/image.XXXXXX")
113 34e34e80 Nikos Skalkotos
add_cleanup rm -f "$helper_img"
114 34e34e80 Nikos Skalkotos
dd if=/dev/zero of="$helper_img" bs=1M count="$HELPER_SIZE" &> /dev/null
115 34e34e80 Nikos Skalkotos
echo "done"
116 34e34e80 Nikos Skalkotos
117 34e34e80 Nikos Skalkotos
echo "Creating partitions..."
118 34e34e80 Nikos Skalkotos
blockdev=$("$LOSETUP" -sf $helper_img)
119 34e34e80 Nikos Skalkotos
add_cleanup "$LOSETUP" -d "$blockdev"
120 34e34e80 Nikos Skalkotos
121 34e34e80 Nikos Skalkotos
sleep 1 # sometimes losetup returns and the device is still busy..
122 34e34e80 Nikos Skalkotos
123 34e34e80 Nikos Skalkotos
format_disk0 "$blockdev" "extdump"  2>&1 | sed -e 's/^/CFDISK: /g'
124 34e34e80 Nikos Skalkotos
125 34e34e80 Nikos Skalkotos
root_dev=$(map_disk0 "$blockdev")-1
126 34e34e80 Nikos Skalkotos
add_cleanup unmap_disk0 "$blockdev"
127 34e34e80 Nikos Skalkotos
128 34e34e80 Nikos Skalkotos
echo Creating and configuring filesystem...
129 34e34e80 Nikos Skalkotos
mkfs.ext3 "$root_dev" 2>&1 | sed -e 's/^/MKFS.EXT3: /g'
130 34e34e80 Nikos Skalkotos
# The helper vm should never do filesystem checks...
131 34e34e80 Nikos Skalkotos
tune2fs -i 0 -c 0 "$root_dev" 2>&1 | sed -e 's/^/TUNE2FS: /g'
132 34e34e80 Nikos Skalkotos
133 34e34e80 Nikos Skalkotos
root_uuid=$(blkid -s UUID -o value "$root_dev")
134 34e34e80 Nikos Skalkotos
135 34e34e80 Nikos Skalkotos
target=$(mktemp -d)
136 34e34e80 Nikos Skalkotos
add_cleanup rmdir "$target"
137 34e34e80 Nikos Skalkotos
138 34e34e80 Nikos Skalkotos
mount "$root_dev" "$target"
139 34e34e80 Nikos Skalkotos
add_cleanup umount "$root_dev"
140 34e34e80 Nikos Skalkotos
141 34e34e80 Nikos Skalkotos
do_multistrap "$target"
142 34e34e80 Nikos Skalkotos
143 34e34e80 Nikos Skalkotos
# Save the package list
144 34e34e80 Nikos Skalkotos
chroot "$target" dpkg-query -W  > "$HELPER_DIR/packages"
145 34e34e80 Nikos Skalkotos
146 34e34e80 Nikos Skalkotos
echo -n "Configuring the helper image..."
147 34e34e80 Nikos Skalkotos
echo snf-image-helper > "$target/etc/hostname"
148 34e34e80 Nikos Skalkotos
149 34e34e80 Nikos Skalkotos
cat > "$target/etc/fstab" <<EOF
150 34e34e80 Nikos Skalkotos
# /etc/fstab: static file system information.
151 34e34e80 Nikos Skalkotos
#
152 34e34e80 Nikos Skalkotos
# <file system>   <mount point>   <type>  <options>       <dump>  <pass>
153 34e34e80 Nikos Skalkotos
UUID=$root_uuid         /               ext3    defaults        0       1
154 34e34e80 Nikos Skalkotos
proc              /proc           proc    defaults        0       0
155 34e34e80 Nikos Skalkotos
EOF
156 34e34e80 Nikos Skalkotos
157 34e34e80 Nikos Skalkotos
# We need this since we mount the helper VM ro
158 34e34e80 Nikos Skalkotos
ln -sf /proc/mounts "$target/etc/mtab"
159 34e34e80 Nikos Skalkotos
160 34e34e80 Nikos Skalkotos
echo "done"
161 34e34e80 Nikos Skalkotos
162 34e34e80 Nikos Skalkotos
echo -n "Extracting kernel..."
163 34e34e80 Nikos Skalkotos
if [ ! -L "$target/vmlinuz" -o ! -L "$target/vmlinuz" ]; then
164 34e34e80 Nikos Skalkotos
    echo -e "\033[1;31mfailed\033[0m"
165 34e34e80 Nikos Skalkotos
    log_error "vmlinuz or initrd.img link in root is missing."
166 34e34e80 Nikos Skalkotos
    log_error "I don't know how to find a usable kernel/initrd pair."
167 34e34e80 Nikos Skalkotos
    exit 1
168 34e34e80 Nikos Skalkotos
fi
169 34e34e80 Nikos Skalkotos
echo "done"
170 34e34e80 Nikos Skalkotos
171 34e34e80 Nikos Skalkotos
# Make sure extended globbing is enabled
172 34e34e80 Nikos Skalkotos
shopt -s extglob
173 34e34e80 Nikos Skalkotos
174 34e34e80 Nikos Skalkotos
kernel=$(ls "$target"/boot/vmlinuz-+([0-9.])-+([a-z0-9])-amd64)
175 34e34e80 Nikos Skalkotos
initrd=$(ls "$target"/boot/initrd.img-+([0-9.])-+([a-z0-9])-amd64)
176 34e34e80 Nikos Skalkotos
177 34e34e80 Nikos Skalkotos
echo "Moving $(basename "$kernel") and $(basename "$initrd") to \`$HELPER_DIR'"
178 34e34e80 Nikos Skalkotos
cp "$kernel" "$initrd" "$HELPER_DIR"
179 34e34e80 Nikos Skalkotos
180 34e34e80 Nikos Skalkotos
kernel=$(basename "$kernel")
181 34e34e80 Nikos Skalkotos
initrd=$(basename "$initrd")
182 34e34e80 Nikos Skalkotos
183 34e34e80 Nikos Skalkotos
(cd "$HELPER_DIR"; ln -fs "$kernel" kernel; ln -fs "$initrd" initrd)
184 34e34e80 Nikos Skalkotos
185 34e34e80 Nikos Skalkotos
pkg_installed=$(grep snf-image-helper "$HELPER_DIR/packages" > /dev/null && echo yes)
186 34e34e80 Nikos Skalkotos
187 34e34e80 Nikos Skalkotos
if [ -z "$HELPER_PKG" -a -z "$pkg_installed" ]; then
188 34e34e80 Nikos Skalkotos
    log_error "No helper package was specified and non was found by the apt."
189 34e34e80 Nikos Skalkotos
    exit 1
190 34e34e80 Nikos Skalkotos
fi
191 34e34e80 Nikos Skalkotos
192 34e34e80 Nikos Skalkotos
if [ -r "$HELPER_PKG" ]; then
193 34e34e80 Nikos Skalkotos
    echo "Installing snf-image-helper pkg in the new image..."
194 34e34e80 Nikos Skalkotos
    cp "$HELPER_PKG" "$target/tmp/"
195 34e34e80 Nikos Skalkotos
    pkg_name=$(basename "$HELPER_PKG")
196 34e34e80 Nikos Skalkotos
    add_cleanup rm "$target/tmp/$pkg_name"
197 34e34e80 Nikos Skalkotos
    chroot "$target" dpkg -i "/tmp/$pkg_name" 2>&1 | sed -e 's/^/DPKG: /g'
198 34e34e80 Nikos Skalkotos
199 34e34e80 Nikos Skalkotos
    # Recreate package list
200 34e34e80 Nikos Skalkotos
    chroot "$target" dpkg-query -W  > "$HELPER_DIR/packages"
201 34e34e80 Nikos Skalkotos
else
202 34e34e80 Nikos Skalkotos
    echo "snf-image-helper pkg was installed from the apt repository."
203 34e34e80 Nikos Skalkotos
fi
204 34e34e80 Nikos Skalkotos
205 6fe48058 Nikos Skalkotos
helper_version="$(grep ^snf-image-helper[[:space:]] "$HELPER_DIR/packages" | cut -f2)"
206 6fe48058 Nikos Skalkotos
host_version="$(dpkg-query -W -f "\${Version}\n" snf-image)"
207 6fe48058 Nikos Skalkotos
208 34e34e80 Nikos Skalkotos
if [ "$VERSION_CHECK" == yes -a -z "$HELPER_PKG" ]; then
209 34e34e80 Nikos Skalkotos
    if [ "$host_version" != "$helper_version" ]; then
210 34e34e80 Nikos Skalkotos
        log_error "snf-image version (=$host_version) and " \
211 34e34e80 Nikos Skalkotos
            "snf-image-helper version (=$helper_version) don't match."
212 34e34e80 Nikos Skalkotos
        exit 1
213 34e34e80 Nikos Skalkotos
    fi
214 34e34e80 Nikos Skalkotos
fi
215 34e34e80 Nikos Skalkotos
216 34e34e80 Nikos Skalkotos
mv "$helper_img" "$HELPER_DIR/image"
217 34e34e80 Nikos Skalkotos
218 29f35803 Nikos Skalkotos
echo "$SNF_IMAGE_VERSION" > "$HELPER_DIR/version"
219 29f35803 Nikos Skalkotos
220 6fe48058 Nikos Skalkotos
echo "Files in \`$HELPER_DIR' were updated successfully" >&2
221 6fe48058 Nikos Skalkotos
222 34e34e80 Nikos Skalkotos
exit 0
223 34e34e80 Nikos Skalkotos
224 34e34e80 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :