Magellan Linux

Diff of /trunk/mlivecdbuild/mlivecdbuild2.sh

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

revision 360 by niro, Mon Mar 27 21:23:02 2006 UTC revision 1403 by niro, Sun Jun 5 18:27:47 2011 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 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; }  die() { echo "ERROR: $@"; exit 1; }
31    
32  # get_profile $filename  # get_profile $filename
# Line 50  custom_services() Line 58  custom_services()
58  {  {
59   local cmd="$1"   local cmd="$1"
60   local services="$2"   local services="$2"
61     local systemdcmd
62    
63   case ${cmd} in   case ${cmd} in
64   add|del|default) continue;;   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}";;   *) die "custom_services: unkown command ${cmd}";;
88   esac   esac
   
  # add given services from profile  
  if [[ -n ${services} ]]  
  then  
  local i  
  for i in ${services}  
  do  
  MROOT="${CDCHROOTDIR}" rc-config ${cmd} ${i} || die "rc ${cmd} ${i}"  
  done  
  fi  
89  }  }
90    
91  add_initrc()  add_initrc()
# Line 72  add_initrc() Line 93  add_initrc()
93   local var="$1"   local var="$1"
94    
95   # sanity checks   # sanity checks
96   [ -z "${CDCHROOTDIR}" ] && die "\$CDCHROOTDIR not given."   [[ -z ${CDCHROOTDIR} ]] && die "\$CDCHROOTDIR not given."
97   echo "${var}" >> ${CDCHROOTDIR}/.installrc || die "add_initrc() adding \$var"   echo "${var}" >> ${CDCHROOTDIR}/.installrc || die "add_initrc() adding \$var"
98  }  }
99    
# Line 82  custom_packages() Line 103  custom_packages()
103   local packages="$2"   local packages="$2"
104    
105   case ${cmd} in   case ${cmd} in
106   install|uninstall) continue;;   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}";;   *) die "custom_packages: unkown command ${cmd}";;
139   esac   esac
   
  if [[ -n ${packages} ]]  
  then  
   
  :> ${CDCHROOTDIR}/.installrc  
  local i  
  for i in ${packages}  
  do  
  add_initrc "mage install ${i}"  
  done  
  add_initrc "mage clean"  
   
  # now run the .installrc script  
  mount -t proc proc ${CDCHROOTDIR}/proc || die "mount proc"  
  mount -t sysfs sysfs ${CDCHROOTDIR}/sys || die "mount sys"  
  mount -o bind /dev ${CDCHROOTDIR}/dev || die "mount dev"  
  chroot ${CDCHROOTDIR} /bin/bash -i /.installrc || die "chr00ting"  
  umount ${CDCHROOTDIR}/dev || die "umount dev"  
  umount ${CDCHROOTDIR}/proc || die "umount proc"  
  umount ${CDCHROOTDIR}/sys || die "umount sys"  
  [ -f ${CDCHROOTDIR}/.installrc ] && rm ${CDCHROOTDIR}/.installrc  
  fi  
