Magellan Linux

Annotation of /branches/mlivecdbuild-1_x_branch/mlivecdbuild2.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1446 - (hide annotations) (download) (as text)
Fri Jul 29 11:14:07 2011 UTC (12 years, 9 months ago) by niro
Original Path: trunk/mlivecdbuild/mlivecdbuild2.sh
File MIME type: application/x-sh
File size: 13507 byte(s)
-check for lock group existance on systemd systems
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 1422 # get full path to isolinux.bin, may vary on multilib systems
23     if [[ -f /usr/share/syslinux/isolinux.bin ]]
24 niro 1402 then
25 niro 1422 ISOLINUX_BIN=/usr/share/syslinux/isolinux.bin
26     elif [[ -f /usr/lib64/mkinitrd/isolinux.bin ]]
27     then
28 niro 1402 ISOLINUX_BIN=/usr/lib64/mkinitrd/isolinux.bin
29     else
30     ISOLINUX_BIN=/usr/lib/mkinitrd/isolinux.bin
31     fi
32    
33 niro 346 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 niro 360 custom_services()
61     {
62     local cmd="$1"
63     local services="$2"
64 niro 1403 local systemdcmd
65 niro 360
66     case ${cmd} in
67 niro 471 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 niro 1403 # 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 niro 471 done
88     fi
89     ;;
90 niro 360 *) die "custom_services: unkown command ${cmd}";;
91     esac
92     }
93    
94     add_initrc()
95     {
96     local var="$1"
97    
98     # sanity checks
99 niro 473 [[ -z ${CDCHROOTDIR} ]] && die "\$CDCHROOTDIR not given."
100 niro 360 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 niro 471 install|uninstall)
110     if [[ -n ${packages} ]]
111     then
112     :> ${CDCHROOTDIR}/.installrc
113 niro 472
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 niro 580 # do not auto-start any services!
120     add_initrc "export MAGE_BOOTSTRAP=true"
121 niro 863 add_initrc 'die() { if [ $? -eq 1 ]; then echo "ERROR: $@"; exit 1; fi; }'
122 niro 580
123 niro 471 local i
124     for i in ${packages}
125     do
126 niro 863 add_initrc "mage ${cmd} ${i} || die ${i}"
127 niro 471 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 niro 360 *) 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 niro 346 prepare_iso()
160     {
161     echo Preparing LiveCD ISO Image ...
162    
163     # fixes some issues with xfree/xorg xkb
164 niro 473 if [[ -L ${CDCHROOTDIR}/etc/X11/xkb ]] && [[ -d /usr/X11R6/lib/X11/xkb ]]
165 niro 346 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 niro 1403 # 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 niro 1446 # 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 niro 346 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 niro 712 install -m 0644 $(get_profile net.eth0) ${CDCHROOTDIR}/etc/conf.d/net.eth0 || die
188 niro 346 echo "${CDHOSTNAME}" > ${CDCHROOTDIR}/etc/hostname || die
189    
190     echo Setting up services ...
191    
192 niro 978 # # add hardware detection
193 niro 1403 # if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
194     # then
195     # MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect"
196     # fi
197 niro 346
198     # del checkfs
199 niro 1403 if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
200     then
201     MROOT="${CDCHROOTDIR}" rc-config del checkfs || die "rc del checkfs"
202     fi
203 niro 346
204 niro 360 # 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 niro 346 echo Cleaning unwanted files ...
230 niro 1403 # 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 niro 360 [ -f ${CDCHROOTDIR}/root/.bash_history ] && rm ${CDCHROOTDIR}/root/.bash_history
236 niro 346 }
237    
238     generate_rootfs()
239     {
240 niro 1403 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 niro 346 echo Generating squashfs compressed rootfs loopfile ...
257 niro 1403 if [[ -x ${CDCHROOTDIR}/sbin/dracut ]]
258     then
259     install -d ${LIVECDROOT}/loop/{LiveOS,mnt} || die
260 niro 346
261 niro 1403 # 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 niro 346 echo Moving rootfs loopfile to isoroot ...
304     install -d ${CDISOROOT}
305 niro 1403 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 niro 346 }
313    
314     install_bootloader()
315     {
316     echo Installing Bootloader ...
317    
318     # iso linux binary
319     install -d ${CDISOROOT}/isolinux
320 niro 1402 install ${ISOLINUX_BIN} ${CDISOROOT}/isolinux || die
321 niro 346
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 niro 1403 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 niro 346 echo Generating initrd image ...
343     echo '#!/bin/bash' > ${CHROOTSH} || die
344 niro 1403 echo 'export LC_ALL=C' >> ${CHROOTSH} || die
345 niro 346 echo 'kv="$(readlink /boot/vmlinuz)"' >> ${CHROOTSH} || die
346     echo 'kv="${kv/kernel-}/"' >> ${CHROOTSH} || die
347 niro 1403 # 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 niro 346 chmod +x ${CHROOTSH} || die
355     chroot ${CDCHROOTDIR} /$(basename ${CHROOTSH}) || die
356     [[ -f ${CHROOTSH} ]] && rm ${CHROOTSH} || die
357    
358 niro 1403 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 niro 346 # 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 niro 1403 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 niro 346
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 niro 472 http_proxy=${http_proxy} \
399     ftp_proxy=${ftp_proxy} \
400     no_proxy=${no_proxy} \
401 niro 346 /bin/bash -i
402 niro 609
403 niro 1403 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 niro 346 }
407    
408 niro 1403 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 niro 360 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 niro 472 echo " enter - enters the rootfs of a livecd"
440 niro 360 echo
441     echo " for example '$(basename $0) all default'"
442     echo " creates a livecd using the default profile."
443     echo
444     }
445    
446 niro 1403 # set some proper traps
447     trap "trap_exit" SIGINT SIGQUIT
448    
449 niro 346 # source profile config - overrides all other vars
450     [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config
451    
452 niro 360 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 niro 713 generate_iso
466 niro 360 ;;
467 niro 472 enter) enter_livecd ;;
468 niro 360 *|'') usage;;
469     esac