blob: 7ee4505ab074e55f1fb9d0a65b6d8feada2297bb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
#!/bin/bash
#
# System installer, vmdebootstrap version.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public
# License along with this program. If not, see
# <http://www.gnu.org/licenses/>.
# Load.
source $APP_BASE/lib/hydra/functions || exit 1
hydra_config_load
# Parameters
BASENAME="`basename $0`"
# Make sure there is provision config.
function hydra_provision_config {
hydra_user_config image /var/cache/qemu/debian/box.img "Destination image"
hydra_user_config size 3G "Image size"
hydra_user_config format qcow2 "Image format: raw or qcow2"
hydra_user_config method custom "Bootstrap method: custom or vmdeboostrap"
hydra_user_config hostname machine "Hostname"
hydra_user_config domain example.org "Domain"
hydra_user_config arch amd64 "System arch"
hydra_user_config version stretch "Distro version"
hydra_user_config mirror http://http.debian.net/debian/ "Debian mirror"
}
# Load configuration
hydra_provision_config_load $1
# Get config parameters
hydra_provision_config
# Check
if [ -e "$image" ]; then
echo "error: $image already exists."
exit 1
fi
# Ensure base folder exists
hydra_sudo_run mkdir -p `dirname $image`
#
# vmdebootstrap version
#
function hydractl_provision_img_vmdebootstrap {
# Check for requirements
for req in vmdebootstrap mbr; do
hydra_install_package $req
done
# Image format
if [ "$format" == "qcow2" ]; then
format="--convert-qcow2"
else
formt=""
fi
# Run
hydra_sudo_run vmdebootstrap --verbose --image=$image --size=$size --distribution=$version \
--mirror=$mirror --arch=$arch --hostname=$hostname.$domain \
--grub $format
# Fix permissions
hydra_sudo_run chown -R `whoami`. `dirname $image`
# Cleanup
hydra_sudo_run rm debootstrap.log
hydra_sudo_run rm ${image}.raw
}
#
# Custom version
#
function hydract_provision_img_custom {
WORK="`mktemp -d`"
# Check for requirements.
for req in debootstrap grub-pc parted; do
hydra_install_package $req
done
echo "Creating image..."
#hydra_sudo_run dd if=/dev/zero of=$image bs=$size count=1
hydra_sudo_run qemu-img create -f raw $image $size
device="`sudo losetup --find --show $image`"
echo "Partitioning image at $device..."
hydra_sudo_run parted -s -- $device mklabel gpt
hydra_sudo_run parted -s -- $device unit MB mkpart non-fs 2 3
hydra_sudo_run parted -s -- $device set 1 bios_grub on
hydra_sudo_run parted -s -- $device unit MB mkpart ext2 3 -1
hydra_sudo_run parted -s -- $device set 2 boot on
hydra_sudo_run mkfs.ext4 ${device}p2
hydra_sudo_run mount ${device}p2 $WORK/
# Non-interactive installation
APT_INSTALL="hydra_sudo_run LC_ALL=C DEBIAN_FRONTEND=noninteractive chroot $WORK/ apt-get install -y"
# Initial system install.
echo "Installing base system..."
hydra_sudo_run LC_ALL=C DEBIAN_FRONTEND=noninteractive debootstrap --arch=$arch $version $WORK/ $mirror
# Initial configuration.
echo "Applying initial configuration..."
hydra_sudo_run mount none -t proc $WORK/proc
hydra_sudo_run mount none -t sysfs $WORK/sys
hydra_sudo_run mount -o bind /dev/ $WORK/dev
echo LANG=C | $SUDO tee $WORK/etc/default/locale > /dev/null
# Hostname configuration.
echo $hostname.$domain | $SUDO tee $WORK/etc/hostname > /dev/null
echo "127.0.0.1 localhost" | $SUDO tee -a $WORK/etc/hosts > /dev/null
# This ordering is important for facter correctly guess the domain name
echo "127.0.0.1 $hostname.$domain $hostname" | $SUDO tee -a $WORK/etc/hosts > /dev/null
# Invert hostname contents to avoid http://projects.puppetlabs.com/issues/2533
tac $WORK/etc/hosts | $SUDO tee $WORK/etc/hosts.new > /dev/null
hydra_sudo_run mv $WORK/etc/hosts.new $WORK/etc/hosts
# Initial upgrade
echo "Applying initial upgrades..."
hydra_sudo_run chroot $WORK/ apt-get update
hydra_sudo_run chroot $WORK/ apt-get upgrade -y
if [ "$arch" == "i386" ]; then
kernel_arch="686"
else
kernel_arch="$arch"
fi
$APT_INSTALL locales
$APT_INSTALL screen cron lsb-release openssl -y
$APT_INSTALL linux-image-$kernel_arch -y
$APT_INSTALL grub-pc -y
hydra_sudo_run chroot $WORK/ update-grub
hydra_sudo_run chroot $WORK/ grub-install $device
# Teardown
hydra_sudo_run umount $WORK/proc
hydra_sudo_run umount $WORK/sys
hydra_sudo_run umount $WORK/dev
hydra_sudo_run umount $WORK
hydra_sudo_run rmdir $WORK
hydra_sudo_run losetup -d $device
# Image conversion
if [ "$format" == "qcow2" ]; then
echo "Converting raw image to qcow2..."
hydra_sudo_run mv $image $image.raw
hydra_sudo_run qemu-img convert -O qcow2 ${image}.raw $image
hydra_sudo_run rm ${image}.raw
fi
# Fix permissions
hydra_sudo_run chown -R `whoami`. `dirname $image`
}
# Dispatch
if [ "$method" == "custom" ]; then
hydractl_provision_img_custom
elif [ "$method" == "vmdebootstrap" ]; then
hydractl_provision_img_vmdebootstrap
else
echo "$BASENAME: invalid method $method"
exit 1
fi
|