Magellan Linux

Annotation of /trunk/mlivecdbuild/mlivecdbuild2.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1403 - (hide annotations) (download) (as text)
Sun Jun 5 18:27:47 2011 UTC (12 years, 11 months ago) by niro
File MIME type: application/x-sh
File size: 13202 byte(s)
-added support for systemd and dracut
1 niro 346 #!/bin/bash
2    
3     # some default settings - gets overidden with the profile config
4 niro 360 CDPROFILE="$2"
5 niro 346 [[ -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 niro 1402 # 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 niro 346 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 niro 360 custom_services()
58     {
59     local cmd="$1"
60     local services="$2"
61 niro 1403 local systemdcmd
62 niro 360
63     case ${cmd} in
64 niro 471 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 niro 1403 # 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 niro 471 done
85     fi
86     ;;
87 niro 360 *) die "custom_services: unkown command ${cmd}";;
88     esac
89     }
90    
91     add_initrc()
92     {
93     local var="$1"
94    
95     # sanity checks
96 niro 473 [[ -z ${CDCHROOTDIR} ]] && die "\$CDCHROOTDIR not given."
97 niro 360 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 niro 471 install|uninstall)
107     if [[ -n ${packages} ]]
108     then
109     :> ${CDCHROOTDIR}/.installrc
110 niro 472
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 niro 580 # do not auto-start any services!
117     add_initrc "export MAGE_BOOTSTRAP=true"
118 niro 863 add_initrc 'die() { if [ $? -eq 1 ]; then echo "ERROR: $@"; exit 1; fi; }'
119 niro 580
120 niro 471 local i
121     for i in ${packages}
122     do
123 niro 863 add_initrc "mage ${cmd} ${i} || die ${i}"
124 niro 471 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 niro 360 *) 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 niro 346 prepare_iso()
157     {
158     echo Preparing LiveCD ISO Image ...
159    
160     # fixes some issues with xfree/xorg xkb
161 niro 473 if [[ -L ${CDCHROOTDIR}/etc/X11/xkb ]] && [[ -d /usr/X11R6/lib/X11/xkb ]]
162 niro 346 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 niro 1403 # 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 niro 346 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 niro 712 install -m 0644 $(get_profile net.eth0) ${CDCHROOTDIR}/etc/conf.d/net.eth0 || die
177 niro 346 echo "${CDHOSTNAME}" > ${CDCHROOTDIR}/etc/hostname || die
178    
179     echo Setting up services ...
180    
181 niro 978 # # add hardware detection
182 niro 1403 # if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
183     # then
184     # MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect"
185     # fi
186 niro 346
187     # del checkfs
188 niro 1403 if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
189     then
190     MROOT="${CDCHROOTDIR}" rc-config del checkfs || die "rc del checkfs"
191     fi
192 niro 346
193 niro 360 # 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 niro 346 echo Cleaning unwanted files ...
219 niro 1403 # 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 niro 360 [ -f ${CDCHROOTDIR}/root/.bash_history ] && rm ${CDCHROOTDIR}/root/.bash_history
225 niro 346 }
226    
227     generate_rootfs()
228     {
229 niro 1403 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 niro 346 echo Generating squashfs compressed rootfs loopfile ...
246 niro 1403 if [[ -x ${CDCHROOTDIR}/sbin/dracut ]]
247     then
248     install -d ${LIVECDROOT}/loop/{LiveOS,mnt} || die
249 niro 346
250 niro 1403 # 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 niro 346 echo Moving rootfs loopfile to isoroot ...
293     install -d ${CDISOROOT}
294 niro 1403 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 niro 346 }
302    
303     install_bootloader()
304     {
305     echo Installing Bootloader ...
306    
307     # iso linux binary
308     install -d ${CDISOROOT}/isolinux
309 niro 1402 install ${ISOLINUX_BIN} ${CDISOROOT}/isolinux || die
310 niro 346
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 niro 1403 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 niro 346 echo Generating initrd image ...
332     echo '#!/bin/bash' > ${CHROOTSH} || die
333 niro 1403 echo 'export LC_ALL=C' >> ${CHROOTSH} || die
334 niro 346 echo 'kv="$(readlink /boot/vmlinuz)"' >> ${CHROOTSH} || die
335     echo 'kv="${kv/kernel-}/"' >> ${CHROOTSH} || die
336 niro 1403 # 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 niro 346 chmod +x ${CHROOTSH} || die
344     chroot ${CDCHROOTDIR} /$(basename ${CHROOTSH}) || die
345     [[ -f ${CHROOTSH} ]] && rm ${CHROOTSH} || die
346    
347 niro 1403 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 niro 346 # 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 niro 1403 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 niro 346
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 niro 472 http_proxy=${http_proxy} \
388     ftp_proxy=${ftp_proxy} \
389     no_proxy=${no_proxy} \
390 niro 346 /bin/bash -i
391 niro 609
392 niro 1403 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 niro 346 }
396    
397 niro 1403 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 niro 360 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 niro 472 echo " enter - enters the rootfs of a livecd"
429 niro 360 echo
430     echo " for example '$(basename $0) all default'"
431     echo " creates a livecd using the default profile."
432     echo
433     }
434    
435 niro 1403 # set some proper traps
436     trap "trap_exit" SIGINT SIGQUIT
437    
438 niro 346 # source profile config - overrides all other vars
439     [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config
440    
441 niro 360 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 niro 713 generate_iso
455 niro 360 ;;
456 niro 472 enter) enter_livecd ;;
457 niro 360 *|'') usage;;
458     esac