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 : |