]> git.ipfire.org Git - people/jschlag/ipfire-3.x-image.git/blame - generate_image.sh
Print more debug info
[people/jschlag/ipfire-3.x-image.git] / generate_image.sh
CommitLineData
5bbf7721
JS
1#!/bin/bash
2###############################################################################
3# IPFire.org - An Open Source Firewall Solution #
4# Copyright (C) - IPFire Development Team <info@ipfire.org> #
5###############################################################################
6
9c529a3a
JS
7#Path of the script
8
9SCRIPT_PATH="$(dirname "$(readlink -f "$0")")"
10
5bbf7721 11
358ea1df
JS
12# INCLUDE SETTINGS
13. "${SCRIPT_PATH}/settings.sh"
424aa4ee 14
358ea1df
JS
15# INCLUDE FUNCTIONS
16. "${SCRIPT_PATH}/functions.sh"
5bbf7721 17#
358ea1df 18# Scripts starts here
5bbf7721
JS
19#
20
e04a0de0 21log DEBUG "Working dir is ${WORKING_DIR}"
5bbf7721 22
0ca7b8a5 23
424aa4ee
JS
24#Parse cmdline
25parse_cmdline $@
26
5bbf7721
JS
27# Check that pakfire is working
28check_for_pakfire
29
c38c098c
JS
30if ! check_for_free_space 10000 "${WORKING_DIR}"; then
31 exit ${EXIT_ERROR}
32fi
5bbf7721
JS
33
34# Check that the image does not exist yet
e04a0de0 35if [ -f ${IMAGE_BASE_FILE} ]; then
5bbf7721
JS
36 log ERROR "Image file does already exists"
37 exit 1
38fi
39
40# Check that the local repo file does not exists yet.
41# We do not want to override custom user configurations.
42if [ -f "${LOCAL_REPO_FILE}" ]; then
43 log ERROR "Config file ${LOCAL_REPO_FILE} for the local repo does already exists"
44 exit 1
45fi
46
e04a0de0
JS
47# cd into working directory
48cd ${WORKING_DIR} || exit ${EXIT_ERROR}
49
5bbf7721
JS
50#
51## Create the disk image.
52#
7d368c65 53dd if=/dev/zero of=${IMAGE_BASE_FILE} seek=${IMAGE_SIZE}M count=1k bs=1
5bbf7721
JS
54
55# Setup the loopback device.
e04a0de0 56outlo=`losetup -f --show ${IMAGE_BASE_FILE}`
5bbf7721 57
16178a1b 58log INFO "Loop device is ${outlo}"
5bbf7721
JS
59log INFO "Create partions and filesystem"
60
61# Create and msdos compatible table on the image.
62parted ${outlo} mklabel msdos
63
64# Add a new partition to the image.
65parted ${outlo} mkpart primary ${FILESYSTEM} 2048k 100% -a minimal
66
67# Make the primary partition bootable.
68parted ${outlo} set 1 boot on
69
70# Notify the kernel about the new partition.
71partx -a ${outlo}
72
73#
74## Create the filesystem.
75#
76mkfs.${FILESYSTEM} ${outlo}p1
77
78#
79## Mount the filesystem.
80#
81
82log INFO "Mount partion in ${IMAGE_MOUNT_DIR}"
83
5bbf7721
JS
84# Afterwards mount the image.
85mount -t ${FILESYSTEM} ${outlo}p1 ${IMAGE_MOUNT_DIR}
86
87#
88## Install IPFire 3.x.
89#
90
91# Add grub on x86_64 to the package list.
92if [ "${ARCH}" == "x86_64" ] || [ "${ARCH}" == "i686" ]; then
93 PACKAGES="${PACKAGES} grub"
94
95 # Store, that grub is present.
96 HAVE_GRUB="True"
97fi
98
99# Check if the git network stack should be installed.
100if [ "${USE_GIT_NETWORK_STACK}" == "True" ]; then
101 GIT_REPOS="${GIT_REPOS} git://git.ipfire.org/network.git"
102
103 # Add build dependencies of network package.
104 PACKAGES="${PACKAGES} ${NETWORK_BUILD_DEPS}"
105fi
106
107# Add develoment packes to the package list, if required.
108if [ "${INSTALL_DEV_PACKAGES}" == "True" ] || [ ! -z "${GIT_REPOS}" ]; then
109 PACKAGES="${PACKAGES} ${DEVELOPMENT_PACKAGES}"
110fi
111
112log INFO "Create local respository"
113
114
115# Check if the local repo should be used.
116if [ "${USE_LOCAL_REPO}" == "True" ]; then
117 # Create local repository.
118 mkdir -pv "${LOCAL_REPO_DIR}"
119
120 # Master repository.
121 if ! pakfire-server repo create ${LOCAL_REPO_DIR} ${LOCAL_REPO_SOURCE_PATH}; then
122 log ERROR "Failed to create a local respository"
91a03596 123 cleanup
5bbf7721
JS
124 exit 1
125 fi
126
127 # Create temporary pakfire repo file.
128 echo "[repo:local]" >> "${LOCAL_REPO_FILE}"
129 echo "description = Local repository." >> "${LOCAL_REPO_FILE}"
130 echo "enabled = 0" >> "${LOCAL_REPO_FILE}"
131 echo "baseurl = ${LOCAL_REPO_DIR}" >> "${LOCAL_REPO_FILE}"
132
133 ENABLE_LOCAL="--enable-repo=local"
134fi
135
136# Install IPFire 3.x in the created image.
137yes | pakfire --root=${IMAGE_MOUNT_DIR} ${ENABLE_LOCAL} install @Base ${PACKAGES}
138
139#
140# Enable serial console
141#
142
143
144#echo "GRUB_TERMINAL=\"serial console\"" >> "${IMAGE_MOUNT_DIR}/etc/default/grub"
145#echo "GRUB_SERIAL_COMMAND=\"serial --unit=0 --speed=115200\"" >> "${IMAGE_MOUNT_DIR}/etc/default/grub"
146
147#Hack to install a /etc/default/grub file
148
9c529a3a 149cmd cp -f "${SCRIPT_PATH}/grub" "${IMAGE_MOUNT_DIR}/etc/default"
5bbf7721 150
5bbf7721
JS
151#
152## Generate fstab
153#
154
155# Gather the uuid of the partition.
156FS_UUID=$(blkid -o value -s UUID ${outlo}p1)
157
158# Write fstab.
879862d2
JS
159echo "UUID=${FS_UUID} / ${FILESYSTEM} defaults 0 0" > "${IMAGE_MOUNT_DIR}/etc/fstab"
160
161cat "${IMAGE_MOUNT_DIR}/etc/fstab"
5bbf7721
JS
162
163#
164## Remove the password for user root.
165#
166
167reset_root_password "${IMAGE_MOUNT_DIR}"
168
169#
170## Setup git repositories.
171#
172
173clone_git_repos "${IMAGE_MOUNT_DIR}/build" ${GIT_REPOS}
174
175#
176## Prepare chrooting into the image.
177#
178
179# Check if the network stack should be build.
180if [ "${USE_GIT_NETWORK_STACK}" == "True" ]; then
181 BUILD_NETWORK_CMDS="cd network/ && ./autogen.sh && ./configure && make && make install"
182fi
183
184ENABLE_GETTY="/bin/systemctl enable getty@.service"
185
186# Check if the arch uses grub
187if [ "${HAVE_GRUB}" == "True" ]; then
840a293b
JS
188 GENERATE_GRUB_CONF="grub-install --boot-directory=${IMAGE_MOUNT_DIR}/boot/ --modules="${FILESYSTEM} part_msdos" ${outlo} && \
189 grub-mkconfig -o /boot/grub/grub.cfg"
5bbf7721
JS
190fi
191
840a293b 192
5bbf7721
JS
193# Use systemd-nspawn to spawn a chroot environment and execute
194# commands inside it.
195#
196# The first command enables the terminal on TTY1.
197# The second command generates the configuration file for grub2.
198
199
200systemd-nspawn -D ${IMAGE_MOUNT_DIR} --bind /dev --capability=CAP_SYS_ADMIN,CAP_SYS_RAWIO --bind /proc --bind /sys << END
201 echo "Execute commands inside chroot"
202 ${ENABLE_GETTY}
203 ${GENERATE_GRUB_CONF}
6539ab5a 204 cd /build/ && ls
5bbf7721
JS
205 ${BUILD_NETWORK_CMDS}
206 echo "All commands executed"
207END
208
209
210
211# Insert the UUID because grub-mkconfig often fails to
212# detect that correctly
213
840a293b 214sed -i "${IMAGE_MOUNT_DIR}/boot/grub/grub.cfg" \
5bbf7721
JS
215 -e "s/root=[A-Za-z0-9\/=-]*/root=UUID=${FS_UUID}/g"
216
840a293b 217cat "${IMAGE_MOUNT_DIR}/boot/grub/grub.cfg"
879862d2
JS
218
219cat "${IMAGE_MOUNT_DIR}/etc/fstab"
220
221
5bbf7721
JS
222#
223## Tidy up.
224#
225
226# Wait a second.
227sleep 5
228
229# Check filesystem for damage.
230fsck.${FILESYSTEM} ${outlo}p1
231
879862d2
JS
232cleanup_stage_1
233
bdeefd44 234publish "${IMAGE_DIR_PUBLISH}" "${IMAGE_BASE_FILE}"
5bbf7721 235
c5c9ff39 236# Cleanup
879862d2 237cleanup_stage_2