]> git.ipfire.org Git - people/jschlag/ipfire-3.x-image.git/blob - generate_image.sh
Print more debug info
[people/jschlag/ipfire-3.x-image.git] / generate_image.sh
1 #!/bin/bash
2 ###############################################################################
3 # IPFire.org - An Open Source Firewall Solution #
4 # Copyright (C) - IPFire Development Team <info@ipfire.org> #
5 ###############################################################################
6
7 #Path of the script
8
9 SCRIPT_PATH="$(dirname "$(readlink -f "$0")")"
10
11
12 # INCLUDE SETTINGS
13 . "${SCRIPT_PATH}/settings.sh"
14
15 # INCLUDE FUNCTIONS
16 . "${SCRIPT_PATH}/functions.sh"
17 #
18 # Scripts starts here
19 #
20
21 log DEBUG "Working dir is ${WORKING_DIR}"
22
23
24 #Parse cmdline
25 parse_cmdline $@
26
27 # Check that pakfire is working
28 check_for_pakfire
29
30 if ! check_for_free_space 10000 "${WORKING_DIR}"; then
31 exit ${EXIT_ERROR}
32 fi
33
34 # Check that the image does not exist yet
35 if [ -f ${IMAGE_BASE_FILE} ]; then
36 log ERROR "Image file does already exists"
37 exit 1
38 fi
39
40 # Check that the local repo file does not exists yet.
41 # We do not want to override custom user configurations.
42 if [ -f "${LOCAL_REPO_FILE}" ]; then
43 log ERROR "Config file ${LOCAL_REPO_FILE} for the local repo does already exists"
44 exit 1
45 fi
46
47 # cd into working directory
48 cd ${WORKING_DIR} || exit ${EXIT_ERROR}
49
50 #
51 ## Create the disk image.
52 #
53 dd if=/dev/zero of=${IMAGE_BASE_FILE} seek=${IMAGE_SIZE}M count=1k bs=1
54
55 # Setup the loopback device.
56 outlo=`losetup -f --show ${IMAGE_BASE_FILE}`
57
58 log INFO "Loop device is ${outlo}"
59 log INFO "Create partions and filesystem"
60
61 # Create and msdos compatible table on the image.
62 parted ${outlo} mklabel msdos
63
64 # Add a new partition to the image.
65 parted ${outlo} mkpart primary ${FILESYSTEM} 2048k 100% -a minimal
66
67 # Make the primary partition bootable.
68 parted ${outlo} set 1 boot on
69
70 # Notify the kernel about the new partition.
71 partx -a ${outlo}
72
73 #
74 ## Create the filesystem.
75 #
76 mkfs.${FILESYSTEM} ${outlo}p1
77
78 #
79 ## Mount the filesystem.
80 #
81
82 log INFO "Mount partion in ${IMAGE_MOUNT_DIR}"
83
84 # Afterwards mount the image.
85 mount -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.
92 if [ "${ARCH}" == "x86_64" ] || [ "${ARCH}" == "i686" ]; then
93 PACKAGES="${PACKAGES} grub"
94
95 # Store, that grub is present.
96 HAVE_GRUB="True"
97 fi
98
99 # Check if the git network stack should be installed.
100 if [ "${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}"
105 fi
106
107 # Add develoment packes to the package list, if required.
108 if [ "${INSTALL_DEV_PACKAGES}" == "True" ] || [ ! -z "${GIT_REPOS}" ]; then
109 PACKAGES="${PACKAGES} ${DEVELOPMENT_PACKAGES}"
110 fi
111
112 log INFO "Create local respository"
113
114
115 # Check if the local repo should be used.
116 if [ "${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"
123 cleanup
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"
134 fi
135
136 # Install IPFire 3.x in the created image.
137 yes | 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
149 cmd cp -f "${SCRIPT_PATH}/grub" "${IMAGE_MOUNT_DIR}/etc/default"
150
151 #
152 ## Generate fstab
153 #
154
155 # Gather the uuid of the partition.
156 FS_UUID=$(blkid -o value -s UUID ${outlo}p1)
157
158 # Write fstab.
159 echo "UUID=${FS_UUID} / ${FILESYSTEM} defaults 0 0" > "${IMAGE_MOUNT_DIR}/etc/fstab"
160
161 cat "${IMAGE_MOUNT_DIR}/etc/fstab"
162
163 #
164 ## Remove the password for user root.
165 #
166
167 reset_root_password "${IMAGE_MOUNT_DIR}"
168
169 #
170 ## Setup git repositories.
171 #
172
173 clone_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.
180 if [ "${USE_GIT_NETWORK_STACK}" == "True" ]; then
181 BUILD_NETWORK_CMDS="cd network/ && ./autogen.sh && ./configure && make && make install"
182 fi
183
184 ENABLE_GETTY="/bin/systemctl enable getty@.service"
185
186 # Check if the arch uses grub
187 if [ "${HAVE_GRUB}" == "True" ]; then
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"
190 fi
191
192
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
200 systemd-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}
204 cd /build/ && ls
205 ${BUILD_NETWORK_CMDS}
206 echo "All commands executed"
207 END
208
209
210
211 # Insert the UUID because grub-mkconfig often fails to
212 # detect that correctly
213
214 sed -i "${IMAGE_MOUNT_DIR}/boot/grub/grub.cfg" \
215 -e "s/root=[A-Za-z0-9\/=-]*/root=UUID=${FS_UUID}/g"
216
217 cat "${IMAGE_MOUNT_DIR}/boot/grub/grub.cfg"
218
219 cat "${IMAGE_MOUNT_DIR}/etc/fstab"
220
221
222 #
223 ## Tidy up.
224 #
225
226 # Wait a second.
227 sleep 5
228
229 # Check filesystem for damage.
230 fsck.${FILESYSTEM} ${outlo}p1
231
232 cleanup_stage_1
233
234 publish "${IMAGE_DIR_PUBLISH}" "${IMAGE_BASE_FILE}"
235
236 # Cleanup
237 cleanup_stage_2