140  }  }
141    
142  read_config()  read_config()
# Line 128  prepare_iso() Line 158  prepare_iso()
158   echo Preparing LiveCD ISO Image ...   echo Preparing LiveCD ISO Image ...
159    
160   # fixes some issues with xfree/xorg xkb   # fixes some issues with xfree/xorg xkb
161   if [ -L "${CDCHROOTDIR}/etc/X11/xkb" -a -d "/usr/X11R6/lib/X11/xkb" ]   if [[ -L ${CDCHROOTDIR}/etc/X11/xkb ]] && [[ -d /usr/X11R6/lib/X11/xkb ]]
162   then   then
163   rm ${CDCHROOTDIR}/etc/X11/xkb || die   rm ${CDCHROOTDIR}/etc/X11/xkb || die
164   mv ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb ${CDCHROOTDIR}/etc/X11 || die   mv ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb ${CDCHROOTDIR}/etc/X11 || die
165   ln -s ../../../../etc/X11/xkb ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb || die   ln -s ../../../../etc/X11/xkb ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb || die
166   fi   fi
167    
168   install -m 0644 $(get_profile inittab) ${CDCHROOTDIR}/etc/inittab || die   # 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   install -m 0644 $(get_profile fstab) ${CDCHROOTDIR}/etc/fstab || die
174   install -m 0644 $(get_profile motd) ${CDCHROOTDIR}/etc/motd || die   install -m 0644 $(get_profile motd) ${CDCHROOTDIR}/etc/motd || die
175   install -m 0644 $(get_profile issue) ${CDCHROOTDIR}/etc/issue || die   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   echo "${CDHOSTNAME}" > ${CDCHROOTDIR}/etc/hostname || die
178    
179   echo Setting up services ...   echo Setting up services ...
180    
181  # not needed with initscripts 0.3.6-r2  # # add hardware detection
182  # # change mountfs with mountfslivecd  # if [[ -x ${CDCHROOTDIR}/sbin/rc-config ]]
183  # MROOT="${CDCHROOTDIR}" rc-config del mountfs || die "rc del mountfs"  # then
184  # MROOT="${CDCHROOTDIR}" rc-config add mountfslivecd || die "rc add mountfslivecd"  # MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect"
185    # fi
  # add hardware detection  
  MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect"  
