root / snf-image-host / snf-image-update-helper.in @ f0eed401
History | View | Annotate | Download (6.8 kB)
1 | d51a95a8 | Nikos Skalkotos | #!/bin/bash |
---|---|---|---|
2 | d51a95a8 | Nikos Skalkotos | |
3 | 3709b5f4 | Nikos Skalkotos | # Copyright (C) 2011 GRNET S.A. |
4 | 3709b5f4 | Nikos Skalkotos | # |
5 | 3709b5f4 | Nikos Skalkotos | # This program is free software; you can redistribute it and/or modify |
6 | 3709b5f4 | Nikos Skalkotos | # it under the terms of the GNU General Public License as published by |
7 | 3709b5f4 | Nikos Skalkotos | # the Free Software Foundation; either version 2 of the License, or |
8 | 3709b5f4 | Nikos Skalkotos | # (at your option) any later version. |
9 | 3709b5f4 | Nikos Skalkotos | # |
10 | 3709b5f4 | Nikos Skalkotos | # This program is distributed in the hope that it will be useful, but |
11 | 3709b5f4 | Nikos Skalkotos | # WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | 3709b5f4 | Nikos Skalkotos | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | 3709b5f4 | Nikos Skalkotos | # General Public License for more details. |
14 | 3709b5f4 | Nikos Skalkotos | # |
15 | 3709b5f4 | Nikos Skalkotos | # You should have received a copy of the GNU General Public License |
16 | 3709b5f4 | Nikos Skalkotos | # along with this program; if not, write to the Free Software |
17 | 3709b5f4 | Nikos Skalkotos | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
18 | 3709b5f4 | Nikos Skalkotos | # 02110-1301, USA. |
19 | 3709b5f4 | Nikos Skalkotos | |
20 | d51a95a8 | Nikos Skalkotos | set -e |
21 | bad5ca1f | Nikos Skalkotos | set -o pipefail |
22 | d51a95a8 | Nikos Skalkotos | |
23 | d51a95a8 | Nikos Skalkotos | . @osdir@/common.sh |
24 | d51a95a8 | Nikos Skalkotos | |
25 | a1aef659 | Nikos Skalkotos | usage() { |
26 | a1aef659 | Nikos Skalkotos | local rc="$1" |
27 | a1aef659 | Nikos Skalkotos | |
28 | a1aef659 | Nikos Skalkotos | cat <<EOF |
29 | a1aef659 | Nikos Skalkotos | |
30 | a1aef659 | Nikos Skalkotos | Usage: $0 [options] |
31 | a1aef659 | Nikos Skalkotos | |
32 | a1aef659 | Nikos Skalkotos | This script runs a debootstrap and creates a small Debian image populated with |
33 | a1aef659 | Nikos Skalkotos | the snf-image-helper package. This needs to be done before the first use of |
34 | a1aef659 | Nikos Skalkotos | ganeti's \`snf-image' guest OS type. |
35 | a1aef659 | Nikos Skalkotos | |
36 | a1aef659 | Nikos Skalkotos | OPTIONS: |
37 | cfd38847 | Nikos Skalkotos | -c CACHE_FILE |
38 | cfd38847 | Nikos Skalkotos | Use this cache file, instead of the default |
39 | cfd38847 | Nikos Skalkotos | [default: $HELPER_CACHE_FILE] |
40 | cfd38847 | Nikos Skalkotos | |
41 | cfd38847 | Nikos Skalkotos | -d DIRECTORY |
42 | cfd38847 | Nikos Skalkotos | Use this directory to host the created files, instead of the default |
43 | cfd38847 | Nikos Skalkotos | [default: $HELPER_DIR] |
44 | cfd38847 | Nikos Skalkotos | |
45 | cfd38847 | Nikos Skalkotos | -h Print this message |
46 | cfd38847 | Nikos Skalkotos | |
47 | cfd38847 | Nikos Skalkotos | -p PACKAGE |
48 | cfd38847 | Nikos Skalkotos | Install this deb package in the helper image, instead of the default |
49 | cfd38847 | Nikos Skalkotos | [default: $HELPER_PKG] |
50 | cfd38847 | Nikos Skalkotos | |
51 | cfd38847 | Nikos Skalkotos | -y Assume Yes to all queries and do not prompt |
52 | a1aef659 | Nikos Skalkotos | |
53 | a1aef659 | Nikos Skalkotos | EOF |
54 | a1aef659 | Nikos Skalkotos | |
55 | a1aef659 | Nikos Skalkotos | exit "$rc" |
56 | a1aef659 | Nikos Skalkotos | } |
57 | a1aef659 | Nikos Skalkotos | |
58 | cfd38847 | Nikos Skalkotos | while getopts "c:d:hp:y" opt; do |
59 | a1aef659 | Nikos Skalkotos | case $opt in |
60 | a1aef659 | Nikos Skalkotos | c) HELPER_CACHE_FILE="$OPTARG" |
61 | a1aef659 | Nikos Skalkotos | ;; |
62 | a1aef659 | Nikos Skalkotos | d) HELPER_DIR="$OPTARG" |
63 | a1aef659 | Nikos Skalkotos | ;; |
64 | a1aef659 | Nikos Skalkotos | h) usage 0 |
65 | a1aef659 | Nikos Skalkotos | ;; |
66 | a1aef659 | Nikos Skalkotos | p) HELPER_PKG="$OPTARG" |
67 | a1aef659 | Nikos Skalkotos | ;; |
68 | a1aef659 | Nikos Skalkotos | y) NO_PROMPT="yes" |
69 | a1aef659 | Nikos Skalkotos | ;; |
70 | a1aef659 | Nikos Skalkotos | ?) log_error "Use \`-h' for help"; exit 1 |
71 | a1aef659 | Nikos Skalkotos | ;; |
72 | a1aef659 | Nikos Skalkotos | esac |
73 | a1aef659 | Nikos Skalkotos | done |
74 | a1aef659 | Nikos Skalkotos | |
75 | a1aef659 | Nikos Skalkotos | echo |
76 | a1aef659 | Nikos Skalkotos | echo "This is the update helper image script for snf-image." |
77 | a1aef659 | Nikos Skalkotos | echo "If you don't know what to do, use \`-h'." |
78 | a1aef659 | Nikos Skalkotos | echo |
79 | a1aef659 | Nikos Skalkotos | |
80 | a1aef659 | Nikos Skalkotos | if [ ! -d "$HELPER_DIR" -o ! -w "$HELPER_DIR" ]; then |
81 | cfd38847 | Nikos Skalkotos | log_error "ERROR:" |
82 | a1aef659 | Nikos Skalkotos | log_error "Helper directory \`$HELPER_DIR' does not exist or the script" \ |
83 | a1aef659 | Nikos Skalkotos | "has no write permission on it." |
84 | a1aef659 | Nikos Skalkotos | exit 1 |
85 | a1aef659 | Nikos Skalkotos | fi |
86 | a1aef659 | Nikos Skalkotos | |
87 | a1aef659 | Nikos Skalkotos | if [ ! -r "$HELPER_PKG" ]; then |
88 | cfd38847 | Nikos Skalkotos | log_error "ERROR:" |
89 | a1aef659 | Nikos Skalkotos | log_error "Helper package \`$HELPER_PKG' does not exist or is not " \ |
90 | a1aef659 | Nikos Skalkotos | "readable by the script." |
91 | 52ac594c | Nikos Skalkotos | exit 1 |
92 | 52ac594c | Nikos Skalkotos | fi |
93 | bad5ca1f | Nikos Skalkotos | |
94 | 52ac594c | Nikos Skalkotos | cat >&1 <<EOF |
95 | a1aef659 | Nikos Skalkotos | This program will overwrite the following files if present: |
96 | 52ac594c | Nikos Skalkotos | \`$HELPER_DIR/initrd' |
97 | 52ac594c | Nikos Skalkotos | \`$HELPER_DIR/kernel' |
98 | 52ac594c | Nikos Skalkotos | \`$HELPER_DIR/image' |
99 | 52ac594c | Nikos Skalkotos | EOF |
100 | 52ac594c | Nikos Skalkotos | |
101 | 52ac594c | Nikos Skalkotos | while [[ 1 ]]; do |
102 | c36351f5 | Nikos Skalkotos | echo -n "Do you want to continue [y/N]? " |
103 | a1aef659 | Nikos Skalkotos | if [ "x$NO_PROMPT" = "xyes" ]; then |
104 | a1aef659 | Nikos Skalkotos | echo "y"; |
105 | a1aef659 | Nikos Skalkotos | break; |
106 | a1aef659 | Nikos Skalkotos | fi |
107 | a1aef659 | Nikos Skalkotos | |
108 | 52ac594c | Nikos Skalkotos | read answer |
109 | 52ac594c | Nikos Skalkotos | [ "$(echo -n "$answer" | tr [A-Z] [a-z])" = "y" ] && break |
110 | 52ac594c | Nikos Skalkotos | if [ -z "$answer" -o "$(echo -n "$answer" | tr [A-Z] [a-z])" = "n" ]; then |
111 | c36351f5 | Nikos Skalkotos | log_error "Abort." |
112 | 52ac594c | Nikos Skalkotos | exit 1 |
113 | 52ac594c | Nikos Skalkotos | fi |
114 | 52ac594c | Nikos Skalkotos | done |
115 | 52ac594c | Nikos Skalkotos | |
116 | 52ac594c | Nikos Skalkotos | rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image" |
117 | 52ac594c | Nikos Skalkotos | |
118 | 52ac594c | Nikos Skalkotos | echo -n "Allocating space for helper disk image..." |
119 | bad5ca1f | Nikos Skalkotos | helper_img=$(mktemp "$HELPER_DIR/image.XXXXXX") |
120 | d51a95a8 | Nikos Skalkotos | |
121 | bad5ca1f | Nikos Skalkotos | dd if=/dev/zero of="$helper_img" bs=1k count=400000 &> /dev/null |
122 | 52ac594c | Nikos Skalkotos | echo "done" |
123 | 52ac594c | Nikos Skalkotos | |
124 | bad5ca1f | Nikos Skalkotos | echo "Creating partitions..." |
125 | 55d2fc47 | Nikos Skalkotos | blockdev=$("$LOSETUP" -sf $helper_img) |
126 | 55d2fc47 | Nikos Skalkotos | add_cleanup "$LOSETUP" -d "$blockdev" |
127 | d51a95a8 | Nikos Skalkotos | |
128 | 52ac594c | Nikos Skalkotos | sleep 1 # sometimes losetup returns and the device is still busy.. |
129 | 52ac594c | Nikos Skalkotos | |
130 | bad5ca1f | Nikos Skalkotos | format_disk0 "$blockdev" "extdump" 2>&1 | sed -e 's/^/CFDISK: /g' |
131 | d51a95a8 | Nikos Skalkotos | |
132 | bad5ca1f | Nikos Skalkotos | root_dev=$(map_disk0 "$blockdev")-1 |
133 | bad5ca1f | Nikos Skalkotos | add_cleanup unmap_disk0 "$blockdev" |
134 | d51a95a8 | Nikos Skalkotos | |
135 | 63d6058d | Nikos Skalkotos | echo Creating and configuring filesystem... |
136 | bad5ca1f | Nikos Skalkotos | mkfs.ext3 "$root_dev" 2>&1 | sed -e 's/^/MKFS.EXT3: /g' |
137 | aac16418 | Nikos Skalkotos | # The helper vm should never do filesystem checks... |
138 | bad5ca1f | Nikos Skalkotos | tune2fs -i 0 -c 0 "$root_dev" 2>&1 | sed -e 's/^/TUNE2FS: /g' |
139 | d51a95a8 | Nikos Skalkotos | |
140 | bad5ca1f | Nikos Skalkotos | target=$(mktemp -d) |
141 | bad5ca1f | Nikos Skalkotos | add_cleanup rmdir "$target" |
142 | d51a95a8 | Nikos Skalkotos | |
143 | bad5ca1f | Nikos Skalkotos | mount "$root_dev" "$target" |
144 | bad5ca1f | Nikos Skalkotos | add_cleanup umount "$root_dev" |
145 | d51a95a8 | Nikos Skalkotos | |
146 | bad5ca1f | Nikos Skalkotos | echo -n "Checking for cached root filesystem file \`$HELPER_CACHE_FILE'..." |
147 | bad5ca1f | Nikos Skalkotos | if [ -f "$HELPER_CACHE_FILE" ]; then |
148 | 52ac594c | Nikos Skalkotos | echo "found" |
149 | bad5ca1f | Nikos Skalkotos | tar xf "$HELPER_CACHE_FILE" -C "$target" |
150 | d51a95a8 | Nikos Skalkotos | else |
151 | 52ac594c | Nikos Skalkotos | echo "not found" |
152 | 52ac594c | Nikos Skalkotos | echo "Debootstraping to create a new root filesystem:" |
153 | 5a31f7ef | Nikos Skalkotos | |
154 | 5a31f7ef | Nikos Skalkotos | # Create a policy-rc.d file to deny init script execution |
155 | 5a31f7ef | Nikos Skalkotos | mkdir -p "$target/usr/sbin" |
156 | 5a31f7ef | Nikos Skalkotos | cat > "$target/usr/sbin/policy-rc.d" <<EOF |
157 | 5a31f7ef | Nikos Skalkotos | #!/bin/sh |
158 | 5a31f7ef | Nikos Skalkotos | exit 101 |
159 | 5a31f7ef | Nikos Skalkotos | EOF |
160 | 5a31f7ef | Nikos Skalkotos | chmod +x "$target/usr/sbin/policy-rc.d" |
161 | 5a31f7ef | Nikos Skalkotos | |
162 | bad5ca1f | Nikos Skalkotos | debootstrap --arch amd64 --include "$HELPER_EXTRA_PKGS" \ |
163 | a1aef659 | Nikos Skalkotos | --variant=minbase stable "$target" "$HELPER_MIRROR" 2>&1 | \ |
164 | a1aef659 | Nikos Skalkotos | sed -e 's/^/DEBOOTSTRAP: /g' |
165 | d51a95a8 | Nikos Skalkotos | |
166 | 5a31f7ef | Nikos Skalkotos | rm "$target/usr/sbin/policy-rc.d" |
167 | 5a31f7ef | Nikos Skalkotos | |
168 | d51a95a8 | Nikos Skalkotos | # remove the downloaded debs, as they are no longer needed |
169 | bad5ca1f | Nikos Skalkotos | find "$target/var/cache/apt/archives" -type f -name '*.deb' -print0 | \ |
170 | d51a95a8 | Nikos Skalkotos | xargs -r0 rm -f |
171 | d51a95a8 | Nikos Skalkotos | |
172 | bad5ca1f | Nikos Skalkotos | tmp_cache=$(mktemp "$HELPER_CACHE_FILE.XXXXXX") |
173 | a1aef659 | Nikos Skalkotos | tar cf "$tmp_cache" --one-file-system -C "$target" . || \ |
174 | a1aef659 | Nikos Skalkotos | { rm "$tmp_cache"; false; } |
175 | bad5ca1f | Nikos Skalkotos | mv -f "$tmp_cache" "$HELPER_CACHE_FILE" |
176 | d51a95a8 | Nikos Skalkotos | fi |
177 | d51a95a8 | Nikos Skalkotos | |
178 | 63d6058d | Nikos Skalkotos | echo -n "Configuring the helper image..." |
179 | bad5ca1f | Nikos Skalkotos | echo snf-image-helper > "$target/etc/hostname" |
180 | d51a95a8 | Nikos Skalkotos | |
181 | bad5ca1f | Nikos Skalkotos | cat > "$target/etc/fstab" <<EOF |
182 | d51a95a8 | Nikos Skalkotos | # /etc/fstab: static file system information. |
183 | d51a95a8 | Nikos Skalkotos | # |
184 | d51a95a8 | Nikos Skalkotos | # <file system> <mount point> <type> <options> <dump> <pass> |
185 | d51a95a8 | Nikos Skalkotos | /dev/sda1 / ext3 defaults 0 1 |
186 | d51a95a8 | Nikos Skalkotos | proc /proc proc defaults 0 0 |
187 | d51a95a8 | Nikos Skalkotos | EOF |
188 | 52ac594c | Nikos Skalkotos | echo "done" |
189 | d51a95a8 | Nikos Skalkotos | |
190 | 52ac594c | Nikos Skalkotos | echo -n "Extracting kernel..." |
191 | bad5ca1f | Nikos Skalkotos | if [ ! -L "$target/vmlinuz" -o ! -L "$target/vmlinuz" ]; then |
192 | bad5ca1f | Nikos Skalkotos | echo -e "\033[1;31mfailed\033[0m" |
193 | bad5ca1f | Nikos Skalkotos | log_error "vmlinuz or initrd.img link in root is missing." |
194 | bad5ca1f | Nikos Skalkotos | log_error "I don't know how to find a usable kernel/initrd pair." |
195 | bad5ca1f | Nikos Skalkotos | exit 1 |
196 | d51a95a8 | Nikos Skalkotos | fi |
197 | 52ac594c | Nikos Skalkotos | echo "done" |
198 | d51a95a8 | Nikos Skalkotos | |
199 | bad5ca1f | Nikos Skalkotos | kernel=$(readlink -en "$target/vmlinuz") |
200 | bad5ca1f | Nikos Skalkotos | initrd=$(readlink -en "$target/initrd.img") |
201 | d51a95a8 | Nikos Skalkotos | |
202 | bad5ca1f | Nikos Skalkotos | echo "Moving $(basename "$kernel") and $(basename "$initrd") to \`$HELPER_DIR'" |
203 | bad5ca1f | Nikos Skalkotos | mv "$kernel" "$initrd" "$HELPER_DIR" |
204 | d51a95a8 | Nikos Skalkotos | |
205 | bad5ca1f | Nikos Skalkotos | kernel=$(basename "$kernel") |
206 | bad5ca1f | Nikos Skalkotos | initrd=$(basename "$initrd") |
207 | d51a95a8 | Nikos Skalkotos | |
208 | bad5ca1f | Nikos Skalkotos | (cd "$HELPER_DIR"; ln -fs "$kernel" kernel; ln -fs "$initrd" initrd) |
209 | d51a95a8 | Nikos Skalkotos | |
210 | bad5ca1f | Nikos Skalkotos | rm "$target/vmlinuz" "$target/initrd.img" |
211 | d51a95a8 | Nikos Skalkotos | |
212 | 52ac594c | Nikos Skalkotos | echo "Installing snf-image-helper pkg in the new image..." |
213 | bad5ca1f | Nikos Skalkotos | cp "$HELPER_PKG" "$target/tmp/" |
214 | bad5ca1f | Nikos Skalkotos | pkg_name=$(basename "$HELPER_PKG") |
215 | bad5ca1f | Nikos Skalkotos | add_cleanup rm "$target/tmp/$pkg_name" |
216 | bad5ca1f | Nikos Skalkotos | chroot "$target" dpkg -i "/tmp/$pkg_name" 2>&1 | sed -e 's/^/DPKG: /g' |
217 | 3b0420ce | Nikos Skalkotos | |
218 | bad5ca1f | Nikos Skalkotos | cat > "$target/etc/rc.local" <<EOF |
219 | 3b0420ce | Nikos Skalkotos | #!/bin/sh -e |
220 | 3b0420ce | Nikos Skalkotos | # |
221 | 3b0420ce | Nikos Skalkotos | # rc.local |
222 | 3b0420ce | Nikos Skalkotos | # |
223 | 3b0420ce | Nikos Skalkotos | # This script is executed at the end of each multiuser runlevel. |
224 | 3b0420ce | Nikos Skalkotos | # Make sure that the script will "exit 0" on success or any other |
225 | 3b0420ce | Nikos Skalkotos | # value on error. |
226 | 3b0420ce | Nikos Skalkotos | # |
227 | 3b0420ce | Nikos Skalkotos | # In order to enable or disable this script just change the execution |
228 | 3b0420ce | Nikos Skalkotos | # bits. |
229 | 3b0420ce | Nikos Skalkotos | # |
230 | 3b0420ce | Nikos Skalkotos | # By default this script does nothing. |
231 | 3b0420ce | Nikos Skalkotos | |
232 | ff7783b8 | Vangelis Koukis | if ! grep -q snf_image_activate_helper /proc/cmdline; then |
233 | ff7783b8 | Vangelis Koukis | echo "WARNING: NOT calling snf-image-helper, add snf_image_activate_helper" |
234 | ff7783b8 | Vangelis Koukis | echo "to the kernel command line if you want to do so." |
235 | ff7783b8 | Vangelis Koukis | else |
236 | ff7783b8 | Vangelis Koukis | /usr/bin/snf-image-helper --force |
237 | ff7783b8 | Vangelis Koukis | fi |
238 | 3b0420ce | Nikos Skalkotos | |
239 | 3b0420ce | Nikos Skalkotos | exit 0 |
240 | 3b0420ce | Nikos Skalkotos | EOF |
241 | 3b0420ce | Nikos Skalkotos | |
242 | bad5ca1f | Nikos Skalkotos | chmod +x "$target/etc/rc.local" |
243 | 3b0420ce | Nikos Skalkotos | |
244 | 52ac594c | Nikos Skalkotos | echo "done" |
245 | 52ac594c | Nikos Skalkotos | |
246 | d51a95a8 | Nikos Skalkotos | cleanup |
247 | d51a95a8 | Nikos Skalkotos | |
248 | bad5ca1f | Nikos Skalkotos | mv "$helper_img" "$HELPER_DIR/image" |
249 | d51a95a8 | Nikos Skalkotos | |
250 | d51a95a8 | Nikos Skalkotos | trap - EXIT |
251 | d51a95a8 | Nikos Skalkotos | |
252 | 63d6058d | Nikos Skalkotos | echo "Files in \`$HELPER_DIR' were updated successfully" |
253 | d51a95a8 | Nikos Skalkotos | exit 0 |
254 | d51a95a8 | Nikos Skalkotos | |
255 | d51a95a8 | Nikos Skalkotos | # vim: set sta sts=4 shiftwidth=4 sw=4 et ai : |