Magellan Linux

Diff of /trunk/mlivecdbuild/mlivecdbuild2.sh

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 978 by niro, Thu Apr 29 20:37:04 2010 UTC revision 1821 by niro, Tue May 29 11:08:26 2012 UTC
# Line 19  CDID="mlcd-$(date +%F-%k%M)" Line 19  CDID="mlcd-$(date +%F-%k%M)"
19  PROFILES_DIR="/usr/lib/mlivecdbuild/profiles"  PROFILES_DIR="/usr/lib/mlivecdbuild/profiles"
20  GLOBAL_PROFILE="${PROFILES_DIR}/global"  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; }  die() { echo "ERROR: $@"; exit 1; }
34    
35  # get_profile $filename  # get_profile $filename
# Line 50  custom_services() Line 61  custom_services()
61  {  {
62   local cmd="$1"   local cmd="$1"
63   local services="$2"   local services="$2"
64     local systemdcmd
65    
66   case ${cmd} in   case ${cmd} in
67   add|del|default)   add|del|default)
# Line 59  custom_services() Line 71  custom_services()
71   local i   local i
72   for i in ${services}   for i in ${services}
73   do   do
74   MROOT="${CDCHROOTDIR}" rc-config ${cmd} ${i} || die "rc ${cmd} ${i}"   # systemd
75     if [[ -x ${CDCHROOTDIR}/bin/systemctl ]] || [[ -x ${CDCHROOTDIR}/usr/bin/systemctl ]]
76     then
77     case ${cmd} in
78     add) chroot ${CDCHROOTDIR} systemctl enable ${i} ;;
79     del) chroot ${CDCHROOTDIR} systemctl disable ${i} ;;
80     default)
81     # convert targets
82     case ${i} in
83     2|3|multi-user) service="multi-user.target" ;;
84     5|graphical) service="graphical.target" ;;
85     esac
86     chroot ${CDCHROOTDIR} systemctl enable ${i} ;;
87     esac
88     fi
89     # busybox and sysvinit
90     if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]] && [[ ! -x ${CDCHROOTDIR}/bin/systemctl ]]  && [[ ! -x ${CDCHROOTDIR}/usr/bin/systemctl ]]
91     then
92     MROOT="${CDCHROOTDIR}" rc-config ${cmd} ${i} || die "rc ${cmd} ${i}"
93     fi
94   done   done
95   fi   fi
96   ;;   ;;
# Line 137  prepare_iso() Line 168  prepare_iso()
168   echo Preparing LiveCD ISO Image ...   echo Preparing LiveCD ISO Image ...
169    
170   # fixes some issues with xfree/xorg xkb   # fixes some issues with xfree/xorg xkb
171   if [[ -L ${CDCHROOTDIR}/etc/X11/xkb ]] && [[ -d /usr/X11R6/lib/X11/xkb ]]   if [[ -L ${CDCHROOTDIR}/etc/X11/xkb ]] &&
172     [[ -d ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb ]]
173   then   then
174   rm ${CDCHROOTDIR}/etc/X11/xkb || die   rm ${CDCHROOTDIR}/etc/X11/xkb || die
175   mv ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb ${CDCHROOTDIR}/etc/X11 || die   mv ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb ${CDCHROOTDIR}/etc/X11 || die
176   ln -s ../../../../etc/X11/xkb ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb || die   ln -s ../../../../etc/X11/xkb ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb || die
177   fi   fi
178    
179   install -m 0644 $(get_profile inittab) ${CDCHROOTDIR}/etc/inittab || die   # fix issues with >=dracut-014 which drops some default modules like livecd
180     if [[ -x ${CDCHROOTDIR}/sbin/dracut ]] ||
181     [[ -x ${CDCHROOTDIR}/usr/sbin/dracut ]] ||
182     [[ -x ${CDCHROOTDIR}/usr/bin/dracut ]]
183     then
184     install -d ${CDCHROOTDIR}/etc/dracut.conf.d || die
185     echo 'add_dracutmodules+=" dmsquash-live "' \
186     > ${CDCHROOTDIR}/etc/dracut.conf.d/02-livecd.conf || die
187     fi
188    
189     # only on sysvinit or busybox systems
190     if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
191     then
192     install -m 0644 $(get_profile inittab) ${CDCHROOTDIR}/etc/inittab || die
193     fi
194     if [[ -x ${CDCHROOTDIR}/bin/systemctl ]] || [[ -x ${CDCHROOTDIR}/usr/bin/systemctl ]]
195     then
196     # check lock group on systemd systems
197     if [[ -z $(chroot ${CDCHROOTDIR} getent group lock) ]]
198     then
199     echo "adding missing group 'lock'"
200     chroot ${CDCHROOTDIR}  groupadd -g 54 lock
201     fi
202     # dbus plugdev group
203     if [[ -z $(chroot ${CDCHROOTDIR} getent group plugdev) ]]
204     then
205     echo "adding missing group 'plugdev'"
206     chroot ${CDCHROOTDIR}  groupadd -g 302 plugdev
207     fi
208     # dbus messagebus group
209     if [[ -z $(chroot ${CDCHROOTDIR} getent group messagebus) ]]
210     then
211     echo "adding missing group 'messagebus'"
212     chroot ${CDCHROOTDIR}  groupadd -g 300 messagebus
213     fi
214     # dbus messagebus user
215     if [[ -z $(chroot ${CDCHROOTDIR} getent passwd messagebus) ]]
216     then
217     echo "adding missing user 'messagebus'"
218     chroot ${CDCHROOTDIR}  useradd -u 300 -g messagebus -d /dev/null -s /bin/false messagebus
219     fi
220     fi
221   install -m 0644 $(get_profile fstab) ${CDCHROOTDIR}/etc/fstab || die   install -m 0644 $(get_profile fstab) ${CDCHROOTDIR}/etc/fstab || die
222   install -m 0644 $(get_profile motd) ${CDCHROOTDIR}/etc/motd || die   install -m 0644 $(get_profile motd) ${CDCHROOTDIR}/etc/motd || die
223   install -m 0644 $(get_profile issue) ${CDCHROOTDIR}/etc/issue || die   install -m 0644 $(get_profile issue) ${CDCHROOTDIR}/etc/issue || die
224   install -m 0644 $(get_profile net.eth0) ${CDCHROOTDIR}/etc/conf.d/net.eth0 || die   install -m 0644 $(get_profile net.eth0) ${CDCHROOTDIR}/etc/conf.d/net.eth0 || die
225   echo "${CDHOSTNAME}" > ${CDCHROOTDIR}/etc/hostname || die   echo "${CDHOSTNAME}" > ${CDCHROOTDIR}/etc/hostname || die
226     install -d ${CDCHROOTDIR}/mnt/magellan || die
227    
228   echo Setting up services ...   echo Setting up services ...
229    
230     # install systemd default services
231     if [[ -x ${CDCHROOTDIR}/bin/systemctl ]]
232     then
233     # install tmpfs /tmp and /var/tmp
234     install -m 0644 $(get_profile tmp.mount) ${CDCHROOTDIR}/lib/systemd/system/ || die
235     install -m 0644 $(get_profile var-tmp.mount) ${CDCHROOTDIR}/lib/systemd/system/ || die
236     # enable them
237     ln -snf ../tmp.mount ${CDCHROOTDIR}/lib/systemd/system/local-fs.target.wants/tmp.mount || die
238     ln -snf ../var-tmp.mount ${CDCHROOTDIR}/lib/systemd/system/local-fs.target.wants/var-tmp.mount || die
239     fi
240     # newer systemd goes to /usr/lib
241     if [[ -x ${CDCHROOTDIR}/usr/bin/systemctl ]]
242     then
243     # install tmpfs /tmp and /var/tmp
244     install -m 0644 $(get_profile tmp.mount) ${CDCHROOTDIR}/usr/lib/systemd/system/ || die
245     install -m 0644 $(get_profile var-tmp.mount) ${CDCHROOTDIR}/usr/lib/systemd/system/ || die
246     # enable them
247     ln -snf ../tmp.mount ${CDCHROOTDIR}/usr/lib/systemd/system/local-fs.target.wants/tmp.mount || die
248     ln -snf ../var-tmp.mount ${CDCHROOTDIR}/usr/lib/systemd/system/local-fs.target.wants/var-tmp.mount || die
249     fi
250    
251     if [[ -x ${CDCHROOTDIR}/bin/systemctl ]] || [[ -x ${CDCHROOTDIR}/usr/bin/systemctl ]]
252     then
253     install -m 0644 $(get_profile getty) ${CDCHROOTDIR}/etc/conf.d/getty || die
254    
255     custom_services add getty@.service
256     custom_services add remote-fs.target
257     # disable readahead
258     custom_services del systemd-readahead-replay.service
259     custom_services del systemd-readahead-collect.service
260     fi
261    
262  # # add hardware detection  # # add hardware detection
263  # MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect"  # if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
264    # then
265    # MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect"
266    # fi
267    
268   # del checkfs   # del checkfs
269   MROOT="${CDCHROOTDIR}" rc-config del checkfs || die "rc del checkfs"   if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
270     then
271     MROOT="${CDCHROOTDIR}" rc-config del checkfs || die "rc del checkfs"
272     fi
273    
274   # add custom packages   # add custom packages
275   [[ -n ${ADD_PACKAGES} ]] && custom_packages install "${ADD_PACKAGES}"   [[ -n ${ADD_PACKAGES} ]] && custom_packages install "${ADD_PACKAGES}"
# Line 185  prepare_iso() Line 297  prepare_iso()
297   fi   fi
298    
299   echo Cleaning unwanted files ...   echo Cleaning unwanted files ...
300   :> ${CDCHROOTDIR}/etc/mtab || die "whiping /etc/mtab"   # do this only if not a symlink!
301     if [[ ! -L ${CDCHROOTDIR}/etc/mtab ]]
302     then
303     :> ${CDCHROOTDIR}/etc/mtab || die "whiping /etc/mtab"
304     fi
305   [ -f ${CDCHROOTDIR}/root/.bash_history ] && rm ${CDCHROOTDIR}/root/.bash_history   [ -f ${CDCHROOTDIR}/root/.bash_history ] && rm ${CDCHROOTDIR}/root/.bash_history
306  }  }
307    
308  generate_rootfs()  generate_rootfs()
309  {  {
310     local loopdev
311     local size
312    
313     if [ -f ${LIVECDROOT}/loop/LiveOS/ext3fs.img ]
314     then
315     rm ${LIVECDROOT}/loop/LiveOS/ext3fs.img || die
316     fi
317     if [ -f ${CDISOROOT}/LiveOS/squashfs.img ]
318     then
319     rm ${CDISOROOT}/LiveOS/squashfs.img
320     fi
321     if [ -f ${CDISOROOT}/livecdrootfs.sqsh ]
322     then
323     rm ${CDISOROOT}/livecdrootfs.sqsh
324     fi
325    
326   echo Generating squashfs compressed rootfs loopfile ...   echo Generating squashfs compressed rootfs loopfile ...
327   mksquashfs ${CDCHROOTDIR} ${LIVECDROOT}/livecdrootfs.sqsh #>/dev/null 2>&1   if [[ -x ${CDCHROOTDIR}/sbin/dracut ]] ||
328     [[ -x ${CDCHROOTDIR}/usr/sbin/dracut ]] ||
329     [[ -x ${CDCHROOTDIR}/usr/bin/dracut ]]
330     then
331     install -d ${LIVECDROOT}/loop/{LiveOS,mnt} || die
332    
333     # get the actual size of the chroot
334     size=$(du -s ${LIVECDROOT}/chroot | sed 's:^\(.*\)[[:space:]].*:\1:')
335    
336     # generate a ext3fs file for devicemapper
337     dd if=/dev/zero of=${LIVECDROOT}/loop/LiveOS/ext3fs.img bs=1024 count=$(( ${size} + 10 )) || die
338     # create a filesystem
339     mkfs.ext3 -L "_${CDID}_EXT3" -m 1 -b 1024 -F ${LIVECDROOT}/loop/LiveOS/ext3fs.img || die
340     # set mount_counts and check_intervals to 0
341     # set dir_index top, to speed up thing with hashed b-trees
342     # allow acls too
343     tune2fs -c0 -i0 -Odir_index -ouser_xattr,acl ${LIVECDROOT}/loop/LiveOS/ext3fs.img || die
344    
345     # losetup the device
346     loopdev=$(losetup -f)
347     [[ -z ${loopdev} ]] && die "No unused loopdev found. Maybe you want 'modprobe loop'?"
348    
349     # mount the image
350     losetup ${loopdev} ${LIVECDROOT}/loop/LiveOS/ext3fs.img || die
351     mount ${loopdev} ${LIVECDROOT}/loop/mnt || die
352    
353     # copy everything to the image file and preserve permissions
354     ( cd ${CDCHROOTDIR} && tar cpf - . ) | ( cd ${LIVECDROOT}/loop/mnt && tar xvpf - )
355    
356     # now umount everything and create the squashfs image
357     umount ${LIVECDROOT}/loop/mnt || die
358     losetup -d ${loopdev} || die
359     # remove mount to not ending up in the squashfs image
360     if [[ -d ${LIVECDROOT}/loop/mnt ]]
361     then
362     rm -r ${LIVECDROOT}/loop/mnt || die
363     fi
364     mksquashfs ${LIVECDROOT}/loop ${LIVECDROOT}/livecdrootfs.sqsh || die
365    
366     # final cleanup
367     if [[ -d ${LIVECDROOT}/loop ]]
368     then
369     rm -r ${LIVECDROOT}/loop || die
370     fi
371     else
372     mksquashfs ${CDCHROOTDIR} ${LIVECDROOT}/livecdrootfs.sqsh || die
373     fi
374    
375   echo Moving rootfs loopfile to isoroot ...   echo Moving rootfs loopfile to isoroot ...
376   install -d ${CDISOROOT}   install -d ${CDISOROOT}
377   mv ${LIVECDROOT}/livecdrootfs.sqsh ${CDISOROOT}   if [[ -x ${CDCHROOTDIR}/sbin/dracut ]] ||
378     [[ -x ${CDCHROOTDIR}/usr/sbin/dracut ]] ||
379     [[ -x ${CDCHROOTDIR}/usr/bin/dracut ]]
380     then
381     install -d ${CDISOROOT}/LiveOS
382     mv ${LIVECDROOT}/livecdrootfs.sqsh ${CDISOROOT}/LiveOS/squashfs.img
383     else
384     mv ${LIVECDROOT}/livecdrootfs.sqsh ${CDISOROOT}
385     fi
386  }  }
387    
388  install_bootloader()  install_bootloader()
# Line 205  install_bootloader() Line 391  install_bootloader()
391    
392   # iso linux binary   # iso linux binary
393   install -d ${CDISOROOT}/isolinux   install -d ${CDISOROOT}/isolinux
394   install /usr/lib/mkinitrd/isolinux.bin ${CDISOROOT}/isolinux || die   install ${ISOLINUX_BIN} ${CDISOROOT}/isolinux || die
395    
396   # kernel   # kernel
397   local kimg="$(basename $(readlink ${CDCHROOTDIR}/boot/vmlinuz))"   local kimg="$(basename $(readlink ${CDCHROOTDIR}/boot/vmlinuz))"
# Line 215  install_bootloader() Line 401  install_bootloader()
401   install -m 0644 $(get_profile boot.lss) ${CDISOROOT}/isolinux || die   install -m 0644 $(get_profile boot.lss) ${CDISOROOT}/isolinux || die
402   install -m 0644 $(get_profile boot.msg) ${CDISOROOT}/isolinux || die   install -m 0644 $(get_profile boot.msg) ${CDISOROOT}/isolinux || die
403   install -m 0644 $(get_profile help.msg) ${CDISOROOT}/isolinux || die   install -m 0644 $(get_profile help.msg) ${CDISOROOT}/isolinux || die
404     # support the new layout too
405     if [[ -f $(get_profile index.msg) ]]
406     then
407     install -m 0644 $(get_profile index.msg) ${CDISOROOT}/isolinux || die
408     fi
409     if [[ -f $(get_profile debug.msg) ]]
410     then
411     install -m 0644 $(get_profile debug.msg) ${CDISOROOT}/isolinux || die
412     fi
413    
414   return 0   return 0
415  }  }
# Line 223  generate_initrd() Line 418  generate_initrd()
418  {  {
419   local CHROOTSH="$(mktemp -p ${CDCHROOTDIR})"   local CHROOTSH="$(mktemp -p ${CDCHROOTDIR})"
420    
421     is_loc_mounted "${CDCHROOTDIR}/sys" || mount -t sysfs sysfs ${CDCHROOTDIR}/sys
422     is_loc_mounted "${CDCHROOTDIR}/proc" || mount -t proc proc ${CDCHROOTDIR}/proc
423     is_loc_mounted "${CDCHROOTDIR}/dev" || mount -o bind /dev ${CDCHROOTDIR}/dev
424    
425   echo Generating initrd image ...   echo Generating initrd image ...
426   echo '#!/bin/bash' > ${CHROOTSH} || die   echo '#!/bin/bash' > ${CHROOTSH} || die
427     echo 'export LC_ALL=C' >> ${CHROOTSH} || die
428   echo 'kv="$(readlink /boot/vmlinuz)"' >> ${CHROOTSH} || die   echo 'kv="$(readlink /boot/vmlinuz)"' >> ${CHROOTSH} || die
429   echo 'kv="${kv/kernel-}/"' >> ${CHROOTSH} || die   echo 'kv="${kv/kernel-}/"' >> ${CHROOTSH} || die
430   echo 'mkinitrd-livecd -f --initramfs /initrd.gz ${kv}' >> ${CHROOTSH} || die   # prefer dracut
431     echo 'if [[ -x /sbin/dracut ]] || [[ -x /usr/sbin/dracut ]] || [[ -x /usr/bin/dracut ]]' >> ${CHROOTSH} || die
432     echo 'then' >> ${CHROOTSH} || die
433     echo ' dracut -v -f /initrd.gz ${kv}' >> ${CHROOTSH} || die
434     echo 'else' >> ${CHROOTSH} || die
435     echo ' mkinitrd-livecd -f --initramfs /initrd.gz ${kv}' >> ${CHROOTSH} || die
436     echo 'fi' >> ${CHROOTSH} || die
437   chmod +x ${CHROOTSH} || die   chmod +x ${CHROOTSH} || die
438   chroot ${CDCHROOTDIR} /$(basename ${CHROOTSH}) || die   chroot ${CDCHROOTDIR} /$(basename ${CHROOTSH}) || die
439   [[ -f ${CHROOTSH} ]] && rm ${CHROOTSH} || die   [[ -f ${CHROOTSH} ]] && rm ${CHROOTSH} || die
440    
441     is_loc_mounted "${CDCHROOTDIR}/dev" && umount ${CDCHROOTDIR}/dev
442     is_loc_mounted "${CDCHROOTDIR}/proc" && umount ${CDCHROOTDIR}/proc
443     is_loc_mounted "${CDCHROOTDIR}/sys" && umount ${CDCHROOTDIR}/sys
444    
445   # move initrd to isoroot   # move initrd to isoroot
446   install -d ${CDISOROOT}/isolinux || die   install -d ${CDISOROOT}/isolinux || die
447   mv ${CDCHROOTDIR}/initrd.gz ${CDISOROOT}/isolinux || die   mv ${CDCHROOTDIR}/initrd.gz ${CDISOROOT}/isolinux || die
# Line 259  generate_iso() Line 469  generate_iso()
469    
470  enter_livecd()  enter_livecd()
471  {  {
472   mount -t sysfs sysfs ${CDCHROOTDIR}/sys   is_loc_mounted "${CDCHROOTDIR}/sys" || mount -t sysfs sysfs ${CDCHROOTDIR}/sys
473   mount -t proc proc ${CDCHROOTDIR}/proc   is_loc_mounted "${CDCHROOTDIR}/proc" || mount -t proc proc ${CDCHROOTDIR}/proc
474   mount -o bind /dev ${CDCHROOTDIR}/dev   is_loc_mounted "${CDCHROOTDIR}/dev" || mount -o bind /dev ${CDCHROOTDIR}/dev
475    
476   chroot ${CDCHROOTDIR} \   chroot ${CDCHROOTDIR} \
477   /usr/bin/env -i \   /usr/bin/env -i \
# Line 273  enter_livecd() Line 483  enter_livecd()
483   no_proxy=${no_proxy} \   no_proxy=${no_proxy} \
484   /bin/bash -i   /bin/bash -i
485    
486   umount ${CDCHROOTDIR}/dev   is_loc_mounted "${CDCHROOTDIR}/dev" && umount ${CDCHROOTDIR}/dev
487   umount ${CDCHROOTDIR}/proc   is_loc_mounted "${CDCHROOTDIR}/proc" && umount ${CDCHROOTDIR}/proc
488   umount ${CDCHROOTDIR}/sys   is_loc_mounted "${CDCHROOTDIR}/sys" && umount ${CDCHROOTDIR}/sys
489    }
490    
491    is_loc_mounted()
492    {
493     local filesys
494     local i
495     filesys=$1
496    
497     i="$(cat /proc/mounts | grep " ${filesys} " | cut -d ' ' -f2)"
498     [[ ${i} != ${filesys} ]] && return 1
499    
500     return 0
501    }
502    
503    trap_exit()
504    {
505     is_loc_mounted "${CDCHROOTDIR}/dev" && umount ${CDCHROOTDIR}/dev
506     is_loc_mounted "${CDCHROOTDIR}/proc" && umount ${CDCHROOTDIR}/proc
507     is_loc_mounted "${CDCHROOTDIR}/sys" && umount ${CDCHROOTDIR}/sys
508  }  }
509    
510  usage()  usage()
# Line 297  usage() Line 526  usage()
526   echo   echo
527  }  }
528    
529    # set some proper traps
530    trap "trap_exit" SIGINT SIGQUIT
531    
532  # source profile config - overrides all other vars  # source profile config - overrides all other vars
533  [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config  [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config
534    

Legend:
Removed from v.978  
changed lines
  Added in v.1821