186    
187   # del checkfs   # del checkfs
188   MROOT="${CDCHROOTDIR}" rc-config del checkfs || die "rc del checkfs"   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   # add custom packages
194   [[ -n ${ADD_PACKAGES} ]] && custom_packages install "${ADD_PACKAGES}"   [[ -n ${ADD_PACKAGES} ]] && custom_packages install "${ADD_PACKAGES}"
# Line 180  prepare_iso() Line 216  prepare_iso()
216   fi   fi
217    
218   echo Cleaning unwanted files ...   echo Cleaning unwanted files ...
219   :> ${CDCHROOTDIR}/etc/mtab || die "whiping /etc/mtab"   # 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   [ -f ${CDCHROOTDIR}/root/.bash_history ] && rm ${CDCHROOTDIR}/root/.bash_history
225  }  }
226    
227  generate_rootfs()  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 ...   echo Generating squashfs compressed rootfs loopfile ...
246   mksquashfs ${CDCHROOTDIR} ${LIVECDROOT}/livecdrootfs.sqsh #>/dev/null 2>&1   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 ...   echo Moving rootfs loopfile to isoroot ...
293   install -d ${CDISOROOT}   install -d ${CDISOROOT}
294   mv ${LIVECDROOT}/livecdrootfs.sqsh ${CDISOROOT}   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()  install_bootloader()
# Line 200  install_bootloader() Line 306  install_bootloader()
306    
307   # iso linux binary   # iso linux binary
308   install -d ${CDISOROOT}/isolinux   install -d ${CDISOROOT}/isolinux
309   install /usr/lib/mkinitrd/isolinux.bin ${CDISOROOT}/isolinux || die   install ${ISOLINUX_BIN} ${CDISOROOT}/isolinux || die
310    
311   # kernel   # kernel
312   local kimg="$(basename $(readlink ${CDCHROOTDIR}/boot/vmlinuz))"   local kimg="$(basename $(readlink ${CDCHROOTDIR}/boot/vmlinuz))"
# Line 218  generate_initrd() Line 324  generate_initrd()
324  {  {
325   local CHROOTSH="$(mktemp -p ${CDCHROOTDIR})"   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 ...   echo Generating initrd image ...
332   echo '#!/bin/bash' > ${CHROOTSH} || die   echo '#!/bin/bash' > ${CHROOTSH} || die
333     echo 'export LC_ALL=C' >> ${CHROOTSH} || die
334   echo 'kv="$(readlink /boot/vmlinuz)"' >> ${CHROOTSH} || die   echo 'kv="$(readlink /boot/vmlinuz)"' >> ${CHROOTSH} || die
335   echo 'kv="${kv/kernel-}/"' >> ${CHROOTSH} || die   echo 'kv="${kv/kernel-}/"' >> ${CHROOTSH} || die
336   echo 'mkinitrd-livecd -f --initramfs /initrd.gz ${kv}' >> ${CHROOTSH} || die   # 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   chmod +x ${CHROOTSH} || die
344   chroot ${CDCHROOTDIR} /$(basename ${CHROOTSH}) || die   chroot ${CDCHROOTDIR} /$(basename ${CHROOTSH}) || die
345   [[ -f ${CHROOTSH} ]] && rm ${CHROOTSH} || die   [[ -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   # move initrd to isoroot
352   install -d ${CDISOROOT}/isolinux || die   install -d ${CDISOROOT}/isolinux || die
353   mv ${CDCHROOTDIR}/initrd.gz ${CDISOROOT}/isolinux || die   mv ${CDCHROOTDIR}/initrd.gz ${CDISOROOT}/isolinux || die
# Line 254  generate_iso() Line 375  generate_iso()
375    
376  enter_livecd()  enter_livecd()
377  {  {
378   mount -t sysfs sysfs ${CDCHROOTDIR}/proc   is_loc_mounted "${CDCHROOTDIR}/sys" || mount -t sysfs sysfs ${CDCHROOTDIR}/sys
379   mount -t proc proc ${CDCHROOTDIR}/proc   is_loc_mounted "${CDCHROOTDIR}/proc" || mount -t proc proc ${CDCHROOTDIR}/proc
380   mount -o bind /dev ${CDCHROOTDIR}/dev   is_loc_mounted "${CDCHROOTDIR}/dev" || mount -o bind /dev ${CDCHROOTDIR}/dev
381    
382   chroot ${CDCHROOTDIR} \   chroot ${CDCHROOTDIR} \
383   /usr/bin/env -i \   /usr/bin/env -i \
384   HOME=/root \   HOME=/root \
385   TERM=$TERM PS1='\u:\w\$ ' \   TERM=$TERM PS1='\u:\w\$ ' \
386   PATH=/bin:/usr/bin:/sbin:/usr/sbin \   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   /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()  usage()
# Line 278  usage() Line 425  usage()
425   echo "    bootloader - installs the bootloader"   echo "    bootloader - installs the bootloader"
426   echo "    isogen     - generate the final livecd iso image"   echo "    isogen     - generate the final livecd iso image"
427   echo "    all        - runs all tasks to get a livecd from zero"   echo "    all        - runs all tasks to get a livecd from zero"
428     echo "    enter      - enters the rootfs of a livecd"
429   echo   echo
430   echo "    for example '$(basename $0) all default'"   echo "    for example '$(basename $0) all default'"
431   echo "    creates a livecd using the default profile."   echo "    creates a livecd using the default profile."
432   echo   echo
433  }  }
434    
435    # set some proper traps
436    trap "trap_exit" SIGINT SIGQUIT
437    
438  # source profile config - overrides all other vars  # source profile config - overrides all other vars
439  [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config  [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config
440    
 #bootstrap_system  
 #prepare_iso  
 #generate_rootfs  
 #generate_initrd  
 #install_bootloader  
 #generate_iso  
   
441  case $1 in  case $1 in
442   bootstrap) bootstrap_system;;   bootstrap) bootstrap_system;;
443   prepare) prepare_iso;;   prepare) prepare_iso;;
# Line 309  case $1 in Line 453  case $1 in
453   install_bootloader   install_bootloader
454   generate_iso   generate_iso
455   ;;   ;;
456     enter) enter_livecd ;;
457   *|'') usage;;   *|'') usage;;
458  esac  esac

Legend:
Removed from v.360  
changed lines
  Added in v.1403