3 # Copyright (C) 2011 GRNET S.A.
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
33 This script runs multistrap and creates a small Debian image populated with
34 the snf-image-helper package. This image is needed for ganeti's \`snf-image'
35 guest OS type to work.
39 Use this directory to host the created files, instead of the default
40 [default: $HELPER_DIR]
45 Install this deb package in the helper image, instead of the default
47 -r Don't use any existing cache
49 -y Assume Yes to all queries and do not prompt
56 while getopts "d:hp:ry" opt; do
58 d) HELPER_DIR="$OPTARG"
62 p) HELPER_PKG="$OPTARG"
68 ?) log_error "Use \`-h' for help"; exit 1
74 echo "This is the update helper image script for snf-image."
75 echo "If you don't know what to do, use \`-h'."
78 if [ ! -d "$HELPER_DIR" -o ! -w "$HELPER_DIR" ]; then
79 log_error "Helper directory \`$HELPER_DIR' does not exist or the script" \
80 "has no write permission on it."
84 if [ ! -e "$MULTISTRAP_CONFIG" ]; then
85 log_error "Multistrap configuration file: \`$MULTISTRAP_CONFIG' does not" \
86 "exist or is not readable by the script."
91 This program will overwrite the following files if present:
94 \`$HELPER_DIR/initrd-xen'
95 \`$HELPER_DIR/kernel-xen'
97 \`$HELPER_DIR/packages'
101 echo -n "Do you want to continue [y/N]? "
102 if [ "x$NO_PROMPT" = "xyes" ]; then
108 [ "$(echo -n "$answer" | tr [A-Z] [a-z])" = "y" ] && break
109 if [ -z "$answer" -o "$(echo -n "$answer" | tr [A-Z] [a-z])" = "n" ]; then
115 rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image"
117 echo -n "Allocating space for helper disk image..."
118 helper_img=$(mktemp "$HELPER_DIR/image.XXXXXX")
119 add_cleanup rm -f "$helper_img"
120 dd if=/dev/zero of="$helper_img" bs=1M count="$HELPER_SIZE" &> /dev/null
123 echo "Creating partitions..."
124 blockdev=$("$LOSETUP" -sf $helper_img)
125 add_cleanup "$LOSETUP" -d "$blockdev"
127 sleep 1 # sometimes losetup returns and the device is still busy..
129 format_disk0 "$blockdev" "extdump" 2>&1 | sed -e 's/^/CFDISK: /g'
131 root_dev=$(map_disk0 "$blockdev")-1
132 add_cleanup unmap_disk0 "$blockdev"
134 echo Creating and configuring filesystem...
135 mkfs.ext3 "$root_dev" 2>&1 | sed -e 's/^/MKFS.EXT3: /g'
136 # The helper vm should never do filesystem checks...
137 tune2fs -i 0 -c 0 "$root_dev" 2>&1 | sed -e 's/^/TUNE2FS: /g'
139 root_uuid=$(blkid -s UUID -o value "$root_dev")
142 add_cleanup rmdir "$target"
144 mount "$root_dev" "$target"
145 add_cleanup umount "$root_dev"
147 do_multistrap "$target"
149 # Save the package list
150 chroot "$target" dpkg-query -W > "$HELPER_DIR/packages"
152 echo -n "Configuring the helper image..."
153 echo snf-image-helper > "$target/etc/hostname"
155 cat > "$target/etc/fstab" <<EOF
156 # /etc/fstab: static file system information.
158 # <file system> <mount point> <type> <options> <dump> <pass>
159 UUID=$root_uuid / ext3 defaults 0 1
160 proc /proc proc defaults 0 0
163 # We need this since we mount the helper VM ro
164 ln -sf /proc/mounts "$target/etc/mtab"
168 echo -n "Extracting kernel..."
169 if [ ! -L "$target/vmlinuz" -o ! -L "$target/vmlinuz" ]; then
170 echo -e "\033[1;31mfailed\033[0m"
171 log_error "vmlinuz or initrd.img link in root is missing."
172 log_error "I don't know how to find a usable kernel/initrd pair."
177 # Make sure extended globbing is enabled
180 kernel=$(ls "$target"/boot/vmlinuz-+([0-9.])-+([a-z0-9])-amd64)
181 initrd=$(ls "$target"/boot/initrd.img-+([0-9.])-+([a-z0-9])-amd64)
183 kernel_xen=$(ls "$target"/boot/vmlinuz-+([0-9.])-+([a-z0-9])-xen-amd64)
184 initrd_xen=$(ls "$target"/boot/initrd.img-+([0-9.])-+([a-z0-9])-xen-amd64)
186 echo "Moving $(basename "$kernel") and $(basename "$initrd") to \`$HELPER_DIR'"
187 cp "$kernel" "$initrd" "$HELPER_DIR"
189 echo "Moving $(basename "$kernel_xen") and $(basename "$initrd_xen") to \`$HELPER_DIR'"
190 cp "$kernel_xen" "$initrd_xen" "$HELPER_DIR"
192 kernel=$(basename "$kernel")
193 initrd=$(basename "$initrd")
195 kernel_xen=$(basename "$kernel_xen")
196 initrd_xen=$(basename "$initrd_xen")
197 (cd "$HELPER_DIR"; ln -fs "$kernel" kernel; ln -fs "$initrd" initrd)
198 (cd "$HELPER_DIR"; ln -fs "$kernel_xen" kernel-xen; ln -fs "$initrd_xen" initrd-xen)
201 pkg_installed=$(grep snf-image-helper "$HELPER_DIR/packages" > /dev/null && echo yes)
203 if [ -z "$HELPER_PKG" -a -z "$pkg_installed" ]; then
204 log_error "No helper package was specified and non was found by the apt."
208 if [ -r "$HELPER_PKG" ]; then
209 echo "Installing snf-image-helper pkg in the new image..."
210 cp "$HELPER_PKG" "$target/tmp/"
211 pkg_name=$(basename "$HELPER_PKG")
212 add_cleanup rm "$target/tmp/$pkg_name"
213 chroot "$target" dpkg -i "/tmp/$pkg_name" 2>&1 | sed -e 's/^/DPKG: /g'
215 # Recreate package list
216 chroot "$target" dpkg-query -W > "$HELPER_DIR/packages"
218 echo "snf-image-helper pkg was installed from the apt repository."
221 helper_version="$(grep ^snf-image-helper[[:space:]] "$HELPER_DIR/packages" | cut -f2)"
222 host_version="$(dpkg-query -W -f "\${Version}\n" snf-image)"
224 if [ "$VERSION_CHECK" == yes -a -z "$HELPER_PKG" ]; then
225 if [ "$host_version" != "$helper_version" ]; then
226 log_error "snf-image version (=$host_version) and " \
227 "snf-image-helper version (=$helper_version) don't match."
232 mv "$helper_img" "$HELPER_DIR/image"
234 echo "Files in \`$HELPER_DIR' were updated successfully" >&2
238 echo "Creating fixed appliance in \`$TMPDIR':" >&2
240 (cd "$HELPER_DIR"; $TAR -cvf "$TMPDIR/snf_image_helper_image-${helper_version}.tar" "$kernel_xen" "$initrd_xen" "$kernel" "$initrd" kernel initrd kernel-xen initrd-xen image packages)
242 echo -n "Compressing fixed appliance ..." >&2
243 (cd "$HELPER_DIR"; $XZ -9 "$TMPDIR/snf_image_helper_image-${helper_version}.tar")
248 # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :