Magellan Linux

Contents of /trunk/mlivecdbuild/mlivecdbuild2.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1446 - (show annotations) (download) (as text)
Fri Jul 29 11:14:07 2011 UTC (12 years, 9 months ago) by niro
File MIME type: application/x-sh
File size: 13507 byte(s)
-check for lock group existance on systemd systems
1 #!/bin/bash
2
3 # some default settings - gets overidden with the profile config
4 CDPROFILE="$2"
5 [[ -z ${CDPROFILE} ]] && CDPROFILE="default"
6 LIVECDROOT="/mnt/MLIVECDBUILD/${CDPROFILE}"
7 CDCHROOTDIR="${LIVECDROOT}/chroot"
8 CDISONAME="livecd-${CDPROFILE}.iso"
9 CDISOROOT="${LIVECDROOT}/isoroot"
10 CDKERNELNAME="magelive"
11 CDHOSTNAME="livecd-${CDPROFILE}"
12 MAGERC="/etc/mage.rc"
13 MAGE_PROFILE="$(basename $(readlink /etc/mage-profile))"
14 #TOOLCHAIN=toolchain
15 BASESYSTEM=livecdsystem26
16 CDID="mlcd-$(date +%F-%k%M)"
17
18 # global profile pathes
19 PROFILES_DIR="/usr/lib/mlivecdbuild/profiles"
20 GLOBAL_PROFILE="${PROFILES_DIR}/global"
21
22 # get full path to isolinux.bin, may vary on multilib systems
23 if [[ -f /usr/share/syslinux/isolinux.bin ]]
24 then
25 ISOLINUX_BIN=/usr/share/syslinux/isolinux.bin
26 elif [[ -f /usr/lib64/mkinitrd/isolinux.bin ]]
27 then
28 ISOLINUX_BIN=/usr/lib64/mkinitrd/isolinux.bin
29 else
30 ISOLINUX_BIN=/usr/lib/mkinitrd/isolinux.bin
31 fi
32
33 die() { echo "ERROR: $@"; exit 1; }
34
35 # get_profile $filename
36 get_profile()
37 {
38 local file="$1"
39
40 if [[ -z ${file} ]] || [[ ! -e ${PROFILES_DIR}/${CDPROFILE}/${file} ]]
41 then
42 echo "${GLOBAL_PROFILE}/${file}"
43 return 0
44 fi
45
46 echo "${PROFILES_DIR}/${CDPROFILE}/${file}"
47 }
48
49 bootstrap_system()
50 {
51 mage-bootstrap \
52 --root "${CDCHROOTDIR}" \
53 --magerc "${MAGERC}" \
54 --profile "${MAGE_PROFILE}" \
55 --toolchain "${TOOLCHAIN}" \
56 --basesystem "${BASESYSTEM}" \
57 || die "bootstrapping toolchain"
58 }
59
60 custom_services()
61 {
62 local cmd="$1"
63 local services="$2"
64 local systemdcmd
65
66 case ${cmd} in
67 add|del|default)
68 # add given services from profile
69 if [[ -n ${services} ]]
70 then
71 local i
72 for i in ${services}
73 do
74 # systemd
75 if [[ -x ${CDCHROOTDIR}/sbin/systemctl ]]
76 then
77 case ${cmd} in
78 add) chroot ${CDCHROOTDIR} systemctl enable ${i} ;;
79 del) chroot ${CDCHROOTDIR} systemctl disable ${i} ;;
80 esac
81 fi
82 # busybox and sysvinit
83 if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
84 then
85 MROOT="${CDCHROOTDIR}" rc-config ${cmd} ${i} || die "rc ${cmd} ${i}"
86 fi
87 done
88 fi
89 ;;
90 *) die "custom_services: unkown command ${cmd}";;
91 esac
92 }
93
94 add_initrc()
95 {
96 local var="$1"
97
98 # sanity checks
99 [[ -z ${CDCHROOTDIR} ]] && die "\$CDCHROOTDIR not given."
100 echo "${var}" >> ${CDCHROOTDIR}/.installrc || die "add_initrc() adding \$var"
101 }
102
103 custom_packages()
104 {
105 local cmd="$1"
106 local packages="$2"
107
108 case ${cmd} in
109 install|uninstall)
110 if [[ -n ${packages} ]]
111 then
112 :> ${CDCHROOTDIR}/.installrc
113
114 # respect proxies
115 [[ -n ${http_proxy} ]] && add_initrc "export http_proxy=${http_proxy}"
116 [[ -n ${ftp_proxy} ]] && add_initrc "export ftp_proxy=${ftp_proxy}"
117 [[ -n ${no_proxy} ]] && add_initrc "export no_proxy=${no_proxy}"
118
119 # do not auto-start any services!
120 add_initrc "export MAGE_BOOTSTRAP=true"
121 add_initrc 'die() { if [ $? -eq 1 ]; then echo "ERROR: $@"; exit 1; fi; }'
122
123 local i
124 for i in ${packages}
125 do
126 add_initrc "mage ${cmd} ${i} || die ${i}"
127 done
128 add_initrc "mage clean"
129
130 # now run the .installrc script
131 mount -t proc proc ${CDCHROOTDIR}/proc || die "mount proc"
132 mount -t sysfs sysfs ${CDCHROOTDIR}/sys || die "mount sys"
133 mount -o bind /dev ${CDCHROOTDIR}/dev || die "mount dev"
134 chroot ${CDCHROOTDIR} /bin/bash -i /.installrc || die "chr00ting"
135 umount ${CDCHROOTDIR}/dev || die "umount dev"
136 umount ${CDCHROOTDIR}/proc || die "umount proc"
137 umount ${CDCHROOTDIR}/sys || die "umount sys"
138 [ -f ${CDCHROOTDIR}/.installrc ] && rm ${CDCHROOTDIR}/.installrc
139 fi
140 ;;
141 *) die "custom_packages: unkown command ${cmd}";;
142 esac
143 }
144
145 read_config()
146 {
147 local file="$1"
148 local pkg
149
150 ( cat ${file}; echo ) | while read pkg
151 do
152 case "${pkg}" in
153 \#*|"") continue ;;
154 esac
155 echo "${pkg}"
156 done
157 }
158
159 prepare_iso()
160 {
161 echo Preparing LiveCD ISO Image ...
162
163 # fixes some issues with xfree/xorg xkb
164 if [[ -L ${CDCHROOTDIR}/etc/X11/xkb ]] && [[ -d /usr/X11R6/lib/X11/xkb ]]
165 then
166 rm ${CDCHROOTDIR}/etc/X11/xkb || die
167 mv ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb ${CDCHROOTDIR}/etc/X11 || die
168 ln -s ../../../../etc/X11/xkb ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb || die
169 fi
170
171 # only on sysvinit or busybox systems
172 if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
173 then
174 install -m 0644 $(get_profile inittab) ${CDCHROOTDIR}/etc/inittab || die
175 fi
176 # check lock group on systemd systems
177 if [[ -x ${CDCHROOTDIR}/bin/systemctl ]]
178 then
179 if [[ -z $(chroot ${CDCHROOTDIR} getent group lock) ]]
180 then
181 chroot ${CDCHROOTDIR} groupadd -g 54 lock
182 fi
183 fi
184 install -m 0644 $(get_profile fstab) ${CDCHROOTDIR}/etc/fstab || die
185 install -m 0644 $(get_profile motd) ${CDCHROOTDIR}/etc/motd || die
186 install -m 0644 $(get_profile issue) ${CDCHROOTDIR}/etc/issue || die
187 install -m 0644 $(get_profile net.eth0) ${CDCHROOTDIR}/etc/conf.d/net.eth0 || die
188 echo "${CDHOSTNAME}" > ${CDCHROOTDIR}/etc/hostname || die
189
190 echo Setting up services ...
191
192 # # add hardware detection
193 # if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
194 # then
195 # MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect"
196 # fi
197
198 # del checkfs
199 if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
200 then
201 MROOT="${CDCHROOTDIR}" rc-config del checkfs || die "rc del checkfs"
202 fi
203
204 # add custom packages
205 [[ -n ${ADD_PACKAGES} ]] && custom_packages install "${ADD_PACKAGES}"
206 [ -f $(get_profile add_packages) ] && custom_packages install "$(read_config $(get_profile add_packages))"
207
208 # del custom packages
209 [[ -n ${DEL_PACKAGES} ]] && custom_packages uninstall "${DEL_PACKAGES}"
210 [ -f $(get_profile del_packages) ] && custom_packages uninstall "$(read_config $(get_profile del_packages))"
211
212 # add given services from profile
213 [[ -n ${ADD_SERVICES} ]] && custom_services add "${ADD_SERVICES}"
214 [ -f $(get_profile add_services) ] && custom_services add "$(read_config $(get_profile add_services))"
215
216 # del given services from profile
217 [[ -n ${DEL_SERVICES} ]] && custom_services del "${DEL_SERVICES}"
218 [ -f $(get_profile del_services) ] && custom_services del "$(read_config $(get_profile del_services))"
219
220 # setup default runlevel
221 [[ -n ${DEFAULT_RUNLEVEL} ]] && custom_services default "${DEFAULT_RUNLEVEL}"
222
223 if [ -f $(get_profile prepare_custom) ]
224 then
225 echo Running custom user script ...
226 source $(get_profile prepare_custom) || die "running custom user script"
227 fi
228
229 echo Cleaning unwanted files ...
230 # do this only if not a symlink!
231 if [[ ! -L ${CDCHROOTDIR}/etc/mtab ]]
232 then
233 :> ${CDCHROOTDIR}/etc/mtab || die "whiping /etc/mtab"
234 fi
235 [ -f ${CDCHROOTDIR}/root/.bash_history ] && rm ${CDCHROOTDIR}/root/.bash_history
236 }
237
238 generate_rootfs()
239 {
240 local loopdev
241 local size
242
243 if [ -f ${LIVECDROOT}/loop/LiveOS/ext3fs.img ]
244 then
245 rm ${LIVECDROOT}/loop/LiveOS/ext3fs.img || die
246 fi
247 if [ -f ${CDISOROOT}/LiveOS/squashfs.img ]
248 then
249 rm ${CDISOROOT}/LiveOS/squashfs.img
250 fi
251 if [ -f ${CDISOROOT}/livecdrootfs.sqsh ]
252 then
253 rm ${CDISOROOT}/livecdrootfs.sqsh
254 fi
255
256 echo Generating squashfs compressed rootfs loopfile ...
257 if [[ -x ${CDCHROOTDIR}/sbin/dracut ]]
258 then
259 install -d ${LIVECDROOT}/loop/{LiveOS,mnt} || die
260
261 # get the actual size of the chroot
262 size=$(du -s chroot | sed 's:^\(.*\)[[:space:]].*:\1:')
263
264 # generate a ext3fs file for devicemapper
265 dd if=/dev/zero of=${LIVECDROOT}/loop/LiveOS/ext3fs.img bs=1024 count=$(( ${size} + 10 )) || die
266 # create a filesystem
267 mkfs.ext3 -L "_${CDID}_EXT3" -m 1 -b 1024 -F ${LIVECDROOT}/loop/LiveOS/ext3fs.img || die
268 # set mount_counts and check_intervals to 0
269 # set dir_index top, to speed up thing with hashed b-trees
270 # allow acls too
271 tune2fs -c0 -i0 -Odir_index -ouser_xattr,acl ${LIVECDROOT}/loop/LiveOS/ext3fs.img || die
272
273 # losetup the device
274 loopdev=$(losetup -f)
275 [[ -z ${loopdev} ]] && die "No unused loopdev found. Maybe you want 'modprobe loop'?"
276
277 # mount the image
278 losetup ${loopdev} ${LIVECDROOT}/loop/LiveOS/ext3fs.img || die
279 mount ${loopdev} ${LIVECDROOT}/loop/mnt || die
280
281 # copy everything to the image file and preserve permissions
282 ( cd ${CDCHROOTDIR} && tar cpf - . ) | ( cd ${LIVECDROOT}/loop/mnt && tar xvpf - )
283
284 # now umount everything and create the squashfs image
285 umount ${LIVECDROOT}/loop/mnt || die
286 losetup -d ${loopdev} || die
287 # remove mount to not ending up in the squashfs image
288 if [[ -d ${LIVECDROOT}/loop/mnt ]]
289 then
290 rm -r ${LIVECDROOT}/loop/mnt || die
291 fi
292 mksquashfs ${LIVECDROOT}/loop ${LIVECDROOT}/livecdrootfs.sqsh || die
293
294 # final cleanup
295 if [[ -d ${LIVECDROOT}/loop ]]
296 then
297 rm -r ${LIVECDROOT}/loop || die
298 fi
299 else
300 mksquashfs ${CDCHROOTDIR} ${LIVECDROOT}/livecdrootfs.sqsh || die
301 fi
302
303 echo Moving rootfs loopfile to isoroot ...
304 install -d ${CDISOROOT}
305 if [[ -x ${CDCHROOTDIR}/sbin/dracut ]]
306 then
307 install -d ${CDISOROOT}/LiveOS
308 mv ${LIVECDROOT}/livecdrootfs.sqsh ${CDISOROOT}/LiveOS/squashfs.img
309 else
310 mv ${LIVECDROOT}/livecdrootfs.sqsh ${CDISOROOT}
311 fi
312 }
313
314 install_bootloader()
315 {
316 echo Installing Bootloader ...
317
318 # iso linux binary
319 install -d ${CDISOROOT}/isolinux
320 install ${ISOLINUX_BIN} ${CDISOROOT}/isolinux || die
321
322 # kernel
323 local kimg="$(basename $(readlink ${CDCHROOTDIR}/boot/vmlinuz))"
324 install ${CDCHROOTDIR}/boot/${kimg} ${CDISOROOT}/isolinux/${CDKERNELNAME} || die
325
326 install -m 0644 $(get_profile isolinux.cfg) ${CDISOROOT}/isolinux || die
327 install -m 0644 $(get_profile boot.lss) ${CDISOROOT}/isolinux || die
328 install -m 0644 $(get_profile boot.msg) ${CDISOROOT}/isolinux || die
329 install -m 0644 $(get_profile help.msg) ${CDISOROOT}/isolinux || die
330
331 return 0
332 }
333
334 generate_initrd()
335 {
336 local CHROOTSH="$(mktemp -p ${CDCHROOTDIR})"
337
338 is_loc_mounted "${CDCHROOTDIR}/sys" || mount -t sysfs sysfs ${CDCHROOTDIR}/sys
339 is_loc_mounted "${CDCHROOTDIR}/proc" || mount -t proc proc ${CDCHROOTDIR}/proc
340 is_loc_mounted "${CDCHROOTDIR}/dev" || mount -o bind /dev ${CDCHROOTDIR}/dev
341
342 echo Generating initrd image ...
343 echo '#!/bin/bash' > ${CHROOTSH} || die
344 echo 'export LC_ALL=C' >> ${CHROOTSH} || die
345 echo 'kv="$(readlink /boot/vmlinuz)"' >> ${CHROOTSH} || die
346 echo 'kv="${kv/kernel-}/"' >> ${CHROOTSH} || die
347 # prefer dracut
348 echo 'if [[ -x /sbin/dracut ]]' >> ${CHROOTSH} || die
349 echo 'then' >> ${CHROOTSH} || die
350 echo ' dracut -v -f /initrd.gz ${kv}' >> ${CHROOTSH} || die
351 echo 'else' >> ${CHROOTSH} || die
352 echo ' mkinitrd-livecd -f --initramfs /initrd.gz ${kv}' >> ${CHROOTSH} || die
353 echo 'fi' >> ${CHROOTSH} || die
354 chmod +x ${CHROOTSH} || die
355 chroot ${CDCHROOTDIR} /$(basename ${CHROOTSH}) || die
356 [[ -f ${CHROOTSH} ]] && rm ${CHROOTSH} || die
357
358 is_loc_mounted "${CDCHROOTDIR}/dev" && umount ${CDCHROOTDIR}/dev
359 is_loc_mounted "${CDCHROOTDIR}/proc" && umount ${CDCHROOTDIR}/proc
360 is_loc_mounted "${CDCHROOTDIR}/sys" && umount ${CDCHROOTDIR}/sys
361
362 # move initrd to isoroot
363 install -d ${CDISOROOT}/isolinux || die
364 mv ${CDCHROOTDIR}/initrd.gz ${CDISOROOT}/isolinux || die
365 }
366
367 generate_iso()
368 {
369 echo Generating ISO Image ...
370 install -d ${CDISOROOT}
371 pushd ${CDISOROOT} &&
372 mkisofs -rock \
373 -full-iso9660-filenames \
374 -allow-leading-dots \
375 -disable-deep-relocation \
376 -output ${LIVECDROOT}/${CDISONAME} \
377 -eltorito-boot isolinux/isolinux.bin \
378 -eltorito-catalog isolinux/boot.cat \
379 -no-emul-boot \
380 -boot-load-size 4 \
381 -boot-info-table \
382 -volid "${CDID}" \
383 ${CDISOROOT} #&> /dev/null
384 popd
385 }
386
387 enter_livecd()
388 {
389 is_loc_mounted "${CDCHROOTDIR}/sys" || mount -t sysfs sysfs ${CDCHROOTDIR}/sys
390 is_loc_mounted "${CDCHROOTDIR}/proc" || mount -t proc proc ${CDCHROOTDIR}/proc
391 is_loc_mounted "${CDCHROOTDIR}/dev" || mount -o bind /dev ${CDCHROOTDIR}/dev
392
393 chroot ${CDCHROOTDIR} \
394 /usr/bin/env -i \
395 HOME=/root \
396 TERM=$TERM PS1='\u:\w\$ ' \
397 PATH=/bin:/usr/bin:/sbin:/usr/sbin \
398 http_proxy=${http_proxy} \
399 ftp_proxy=${ftp_proxy} \
400 no_proxy=${no_proxy} \
401 /bin/bash -i
402
403 is_loc_mounted "${CDCHROOTDIR}/dev" && umount ${CDCHROOTDIR}/dev
404 is_loc_mounted "${CDCHROOTDIR}/proc" && umount ${CDCHROOTDIR}/proc
405 is_loc_mounted "${CDCHROOTDIR}/sys" && umount ${CDCHROOTDIR}/sys
406 }
407
408 is_loc_mounted()
409 {
410 local filesys
411 local i
412 filesys=$1
413
414 i="$(cat /proc/mounts | grep " ${filesys} " | cut -d ' ' -f2)"
415 [[ ${i} != ${filesys} ]] && return 1
416
417 return 0
418 }
419
420 trap_exit()
421 {
422 is_loc_mounted "${CDCHROOTDIR}/dev" && umount ${CDCHROOTDIR}/dev
423 is_loc_mounted "${CDCHROOTDIR}/proc" && umount ${CDCHROOTDIR}/proc
424 is_loc_mounted "${CDCHROOTDIR}/sys" && umount ${CDCHROOTDIR}/sys
425 }
426
427 usage()
428 {
429 echo "Usage: $(basename $0) [command] [profile] ..."
430 echo
431 echo "Commands:"
432 echo " bootstrap - bootstraps the rootfs for the livecd"
433 echo " prepare - prepare the rootfs to run from a livecd"
434 echo " rootfs - generates the squashfs rootfs image"
435 echo " initrd - generates a livecd suitable initrd"
436 echo " bootloader - installs the bootloader"
437 echo " isogen - generate the final livecd iso image"
438 echo " all - runs all tasks to get a livecd from zero"
439 echo " enter - enters the rootfs of a livecd"
440 echo
441 echo " for example '$(basename $0) all default'"
442 echo " creates a livecd using the default profile."
443 echo
444 }
445
446 # set some proper traps
447 trap "trap_exit" SIGINT SIGQUIT
448
449 # source profile config - overrides all other vars
450 [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config
451
452 case $1 in
453 bootstrap) bootstrap_system;;
454 prepare) prepare_iso;;
455 rootfs) generate_rootfs;;
456 initrd) generate_initrd;;
457 bootloader) install_bootloader;;
458 isogen) generate_iso;;
459 all)
460 bootstrap_system
461 prepare_iso
462 generate_rootfs
463 generate_initrd
464 install_bootloader
465 generate_iso
466 ;;
467 enter) enter_livecd ;;
468 *|'') usage;;
469 esac