Magellan Linux

Contents of /trunk/mlivecdbuild/mlivecdbuild2.sh

Parent Directory Parent Directory | Revision Log Revision Log


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