home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / redakcyjne / openSuSE / openSUSE-11.2-KDE4-LiveCD-i686.iso / boot / i386 / loader / initrd / initrd~ / include < prev    next >
Text File  |  2009-11-02  |  139KB  |  4,983 lines

  1. #================
  2. # FILE          : KIWILinuxRC.sh
  3. #----------------
  4. # PROJECT       : OpenSUSE Build-Service
  5. # COPYRIGHT     : (c) 2006 SUSE LINUX Products GmbH, Germany
  6. #               :
  7. # AUTHOR        : Marcus Schaefer <ms@suse.de>
  8. #               :
  9. # BELONGS TO    : Operating System images
  10. #               :
  11. # DESCRIPTION   : This module contains common used functions
  12. #               : for the suse linuxrc and preinit boot image
  13. #               : files
  14. #               : 
  15. #               :
  16. # STATUS        : Development
  17. #----------------
  18. #======================================
  19. # Exports (General)
  20. #--------------------------------------
  21. export ELOG_FILE=/var/log/boot.kiwi
  22. export ELOG_CONSOLE=/dev/tty3
  23. export ELOG_BOOTSHELL=/dev/tty2
  24. export ELOG_EXCEPTION=/dev/tty1
  25. export KLOG_CONSOLE=4
  26. export KLOG_DEFAULT=1
  27. export ELOG_STOPPED=0
  28. export PARTITIONER=sfdisk
  29. export TRANSFER_ERRORS_FILE=/tmp/transfer.errors
  30. export DEFAULT_VGA=0x314
  31. export HAVE_MODULES_ORDER=1
  32. export DIALOG_LANG=ask
  33. export UFONT=/usr/share/fbiterm/fonts/b16.pcf.gz
  34. export TERM=linux
  35. export LANG=en_US.utf8
  36. export UTIMER=0
  37.  
  38. #======================================
  39. # Start boot timer
  40. #--------------------------------------
  41. if [ -x /usr/bin/utimer ];then
  42.     /usr/bin/utimer
  43.     export UTIMER=$(cat /var/run/utimer.pid)
  44. fi
  45.  
  46. #======================================
  47. # Dialog
  48. #--------------------------------------
  49. function Dialog {
  50.     local code=1
  51.     export DIALOG_CANCEL=1
  52.     if [ -e /dev/fb0 ];then
  53.         code=$(fbiterm -m $UFONT -- dialog \
  54.             --ok-label "$(getText "OK")" \
  55.             --cancel-label "$(getText "Cancel")" \
  56.             --yes-label "$(getText "Yes")" \
  57.             --no-label "$(getText "No")" \
  58.             --exit-label "$(getText "Exit")" \
  59.             "$@";echo $?)
  60.         code=$(echo $code | cut -c5-)
  61.     else
  62.         dialog \
  63.             --ok-label "$(getText "OK")" \
  64.             --cancel-label "$(getText "Cancel")" \
  65.             --yes-label "$(getText "Yes")" \
  66.             --no-label "$(getText "No")" \
  67.             --exit-label "$(getText "Exit")" \
  68.             "$@"
  69.         code=$?
  70.     fi
  71.     return $code
  72. }
  73. #======================================
  74. # Debug
  75. #--------------------------------------
  76. function Debug {
  77.     # /.../
  78.     # print message if variable DEBUG is set to 1
  79.     # -----
  80.     if test "$DEBUG" = 1;then
  81.         echo "+++++> $1"
  82.     fi
  83. }
  84. #======================================
  85. # Echo
  86. #--------------------------------------
  87. function Echo {
  88.     # /.../
  89.     # print a message to the controling terminal
  90.     # ----
  91.     if [ $ELOG_STOPPED = 0 ];then
  92.         set +x
  93.     fi
  94.     if [ ! $UTIMER = 0 ];then
  95.         kill -HUP $UTIMER
  96.         local prefix=$(cat /tmp/utimer)
  97.     else
  98.         local prefix="===>"
  99.     fi
  100.     local option=""
  101.     local optn=""
  102.     local opte=""
  103.     while getopts "bne" option;do
  104.         case $option in
  105.             b) prefix="    " ;;
  106.             n) optn="-n" ;;
  107.             e) opte="-e" ;;
  108.             *) echo "Invalid argument: $option" ;;
  109.         esac
  110.     done
  111.     shift $(($OPTIND - 1))
  112.     if [ $ELOG_STOPPED = 0 ];then
  113.         set -x
  114.     fi
  115.     echo $optn $opte "$prefix $1"
  116.     if [ $ELOG_STOPPED = 0 ];then
  117.         set +x
  118.     fi
  119.     OPTIND=1
  120.     if [ $ELOG_STOPPED = 0 ];then
  121.         set -x
  122.     fi
  123. }
  124. #======================================
  125. # WaitKey
  126. #--------------------------------------
  127. function WaitKey {
  128.     # /.../
  129.     # if DEBUG is set wait for ENTER to continue
  130.     # ----
  131.     if test "$DEBUG" = 1;then
  132.         Echo -n "Press ENTER to continue..."
  133.         read
  134.     fi
  135. }
  136. #======================================
  137. # closeKernelConsole
  138. #--------------------------------------
  139. function closeKernelConsole {
  140.     # /.../
  141.     # close the kernel console, set level to 1
  142.     # ----
  143.     klogconsole -l 1
  144. }
  145. #======================================
  146. # openKernelConsole
  147. #--------------------------------------
  148. function openKernelConsole {
  149.     # /.../
  150.     # move the kernel console to terminal 3 as you can't see the messages
  151.     # now directly it looks like the kernel console is switched off
  152.     # but it isn't really. If DEBUG is set the logging remains on
  153.     # the first console
  154.     # ----
  155.     if test "$DEBUG" = 0;then
  156.         Echo "Kernel logging enabled on: /dev/tty$KLOG_CONSOLE"
  157.         setctsid /dev/tty$KLOG_CONSOLE \
  158.             klogconsole -l 7 -r$KLOG_CONSOLE
  159.     fi
  160. }
  161. #======================================
  162. # reopenKernelConsole
  163. #--------------------------------------
  164. function reopenKernelConsole {
  165.     # /.../
  166.     # reopen kernel console to be able to see kernel messages
  167.     # while the system is booting
  168.     # ----
  169.     Echo "Kernel logging enabled on: /dev/tty$KLOG_DEFAULT"
  170.     klogconsole -l 7 -r$KLOG_DEFAULT
  171. }
  172. #======================================
  173. # importFile
  174. #--------------------------------------
  175. function importFile {
  176.     # /.../
  177.     # import the config.<MAC> style format. the function
  178.     # will export each entry of the file as variable into
  179.     # the current shell environment
  180.     # ----
  181.     IFS="
  182.     "
  183.     while read line;do
  184.         echo $line | grep -qi "^#" && continue
  185.         key=`echo "$line" | cut -d '=' -f1`
  186.         item=`echo "$line" | cut -d '=' -f2-`
  187.         if [ -z "$key" ] || [ -z "$item" ];then
  188.             continue
  189.         fi
  190.         if ! echo $item | grep -E -q "^(\"|')";then
  191.             item="'"$item"'"
  192.         fi
  193.         Debug "$key=$item"
  194.         eval export "$key\=$item"
  195.     done
  196.     if [ ! -z "$ERROR_INTERRUPT" ];then
  197.         Echo -e "$ERROR_INTERRUPT"
  198.         systemException "*** interrupted ****" "shell"
  199.     fi
  200.     IFS=$IFS_ORIG
  201. }
  202. #======================================
  203. # systemException
  204. #--------------------------------------
  205. function systemException {
  206.     # /.../
  207.     # print a message to the controling terminal followed
  208.     # by an action. Possible actions are reboot, wait
  209.     # and opening a shell
  210.     # ----
  211.     set +x
  212.     local what=$2
  213.     test -e /proc/splash && echo verbose > /proc/splash
  214.     if [ $what = "reboot" ];then
  215.         if cat /proc/cmdline | grep -qi "kiwidebug=1";then
  216.             what="shell"
  217.         fi
  218.     fi
  219.     Echo "$1"
  220.     case "$what" in
  221.     "reboot")
  222.         Echo "rebootException: error consoles at Alt-F3/F4"
  223.         Echo "rebootException: reboot in 120 sec..."; sleep 120
  224.         /sbin/reboot -f -i >/dev/null
  225.     ;;
  226.     "wait")
  227.         Echo "waitException: waiting for ever..."
  228.         while true;do sleep 100;done
  229.     ;;
  230.     "shell")
  231.         Echo "shellException: providing shell..."
  232.         setctsid $ELOG_EXCEPTION /bin/bash -i || /bin/bash -i
  233.     ;;
  234.     *)
  235.         Echo "unknownException..."
  236.     ;;
  237.     esac
  238. }
  239. #======================================
  240. # copyDevices
  241. #--------------------------------------
  242. function copyDeviceNodes {
  243.     local search=$1
  244.     local prefix=$2
  245.     local dtype
  246.     local major
  247.     local minor
  248.     local perms
  249.     if [ -z "$search" ];then
  250.         search=/dev
  251.     fi
  252.     pushd $search >/dev/null
  253.     for i in *;do
  254.         if [ -e $prefix/$i ];then
  255.             continue
  256.         fi
  257.         if [ -b $i ];then
  258.             dtype=b
  259.         elif [ -c $i ];then
  260.             dtype=c
  261.         elif [ -p $i ];then
  262.             dtype=p
  263.         else
  264.             continue
  265.         fi
  266.         info=`stat $i -c "0%a:0x%t:0x%T"`
  267.         major=`echo $info | cut -f2 -d:`
  268.         minor=`echo $info | cut -f3 -d:`
  269.         perms=`echo $info | cut -f1 -d:`
  270.         if [ $dtype = "p" ];then
  271.             mknod -m $perms $prefix/$i $dtype
  272.         else
  273.             mknod -m $perms $prefix/$i $dtype $major $minor
  274.         fi
  275.     done
  276.     popd >/dev/null
  277. }
  278. #======================================
  279. # copyDevices
  280. #--------------------------------------
  281. function createInitialDevices {
  282.     local prefix=$1
  283.     mkdir -p $prefix
  284.     if [ ! -d $prefix ];then
  285.         return
  286.     fi
  287.     if [ -e $prefix/null ];then
  288.         rm -f $prefix/null
  289.     fi
  290.     test -c $prefix/tty      || mknod -m 0666 $prefix/tty      c 5 0
  291.     test -c $prefix/tty1     || mknod -m 0666 $prefix/tty1     c 4 1
  292.     test -c $prefix/tty2     || mknod -m 0666 $prefix/tty2     c 4 2
  293.     test -c $prefix/tty3     || mknod -m 0666 $prefix/tty3     c 4 3
  294.     test -c $prefix/tty4     || mknod -m 0666 $prefix/tty4     c 4 4
  295.     test -c $prefix/console  || mknod -m 0600 $prefix/console  c 5 1
  296.     test -c $prefix/ptmx     || mknod -m 0666 $prefix/ptmx     c 5 2
  297.     exec < $prefix/console > $prefix/console
  298.     test -c $prefix/null     || mknod -m 0666 $prefix/null     c 1 3
  299.     test -c $prefix/kmsg     || mknod -m 0600 $prefix/kmsg     c 1 11
  300.     test -c $prefix/snapshot || mknod -m 0660 $prefix/snapshot c 10 231
  301.     test -c $prefix/random   || mknod -m 0666 $prefix/random   c 1 8
  302.     test -c $prefix/urandom  || mknod -m 0644 $prefix/urandom  c 1 9
  303.     test -b $prefix/loop0    || mknod -m 0640 $prefix/loop0    b 7 0
  304.     test -b $prefix/loop1    || mknod -m 0640 $prefix/loop1    b 7 1
  305.     test -b $prefix/loop2    || mknod -m 0640 $prefix/loop2    b 7 2
  306.     mkdir -p -m 0755 $prefix/pts
  307.     mkdir -p -m 1777 $prefix/shm
  308.     test -L $prefix/fd     || ln -s /proc/self/fd $prefix/fd
  309.     test -L $prefix/stdin  || ln -s fd/0 $prefix/stdin
  310.     test -L $prefix/stdout || ln -s fd/1 $prefix/stdout
  311.     test -L $prefix/stderr || ln -s fd/2 $prefix/stderr
  312. }
  313. #======================================
  314. # mountSystemFilesystems
  315. #--------------------------------------
  316. function mountSystemFilesystems {
  317.     mount -t proc  proc   /proc
  318.     mount -t sysfs sysfs  /sys
  319.     mount -t tmpfs -o mode=0755 udev /dev
  320.     createInitialDevices /dev
  321.     mount -t devpts devpts /dev/pts
  322. }
  323. #======================================
  324. # umountSystemFilesystems
  325. #--------------------------------------
  326. function umountSystemFilesystems {
  327.     umount /dev/pts >/dev/null
  328.     umount /sys     >/dev/null
  329.     umount /proc    >/dev/null
  330. }
  331. #======================================
  332. # createFramebufferDevices
  333. #--------------------------------------
  334. function createFramebufferDevices {
  335.     if [ -f /proc/fb ]; then
  336.         Echo "Creating framebuffer devices"
  337.         while read fbnum fbtype; do
  338.             if [ $(($fbnum < 32)) ] ; then
  339.                 [ -c /dev/fb$fbnum ] || mknod -m 0660 /dev/fb$fbnum c 29 $fbnum
  340.             fi
  341.         done < /proc/fb
  342.     fi
  343. }
  344. #======================================
  345. # errorLogStop
  346. #--------------------------------------
  347. function errorLogStop {
  348.     set +x
  349.     export ELOG_STOPPED=1
  350.     exec 2>$ELOG_EXCEPTION
  351. }
  352. #======================================
  353. # errorLogContinue
  354. #--------------------------------------
  355. function errorLogContinue {
  356.     exec 2>>$ELOG_FILE
  357.     export ELOG_STOPPED=0
  358.     set -x
  359. }
  360. #======================================
  361. # errorLogStart
  362. #--------------------------------------
  363. function errorLogStart {
  364.     # /.../
  365.     # Log all errors up to now to the terminal specified
  366.     # by ELOG_CONSOLE
  367.     # ----
  368.     if [ ! -f $ELOG_FILE ];then
  369.         echo "KIWI Log:" >> $ELOG_FILE
  370.     else
  371.         killproc tail
  372.         echo "KIWI PreInit Log" >> $ELOG_FILE
  373.     fi
  374.     echo "Boot-Logging enabled on $ELOG_CONSOLE"
  375.     setctsid -f $ELOG_CONSOLE /bin/bash -i -c "tail -f $ELOG_FILE" &
  376.     exec 2>>$ELOG_FILE
  377.     if [ -f .profile ];then
  378.         echo "KIWI .profile contents:" 1>&2
  379.         cat .profile 1>&2
  380.     fi
  381.     set -x 1>&2
  382. }
  383. #======================================
  384. # udevPending
  385. #--------------------------------------
  386. function udevPending {
  387.     local timeout=30
  388.     if [ -x /sbin/udevadm ];then
  389.         /sbin/udevadm trigger
  390.         /sbin/udevadm settle --timeout=$timeout
  391.     else
  392.         /sbin/udevtrigger
  393.         /sbin/udevsettle --timeout=$timeout
  394.     fi
  395. }
  396. #======================================
  397. # udevSystemStart
  398. #--------------------------------------
  399. function udevSystemStart {
  400.     # /.../
  401.     # start udev while in pre-init phase. This means we can
  402.     # run udev from the standard runlevel script
  403.     # ----
  404.     /etc/init.d/boot.udev start
  405.     echo
  406. }
  407. #======================================
  408. # udevStart
  409. #--------------------------------------
  410. function udevStart {
  411.     # /.../
  412.     # start the udev daemon.
  413.     # ----
  414.     echo "Creating device nodes with udev"
  415.     # disable hotplug helper, udevd listens to netlink
  416.     if [ -e /proc/sys/kernel/hotplug ];then
  417.         echo "" > /proc/sys/kernel/hotplug
  418.     fi
  419.     if ! ls /lib/modules/*/modules.order &>/dev/null;then
  420.         # /.../
  421.         # without modules.order in place we prevent udev from loading
  422.         # the storage modules because it does not make a propper
  423.         # choice if there are multiple possible modules available.
  424.         # Example:
  425.         # udev prefers ata_generic over ata_piix but the hwinfo
  426.         # order is ata_piix first which also seems to make more
  427.         # sense.
  428.         # -----
  429.         rm -f /etc/udev/rules.d/*-drivers.rules
  430.         rm -f /lib/udev/rules.d/*-drivers.rules
  431.         HAVE_MODULES_ORDER=0
  432.     fi
  433.     # start the udev daemon
  434.     udevd --daemon udev_log="debug"
  435.     # wait for pending triggered udev events.
  436.     udevPending
  437.     # start splashy if configured
  438.     startSplashy
  439. }
  440. #======================================
  441. # udevKill
  442. #--------------------------------------
  443. function udevKill {
  444.     killproc /sbin/udevd
  445. }
  446. #======================================
  447. # startSplashy
  448. #--------------------------------------
  449. function startSplashy {
  450.     if [ -x /usr/sbin/splashy ];then
  451.         splashy boot
  452.     fi
  453. }
  454. #======================================
  455. # startBlogD
  456. #--------------------------------------
  457. function startBlogD {
  458.     REDIRECT=$(showconsole 2>/dev/null)
  459.     if test -n "$REDIRECT" ; then
  460.         mkdir -p /var/log
  461.         > /dev/shm/initrd.msg
  462.         ln -sf /dev/shm/initrd.msg /var/log/boot.msg
  463.         mkdir -p /var/run
  464.         /sbin/blogd $REDIRECT
  465.     fi
  466. }
  467. #======================================
  468. # killBlogD
  469. #--------------------------------------
  470. function killBlogD {
  471.     # /.../
  472.     # kill blogd on /dev/console
  473.     # ----
  474.     local umountProc=0
  475.     if [ ! -e /proc/mounts ];then
  476.         mount -t proc proc /proc
  477.         umountProc=1
  478.     fi
  479.     Echo "Stopping boot logging"
  480.     killall -9 blogd
  481.     if [ $umountProc -eq 1 ];then
  482.         umount /proc
  483.     fi
  484. }
  485. #======================================
  486. # installBootLoader
  487. #--------------------------------------
  488. function installBootLoader {
  489.     # /.../
  490.     # generic function to install the boot loader.
  491.     # The selection of the bootloader happens according to
  492.     # the architecture of the system
  493.     # ----
  494.     local arch=`uname -m`
  495.     if [ -z "$loader" ];then
  496.         loader="grub"
  497.     fi
  498.     case $arch-$loader in
  499.         i*86-grub)   installBootLoaderGrub ;;
  500.         x86_64-grub) installBootLoaderGrub ;;
  501.         ppc*)        installBootLoaderLilo ;;
  502.         *)
  503.         systemException \
  504.             "*** boot loader install for $arch-$loader not implemented ***" \
  505.         "reboot"
  506.     esac
  507. }
  508. #======================================
  509. # installBootLoaderRecovery
  510. #--------------------------------------
  511. function installBootLoaderRecovery {
  512.     # /.../
  513.     # generic function to install the boot loader into
  514.     # the recovery partition. The selection of the bootloader
  515.     # happens according to the architecture of the system
  516.     # ----
  517.     local arch=`uname -m`
  518.     if [ -z "$loader" ];then
  519.         loader="grub"
  520.     fi
  521.     case $arch-$loader in
  522.         i*86-grub)   installBootLoaderGrubRecovery ;;
  523.         x86_64-grub) installBootLoaderGrubRecovery ;;
  524.         *)
  525.         systemException \
  526.             "*** boot loader setup for $arch-$loader not implemented ***" \
  527.         "reboot"
  528.     esac
  529. }
  530. #======================================
  531. # installBootLoaderGrub
  532. #--------------------------------------
  533. function installBootLoaderGrub {
  534.     # /.../
  535.     # install the grub according to the contents of
  536.     # /etc/grub.conf and /boot/grub/menu.lst
  537.     # ----
  538.     if [ -x /usr/sbin/grub ];then
  539.         Echo "Installing boot loader..."
  540.         /usr/sbin/grub --batch --no-floppy < /etc/grub.conf 1>&2
  541.         if [ ! $? = 0 ];then
  542.             Echo "Failed to install boot loader"
  543.         fi
  544.     else
  545.         Echo "Image doesn't have grub installed"
  546.         Echo "Can't install boot loader"
  547.     fi
  548. }
  549. #======================================
  550. # installBootLoaderLilo
  551. #--------------------------------------
  552. function installBootLoaderLilo {
  553.     # /.../
  554.     # install the lilo according to the contents of
  555.     # /etc/lilo.conf
  556.     # ----
  557.     if [ -x /sbin/lilo ];then
  558.         Echo "Installing boot loader..."
  559.         /sbin/lilo 1>&2
  560.         if [ ! $? = 0 ];then
  561.             Echo "Failed to install boot loader"
  562.         fi
  563.     else
  564.         Echo "Image doesn't have lilo installed"
  565.         Echo "Can't install boot loader"
  566.     fi
  567. }
  568. #======================================
  569. # installBootLoaderGrubRecovery
  570. #--------------------------------------
  571. function installBootLoaderGrubRecovery {
  572.     # /.../
  573.     # install the grub into the recovery partition.
  574.     # By design the recovery partition is always the
  575.     # fourth primary partition of the disk
  576.     # ----
  577.     local input=/grub.input
  578.     local gdevreco=$(expr $recoid - 1)
  579.     echo "device (hd0) $imageDiskDevice" > $input
  580.     echo "root (hd0,$gdevreco)"  >> $input
  581.     echo "setup (hd0,$gdevreco)" >> $input
  582.     echo "quit"          >> $input
  583.     if [ -x /mnt/usr/sbin/grub ];then
  584.         /mnt/usr/sbin/grub --batch < $input 1>&2
  585.     else
  586.         Echo "Image doesn't have grub installed"
  587.         Echo "Can't install boot loader"
  588.         systemException \
  589.             "recovery grub setup failed" \
  590.         "reboot"
  591.     fi
  592. }
  593. #======================================
  594. # setupSUSEInitrd
  595. #--------------------------------------
  596. function setupSUSEInitrd {
  597.     # /.../
  598.     # call mkinitrd on suse systems to create the distro initrd
  599.     # based on /etc/sysconfig/kernel
  600.     # ----
  601.     bootLoaderOK=1
  602.     local umountProc=0
  603.     local umountSys=0
  604.     local systemMap=0
  605.     local running
  606.     local rlinux
  607.     local rinitrd
  608.     for i in `find /boot/ -name "System.map*"`;do
  609.         systemMap=1
  610.     done
  611.     if [ $systemMap -eq 1 ];then
  612.         if [ ! -e /proc/mounts ];then
  613.             mount -t proc proc /proc
  614.             umountProc=1
  615.         fi
  616.         if [ ! -e /sys/block ];then
  617.             mount -t sysfs sysfs /sys
  618.             umountSys=1
  619.         fi
  620.         if [ -f /etc/init.d/boot.device-mapper ];then
  621.             /etc/init.d/boot.device-mapper start
  622.         fi
  623.         if [ "$haveLVM" = "yes" ]; then
  624.             /etc/init.d/boot.lvm start
  625.         fi
  626.         if ! mkinitrd;then
  627.             Echo "Can't create initrd"
  628.             systemIntegrity=unknown
  629.             bootLoaderOK=0
  630.         fi
  631.         if [ -f /etc/init.d/boot.device-mapper ];then
  632.             /etc/init.d/boot.device-mapper stop
  633.         fi
  634.         if [ $bootLoaderOK = "1" ];then
  635.             if [ -f /boot/initrd.vmx ];then
  636.                 rm -f /boot/initrd.vmx
  637.                 rm -f /boot/linux.vmx
  638.                 running=$(uname -r)
  639.                 rlinux=vmlinuz-$running
  640.                 rinitrd=initrd-$running
  641.                 ln -s $rlinux  /boot/linux.vmx
  642.                 ln -s $rinitrd /boot/initrd.vmx
  643.             fi
  644.         fi
  645.         if [ $umountSys -eq 1 ];then
  646.             umount /sys
  647.         fi
  648.         if [ $umountProc -eq 1 ];then
  649.             umount /proc
  650.         fi
  651.     else
  652.         Echo "Image doesn't include kernel system map"
  653.         Echo "Can't create initrd"
  654.         systemIntegrity=unknown
  655.         bootLoaderOK=0
  656.     fi
  657. }
  658. #======================================
  659. # callSUSEInitrdScripts
  660. #--------------------------------------
  661. function callSUSEInitrdScripts {
  662.     # /.../
  663.     # create initrd with mkinitrd and extract the run_all.sh script
  664.     # after that call the script in /lib/mkinitrd. The mkinitrd
  665.     # package must be installed in the system image to do that
  666.     # ----
  667.     local prefix=$1
  668.     if [ ! -d $prefix/lib/mkinitrd ];then
  669.         Echo "No mkinitrd package installed"
  670.         Echo "Can't call initrd scripts"
  671.         return
  672.     fi
  673.     mkinitrd >/dev/null
  674.     if [ ! -f $prefix/boot/initrd ];then
  675.         Echo "No initrd file found"
  676.         Echo "Can't call initrd scripts"
  677.         return
  678.     fi
  679.     mkdir $prefix/tmp/suse
  680.     cd $prefix/tmp/suse && gzip -cd $prefix/boot/initrd | cpio -i
  681.     if [ ! -f $prefix/tmp/suse/run_all.sh ];then
  682.         Echo "No run_all.sh script in initrd"
  683.         Echo "Can't call initrd scripts"
  684.         return
  685.     fi
  686.     Echo "Calling SUSE initrd scripts"
  687.     chroot . bash ./run_all.sh
  688. }
  689. #======================================
  690. # setupBootLoaderFiles
  691. #--------------------------------------
  692. function setupBootLoaderFiles {
  693.     # /.../
  694.     # generic function which returns the files used for a
  695.     # specific bootloader. The selection of the bootloader
  696.     # happens according to the architecture of the system
  697.     # ----
  698.     local arch=`uname -m`
  699.     if [ -z "$loader" ];then
  700.         loader="grub"
  701.     fi
  702.     case $arch-$loader in
  703.         i*86-grub)    setupBootLoaderFilesGrub ;;
  704.         x86_64-grub)  setupBootLoaderFilesGrub ;;
  705.         ppc*)         setupBootLoaderFilesLilo ;;
  706.         *)
  707.         systemException \
  708.             "*** boot loader files for $arch-$loader not implemented ***" \
  709.         "reboot"
  710.     esac
  711. }
  712. #======================================
  713. # setupBootLoaderFilesGrub
  714. #--------------------------------------
  715. function setupBootLoaderFilesGrub {
  716.     echo "/boot/grub/menu.lst /etc/grub.conf"
  717. }
  718. #======================================
  719. # setupBootLoaderFilesLilo
  720. #--------------------------------------
  721. function setupBootLoaderFilesLilo {
  722.     echo "/etc/lilo.conf"
  723. }
  724. #======================================
  725. # setupBootLoader
  726. #--------------------------------------
  727. function setupBootLoader {
  728.     # /.../
  729.     # generic function to setup the boot loader configuration.
  730.     # The selection of the bootloader happens according to
  731.     # the architecture of the system
  732.     # ----
  733.     local arch=`uname -m`
  734.     local para=""
  735.     while [ $# -gt 0 ];do
  736.         para="$para \"$1\""
  737.         shift
  738.     done
  739.     if [ -z "$loader" ];then
  740.         loader="grub"
  741.     fi
  742.     case $arch-$loader in
  743.         i*86-grub)       eval setupBootLoaderGrub $para ;;
  744.         x86_64-grub)     eval setupBootLoaderGrub $para ;;
  745.         i*86-syslinux)   eval setupBootLoaderSyslinux $para ;;
  746.         x86_64-syslinux) eval setupBootLoaderSyslinux $para ;;
  747.         ppc*)            eval setupBootLoaderLilo $para ;;
  748.         *)
  749.         systemException \
  750.             "*** boot loader setup for $arch-$loader not implemented ***" \
  751.         "reboot"
  752.     esac
  753. }
  754. #======================================
  755. # setupBootLoaderRecovery
  756. #--------------------------------------
  757. function setupBootLoaderRecovery {
  758.     # /.../
  759.     # generic function to setup the boot loader configuration
  760.     # for the recovery partition. The selection of the bootloader
  761.     # happens according to the architecture of the system
  762.     # ----
  763.     local arch=`uname -m`
  764.     local para=""
  765.     while [ $# -gt 0 ];do
  766.         para="$para \"$1\""
  767.         shift
  768.     done
  769.     if [ -z "$loader" ];then
  770.         loader="grub"
  771.     fi
  772.     case $arch-$loader in
  773.         i*86-grub)   eval setupBootLoaderGrubRecovery $para ;;
  774.         x86_64-grub) eval setupBootLoaderGrubRecovery $para ;;
  775.         *)
  776.         systemException \
  777.             "*** boot loader setup for $arch-$loader not implemented ***" \
  778.         "reboot"
  779.     esac
  780. }
  781. #======================================
  782. # setupBootLoaderGrubRecovery
  783. #--------------------------------------
  784. function setupBootLoaderGrubRecovery {
  785.     # /.../
  786.     # create menu.lst file for the recovery boot system
  787.     # ----
  788.     local mountPrefix=$1  # mount path of the image
  789.     local destsPrefix=$2  # base dir for the config files
  790.     local gfix=$3         # grub title
  791.     local menu=$destsPrefix/boot/grub/menu.lst
  792.     local kernel=""
  793.     local initrd=""
  794.     local fbmode=$vga
  795.     local gdevreco=$(expr $recoid - 1)
  796.     if [ -z "$fbmode" ];then
  797.         fbmode=$DEFAULT_VGA
  798.     fi
  799.     gdev_recovery="(hd0,$gdevreco)"
  800.     rdev_recovery=$OEM_RECOVERY
  801.     diskByID=`getDiskID $rdev_recovery`
  802.     #======================================
  803.     # import grub stages into recovery
  804.     #--------------------------------------
  805.     cp $mountPrefix/boot/grub/stage1 $destsPrefix/boot/grub
  806.     cp $mountPrefix/boot/grub/stage2 $destsPrefix/boot/grub
  807.     #======================================
  808.     # backup current menu.lst
  809.     #--------------------------------------
  810.     mv $menu $menu.system
  811.     #======================================
  812.     # create recovery menu.lst
  813.     #--------------------------------------
  814.     echo "timeout 30" > $menu
  815.     echo "gfxmenu $gdev_recovery/boot/message" >> $menu
  816.     kernel=vmlinuz # this is a copy of the kiwi linux.vmx file
  817.     initrd=initrd  # this is a copy of the kiwi initrd.vmx file
  818.     #======================================
  819.     # create recovery entry
  820.     #--------------------------------------
  821.     if [ ! -z "$OEM_RECOVERY" ];then
  822.         #======================================
  823.         # Make the cancel option default
  824.         #--------------------------------------
  825.         echo "default 2"                                  >> $menu
  826.         #======================================
  827.         # Recovery
  828.         #--------------------------------------
  829.         title=$(makeLabel "Recover/Repair System")
  830.         echo "title $title"                               >> $menu
  831.         if xenServer;then
  832.             echo " root $gdev_recovery"                   >> $menu
  833.             echo " kernel /boot/xen.gz"                   >> $menu
  834.             echo -n " module /boot/$kernel"               >> $menu
  835.             echo -n " root=$diskByID $console"            >> $menu
  836.             echo -n " vga=$fbmode splash=silent"          >> $menu
  837.             echo -n " $KIWI_INITRD_PARAMS"                >> $menu
  838.             echo -n " $KIWI_KERNEL_OPTIONS"               >> $menu
  839.             echo " KIWI_RECOVERY=$recoid showopts"        >> $menu
  840.             echo " module /boot/$initrd"                  >> $menu
  841.         else
  842.             echo -n " kernel $gdev_recovery/boot/$kernel" >> $menu
  843.             echo -n " root=$diskByID $console"            >> $menu
  844.             echo -n " vga=$fbmode splash=silent"          >> $menu
  845.             echo -n " $KIWI_INITRD_PARAMS"                >> $menu
  846.             echo -n " $KIWI_KERNEL_OPTIONS"               >> $menu
  847.             echo " KIWI_RECOVERY=$recoid showopts"        >> $menu
  848.             echo " initrd $gdev_recovery/boot/$initrd"    >> $menu
  849.         fi
  850.         #======================================
  851.         # Restore
  852.         #--------------------------------------
  853.         title=$(makeLabel "Restore Factory System")
  854.         echo "title $title"                               >> $menu
  855.         if xenServer;then
  856.             echo " root $gdev_recovery"                   >> $menu
  857.             echo " kernel /boot/xen.gz"                   >> $menu
  858.             echo -n " module /boot/$kernel"               >> $menu
  859.             echo -n " root=$diskByID $console"            >> $menu
  860.             echo -n " vga=$fbmode splash=silent"          >> $menu
  861.             echo -n " $KIWI_INITRD_PARAMS"                >> $menu
  862.             echo -n " $KIWI_KERNEL_OPTIONS"               >> $menu
  863.             echo " KIWI_RECOVERY=$recoid showopts"        >> $menu
  864.             echo " module /boot/$initrd"                  >> $menu
  865.         else
  866.             echo -n " kernel $gdev_recovery/boot/$kernel" >> $menu
  867.             echo -n " root=$diskByID $console"            >> $menu
  868.             echo -n " vga=$fbmode splash=silent"          >> $menu
  869.             echo -n " $KIWI_INITRD_PARAMS"                >> $menu
  870.             echo -n " $KIWI_KERNEL_OPTIONS"               >> $menu
  871.             echo -n " KIWI_RECOVERY=$recoid RESTORE=1"    >> $menu
  872.             echo " showopts"                              >> $menu
  873.             echo " initrd $gdev_recovery/boot/$initrd"    >> $menu
  874.         fi
  875.         #======================================
  876.         # Reboot
  877.         #--------------------------------------
  878.         title=$(makeLabel "Cancel/Reboot")
  879.         echo "title $title"                               >> $menu
  880.         echo " reboot"                                    >> $menu
  881.     fi
  882. }
  883. #======================================
  884. # setupBootLoaderSyslinux
  885. #--------------------------------------
  886. function setupBootLoaderSyslinux {
  887.     # /.../
  888.     # create syslinux.cfg used for the
  889.     # syslinux bootloader
  890.     # ----
  891.     local mountPrefix=$1  # mount path of the image
  892.     local destsPrefix=$2  # base dir for the config files
  893.     local gnum=$3         # boot partition ID
  894.     local rdev=$4         # root partition
  895.     local gfix=$5         # syslinux title postfix
  896.     local swap=$6         # optional swap partition
  897.     local conf=$destsPrefix/boot/syslinux/syslinux.cfg
  898.     local sysb=$destsPrefix/etc/sysconfig/bootloader
  899.     local console=""
  900.     local kname=""
  901.     local kernel=""
  902.     local initrd=""
  903.     local title=""
  904.     local fbmode=$vga
  905.     local xencons=$xencons
  906.     if [ -z "$fbmode" ];then
  907.         fbmode=$DEFAULT_VGA
  908.     fi
  909.     #======================================
  910.     # check for device by ID
  911.     #--------------------------------------
  912.     local diskByID=`getDiskID $rdev`
  913.     local swapByID=`getDiskID $swap`
  914.     #======================================
  915.     # check for boot image .profile
  916.     #--------------------------------------
  917.     if [ -f /.profile ];then
  918.         importFile < /.profile
  919.     fi
  920.     #======================================
  921.     # check for system image .profile
  922.     #--------------------------------------
  923.     if [ -f $mountPrefix/image/.profile ];then
  924.         importFile < $mountPrefix/image/.profile
  925.     fi
  926.     #======================================
  927.     # check for syslinux title postfix
  928.     #--------------------------------------
  929.     if [ -z "$gfix" ];then
  930.         gfix="unknown"
  931.     fi
  932.     #======================================
  933.     # check for boot TIMEOUT
  934.     #--------------------------------------
  935.     if [ -z "$KIWI_BOOT_TIMEOUT" ];then
  936.         KIWI_BOOT_TIMEOUT=100;
  937.     fi
  938.     #======================================
  939.     # create directory structure
  940.     #--------------------------------------
  941.     for dir in $conf $sysb;do
  942.         dir=`dirname $dir`; mkdir -p $dir
  943.     done
  944.     #======================================
  945.     # create syslinux.cfg file
  946.     #--------------------------------------
  947.     echo "DEFAULT vesamenu.c32"         > $conf
  948.     echo "TIMEOUT $KIWI_BOOT_TIMEOUT"  >> $conf
  949.     local count=1
  950.     IFS="," ; for i in $KERNEL_LIST;do
  951.         if test ! -z "$i";then
  952.             #======================================
  953.             # setup syslinux requirements
  954.             #--------------------------------------
  955.             kernel=`echo $i | cut -f1 -d:`
  956.             initrd=`echo $i | cut -f2 -d:`
  957.             kname=${KERNEL_NAME[$count]}
  958.             #======================================
  959.             # move to FAT requirements 8+3
  960.             #--------------------------------------
  961.             kernel="linux.$count"
  962.             initrd="initrd.$count"
  963.             if ! echo $gfix | grep -E -q "OEM|USB|VMX|unknown";then
  964.                 if [ "$count" = "1" ];then
  965.                     title=$(makeLabel "$gfix")
  966.                 else
  967.                     title=$(makeLabel "$kname [ $gfix ]")
  968.                 fi
  969.             elif [ -z "$kiwi_oemtitle" ];then
  970.                 title=$(makeLabel "$kname [ $gfix ]")
  971.             else
  972.                 if [ "$count" = "1" ];then
  973.                     title=$(makeLabel "$kiwi_oemtitle [ $gfix ]")
  974.                 else
  975.                     title=$(makeLabel "$kiwi_oemtitle-$kname [ $gfix ]")
  976.                 fi
  977.             fi
  978.             #======================================
  979.             # create standard entry
  980.             #--------------------------------------
  981.             echo "LABEL Linux" >> $conf
  982.             echo "MENU LABEL $title"                           >> $conf
  983.             if xenServer;then
  984.                 systemException \
  985.                     "*** syslinux: Xen dom0 boot not implemented ***" \
  986.                 "reboot"
  987.             else
  988.                 echo "KERNEL /boot/$kernel"                    >> $conf
  989.                 echo -n "APPEND initrd=/boot/$initrd"          >> $conf
  990.                 echo -n " root=$diskByID $console vga=$fbmode" >> $conf
  991.                 echo -n " loader=$loader splash=silent"        >> $conf
  992.                 if [ ! -z "$swap" ];then
  993.                     echo -n " resume=$swapByID"                >> $conf
  994.                 fi
  995.                 if [ ! -z "$xencons" ]; then
  996.                     echo -n " xencons=$xencons"                >> $conf
  997.                 fi
  998.                 echo -n " $KIWI_INITRD_PARAMS"                 >> $conf
  999.                 echo " $KIWI_KERNEL_OPTIONS showopts"          >> $conf
  1000.             fi
  1001.             #======================================
  1002.             # create Failsafe entry
  1003.             #--------------------------------------
  1004.             title=$(makeLabel "Failsafe -- $title")
  1005.             echo "LABEL Failsafe"                              >> $conf
  1006.             echo "MENU LABEL $title"                           >> $conf
  1007.             if xenServer;then
  1008.                 systemException \
  1009.                     "*** syslinux: Xen dom0 boot not implemented ***" \
  1010.                 "reboot"
  1011.             else
  1012.                 echo "KERNEL /boot/$kernel"                    >> $conf
  1013.                 echo -n "APPEND initrd=/boot/$initrd"          >> $conf
  1014.                 echo -n " root=$diskByID $console vga=$fbmode" >> $conf
  1015.                 echo -n " loader=$loader splash=silent"        >> $conf
  1016.                 if [ ! -z "$swap" ];then
  1017.                     echo -n " resume=$swapByID"                >> $conf
  1018.                 fi
  1019.                 if [ ! -z "$xencons" ]; then
  1020.                     echo -n " xencons=$xencons"                >> $conf
  1021.                 fi
  1022.                 echo -n " $KIWI_INITRD_PARAMS"                 >> $conf
  1023.                 echo " $KIWI_KERNEL_OPTIONS showopts"          >> $conf
  1024.                 echo -n " ide=nodma apm=off acpi=off"          >> $conf
  1025.                 echo -n " noresume selinux=0 nosmp"            >> $conf
  1026.                 echo " noapic maxcpus=0 edd=off"               >> $conf
  1027.             fi
  1028.             count=`expr $count + 1`
  1029.         fi
  1030.     done
  1031.     #======================================
  1032.     # create recovery entry
  1033.     #--------------------------------------
  1034.     if [ ! -z "$OEM_RECOVERY" ];then
  1035.         systemException \
  1036.             "*** syslinux recovery chain loading not implemented ***" \
  1037.         "reboot"
  1038.     fi
  1039.     #======================================
  1040.     # create sysconfig/bootloader
  1041.     #--------------------------------------
  1042.     echo "LOADER_TYPE=\"syslinux\""                           > $sysb
  1043.     echo "LOADER_LOCATION=\"mbr\""                           >> $sysb
  1044.     echo "DEFAULT_VGA=\"$fbmode\""                           >> $sysb 
  1045.     echo -n "DEFAULT_APPEND=\"root=$diskByID splash=silent"  >> $sysb
  1046.     if [ ! -z "$swap" ];then
  1047.         echo -n " resume=$swapByID"                          >> $sysb
  1048.     fi
  1049.     echo -n " $KIWI_INITRD_PARAMS $KIWI_KERNEL_OPTIONS"      >> $sysb
  1050.     echo " showopts\""                                       >> $sysb
  1051.     echo "FAILSAFE_VGA=\"$fbmode\""                          >> $sysb
  1052.     echo -n "FAILSAFE_APPEND=\"root=$diskByID splash=silent" >> $sysb
  1053.     if [ ! -z "$swap" ];then
  1054.         echo -n " resume=$swapByID"                          >> $sysb
  1055.     fi
  1056.     echo -n " $KIWI_INITRD_PARAMS $KIWI_KERNEL_OPTIONS"      >> $sysb
  1057.     echo -n " showopts ide=nodma apm=off acpi=off noresume"  >> $sysb
  1058.     echo "selinux=0 nosmp noapic maxcpus=0 edd=off\""        >> $sysb
  1059. }
  1060. #======================================
  1061. # setupBootLoaderGrub
  1062. #--------------------------------------
  1063. function setupBootLoaderGrub {
  1064.     # /.../
  1065.     # create grub.conf and menu.lst file used for
  1066.     # installing the bootloader
  1067.     # ----
  1068.     local mountPrefix=$1  # mount path of the image
  1069.     local destsPrefix=$2  # base dir for the config files
  1070.     local gnum=$3         # grub boot partition ID
  1071.     local rdev=$4         # grub root partition
  1072.     local gfix=$5         # grub title postfix
  1073.     local swap=$6         # optional swap partition
  1074.     local menu=$destsPrefix/boot/grub/menu.lst
  1075.     local conf=$destsPrefix/etc/grub.conf
  1076.     local dmap=$destsPrefix/boot/grub/device.map
  1077.     local sysb=$destsPrefix/etc/sysconfig/bootloader
  1078.     local stage=/boot/grub/stage2
  1079.     local console=""
  1080.     local kname=""
  1081.     local kernel=""
  1082.     local initrd=""
  1083.     local title=""
  1084.     local rdisk=""
  1085.     local fbmode=$vga
  1086.     local xencons=$xencons
  1087.     local gdevreco=$(expr $recoid - 1)
  1088.     if [ -z "$fbmode" ];then
  1089.         fbmode=$DEFAULT_VGA
  1090.     fi
  1091.     #======================================
  1092.     # check for device by ID
  1093.     #--------------------------------------
  1094.     local diskByID=`getDiskID $rdev`
  1095.     local swapByID=`getDiskID $swap`
  1096.     #======================================
  1097.     # check for boot image .profile
  1098.     #--------------------------------------
  1099.     if [ -f /.profile ];then
  1100.         importFile < /.profile
  1101.     fi
  1102.     #======================================
  1103.     # check for system image .profile
  1104.     #--------------------------------------
  1105.     if [ -f $mountPrefix/image/.profile ];then
  1106.         importFile < $mountPrefix/image/.profile
  1107.     fi
  1108.     #======================================
  1109.     # check for grub device
  1110.     #--------------------------------------
  1111.     if [ -z "$gnum" ];then
  1112.         gnum=1
  1113.     fi
  1114.     #======================================
  1115.     # check for grub title postfix
  1116.     #--------------------------------------
  1117.     if [ -z "$gfix" ];then
  1118.         gfix="unknown"
  1119.     fi
  1120.     #======================================
  1121.     # check for boot TIMEOUT
  1122.     #--------------------------------------
  1123.     if [ -z "$KIWI_BOOT_TIMEOUT" ];then
  1124.         KIWI_BOOT_TIMEOUT=10;
  1125.     fi
  1126.     #======================================
  1127.     # check for UNIONFS_CONFIG
  1128.     #--------------------------------------
  1129.     if [ "$haveLVM" = "yes" ]; then
  1130.         gnum=1
  1131.     elif [ "$haveDMSquash" = "yes" ];then
  1132.         gnum=2
  1133.     elif [ "$haveClicFS" = "yes" ];then
  1134.         gnum=2
  1135.     elif [ "$haveLuks" = "yes" ];then
  1136.         :
  1137.     elif [ ! -z "$UNIONFS_CONFIG" ] && [ $gnum -gt 0 ]; then
  1138.         rwDevice=`echo $UNIONFS_CONFIG | cut -d , -f 1`
  1139.         gnum=`echo $rwDevice | sed -e "s/\/dev.*\([0-9]\)/\\1/"`
  1140.         gnum=`expr $gnum - 1`
  1141.     fi
  1142.     #======================================
  1143.     # create directory structure
  1144.     #--------------------------------------
  1145.     for dir in $menu $conf $dmap $sysb;do
  1146.         dir=`dirname $dir`; mkdir -p $dir
  1147.     done
  1148.     #======================================
  1149.     # setup grub device node
  1150.     #--------------------------------------
  1151.     gdev="(hd0,$gnum)"
  1152.     #======================================
  1153.     # create menu.lst file
  1154.     #--------------------------------------
  1155.     echo "timeout $KIWI_BOOT_TIMEOUT"  > $menu
  1156.     if [ -f /image/loader/message ] || [ -f /boot/message ];then
  1157.         echo "gfxmenu $gdev/boot/message" >> $menu
  1158.     fi
  1159.     local count=1
  1160.     IFS="," ; for i in $KERNEL_LIST;do
  1161.         if test ! -z "$i";then
  1162.             #======================================
  1163.             # create grub requirements
  1164.             #--------------------------------------
  1165.             kernel=`echo $i | cut -f1 -d:`
  1166.             initrd=`echo $i | cut -f2 -d:`
  1167.             kname=${KERNEL_NAME[$count]}
  1168.             if ! echo $gfix | grep -E -q "OEM|USB|VMX|unknown";then
  1169.                 if [ "$count" = "1" ];then
  1170.                     title=$(makeLabel "$gfix")
  1171.                 else
  1172.                     title=$(makeLabel "$kname [ $gfix ]")
  1173.                 fi
  1174.             elif [ -z "$kiwi_oemtitle" ];then
  1175.                 title=$(makeLabel "$kname [ $gfix ]")
  1176.             else
  1177.                 if [ "$count" = "1" ];then
  1178.                     title=$(makeLabel "$kiwi_oemtitle [ $gfix ]")
  1179.                 else
  1180.                     title=$(makeLabel "$kiwi_oemtitle-$kname [ $gfix ]")
  1181.                 fi
  1182.             fi
  1183.             #======================================
  1184.             # create standard entry
  1185.             #--------------------------------------
  1186.             echo "title $title"                                   >> $menu
  1187.             if xenServer;then
  1188.                 echo " root $gdev"                                >> $menu
  1189.                 echo " kernel /boot/xen.gz"                       >> $menu
  1190.                 echo -n " module /boot/$kernel"                   >> $menu
  1191.                 echo -n " root=$diskByID $console"                >> $menu
  1192.                 echo -n " vga=$fbmode splash=silent"              >> $menu
  1193.                 if [ ! -z "$swap" ];then
  1194.                     echo -n " resume=$swapByID"                   >> $menu
  1195.                 fi
  1196.                 if [ ! -z "$xencons" ]; then
  1197.                     echo -n " xencons=$xencons"                   >> $menu
  1198.                 fi
  1199.                 echo -n " $KIWI_INITRD_PARAMS"                    >> $menu
  1200.                 echo " $KIWI_KERNEL_OPTIONS showopts"             >> $menu
  1201.                 echo " module /boot/$initrd"                      >> $menu
  1202.             else
  1203.                 echo -n " kernel $gdev/boot/$kernel"              >> $menu
  1204.                 echo -n " root=$diskByID $console"                >> $menu
  1205.                 echo -n " vga=$fbmode splash=silent"              >> $menu
  1206.                 if [ ! -z "$swap" ];then
  1207.                     echo -n " resume=$swapByID"                   >> $menu
  1208.                 fi
  1209.                 if [ ! -z "$xencons" ]; then
  1210.                     echo -n " xencons=$xencons"                   >> $menu
  1211.                 fi
  1212.                 echo -n " $KIWI_INITRD_PARAMS"                    >> $menu
  1213.                 echo " $KIWI_KERNEL_OPTIONS showopts"             >> $menu
  1214.                 echo " initrd $gdev/boot/$initrd"                 >> $menu
  1215.             fi
  1216.             #======================================
  1217.             # create failsafe entry
  1218.             #--------------------------------------
  1219.             title=$(makeLabel "Failsafe -- $title")
  1220.             echo "title $title"                                   >> $menu
  1221.             if xenServer;then
  1222.                 echo " root $gdev"                                >> $menu
  1223.                 echo " kernel /boot/xen.gz"                       >> $menu
  1224.                 echo -n " module /boot/$kernel"                   >> $menu
  1225.                 echo -n " root=$diskByID $console"                >> $menu
  1226.                 echo -n " vga=$fbmode splash=silent"              >> $menu
  1227.                 echo -n " $KIWI_INITRD_PARAMS"                    >> $menu
  1228.                 echo -n " $KIWI_KERNEL_OPTIONS showopts"          >> $menu
  1229.                 echo -n " ide=nodma apm=off acpi=off"             >> $menu
  1230.                 echo -n " noresume selinux=0 nosmp"               >> $menu
  1231.                 if [ ! -z "$xencons" ]; then
  1232.                     echo -n " xencons=$xencons"                   >> $menu
  1233.                 fi
  1234.                 echo " noapic maxcpus=0 edd=off"                  >> $menu
  1235.                 echo " module /boot/$initrd"                      >> $menu
  1236.             else
  1237.                 echo -n " kernel $gdev/boot/$kernel"              >> $menu
  1238.                 echo -n " root=$diskByID $console"                >> $menu
  1239.                 echo -n " vga=$fbmode splash=silent"              >> $menu
  1240.                 echo -n " $KIWI_INITRD_PARAMS"                    >> $menu
  1241.                 echo -n " $KIWI_KERNEL_OPTIONS showopts"          >> $menu
  1242.                 echo -n " ide=nodma apm=off acpi=off"             >> $menu
  1243.                 echo -n " noresume selinux=0 nosmp"               >> $menu
  1244.                 if [ ! -z "$xencons" ]; then
  1245.                     echo -n " xencons=$xencons"                   >> $menu
  1246.                 fi
  1247.                 echo " noapic maxcpus=0 edd=off"                  >> $menu
  1248.                 echo " initrd $gdev/boot/$initrd"                 >> $menu
  1249.             fi
  1250.                     count=`expr $count + 1`
  1251.         fi
  1252.     done
  1253.     #======================================
  1254.     # create recovery entry
  1255.     #--------------------------------------
  1256.     if [ ! -z "$OEM_RECOVERY" ];then
  1257.         echo "title Recovery"                             >> $menu
  1258.         echo " rootnoverify (hd0,$gdevreco)"              >> $menu
  1259.         echo " chainloader +1"                            >> $menu
  1260.     fi
  1261.     #======================================
  1262.     # create grub.conf file
  1263.     #--------------------------------------
  1264.     echo "root $gdev" > $conf
  1265.     if dd if=$rdev bs=1 count=512 | file - | grep -q Bootloader;then
  1266.         echo "setup --stage2=$stage $gdev" >> $conf
  1267.     else
  1268.         echo "setup --stage2=$stage (hd0)" >> $conf
  1269.     fi
  1270.     echo "quit" >> $conf
  1271.     #======================================
  1272.     # create grub device map
  1273.     #--------------------------------------
  1274.     rdisk=`echo $rdev | sed -e s"@[0-9]@@g"`
  1275.     if [ ! -z "$imageDiskDevice" ];then
  1276.         rdisk=$imageDiskDevice
  1277.     fi
  1278.     echo "(hd0) $rdisk" > $dmap
  1279.     #======================================
  1280.     # create sysconfig/bootloader
  1281.     #--------------------------------------
  1282.     echo "LOADER_TYPE=\"grub\""                               > $sysb
  1283.     echo "LOADER_LOCATION=\"mbr\""                           >> $sysb
  1284.     echo "DEFAULT_VGA=\"$fbmode\""                           >> $sysb  
  1285.     echo -n "DEFAULT_APPEND=\"root=$diskByID splash=silent"  >> $sysb
  1286.     if [ ! -z "$swap" ];then
  1287.         echo -n " resume=$swapByID"                          >> $sysb
  1288.     fi
  1289.     echo -n " $KIWI_INITRD_PARAMS $KIWI_KERNEL_OPTIONS"      >> $sysb
  1290.     echo " showopts\""                                       >> $sysb
  1291.     echo "FAILSAFE_VGA=\"$fbmode\""                          >> $sysb
  1292.     echo -n "FAILSAFE_APPEND=\"root=$diskByID splash=silent" >> $sysb
  1293.     if [ ! -z "$swap" ];then
  1294.         echo -n " resume=$swapByID"                          >> $sysb
  1295.     fi
  1296.     echo -n " $KIWI_INITRD_PARAMS $KIWI_KERNEL_OPTIONS"      >> $sysb
  1297.     echo -n " showopts ide=nodma apm=off acpi=off noresume"  >> $sysb
  1298.     echo "selinux=0 nosmp noapic maxcpus=0 edd=off\""        >> $sysb
  1299. }
  1300. #======================================
  1301. # setupBootLoaderLilo
  1302. #--------------------------------------
  1303. function setupBootLoaderLilo {
  1304.     # /.../
  1305.     # create lilo.conf file used for
  1306.     # installing the bootloader
  1307.     # ----
  1308.     local mountPrefix=$1  # mount path of the image
  1309.     local destsPrefix=$2  # base dir for the config files
  1310.     local lnum=$3         # lilo boot partition ID
  1311.     local rdev=$4         # lilo root partition
  1312.     local lfix=$5         # lilo title postfix
  1313.     local swap=$6         # optional swap partition
  1314.     local conf=$destsPrefix/etc/lilo.conf
  1315.     local sysb=$destsPrefix/etc/sysconfig/bootloader
  1316.     local console=""
  1317.     local kname=""
  1318.     local kernel=""
  1319.     local initrd=""
  1320.     local title=""
  1321.     local rdisk=""
  1322.     local fbmode=$vga
  1323.     local xencons=$xencons
  1324.     if [ -z "$fbmode" ];then
  1325.         fbmode=$DEFAULT_VGA
  1326.     fi
  1327.     #======================================
  1328.     # check for device by ID
  1329.     #--------------------------------------
  1330.     local diskByID=`getDiskID $rdev`
  1331.     local swapByID=`getDiskID $swap`
  1332.     #======================================
  1333.     # check for boot image .profile
  1334.     #--------------------------------------
  1335.     if [ -f /.profile ];then
  1336.         importFile < /.profile
  1337.     fi
  1338.     #======================================
  1339.     # check for system image .profile
  1340.     #--------------------------------------
  1341.     if [ -f $mountPrefix/image/.profile ];then
  1342.         importFile < $mountPrefix/image/.profile
  1343.     fi
  1344.     #======================================
  1345.     # check for lilo title postfix
  1346.     #--------------------------------------
  1347.     if [ -z "$lfix" ];then
  1348.         lfix="unknown"
  1349.     fi
  1350.     #======================================
  1351.     # check for boot TIMEOUT
  1352.     #--------------------------------------
  1353.     if [ -z "$KIWI_BOOT_TIMEOUT" ];then
  1354.         KIWI_BOOT_TIMEOUT=10;
  1355.     fi
  1356.     #======================================
  1357.     # check for UNIONFS_CONFIG
  1358.     #--------------------------------------
  1359.     if [ "$haveLVM" = "yes" ]; then
  1360.         lnum=1
  1361.     elif [ "$haveDMSquash" = "yes" ];then
  1362.         lnum=2
  1363.     elif [ "$haveClicFS" = "yes" ];then
  1364.         lnum=2
  1365.     elif [ "$haveLuks" = "yes" ];then
  1366.         :
  1367.     elif [ ! -z "$UNIONFS_CONFIG" ] && [ $gnum -gt 0 ]; then
  1368.         rwDevice=`echo $UNIONFS_CONFIG | cut -d , -f 1`
  1369.         lnum=`echo $rwDevice | sed -e "s/\/dev.*\([0-9]\)/\\1/"`
  1370.         lnum=`expr $gnum - 1`
  1371.     fi
  1372.     #======================================
  1373.     # setup lilo boot device
  1374.     #--------------------------------------
  1375.     rdisk=`echo $rdev | sed -e s"@[0-9]@@g"`
  1376.     if [ ! -z "$imageDiskDevice" ];then
  1377.         rdisk=$imageDiskDevice
  1378.     fi
  1379.     rdev=$rdisk$lnum
  1380.     #======================================
  1381.     # create directory structure
  1382.     #--------------------------------------
  1383.     for dir in $conf $sysb;do
  1384.         dir=`dirname $dir`; mkdir -p $dir
  1385.     done
  1386.     #======================================
  1387.     # create lilo.conf file
  1388.     #--------------------------------------
  1389.     echo "boot=$rdev"                                        >  $conf
  1390.     echo "activate"                                          >> $conf
  1391.     echo "timeout=`expr $KIWI_BOOT_TIMEOUT \* 10`"           >> $conf
  1392.     echo "default=kiwi$count"                                >> $conf
  1393.     local count=1
  1394.     IFS="," ; for i in $KERNEL_LIST;do
  1395.         if test ! -z "$i";then
  1396.             #======================================
  1397.             # create lilo requirements
  1398.             #--------------------------------------
  1399.             kernel=`echo $i | cut -f1 -d:`
  1400.             initrd=`echo $i | cut -f2 -d:`
  1401.             kname=${KERNEL_NAME[$count]}
  1402.             if ! echo $lfix | grep -E -q "OEM|USB|VMX|unknown";then
  1403.                 if [ "$count" = "1" ];then
  1404.                     title=$(makeLabel "$lfix")
  1405.                 else
  1406.                     title=$(makeLabel "$kname [ $lfix ]")
  1407.                 fi
  1408.             elif [ -z "$kiwi_oemtitle" ];then
  1409.                 title=$(makeLabel "$kname [ $lfix ]")
  1410.             else
  1411.                 if [ "$count" = "1" ];then
  1412.                     title=$(makeLabel "$kiwi_oemtitle [ $lfix ]")
  1413.                 else
  1414.                     title=$(makeLabel "$kiwi_oemtitle-$kname [ $lfix ]")
  1415.                 fi
  1416.             fi
  1417.             #======================================
  1418.             # create standard entry
  1419.             #--------------------------------------
  1420.             echo "label=\"$title\""                          >> $conf
  1421.             if xenServer;then
  1422.                 systemException \
  1423.                     "*** lilo: Xen dom0 boot not implemented ***" \
  1424.                 "reboot"
  1425.             else
  1426.                 echo "image=/boot/$kernel"                   >> $conf
  1427.                 echo "initrd=/boot/$initrd"                  >> $conf
  1428.                 echo -n "append=\"quiet sysrq=1 panic=9"     >> $conf
  1429.                 echo -n " root=$diskByID $console"           >> $conf
  1430.                 echo -n " vga=$fbmode splash=silent"         >> $conf
  1431.                 if [ ! -z "$swap" ];then                     
  1432.                     echo -n " resume=$swapByID"              >> $conf
  1433.                 fi
  1434.                 if [ ! -z "$xencons" ]; then
  1435.                     echo -n " xencons=$xencons"              >> $conf
  1436.                 fi
  1437.                 echo -n " $KIWI_INITRD_PARAMS"               >> $conf
  1438.                 echo " $KIWI_KERNEL_OPTIONS showopts\""      >> $conf
  1439.             fi
  1440.             #======================================
  1441.             # create failsafe entry
  1442.             #--------------------------------------
  1443.             title=$(makeLabel "Failsafe -- $title")
  1444.             echo "label=\"$title\""                          >> $conf
  1445.             if xenServer;then
  1446.                 systemException \
  1447.                     "*** lilo: Xen dom0 boot not implemented ***" \
  1448.                 "reboot"
  1449.             else
  1450.                 echo "image=/boot/$kernel"                   >> $conf
  1451.                 echo "initrd=/boot/$initrd"                  >> $conf
  1452.                 echo -n "append=\"quiet sysrq=1 panic=9"     >> $conf
  1453.                 echo -n " root=$diskByID $console"           >> $conf
  1454.                 echo -n " vga=$fbmode splash=silent"         >> $conf
  1455.                 if [ ! -z "$swap" ];then
  1456.                     echo -n " resume=$swapByID"              >> $conf
  1457.                 fi
  1458.                 if [ ! -z "$xencons" ]; then
  1459.                     echo -n " xencons=$xencons"              >> $conf
  1460.                 fi
  1461.                 echo -n " $KIWI_INITRD_PARAMS"               >> $conf
  1462.                 echo -n " $KIWI_KERNEL_OPTIONS showopts\""   >> $conf
  1463.                 echo -n " ide=nodma apm=off acpi=off"        >> $conf
  1464.                 echo " noresume selinux=0 nosmp"             >> $conf
  1465.             fi
  1466.             count=`expr $count + 1`
  1467.         fi
  1468.     done
  1469.     #======================================
  1470.     # create recovery entry
  1471.     #--------------------------------------
  1472.     if [ ! -z "$OEM_RECOVERY" ];then
  1473.         systemException \
  1474.             "*** lilo: recovery chain loading not implemented ***" \
  1475.         "reboot"
  1476.     fi
  1477.     #======================================
  1478.     # create sysconfig/bootloader
  1479.     #--------------------------------------
  1480.     echo "LOADER_TYPE=\"lilo\""                               > $sysb
  1481.     echo "LOADER_LOCATION=\"mbr\""                           >> $sysb
  1482.     echo "DEFAULT_VGA=\"$fbmode\""                           >> $sysb 
  1483.     echo -n "DEFAULT_APPEND=\"root=$diskByID splash=silent"  >> $sysb
  1484.     if [ ! -z "$swap" ];then
  1485.         echo -n " resume=$swapByID"                          >> $sysb
  1486.     fi
  1487.     echo -n " $KIWI_INITRD_PARAMS $KIWI_KERNEL_OPTIONS"      >> $sysb
  1488.     echo " showopts\""                                       >> $sysb
  1489.     echo "FAILSAFE_VGA=\"$fbmode\""                          >> $sysb
  1490.     echo -n "FAILSAFE_APPEND=\"root=$diskByID splash=silent" >> $sysb
  1491.     if [ ! -z "$swap" ];then
  1492.         echo -n " resume=$swapByID"                          >> $sysb
  1493.     fi
  1494.     echo -n " $KIWI_INITRD_PARAMS $KIWI_KERNEL_OPTIONS"      >> $sysb
  1495.     echo -n " showopts ide=nodma apm=off acpi=off noresume"  >> $sysb
  1496.     echo "selinux=0 nosmp noapic maxcpus=0 edd=off\""        >> $sysb
  1497. }
  1498. #======================================
  1499. # setupDefaultPXENetwork
  1500. #--------------------------------------
  1501. function setupDefaultPXENetwork {
  1502.     # /.../
  1503.     # create the /sysconfig/network file according to the PXE
  1504.     # boot interface.
  1505.     # ----
  1506.     local prefix=$1
  1507.     local niface=$prefix/etc/sysconfig/network/ifcfg-$PXE_IFACE
  1508.     mkdir -p $prefix/etc/sysconfig/network
  1509.     cat > $niface < /dev/null
  1510.     echo "BOOTPROTO='dhcp'"    >> $niface
  1511.     echo "STARTMODE='ifplugd'" >> $niface
  1512.     echo "USERCONTROL='no'"    >> $niface
  1513. }
  1514. #======================================
  1515. # setupDefaultFstab
  1516. #--------------------------------------
  1517. function setupDefaultFstab {
  1518.     # /.../
  1519.     # create a new /etc/fstab file with the default entries
  1520.     # ----
  1521.     local prefix=$1
  1522.     local nfstab=$prefix/etc/fstab
  1523.     mkdir -p $prefix/etc
  1524.     cat > $nfstab < /dev/null
  1525.     echo "devpts  /dev/pts   devpts  mode=0620,gid=5 0 0"   >> $nfstab
  1526.     echo "proc    /proc      proc    defaults 0 0"          >> $nfstab
  1527.     echo "sysfs   /sys       sysfs   noauto 0 0"            >> $nfstab
  1528. }
  1529. #======================================
  1530. # updateRootDeviceFstab
  1531. #--------------------------------------
  1532. function updateRootDeviceFstab {
  1533.     # /.../
  1534.     # add one line to the fstab file for the root device
  1535.     # ----
  1536.     IFS=$IFS_ORIG
  1537.     local prefix=$1
  1538.     local rdev=$2
  1539.     local nfstab=$prefix/etc/fstab
  1540.     local diskByID=`getDiskID $rdev`
  1541.     if [ ! -z "$NFSROOT" ];then
  1542.         local server=`echo $rdev | cut -f3 -d" "`
  1543.         local option=`echo $rdev | cut -f2 -d" "`
  1544.         echo "$server / nfs $option 0 0" >> $nfstab
  1545.         return
  1546.     fi
  1547.     #======================================
  1548.     # check for device by ID
  1549.     #--------------------------------------
  1550.     if [ -z "$UNIONFS_CONFIG" ]; then
  1551.         echo "$diskByID / $FSTYPE defaults 0 0" >> $nfstab
  1552.     else
  1553.         echo "/dev/root / defaults 0 0" >> $nfstab
  1554.     fi
  1555. }
  1556. #======================================
  1557. # updateSwapDeviceFstab
  1558. #--------------------------------------
  1559. function updateSwapDeviceFstab {
  1560.     # /.../
  1561.     # add one line to the fstab file for the swap device
  1562.     # ----
  1563.     local prefix=$1
  1564.     local sdev=$2
  1565.     local diskByID=`getDiskID $sdev`
  1566.     local nfstab=$prefix/etc/fstab
  1567.     echo "$diskByID swap swap pri=42 0 0" >> $nfstab
  1568. }
  1569. #======================================
  1570. # updateLVMBootDeviceFstab
  1571. #--------------------------------------
  1572. function updateLVMBootDeviceFstab {
  1573.     # /.../
  1574.     # add one line to the fstab file for the /lvmboot
  1575.     # device partition
  1576.     # ----
  1577.     local prefix=$1
  1578.     local sdev=$2
  1579.     local mount=$3
  1580.     if [ -z "$mount" ];then
  1581.         mount=/lvmboot
  1582.     fi
  1583.     local diskByID=`getDiskID $sdev`
  1584.     local nfstab=$prefix/etc/fstab
  1585.     if [ ! -z "$FSTYPE" ];then
  1586.         FSTYPE_SAVE=$FSTYPE
  1587.     fi
  1588.     #======================================
  1589.     # probe filesystem
  1590.     #--------------------------------------
  1591.     probeFileSystem $sdev
  1592.     if [ -z $FSTYPE ] || [ $FSTYPE = "unknown" ];then
  1593.         FSTYPE="auto"
  1594.     fi
  1595.     echo "$diskByID $mount $FSTYPE defaults 0 0" >> $nfstab
  1596.     if [ ! -z "$FSTYPE_SAVE" ];then
  1597.         FSTYPE=$FSTYPE_SAVE
  1598.     fi
  1599. }
  1600. #======================================
  1601. # updateDMBootDeviceFstab
  1602. #--------------------------------------
  1603. function updateDMBootDeviceFstab {
  1604.     updateLVMBootDeviceFstab $1 $2 "/dmboot"
  1605. }
  1606. #======================================
  1607. # updateClicBootDeviceFstab
  1608. #--------------------------------------
  1609. function updateClicBootDeviceFstab {
  1610.     updateLVMBootDeviceFstab $1 $2 "/clicboot"
  1611. }
  1612. #======================================
  1613. # updateLuksBootDeviceFstab
  1614. #--------------------------------------
  1615. function updateLuksBootDeviceFstab {
  1616.     updateLVMBootDeviceFstab $1 $2 "/luksboot"
  1617. }
  1618. #======================================
  1619. # updateSyslinuxBootDeviceFstab
  1620. #--------------------------------------
  1621. function updateSyslinuxBootDeviceFstab {
  1622.     # /.../
  1623.     # add one line to the fstab file for the /syslboot
  1624.     # device partition
  1625.     # ----
  1626.     local prefix=$1
  1627.     local sdev=$2
  1628.     local diskByID=`getDiskID $sdev`
  1629.     local nfstab=$prefix/etc/fstab
  1630.     echo "$diskByID /syslboot vfat defaults 0 0" >> $nfstab
  1631. }
  1632. #======================================
  1633. # updateOtherDeviceFstab
  1634. #--------------------------------------
  1635. function updateOtherDeviceFstab {
  1636.     # /.../
  1637.     # check the contents of the $PART_MOUNT variable and
  1638.     # add one line to the fstab file for each partition
  1639.     # to mount.
  1640.     # ----
  1641.     local prefix=$1
  1642.     local nfstab=$prefix/etc/fstab
  1643.     local index=0
  1644.     IFS=":" ; for i in $PART_MOUNT;do
  1645.         if test ! -z "$i";then
  1646.             count=0
  1647.             IFS=":" ; for n in $PART_DEV;do
  1648.                 device=$n
  1649.                 if test $count -eq $index;then
  1650.                     break
  1651.                 fi
  1652.                 count=`expr $count + 1`
  1653.             done
  1654.             index=`expr $index + 1`
  1655.             if test ! $i = "/" && test ! $i = "x";then
  1656.                 probeFileSystem $device
  1657.                 echo "$device $i $FSTYPE defaults 1 1" >> $nfstab
  1658.             fi
  1659.         fi
  1660.     done
  1661. }
  1662. #======================================
  1663. # setupKernelModules
  1664. #--------------------------------------
  1665. function setupKernelModules {
  1666.     # /.../
  1667.     # create sysconfig/kernel file which includes the
  1668.     # kernel modules to become integrated into the initrd
  1669.     # if created by the distro mkinitrd tool
  1670.     # ----
  1671.     local destprefix=$1
  1672.     local srcprefix=$2
  1673.     if [ -z "$srcprefix" ];then
  1674.         srcprefix=/mnt
  1675.     fi
  1676.     local ktempl=$srcprefix/var/adm/fillup-templates/sysconfig.kernel
  1677.     local syskernel=$destprefix/etc/sysconfig/kernel
  1678.     mkdir -p $destprefix/etc/sysconfig
  1679.     if [ ! -f $ktempl ];then
  1680.         systemException \
  1681.             "Can't find kernel sysconfig template in system image !" \
  1682.         "reboot"
  1683.     fi
  1684.     cp $ktempl $syskernel
  1685.     sed -i -e \
  1686.         s"@^INITRD_MODULES=.*@INITRD_MODULES=\"$INITRD_MODULES\"@" \
  1687.     $syskernel
  1688.     sed -i -e \
  1689.         s"@^DOMU_INITRD_MODULES=.*@DOMU_INITRD_MODULES=\"$DOMURD_MODULES\"@" \
  1690.     $syskernel
  1691. }
  1692. #======================================
  1693. # kernelCheck
  1694. #--------------------------------------
  1695. function kernelCheck {
  1696.     # /.../
  1697.     # Check this running kernel against the kernel
  1698.     # installed in the image. If the version does not 
  1699.     # match we need to reboot to activate the system
  1700.     # image kernel.
  1701.     # ----
  1702.     kactive=`uname -r`
  1703.     kreboot=1
  1704.     prefix=$1
  1705.     for i in $prefix/lib/modules/*;do
  1706.         if [ ! -d $i ];then
  1707.             continue
  1708.         fi
  1709.         kinstname=${i##*/}
  1710.         if [ $kinstname = $kactive ];then
  1711.             kreboot=0
  1712.             break
  1713.         fi
  1714.     done
  1715.     if [ $kreboot = 1 ];then
  1716.         Echo "Kernel versions do not match rebooting in 5 sec..."
  1717.         REBOOT_IMAGE="yes"
  1718.         sleep 5
  1719.     fi
  1720. }
  1721. #======================================
  1722. # probeFileSystem
  1723. #--------------------------------------
  1724. function probeFileSystem {
  1725.     # /.../
  1726.     # probe for the filesystem type. The function will
  1727.     # read 128 kB of the given device and check the
  1728.     # filesystem header data to detect the type of the
  1729.     # filesystem
  1730.     # ----
  1731.     FSTYPE=unknown
  1732.     FSTYPE=$(blkid $1 -s TYPE -o value)
  1733.     case $FSTYPE in
  1734.         ext4)     FSTYPE=ext4 ;;
  1735.         ext3)     FSTYPE=ext3 ;;
  1736.         ext2)     FSTYPE=ext2 ;;
  1737.         reiserfs) FSTYPE=reiserfs ;;
  1738.         squashfs) FSTYPE=squashfs ;;
  1739.         luks)     FSTYPE=luks ;;
  1740.         vfat)     FSTYPE=vfat ;;
  1741.         clicfs)   FSTYPE=clicfs ;;
  1742.         *)
  1743.             FSTYPE=unknown
  1744.         ;;
  1745.     esac
  1746.     if [ $FSTYPE = "unknown" ];then
  1747.         dd if=$1 of=/tmp/filesystem-$$ bs=128k count=1 >/dev/null
  1748.     fi
  1749.     if [ $FSTYPE = "unknown" ];then
  1750.         if grep -q ^CLIC /tmp/filesystem-$$;then
  1751.             FSTYPE=clicfs
  1752.         fi
  1753.     fi
  1754.     export FSTYPE
  1755. }
  1756. #======================================
  1757. # getSystemIntegrity
  1758. #--------------------------------------
  1759. function getSystemIntegrity {
  1760.     # /.../
  1761.     # check the variable SYSTEM_INTEGRITY which contains
  1762.     # information about the status of all image portions
  1763.     # per partition. If a number is given as parameter only
  1764.     # the information from the image assigned to this partition
  1765.     # is returned
  1766.     # ----
  1767.     if [ -z "$SYSTEM_INTEGRITY" ];then
  1768.         echo "clean"
  1769.     else
  1770.         echo $SYSTEM_INTEGRITY | cut -f$1 -d:
  1771.     fi
  1772. }
  1773. #======================================
  1774. # getSystemMD5Status
  1775. #--------------------------------------
  1776. function getSystemMD5Status {
  1777.     # /.../
  1778.     # return the md5 status of the given image number.
  1779.     # the function works similar to getSystemIntegrity
  1780.     # ----
  1781.     echo $SYSTEM_MD5STATUS | cut -f$1 -d:
  1782. }
  1783. #======================================
  1784. # waitForUSBDeviceScan
  1785. #--------------------------------------
  1786. function waitForUSBDeviceScan {
  1787.     local devices=0
  1788.     if [ ! "$HAVE_USB" = "yes" ];then
  1789.         return
  1790.     fi
  1791.     Echo -n "Waiting for USB device scan to complete..."
  1792.     while \
  1793.         [ $(dmesg | grep -c 'usb-storage: device scan complete') -lt 1 ] && \
  1794.         [ $devices -lt 15 ]
  1795.     do
  1796.         echo -n .
  1797.         sleep 1
  1798.         devices=$(( $devices + 1 ))
  1799.     done
  1800.     udevPending
  1801.     echo
  1802. }
  1803. #======================================
  1804. # probeUSB
  1805. #--------------------------------------
  1806. function probeUSB {
  1807.     local module=""
  1808.     local stdevs=""
  1809.     local hwicmd="/usr/sbin/hwinfo"
  1810.     export HAVE_USB="no"
  1811.     if [ $HAVE_MODULES_ORDER = 0 ];then
  1812.         #======================================
  1813.         # load host controller modules
  1814.         #--------------------------------------
  1815.         IFS="%"
  1816.         for i in \
  1817.             `$hwicmd --usb | grep "Driver [IA]" | 
  1818.             sed -es"@modprobe\(.*\)\"@\1%@" | tr -d "\n"`
  1819.         do
  1820.             if echo $i | grep -q "#0";then
  1821.                 module=`echo $i | cut -f2 -d"\"" | tr -d " "`
  1822.                 module=`echo $module | sed -es"@modprobe@@g"`
  1823.                 IFS=";"
  1824.                 for m in $module;do
  1825.                     if ! echo $stdevs | grep -q $m;then
  1826.                         stdevs="$stdevs $m"
  1827.                     fi
  1828.                 done
  1829.             fi
  1830.         done
  1831.         for i in \
  1832.             `$hwicmd --usb-ctrl | grep "Driver [IA]" | 
  1833.             sed -es"@modprobe\(.*\)\"@\1%@" | tr -d "\n"`
  1834.         do
  1835.             if echo $i | grep -q "#0";then
  1836.                 module=`echo $i | cut -f2 -d"\"" | tr -d " "`
  1837.                 module=`echo $module | sed -es"@modprobe@@g"`
  1838.                 IFS=";"
  1839.                 for m in $module;do
  1840.                     if ! echo $stdevs | grep -q $m;then
  1841.                         stdevs="$stdevs $m"
  1842.                     fi
  1843.                 done
  1844.             fi
  1845.         done
  1846.         IFS=$IFS_ORIG
  1847.         stdevs=`echo $stdevs`
  1848.         for module in $stdevs;do
  1849.             Echo "Probing module: $module"
  1850.             modprobe $module >/dev/null
  1851.         done
  1852.         #======================================
  1853.         # check load status for host controller
  1854.         #--------------------------------------
  1855.         if [ -z "$stdevs" ];then
  1856.             return
  1857.         fi
  1858.         #======================================
  1859.         # manually load storage/input drivers
  1860.         #--------------------------------------
  1861.         for i in usbhid usb-storage;do
  1862.             modprobe $i &>/dev/null
  1863.         done
  1864.     fi
  1865.     stdevs=$(ls -1 /sys/bus/usb/devices/ | wc -l)
  1866.     if [ $stdevs -gt 0 ];then
  1867.         export HAVE_USB="yes"
  1868.     fi
  1869.     waitForUSBDeviceScan
  1870. }
  1871. #======================================
  1872. # probeDevices
  1873. #--------------------------------------
  1874. function probeDevices {
  1875.     #======================================
  1876.     # probe USB devices and load modules
  1877.     #--------------------------------------
  1878.     probeUSB
  1879.     #======================================
  1880.     # probe Disk devices and load modules
  1881.     #--------------------------------------
  1882.     if [ $HAVE_MODULES_ORDER = 0 ];then
  1883.         Echo "Including required kernel modules..."
  1884.         IFS="%"
  1885.         local module=""
  1886.         local stdevs=""
  1887.         local hwicmd="/usr/sbin/hwinfo"
  1888.         for i in \
  1889.             `$hwicmd --storage | grep "Driver [IA]" | 
  1890.             sed -es"@modprobe\(.*\)\"@\1%@" | tr -d "\n"`
  1891.         do
  1892.             if echo $i | grep -q "#0";then
  1893.                 module=`echo $i | cut -f2 -d"\"" | tr -d " "`
  1894.                 module=`echo $module | sed -es"@modprobe@@g"`
  1895.                 IFS=";"
  1896.                 for m in $module;do
  1897.                     if ! echo $stdevs | grep -q $m;then
  1898.                         stdevs="$stdevs $m"
  1899.                     fi
  1900.                 done
  1901.             fi
  1902.         done
  1903.         IFS=$IFS_ORIG
  1904.         stdevs=`echo $stdevs`
  1905.         if [ ! -z "$kiwikernelmodule" ];then
  1906.             for module in $kiwikernelmodule;do
  1907.                 Echo "Probing module (cmdline): $module"
  1908.                 INITRD_MODULES="$INITRD_MODULES $module"
  1909.                 modprobe $module >/dev/null
  1910.             done
  1911.         fi
  1912.         for module in $stdevs;do
  1913.             loadok=1
  1914.             for broken in $kiwibrokenmodule;do
  1915.                 if [ $broken = $module ];then
  1916.                     Echo "Prevent loading module: $module"
  1917.                     loadok=0; break
  1918.                 fi
  1919.             done
  1920.             if [ $loadok = 1 ];then
  1921.                 Echo "Probing module: $module"
  1922.                 INITRD_MODULES="$INITRD_MODULES $module"
  1923.                 modprobe $module >/dev/null
  1924.             fi
  1925.         done
  1926.         hwinfo --block &>/dev/null
  1927.         # /.../
  1928.         # older systems require ide-disk to be present at any time
  1929.         # for details on this crappy call see bug: #250241
  1930.         # ----
  1931.         modprobe ide-disk &>/dev/null
  1932.     else
  1933.         if [ ! -z "$kiwikernelmodule" ];then
  1934.             for module in $kiwikernelmodule;do
  1935.                 Echo "Probing module (cmdline): $module"
  1936.                 INITRD_MODULES="$INITRD_MODULES $module"
  1937.                 modprobe $module >/dev/null
  1938.             done
  1939.         fi
  1940.     fi
  1941.     #======================================
  1942.     # Manual loading of modules
  1943.     #--------------------------------------
  1944.     for i in rd brd edd dm-mod xennet xenblk;do
  1945.         modprobe $i &>/dev/null
  1946.     done
  1947. }
  1948. #======================================
  1949. # CDDevice
  1950. #--------------------------------------
  1951. function CDDevice {
  1952.     # /.../
  1953.     # detect CD/DVD/USB device(s). The function use the information
  1954.     # from hwinfo --cdrom to search for the block device
  1955.     # ----
  1956.     IFS=$IFS_ORIG
  1957.     local count=0
  1958.     local h=/usr/sbin/hwinfo
  1959.     if [ $HAVE_MODULES_ORDER = 0 ];then
  1960.         for module in sg sd_mod sr_mod cdrom ide-cd BusLogic vfat; do
  1961.             /sbin/modprobe $module
  1962.         done
  1963.     fi
  1964.     Echo -n "Waiting for CD/DVD device(s) to appear..."
  1965.     while true;do
  1966.         cddevs=`$h --cdrom | grep "Device File:"|sed -e"s@(.*)@@" | cut -f2 -d:`
  1967.         cddevs=`echo $cddevs`
  1968.         for i in $cddevs;do
  1969.             if [ -b $i ];then
  1970.                 test -z $cddev && cddev=$i || cddev=$cddev:$i
  1971.             fi
  1972.         done
  1973.         if [ ! -z "$cddev" ] || [ $count -eq 12 ]; then
  1974.             break
  1975.         else
  1976.             echo -n .
  1977.             sleep 1
  1978.         fi
  1979.         count=`expr $count + 1`
  1980.     done
  1981.     echo
  1982.     if [ -z "$cddev" ];then
  1983.         USBStickDevice
  1984.         if [ $stickFound = 0 ];then
  1985.             systemException \
  1986.                 "Failed to detect CD/DVD or USB drive !" \
  1987.             "reboot"
  1988.         fi
  1989.         cddev=$stickDevice
  1990.     fi
  1991. }
  1992. #======================================
  1993. # USBStickDevice
  1994. #--------------------------------------
  1995. function USBStickDevice {
  1996.     stickFound=0
  1997.     local mode=$1
  1998.     #======================================
  1999.     # search for USB removable devices
  2000.     #--------------------------------------
  2001.     waitForUSBDeviceScan
  2002.     for device in /sys/bus/usb/drivers/usb-storage/*;do
  2003.         if [ ! -L $device ];then
  2004.             continue
  2005.         fi
  2006.         descriptions=$device/host*/target*/*/block*
  2007.         for description in $descriptions;do
  2008.             if [ ! -d $description ];then
  2009.                 continue
  2010.             fi
  2011.             isremovable=$description/removable
  2012.             storageID=`echo $description | cut -f1 -d: | xargs basename`
  2013.             devicebID=`basename $description | cut -f2 -d:`
  2014.             if [ $devicebID = "block" ];then
  2015.                 devicebID=`ls -1 $description`
  2016.                 isremovable=$description/$devicebID/removable
  2017.             fi
  2018.             serial="/sys/bus/usb/devices/$storageID/serial"
  2019.             device="/dev/$devicebID"
  2020.             if [ ! -b $device ];then
  2021.                 continue;
  2022.             fi
  2023.             if [ ! -f $isremovable ];then
  2024.                 continue;
  2025.             fi
  2026.             if ! partitionSize $device >/dev/null;then
  2027.                 continue;
  2028.             fi
  2029.             if [ ! -f $serial ];then
  2030.                 serial="USB Stick (unknown type)"
  2031.             else
  2032.                 serial=`cat $serial`
  2033.             fi
  2034.             removable=`cat $isremovable`
  2035.             # /.../
  2036.             # don't check the removable flag, it could be wrong
  2037.             # especially for USB hard disks connected via a
  2038.             # USB caddy, details in bug: 535113
  2039.             # ----
  2040.             removable=1
  2041.             if [ $removable -eq 1 ];then
  2042.                 stickRoot=$device
  2043.                 stickDevice=$(ddn $device 1)
  2044.                 for devnr in 1 2;do
  2045.                     dev=$(ddn $stickRoot $devnr)
  2046.                     if ! kiwiMount "$dev" "/mnt" "-o ro";then
  2047.                         continue
  2048.                     fi
  2049.                     if [ "$mode" = "install" ];then
  2050.                         # /.../
  2051.                         # USB stick search for install media
  2052.                         # created with kiwi
  2053.                         # ----
  2054.                         if \
  2055.                             [ ! -e /mnt/config.isoclient ] && \
  2056.                             [ ! -e /mnt/config.usbclient ]
  2057.                         then
  2058.                             umountSystem
  2059.                             continue
  2060.                         fi
  2061.                     else
  2062.                         # /.../
  2063.                         # USB stick search for Linux system tree
  2064.                         # created with kiwi
  2065.                         # ----
  2066.                         if [ ! -e /mnt/etc/ImageVersion ]; then
  2067.                             umountSystem
  2068.                             continue
  2069.                         fi
  2070.                     fi
  2071.                     stickFound=1
  2072.                     umountSystem
  2073.                     break
  2074.                 done
  2075.                 if [ "$stickFound" = 0 ];then
  2076.                     continue
  2077.                 fi
  2078.                 stickSerial=$serial
  2079.                 return
  2080.             fi
  2081.         done
  2082.     done
  2083. }
  2084. #======================================
  2085. # CDMountOption
  2086. #--------------------------------------
  2087. function CDMountOption {
  2088.     # /.../
  2089.     # checks for the ISO 9660 extension and prints the
  2090.     # mount option required to mount the device in full
  2091.     # speed mode
  2092.     # ----
  2093.     local dev=$1
  2094.     local iso="ISO 9660"
  2095.     if dd if=$dev bs=42k count=1 2>&1 | file - | grep -q $iso;then
  2096.         echo "-t iso9660"
  2097.     fi
  2098. }
  2099. #======================================
  2100. # CDMount
  2101. #--------------------------------------
  2102. function CDMount {
  2103.     # /.../
  2104.     # search all CD/DVD drives and use the one we can find
  2105.     # the CD configuration on
  2106.     # ----
  2107.     local count=0
  2108.     local ecode=0
  2109.     local cdopt
  2110.     mkdir -p /cdrom
  2111.     if [ -f /.profile ];then
  2112.         importFile < /.profile
  2113.     fi
  2114.     #======================================
  2115.     # check for hybrid mbr ID
  2116.     #--------------------------------------
  2117.     if [ -z "$cdinst" ];then
  2118.         searchBIOSBootDevice
  2119.         ecode=$?
  2120.         if [ ! $ecode = 0 ];then
  2121.             if [ $ecode = 2 ];then
  2122.                 systemException "$biosBootDevice" "reboot"
  2123.             fi
  2124.             unset kiwi_hybrid
  2125.         fi
  2126.     else
  2127.         unset kiwi_hybrid
  2128.     fi
  2129.     #======================================
  2130.     # walk through media
  2131.     #--------------------------------------
  2132.     if [ -z "$kiwi_hybrid" ];then
  2133.         #======================================
  2134.         # search for CD/DVD devices
  2135.         #--------------------------------------
  2136.         CDDevice
  2137.         Echo -n "Mounting live boot drive..."
  2138.         while true;do
  2139.             IFS=":"; for i in $cddev;do
  2140.                 cdopt=$(CDMountOption $i)
  2141.                 if [ -x /usr/bin/driveready ];then
  2142.                     driveready $i&& eval mount $cdopt -o ro $i /cdrom >/dev/null
  2143.                 else
  2144.                     eval mount $cdopt -o ro $i /cdrom >/dev/null
  2145.                 fi
  2146.                 if [ -f $LIVECD_CONFIG ];then
  2147.                     cddev=$i; echo
  2148.                     #======================================
  2149.                     # run mediacheck if requested and boot
  2150.                     #--------------------------------------
  2151.                     if [ "$mediacheck" = 1 ]; then
  2152.                         test -e /proc/splash && echo verbose > /proc/splash
  2153.                         checkmedia $cddev
  2154.                         Echo -n "Press ENTER for reboot: "; read nope
  2155.                         /sbin/reboot -f -i >/dev/null
  2156.                     fi
  2157.                     #======================================
  2158.                     # device found go with it
  2159.                     #--------------------------------------
  2160.                     IFS=$IFS_ORIG
  2161.                     return
  2162.                 fi
  2163.                 umount $i &>/dev/null
  2164.             done
  2165.             IFS=$IFS_ORIG
  2166.             if [ $count -eq 12 ]; then
  2167.                 break
  2168.             else
  2169.                 echo -n .
  2170.                 sleep 1
  2171.             fi
  2172.             count=`expr $count + 1`
  2173.         done
  2174.     else
  2175.         #======================================
  2176.         # search for hybrid device
  2177.         #--------------------------------------
  2178.         Echo -n "Mounting hybrid live boot drive..."
  2179.         cddev=$(ddn $biosBootDevice 1)
  2180.         kiwiMount "$cddev" "/cdrom" "-o ro"
  2181.         if [ -f $LIVECD_CONFIG ];then
  2182.             echo
  2183.             #======================================
  2184.             # run mediacheck if requested and boot
  2185.             #--------------------------------------
  2186.             if [ "$mediacheck" = 1 ]; then
  2187.                 test -e /proc/splash && echo verbose > /proc/splash
  2188.                 checkmedia $cddev
  2189.                 Echo -n "Press ENTER for reboot: "; read nope
  2190.                 /sbin/reboot -f -i >/dev/null
  2191.             fi
  2192.             #======================================
  2193.             # search hybrid for a write partition
  2194.             #--------------------------------------
  2195.             for disknr in 2 3 4;do
  2196.                 id=`partitionID $biosBootDevice $disknr`
  2197.                 if [ "$id" = "83" ];then
  2198.                     export HYBRID_RW=$biosBootDevice$disknr
  2199.                     break
  2200.                 fi
  2201.             done
  2202.             #======================================
  2203.             # device found go with it
  2204.             #--------------------------------------
  2205.             return
  2206.         fi
  2207.         umount $cddev &>/dev/null
  2208.     fi
  2209.     echo
  2210.     systemException \
  2211.         "Couldn't find Live image configuration file" \
  2212.     "reboot"
  2213. }
  2214. #======================================
  2215. # CDUmount
  2216. #--------------------------------------
  2217. function CDUmount {
  2218.     # /.../
  2219.     # umount the CD device
  2220.     # ----
  2221.     umount $cddev
  2222. }
  2223. #======================================
  2224. # CDEject
  2225. #--------------------------------------
  2226. function CDEject {
  2227.     eject $cddev
  2228. }
  2229. #======================================
  2230. # searchBIOSBootDevice
  2231. #--------------------------------------
  2232. function searchBIOSBootDevice {
  2233.     # /.../
  2234.     # search for the BIOS boot device which is the device
  2235.     # with the BIOS id 0x80. The test may fail if the boot
  2236.     # device is a CD/DVD drive. If the test fails we search
  2237.     # for the MBR disk label and compare it with the kiwi
  2238.     # written mbrid file in /boot/grub/ of the system image
  2239.     # ----
  2240.     IFS=$IFS_ORIG
  2241.     local h=/usr/sbin/hwinfo
  2242.     local c="Device File:|BIOS id"
  2243.     local ddevs=`$h --disk|grep -E "$c"|sed -e"s@(.*)@@"|cut -f2 -d:|tr -d " "`
  2244.     local cmpd=/tmp/mbrids
  2245.     local ifix=0
  2246.     local matched
  2247.     local bios
  2248.     local file
  2249.     local pred
  2250.     #======================================
  2251.     # Store device with BIOS id 0x80
  2252.     #--------------------------------------
  2253.     for curd in $ddevs;do
  2254.         if [ $curd = "0x80" ];then
  2255.             bios=$pred; break
  2256.         fi
  2257.         pred=$curd
  2258.     done
  2259.     #======================================
  2260.     # Check for OEM ISO installation mode
  2261.     #--------------------------------------
  2262.     if [ ! -z "$cdinst" ];then
  2263.         CDMount
  2264.         umount $cddev
  2265.         curd=$cddev
  2266.         export biosBootDevice=$curd
  2267.         return 0
  2268.     fi
  2269.     #======================================
  2270.     # Search and copy all mbrid files 
  2271.     #--------------------------------------
  2272.     mkdir -p $cmpd
  2273.     for curd in $ddevs;do
  2274.         if [ ! $(echo $curd | cut -c 1) = "/" ];then
  2275.             continue
  2276.         fi
  2277.         for id in 1 2 3;do
  2278.             dev=$(ddn $curd $id)
  2279.             if ! mount -o ro $dev /mnt;then
  2280.                 continue
  2281.             fi
  2282.             if [ -f /mnt/boot/grub/mbrid ];then
  2283.                 cp -a /mnt/boot/grub/mbrid $cmpd/mbrid$ifix
  2284.                 ifix=$(expr $ifix + 1)
  2285.                 umount /mnt
  2286.                 break
  2287.             fi
  2288.             umount /mnt
  2289.         done
  2290.     done
  2291.     #======================================
  2292.     # Read mbrid from the newest mbrid file 
  2293.     #--------------------------------------
  2294.     file=$(ls -1t $cmpd 2>/dev/null | head -n 1)
  2295.     if [ -z "$file" ];then
  2296.         export biosBootDevice="Failed to find MBR identifier !"
  2297.         return 1
  2298.     fi
  2299.     read mbrI < $cmpd/$file
  2300.     #======================================
  2301.     # Compare ID with MBR entry 
  2302.     #--------------------------------------
  2303.     ifix=0
  2304.     for curd in $ddevs;do
  2305.         if [ ! -b $curd ];then
  2306.             continue
  2307.         fi
  2308.         mbrM=`dd if=$curd bs=1 count=4 skip=$((0x1b8))|hexdump -n4 -e '"0x%x"'`
  2309.         if [ "$mbrM" = "$mbrI" ];then
  2310.             ifix=1
  2311.             matched=$curd
  2312.             if [ "$curd" = "$bios" ];then
  2313.                 export biosBootDevice=$curd
  2314.                 return 0
  2315.             fi
  2316.         fi
  2317.     done
  2318.     if [ $ifix -eq 1 ];then
  2319.         export biosBootDevice=$matched
  2320.         return 0
  2321.     fi
  2322.     export biosBootDevice="No devices matches MBR identifier: $mbrI !"
  2323.     return 2
  2324. }
  2325. #======================================
  2326. # searchVolumeGroup
  2327. #--------------------------------------
  2328. function searchVolumeGroup {
  2329.     # /.../
  2330.     # search for a volume group named kiwiVG and if it can be
  2331.     # found activate it while creating appropriate device nodes:
  2332.     # /dev/kiwiVG/LVRoot and/or /dev/kiwiVG/LVComp
  2333.     # return zero on success
  2334.     # ----
  2335.     if vgscan 2>&1 | grep -q "kiwiVG"; then
  2336.         vgchange -a y kiwiVG
  2337.         return $?
  2338.     fi
  2339.     return 1
  2340. }
  2341. #======================================
  2342. # searchSwapSpace
  2343. #--------------------------------------
  2344. function searchSwapSpace {
  2345.     # /.../
  2346.     # search for a type=82 swap partition
  2347.     # ----
  2348.     if [ ! -z $kiwinoswapsearch ];then
  2349.         return
  2350.     fi
  2351.     local hwapp=/usr/sbin/hwinfo
  2352.     local diskdevs=`$hwapp --disk | grep "Device File:" | cut -f2 -d:`
  2353.     diskdevs=`echo $diskdevs | sed -e "s@(.*)@@"`
  2354.     for diskdev in $diskdevs;do
  2355.         for disknr in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15;do
  2356.             id=`partitionID $diskdev $disknr`
  2357.             if [ "$id" = "82" ];then
  2358.                 echo $diskdev$disknr
  2359.                 return
  2360.             fi
  2361.         done
  2362.     done
  2363. }
  2364. #======================================
  2365. # searchDiskSpace
  2366. #--------------------------------------
  2367. function searchDiskSpace {
  2368.     # /.../
  2369.     # search for a free non swap partition
  2370.     # ----
  2371.     if [ ! -z $kiwinoswapsearch ];then
  2372.         return
  2373.     fi
  2374.     local hwapp=/usr/sbin/hwinfo
  2375.     local diskdevs=`$hwapp --disk | grep "Device File:" | cut -f2 -d:`
  2376.     diskdevs=`echo $diskdevs | sed -e "s@(.*)@@"`
  2377.     for diskdev in $diskdevs;do
  2378.         for disknr in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15;do
  2379.             id=`partitionID $diskdev $disknr`
  2380.             if [ -z $id ];then
  2381.                 id=0
  2382.             fi
  2383.             if [ "$id" -ne 82 ] && [ "$id" -ne 0 ];then
  2384.                 echo $diskdev$disknr
  2385.                 return
  2386.             fi
  2387.         done
  2388.     done
  2389. }
  2390. #======================================
  2391. # updateMTAB
  2392. #--------------------------------------
  2393. function updateMTAB {
  2394.     prefix=$1
  2395.     umount=0
  2396.     if [ ! -e /proc/mounts ];then
  2397.         mount -t proc proc /proc
  2398.         umount=1
  2399.     fi
  2400.     cat /proc/mounts > $prefix/etc/mtab
  2401.     if [ $umount -eq 1 ];then
  2402.         umount /proc
  2403.     fi
  2404. }
  2405. #======================================
  2406. # probeNetworkCard
  2407. #--------------------------------------
  2408. function probeNetworkCard {
  2409.     # /.../
  2410.     # use hwinfo to probe for all network devices. The
  2411.     # function will check for the driver which is needed
  2412.     # to support the card and returns the information in
  2413.     # the networkModule variable
  2414.     # ----
  2415.     IFS="%"
  2416.     local module=""
  2417.     local hwicmd="/usr/sbin/hwinfo"
  2418.     for i in \
  2419.         `$hwicmd --netcard | grep "Driver [IA]" | 
  2420.         sed -es"@modprobe\(.*\)\"@\1%@" | tr -d "\n"`
  2421.     do
  2422.         if echo $i | grep -q "#0";then
  2423.             module=`echo $i | cut -f2 -d"\"" | tr -d " "`
  2424.             module=`echo $module | sed -es"@modprobe@@g"`
  2425.             IFS=";"
  2426.             for m in $module;do
  2427.                 if ! echo $networkModule | grep -q $m;then
  2428.                     if [ ! -z "$networkModule" ];then
  2429.                         networkModule="$networkModule:$m"
  2430.                     else
  2431.                         networkModule=$m
  2432.                     fi
  2433.                 fi
  2434.             done
  2435.         fi
  2436.     done
  2437.     IFS=$IFS_ORIG
  2438.     networkModule=`echo $networkModule`
  2439. }
  2440. #======================================
  2441. # setupNetwork
  2442. #--------------------------------------
  2443. function setupNetwork {
  2444.     # /.../
  2445.     # probe for the existing network interface names and
  2446.     # hardware addresses. Match the BOOTIF address from PXE
  2447.     # to the correct linux interface name. Setup the network
  2448.     # interface using a dhcp request. On success the dhcp
  2449.     # info file is imported into the current shell environment
  2450.     # and the nameserver information is written to
  2451.     # /etc/resolv.conf
  2452.     # ----
  2453.     IFS="
  2454.     "
  2455.     local MAC=0
  2456.     local DEV=0
  2457.     local mac_list=0
  2458.     local dev_list=0
  2459.     local index=0
  2460.     local hwicmd=/usr/sbin/hwinfo
  2461.     local iface=eth0
  2462.     for i in `$hwicmd --netcard`;do
  2463.         IFS=$IFS_ORIG
  2464.         if echo $i | grep -q "HW Address:";then
  2465.             MAC=`echo $i | sed -e s"@HW Address:@@"`
  2466.             MAC=`echo $MAC`
  2467.             mac_list[$index]=$MAC
  2468.             index=`expr $index + 1`
  2469.         fi
  2470.         if echo $i | grep -q "Device File:";then
  2471.             DEV=`echo $i | sed -e s"@Device File:@@"`
  2472.             DEV=`echo $DEV`
  2473.             dev_list[$index]=$DEV
  2474.         fi
  2475.     done
  2476.     if [ -z $BOOTIF ];then
  2477.         # /.../
  2478.         # there is no PXE boot interface information. We will use
  2479.         # the first detected interface as fallback solution
  2480.         # ----
  2481.         iface=${dev_list[0]}
  2482.     else
  2483.         # /.../
  2484.         # evaluate the information from the PXE boot interface
  2485.         # if we found the MAC in the list the appropriate interface
  2486.         # name is assigned. if not eth0 is used as fallback
  2487.         # ----
  2488.         index=0
  2489.         BOOTIF=`echo $BOOTIF | cut -f2- -d - | tr "-" ":"`
  2490.         for i in ${mac_list[*]};do
  2491.             if [ $i = $BOOTIF ];then
  2492.                 iface=${dev_list[$index]}
  2493.             fi
  2494.             index=`expr $index + 1`
  2495.         done
  2496.     fi
  2497.     export PXE_IFACE=$iface
  2498.     dhcpcd -p $PXE_IFACE 1>&2
  2499.     if test $? != 0;then
  2500.         systemException \
  2501.             "Failed to setup DHCP network interface !" \
  2502.         "reboot"
  2503.     fi
  2504.     ifconfig lo 127.0.0.1 netmask 255.0.0.0 up
  2505.     for i in 1 2 3 4 5 6 7 8 9 0;do
  2506.         [ -s /var/lib/dhcpcd/dhcpcd-$PXE_IFACE.info ] && break
  2507.         sleep 2
  2508.     done
  2509.     importFile < /var/lib/dhcpcd/dhcpcd-$PXE_IFACE.info
  2510.     if [ -z "$DOMAIN" ] && [ -n "$DNSDOMAIN" ];then
  2511.         export DOMAIN=$DNSDOMAIN
  2512.     fi
  2513.     echo "search $DOMAIN" > /etc/resolv.conf
  2514.     if [ -z "$DNS" ] && [ -n "$DNSSERVERS" ];then
  2515.         export DNS=$DNSSERVERS
  2516.     fi
  2517.     IFS="," ; for i in $DNS;do
  2518.         echo "nameserver $i" >> /etc/resolv.conf
  2519.     done
  2520.     DHCPCHADDR=`echo $DHCPCHADDR | tr a-z A-Z`
  2521. }
  2522. #======================================
  2523. # updateNeeded
  2524. #--------------------------------------
  2525. function updateNeeded {
  2526.     # /.../
  2527.     # check the contents of the IMAGE key and compare the
  2528.     # image version file as well as the md5 sum of the installed
  2529.     # and the available image on the tftp server
  2530.     # ----
  2531.     SYSTEM_INTEGRITY=""
  2532.     SYSTEM_MD5STATUS=""
  2533.     local count=0
  2534.     IFS="," ; for i in $IMAGE;do
  2535.         field=0
  2536.         IFS=";" ; for n in $i;do
  2537.         case $field in
  2538.             0) field=1 ;;
  2539.             1) imageName=$n   ; field=2 ;;
  2540.             2) imageVersion=$n; field=3 ;;
  2541.             3) imageServer=$n ; field=4 ;;
  2542.             4) imageBlkSize=$n; field=5 ;;
  2543.             5) imageZipped=$n ;
  2544.         esac
  2545.         done
  2546.         atversion="$imageName-$imageVersion"
  2547.         versionFile="/mnt/etc/ImageVersion-$atversion"
  2548.         IFS=" "
  2549.         if [ -f "$versionFile" ];then
  2550.             read installed sum2 < $versionFile
  2551.         fi
  2552.         imageMD5s="image/$imageName-$imageVersion.md5"
  2553.         [ -z "$imageServer" ]  && imageServer=$SERVER
  2554.         [ -z "$imageBlkSize" ] && imageBlkSize=8192
  2555.         if [ ! -f /etc/image.md5 ];then
  2556.             fetchFile $imageMD5s /etc/image.md5 uncomp $imageServer
  2557.         fi
  2558.         read sum1 blocks blocksize zblocks zblocksize < /etc/image.md5
  2559.         if [ ! -z "$sum1" ];then
  2560.             SYSTEM_MD5STATUS="$SYSTEM_MD5STATUS:$sum1"
  2561.         else
  2562.             SYSTEM_MD5STATUS="$SYSTEM_MD5STATUS:none"
  2563.         fi
  2564.         if [ ! -z "$1" ];then
  2565.             continue
  2566.         fi
  2567.         if test "$count" = 1;then
  2568.         if test "$SYSTEM_INTEGRITY" = ":clean";then
  2569.             Echo "Main OS image update needed"
  2570.             Echo -b "Forcing download for multi image session"
  2571.             RELOAD_IMAGE="yes"
  2572.         fi
  2573.         fi
  2574.         count=$(($count + 1))
  2575.         Echo "Checking update status for image: $imageName"
  2576.         if test ! -z $RELOAD_IMAGE;then
  2577.             Echo -b "Update forced via RELOAD_IMAGE..."
  2578.             Echo -b "Update status: Clean"
  2579.             SYSTEM_INTEGRITY="$SYSTEM_INTEGRITY:clean"
  2580.             continue
  2581.         fi
  2582.         if test ! -f $versionFile;then
  2583.             Echo -b "Update forced: /etc/ImageVersion-$atversion not found"
  2584.             Echo -b "Update status: Clean"
  2585.             SYSTEM_INTEGRITY="$SYSTEM_INTEGRITY:clean"
  2586.             RELOAD_IMAGE="yes"
  2587.             continue
  2588.         fi
  2589.         Echo -b "Current: $atversion Installed: $installed"
  2590.         if test "$atversion" = "$installed";then
  2591.             if test "$sum1" = "$sum2";then
  2592.                 Echo -b "Update status: Fine"
  2593.                 SYSTEM_INTEGRITY="$SYSTEM_INTEGRITY:fine"
  2594.                 continue
  2595.             fi
  2596.             Echo -b "Image Update for image [ $imageName ] needed"
  2597.             Echo -b "Image version equals but md5 checksum failed"
  2598.             Echo -b "This means the contents of the new image differ"
  2599.             RELOAD_IMAGE="yes"
  2600.         else
  2601.             Echo -b "Image Update for image [ $imageName ] needed"
  2602.             Echo -b "Name and/or image version differ"
  2603.             RELOAD_IMAGE="yes"
  2604.         fi
  2605.         Echo -b "Update status: Clean"
  2606.         SYSTEM_INTEGRITY="$SYSTEM_INTEGRITY:clean"
  2607.     done
  2608.     SYSTEM_INTEGRITY=`echo $SYSTEM_INTEGRITY | cut -f2- -d:`
  2609.     SYSTEM_MD5STATUS=`echo $SYSTEM_MD5STATUS | cut -f2- -d:`
  2610. }
  2611. #======================================
  2612. # cleanSweep
  2613. #--------------------------------------
  2614. function cleanSweep {
  2615.     # /.../
  2616.     # zero out a the given disk device
  2617.     # ----
  2618.     local diskDevice=$1
  2619.     dd if=/dev/zero of=$diskDevice bs=32M >/dev/null
  2620. }
  2621. #======================================
  2622. # createFileSystem
  2623. #--------------------------------------
  2624. function createFileSystem {
  2625.     # /.../
  2626.     # create a filesystem on the specified partition
  2627.     # if the partition is of type LVM a volume group
  2628.     # is created
  2629.     # ----
  2630.     diskPartition=$1
  2631.     diskID=`echo $diskPartition | sed -e s@[^0-9]@@g`
  2632.     diskPD=`echo $diskPartition | sed -e s@[0-9]@@g`
  2633.     diskPartitionType=`partitionID $diskPD $diskID`
  2634.     if test "$diskPartitionType" = "8e";then
  2635.         Echo "Creating Volume group [systemvg]"
  2636.         pvcreate $diskPartition >/dev/null
  2637.         vgcreate systemvg $diskPartition >/dev/null
  2638.     else
  2639.         # .../
  2640.         # Create partition in case it is not root system and
  2641.         # there is no system  already created There is no need to
  2642.         # create a filesystem on the root partition
  2643.         # ----
  2644.         if test $diskID -gt 2; then
  2645.             if ! e2fsck -p $diskPartition 1>&2; then
  2646.                 Echo "Partition $diskPartition is not valid, formating..."
  2647.                 mke2fs -T ext3 -j $diskPartition 1>&2
  2648.                 if test $? != 0; then
  2649.                     systemException \
  2650.                         "Failed to create filesystem on: $diskPartition !" \
  2651.                     "reboot"
  2652.                 fi
  2653.             else
  2654.                 Echo "Partition $diskPartition is valid, leave it untouched"
  2655.             fi
  2656.         fi
  2657.     fi
  2658. }
  2659. #======================================
  2660. # checkExtended
  2661. #--------------------------------------
  2662. function checkExtended {
  2663.     # /.../
  2664.     # check the IMAGE system partition and adapt if the index
  2665.     # was increased due to an extended partition
  2666.     # ----
  2667.     local iDevice=""
  2668.     local iNumber=""
  2669.     local iNewDev=""
  2670.     local iPartNr=""
  2671.     IFS="," ; for i in $PART;do
  2672.         iPartNr=`expr $iPartNr + 1`
  2673.     done
  2674.     if [ $iPartNr -gt 4 ];then
  2675.         iDevice=`echo $IMAGE | cut -f1 -d";" | cut -f2 -d=`
  2676.         iNumber=`echo $iDevice | tr -d "a-zA-Z\/"`
  2677.         if [ $iNumber -ge 4 ];then
  2678.             iNumber=`expr $iNumber + 1`
  2679.             iNewDev=$DISK$iNumber
  2680.             IMAGE=`echo $IMAGE | sed -e s@$iDevice@$iNewDev@`
  2681.         fi
  2682.     fi
  2683. }
  2684. #======================================
  2685. # sfdiskGetPartitionID
  2686. #--------------------------------------
  2687. function sfdiskGetPartitionID {
  2688.     # /.../
  2689.     # prints the partition ID for the given device and number
  2690.     # ----
  2691.     sfdisk -c $1 $2
  2692. }
  2693. #======================================
  2694. # sfdiskPartitionCount
  2695. #--------------------------------------
  2696. function sfdiskPartitionCount {
  2697.     # /.../
  2698.     # calculate the number of partitions to create. If the
  2699.     # number is more than 4 an extended partition needs to be
  2700.     # created.
  2701.     # ----
  2702.     IFS="," ; for i in $PART;do
  2703.         PART_NUMBER=`expr $PART_NUMBER + 1`
  2704.     done
  2705.     if [ $PART_NUMBER -gt 4 ];then
  2706.         PART_NEED_EXTENDED=1
  2707.     fi
  2708.     PART_NUMBER=`expr $PART_NUMBER + 1`
  2709.     PART_NEED_FILL=`expr $PART_NUMBER / 8`
  2710.     PART_NEED_FILL=`expr 8 - \( $PART_NUMBER - $PART_NEED_FILL \* 8 \)`
  2711. }
  2712. #======================================
  2713. # sfdiskFillPartition
  2714. #--------------------------------------
  2715. function sfdiskFillPartition {
  2716.     # /.../
  2717.     # in case of an extended partition the number of input lines
  2718.     # must be a multiple of 4, so this function will fill the input
  2719.     # with empty lines to make sfdisk happy
  2720.     # ----
  2721.     while test $PART_NEED_FILL -gt 0;do
  2722.         echo >> $PART_FILE
  2723.         PART_NEED_FILL=`expr $PART_NEED_FILL - 1`
  2724.     done
  2725. }
  2726. #======================================
  2727. # sfdiskCreateSwap
  2728. #--------------------------------------
  2729. function sfdiskCreateSwap {
  2730.     # /.../
  2731.     # create the sfdisk input line for setting up the
  2732.     # swap space
  2733.     # ----
  2734.     IFS="," ; for i in $PART;do
  2735.         field=0
  2736.         IFS=";" ; for n in $i;do
  2737.         case $field in
  2738.             0) partSize=$n   ; field=1 ;;
  2739.             1) partID=$n     ; field=2 ;;
  2740.             2) partMount=$n;
  2741.         esac
  2742.         done
  2743.         if test $partID = "82" -o $partID = "S";then
  2744.             echo "0,$partSize,$partID,-" > $PART_FILE
  2745.             PART_COUNT=`expr $PART_COUNT + 1`
  2746.             return
  2747.         fi
  2748.     done
  2749. }
  2750. #======================================
  2751. # sfdiskCreatePartition
  2752. #--------------------------------------
  2753. function sfdiskCreatePartition {
  2754.     # /.../
  2755.     # create the sfdisk input lines for setting up the
  2756.     # partition table except the swap space
  2757.     # ----
  2758.     devices=1
  2759.     IFS="," ; for i in $PART;do
  2760.         field=0
  2761.         IFS=";" ; for n in $i;do
  2762.         case $field in
  2763.             0) partSize=$n   ; field=1 ;;
  2764.             1) partID=$n     ; field=2 ;;
  2765.             2) partMount=$n;
  2766.         esac
  2767.         done
  2768.         if test $partID = "82" -o $partID = "S";then
  2769.             continue
  2770.         fi
  2771.         if test $partSize = "x";then
  2772.             partSize=""
  2773.         fi
  2774.         if [ $PART_COUNT -eq 1 ];then
  2775.             echo ",$partSize,$partID,*" >> $PART_FILE
  2776.         else
  2777.             echo ",$partSize,$partID,-" >> $PART_FILE
  2778.         fi
  2779.         PART_COUNT=`expr $PART_COUNT + 1`
  2780.         if [ $PART_NEED_EXTENDED -eq 1 ];then
  2781.         if [ $PART_COUNT -eq 3 ];then
  2782.             echo ",,E" >> $PART_FILE
  2783.             NO_FILE_SYSTEM=1
  2784.         fi
  2785.         fi
  2786.         devices=`expr $devices + 1`
  2787.         if test -z "$PART_MOUNT";then
  2788.             PART_MOUNT="$partMount"
  2789.             PART_DEV="$DISK$devices"
  2790.         else
  2791.             PART_MOUNT="$PART_MOUNT:$partMount"
  2792.             if [ $NO_FILE_SYSTEM -eq 2 ];then
  2793.                 devices=`expr $devices + 1`
  2794.                 NO_FILE_SYSTEM=0
  2795.             fi
  2796.             PART_DEV="$PART_DEV:$DISK$devices"
  2797.         fi
  2798.         if [ $NO_FILE_SYSTEM -eq 1 ];then
  2799.             NO_FILE_SYSTEM=2
  2800.         fi
  2801.     done
  2802.     if [ $PART_NEED_EXTENDED -eq 1 ];then
  2803.         sfdiskFillPartition
  2804.     fi
  2805.     export PART_MOUNT
  2806.     export PART_DEV
  2807. }
  2808. #======================================
  2809. # sfdiskWritePartitionTable
  2810. #--------------------------------------
  2811. function sfdiskWritePartitionTable {
  2812.     # /.../
  2813.     # write the partition table using PART_FILE as
  2814.     # input for sfdisk
  2815.     # ----
  2816.     local diskDevice=$1
  2817.     dd if=/dev/zero of=$diskDevice bs=512 count=1 >/dev/null
  2818.     sfdisk -uM --force $diskDevice < $PART_FILE >/dev/null
  2819.     if test $? != 0;then
  2820.         systemException \
  2821.             "Failed to create partition table on: $diskDevice !" \
  2822.         "reboot"
  2823.     fi
  2824.     verifyOutput=`sfdisk -V $diskDevice`
  2825.     if test $? != 0;then
  2826.         systemException \
  2827.             "Failed to verify partition table on $diskDevice: $verifyOutput" \
  2828.         "reboot"
  2829.     fi
  2830.     rm -f $PART_FILE
  2831. }
  2832. #======================================
  2833. # partedGetPartitionID
  2834. #--------------------------------------
  2835. function partedGetPartitionID {
  2836.     # /.../
  2837.     # prints the partition ID for the given device and number
  2838.     # ----
  2839.     local disk=`echo $1 | sed -e s"@[0-9]@@g"`
  2840.     parted -m -s $disk print | grep ^$2: | cut -f10 -d, | cut -f2 -d=
  2841. }
  2842. #======================================
  2843. # partedCreatePartition
  2844. #--------------------------------------
  2845. function partedCreatePartition {
  2846.     # /.../
  2847.     # create the parted input data for setting up the
  2848.     # partition table
  2849.     # ----
  2850.     p_stopp=0
  2851.     dd if=/dev/zero of=$DISK bs=512 count=1 >/dev/null && \
  2852.         /usr/sbin/parted -s $DISK mklabel msdos
  2853.     if [ $? -ne 0 ];then
  2854.         systemException \
  2855.             "Failed to clean partition table on: $DISK !" \
  2856.             "reboot"
  2857.     fi
  2858.     p_opts="-s $DISK unit s print"
  2859.     p_size=`/usr/sbin/parted $p_opts | grep "^Disk" | cut -f2 -d: | cut -f1 -ds`
  2860.     p_size=`echo $p_size`
  2861.     p_size=`expr $p_size - 1`
  2862.     p_cmd="/usr/sbin/parted -s $DISK unit s"
  2863.     IFS="," ; for i in $PART;do
  2864.         field=0
  2865.         IFS=";" ; for n in $i;do
  2866.         case $field in
  2867.             0) partSize=$n ; field=1 ;;
  2868.             1) partID=$n   ; field=2 ;;
  2869.             2) partMount=$n;
  2870.         esac
  2871.         done
  2872.         PART_COUNT=`expr $PART_COUNT + 1`
  2873.         if test $partSize = "x";then
  2874.             partSize=$p_size
  2875.         else
  2876.             partSize=`expr $partSize \* 2048`
  2877.         fi
  2878.         if test $partID = "82" -o $partID = "S";then
  2879.             partedGetSectors 63 $partSize
  2880.             p_cmd="$p_cmd mkpartfs primary linux-swap $p_start $p_stopp"
  2881.             continue
  2882.         fi
  2883.         if [ $p_stopp = 0 ];then
  2884.             systemException \
  2885.                 "Invalid partition setup: $PART !" \
  2886.                 "reboot"
  2887.         fi
  2888.         partedGetSectors $p_stopp $partSize
  2889.         if [ $PART_COUNT -le 3 ];then
  2890.             p_cmd="$p_cmd mkpart primary $p_start $p_stopp"
  2891.             p_cmd="$p_cmd set $PART_COUNT type 0x$partID"
  2892.         else
  2893.             if [ $PART_COUNT -eq 4 ];then
  2894.                 p_cmd="$p_cmd mkpart extended $p_start $p_size"
  2895.                 p_cmd="$p_cmd set $PART_COUNT type 0x85"
  2896.                 PART_COUNT=`expr $PART_COUNT + 1`
  2897.                 NO_FILE_SYSTEM=1
  2898.             fi
  2899.             p_start=`expr $p_start + 1`
  2900.             p_cmd="$p_cmd mkpart logical $p_start $p_stopp"
  2901.             p_cmd="$p_cmd set $PART_COUNT type 0x$partID"
  2902.         fi
  2903.         if test -z "$PART_MOUNT";then
  2904.             PART_MOUNT="$partMount"
  2905.             PART_DEV="$DISK$devices"
  2906.         else
  2907.             PART_MOUNT="$PART_MOUNT:$partMount"
  2908.             if [ $NO_FILE_SYSTEM -eq 2 ];then
  2909.                 NO_FILE_SYSTEM=0
  2910.             fi
  2911.             PART_DEV="$PART_DEV:$DISK$devices"
  2912.         fi
  2913.         if [ $NO_FILE_SYSTEM -eq 1 ];then
  2914.             NO_FILE_SYSTEM=2
  2915.         fi
  2916.     done
  2917.     export PART_MOUNT
  2918.     export PART_DEV
  2919.     p_cmd="$p_cmd set 2 boot on"
  2920. }
  2921. #======================================
  2922. # partedGetSectors
  2923. #--------------------------------------
  2924. function partedGetSectors {
  2925.     # /.../
  2926.     # calculate start/end sector for given
  2927.     # sector size
  2928.     # ---
  2929.     p_start=$1
  2930.     if [ $p_start -gt 63 ];then
  2931.         p_start=`expr $p_start + 1`
  2932.     fi
  2933.     p_stopp=`expr $p_start + $2`
  2934.     if [ $p_stopp -gt $p_size ];then
  2935.         p_stopp=$p_size
  2936.     fi
  2937. }
  2938. #======================================
  2939. # partedWritePartitionTable
  2940. #--------------------------------------
  2941. function partedWritePartitionTable {
  2942.     # /.../
  2943.     # write the partition table using parted
  2944.     # ----
  2945.     local diskDevice=$1
  2946.     eval $p_cmd
  2947.     if test $? != 0;then
  2948.         systemException \
  2949.             "Failed to create partition table on: $diskDevice !" \
  2950.         "reboot"
  2951.     fi
  2952. }
  2953. #======================================
  2954. # partitionID
  2955. #--------------------------------------
  2956. function partitionID {
  2957.     local diskDevice=$1
  2958.     local diskNumber=$2
  2959.     if [ $PARTITIONER = "sfdisk" ];then
  2960.         sfdiskGetPartitionID $diskDevice $diskNumber
  2961.     else
  2962.         partedGetPartitionID $diskDevice $diskNumber
  2963.     fi
  2964. }
  2965. #======================================
  2966. # partitionSize
  2967. #--------------------------------------
  2968. function partitionSize {
  2969.     local diskDevice=$1
  2970.     if [ -z "$diskDevice" ] || [ ! -e "$diskDevice" ];then
  2971.         return 1
  2972.     fi
  2973.     expr $(blockdev --getsize64 $diskDevice) / 1024
  2974. }
  2975. #======================================
  2976. # partitionCount
  2977. #--------------------------------------
  2978. function partitionCount {
  2979.     if [ $PARTITIONER = "sfdisk" ];then
  2980.         sfdiskPartitionCount
  2981.     fi
  2982. }
  2983. #======================================
  2984. # createSwap
  2985. #--------------------------------------
  2986. function createSwap {
  2987.     if [ $PARTITIONER = "sfdisk" ];then
  2988.         sfdiskCreateSwap
  2989.     fi
  2990. }
  2991. #======================================
  2992. # createPartition
  2993. #--------------------------------------
  2994. function createPartition {
  2995.     if [ $PARTITIONER = "sfdisk" ];then
  2996.         sfdiskCreatePartition
  2997.     else
  2998.         partedCreatePartition
  2999.     fi
  3000. }
  3001. #======================================
  3002. # writePartitionTable
  3003. #--------------------------------------
  3004. function writePartitionTable {
  3005.     if [ $PARTITIONER = "sfdisk" ];then
  3006.         sfdiskWritePartitionTable $1
  3007.     else
  3008.         partedWritePartitionTable $1
  3009.     fi
  3010. }
  3011. #======================================
  3012. # linuxPartition
  3013. #--------------------------------------
  3014. function linuxPartition {
  3015.     # /.../
  3016.     # check for a linux partition on partition number 2
  3017.     # using the given disk device. On success return 0
  3018.     # ----
  3019.     local diskDevice=$1
  3020.     local diskPartitionType=`partitionID $diskDevice 2`
  3021.     if test "$diskPartitionType" = "83";then
  3022.         return 0
  3023.     fi
  3024.     return 1
  3025. }
  3026. #======================================
  3027. # kernelList
  3028. #--------------------------------------
  3029. function kernelList {
  3030.     # /.../
  3031.     # check for all installed kernels whether there are valid
  3032.     # links to the initrd and kernel files. The function will
  3033.     # save the valid linknames in the variable KERNEL_LIST
  3034.     # ----
  3035.     local prefix=$1
  3036.     local kcount=0
  3037.     local kname=""
  3038.     local kernel=""
  3039.     local initrd=""
  3040.     KERNEL_LIST=""
  3041.     KERNEL_NAME=""
  3042.     for i in $prefix/lib/modules/*;do
  3043.         if [ ! -d $i ];then
  3044.             continue
  3045.         fi
  3046.         unset KERNEL_PAIR
  3047.         unset kernel
  3048.         unset initrd
  3049.         kname=`basename $i`
  3050.         for k in $prefix/boot/vmlinu[zx]-${i##*/}; do
  3051.             if [ -f $k ];then
  3052.                 kernel=${k##*/}
  3053.                 initrd=initrd-${i##*/}
  3054.             fi
  3055.         done
  3056.         if [ -z $kernel ];then
  3057.             continue
  3058.         fi
  3059.         kcount=$((kcount+1))
  3060.         KERNEL_PAIR=$kernel:$initrd
  3061.         KERNEL_NAME[$kcount]=$kname
  3062.         if [ $kcount = 1 ];then
  3063.             KERNEL_LIST=$KERNEL_PAIR
  3064.         elif [ $kcount -gt 1 ];then
  3065.             KERNEL_LIST=$KERNEL_LIST,$KERNEL_PAIR
  3066.         fi
  3067.     done
  3068.     if [ -z "$KERNEL_LIST" ];then
  3069.         # /.../
  3070.         # the system image doesn't provide the kernel and initrd but
  3071.         # if there is a downloaded kernel and initrd from the KIWI_INITRD
  3072.         # setup. the kernelList function won't find initrds that gets
  3073.         # downloaded over tftp so make sure the vmlinu[zx]/initrd combo
  3074.         # gets added
  3075.         # ----
  3076.         if [ -e $prefix/boot/vmlinuz ];then
  3077.             KERNEL_LIST="vmlinuz:initrd"
  3078.             KERNEL_NAME[1]=vmlinuz
  3079.         fi
  3080.         if [ -e $prefix/boot/vmlinux ];then
  3081.             KERNEL_LIST="vmlinux:initrd"
  3082.             KERNEL_NAME[1]=vmlinux
  3083.         fi
  3084.     fi
  3085.     export KERNEL_LIST
  3086.     export KERNEL_NAME
  3087. }
  3088. #======================================
  3089. # validateSize
  3090. #--------------------------------------
  3091. function validateSize {
  3092.     # /.../
  3093.     # check if the image fits into the requested partition.
  3094.     # An information about the sizes is printed out
  3095.     # ----
  3096.     haveBytes=`partitionSize $imageDevice`
  3097.     haveBytes=`expr $haveBytes \* 1024`
  3098.     haveMByte=`expr $haveBytes / 1048576`
  3099.     needBytes=`expr $blocks \* $blocksize`
  3100.     needMByte=`expr $needBytes / 1048576`
  3101.     Echo "Have size: $imageDevice -> $haveBytes Bytes [ $haveMByte MB ]"
  3102.     Echo "Need size: $needBytes Bytes [ $needMByte MB ]"
  3103.     if test $haveBytes -gt $needBytes;then
  3104.         return 0
  3105.     fi
  3106.     return 1
  3107. }
  3108. #======================================
  3109. # validateTarSize
  3110. #--------------------------------------
  3111. function validateTarSize {
  3112.     # /.../
  3113.     # this function requires a destination directory which
  3114.     # could be a tmpfs mount and a compressed tar source file.
  3115.     # The function will then check if the tar file could be
  3116.     # unpacked according to the size of the destination
  3117.     # ----
  3118.     local tsrc=$1
  3119.     local haveKByte=0
  3120.     local haveMByte=0
  3121.     local needBytes=0
  3122.     local needMByte=0
  3123.     haveKByte=`cat /proc/meminfo | grep MemFree | cut -f2 -d: | cut -f1 -dk`
  3124.     haveMByte=`expr $haveKByte / 1024`
  3125.     needBytes=`du --bytes $tsrc | cut -f1`
  3126.     needMByte=`expr $needBytes / 1048576`
  3127.     Echo "Have size: proc/meminfo -> $haveMByte MB"
  3128.     Echo "Need size: $tsrc -> $needMByte MB [ uncompressed ]"
  3129.     if test $haveMByte -gt $needMByte;then
  3130.         return 0
  3131.     fi
  3132.     return 1
  3133. }
  3134. #======================================
  3135. # validateBlockSize
  3136. #--------------------------------------
  3137. function validateBlockSize {
  3138.     # /.../
  3139.     # check the block size value. atftp limits to a maximum of
  3140.     # 65535 blocks, so the block size must be checked according
  3141.     # to the size of the image. The block size itself is also
  3142.     # limited to 65464 bytes
  3143.     # ----
  3144.     if [ -z "$zblocks" ] && [ -z "$blocks" ];then
  3145.         # md5 file not yet read in... skip
  3146.         return
  3147.     fi
  3148.     if [ ! -z "$zblocks" ];then
  3149.         isize=`expr $zblocks \* $zblocksize`
  3150.     else
  3151.         isize=`expr $blocks \* $blocksize`
  3152.     fi
  3153.     isize=`expr $isize / 65535`
  3154.     if [ $isize -gt $imageBlkSize ];then
  3155.         imageBlkSize=`expr $isize + 1024`
  3156.     fi
  3157.     if [ $imageBlkSize -gt 65464 ];then
  3158.         systemException \
  3159.             "Maximum blocksize for atftp protocol exceeded" \
  3160.         "reboot"
  3161.     fi
  3162. }
  3163. #======================================
  3164. # loadOK
  3165. #--------------------------------------
  3166. function loadOK {
  3167.     # /.../
  3168.     # check the output of the atftp command, unfortunately
  3169.     # there is no useful return code to check so we have to
  3170.     # check the output of the command
  3171.     # ----
  3172.     for i in "File not found" "aborting" "no option named" "unknown host" ; do
  3173.         if echo "$1" | grep -q  "$i" ; then
  3174.             return 1
  3175.         fi
  3176.     done
  3177.     return 0
  3178. }
  3179. #======================================
  3180. # includeKernelParameters
  3181. #--------------------------------------
  3182. function includeKernelParameters {
  3183.     # /.../
  3184.     # include the parameters from /proc/cmdline into
  3185.     # the current shell environment
  3186.     # ----
  3187.     IFS=$IFS_ORIG
  3188.     for i in `cat /proc/cmdline`;do
  3189.         if ! echo $i | grep -q "=";then
  3190.             continue
  3191.         fi
  3192.         kernelKey=`echo $i | cut -f1 -d=`
  3193.         kernelVal=`echo $i | cut -f2 -d=`
  3194.         eval export $kernelKey=$kernelVal
  3195.     done
  3196.     if [ ! -z "$kiwikernelmodule" ];then
  3197.         kiwikernelmodule=`echo $kiwikernelmodule | tr , " "`
  3198.     fi
  3199.     if [ ! -z "$kiwibrokenmodule" ];then
  3200.         kiwibrokenmodule=`echo $kiwibrokenmodule | tr , " "`
  3201.     fi
  3202.     if [ ! -z "$kiwistderr" ];then
  3203.         export ELOG_CONSOLE=$kiwistderr
  3204.         export ELOG_EXCEPTION=$kiwistderr
  3205.     fi
  3206.     if [ ! -z "$ramdisk_size" ];then
  3207.         local modfile=/etc/modprobe.conf.local
  3208.         if [ -f $modfile ];then
  3209.             sed -i -e s"@rd_size=.*@rd_size=$ramdisk_size@" $modfile
  3210.         fi
  3211.     fi
  3212.     if [ ! -z "$lang" ];then
  3213.         export DIALOG_LANG=$lang
  3214.     fi
  3215. }
  3216. #======================================
  3217. # checkServer
  3218. #--------------------------------------
  3219. function checkServer {
  3220.     # /.../
  3221.     # check the kernel commandline parameter kiwiserver.
  3222.     # If it exists its contents will be used as
  3223.     # server address stored in the SERVER variabe
  3224.     # ----
  3225.     if [ ! -z $kiwiserver ];then
  3226.         Echo "Found server in kernel cmdline"
  3227.         SERVER=$kiwiserver
  3228.     fi
  3229.     if [ ! -z $kiwiservertype ]; then
  3230.         Echo "Found server type in kernel cmdline"
  3231.         SERVERTYPE=$kiwiservertype
  3232.     else
  3233.         SERVERTYPE=tftp
  3234.     fi
  3235. }
  3236. #======================================
  3237. # umountSystem
  3238. #--------------------------------------
  3239. function umountSystem {
  3240.     local retval=0
  3241.     local OLDIFS=$IFS
  3242.     local mountPath=/mnt
  3243.     IFS=$IFS_ORIG
  3244.     if test ! -z $UNIONFS_CONFIG;then
  3245.         roDir=/read-only
  3246.         rwDir=/read-write
  3247.         xiDir=/xino
  3248.         if ! umount $mountPath >/dev/null;then
  3249.             retval=1
  3250.         fi
  3251.         for dir in $roDir $rwDir $xiDir;do
  3252.             if ! umount $dir >/dev/null;then
  3253.                 retval=1
  3254.             fi
  3255.         done
  3256.     elif test ! -z $COMBINED_IMAGE;then
  3257.         rm -f /read-only >/dev/null
  3258.         rm -f /read-write >/dev/null
  3259.         umount /mnt/read-only >/dev/null || retval=1
  3260.         umount /mnt/read-write >/dev/null || retval=1
  3261.         umount /mnt >/dev/null || retval=1
  3262.     else
  3263.         if ! umount $mountPath >/dev/null;then
  3264.             retval=1
  3265.         fi
  3266.     fi
  3267.     IFS=$OLDIFS
  3268.     return $retval
  3269. }
  3270. #======================================
  3271. # isFSTypeReadOnly
  3272. #--------------------------------------
  3273. function isFSTypeReadOnly {
  3274.     if [ "$FSTYPE" = "squashfs" ];then
  3275.         export unionFST=aufs
  3276.         return 0
  3277.     fi
  3278.     if [ "$FSTYPE" = "clicfs" ];then
  3279.         export unionFST=clicfs
  3280.         return 0
  3281.     fi
  3282.     return 1
  3283. }
  3284. #======================================
  3285. # kiwiMount
  3286. #--------------------------------------
  3287. function kiwiMount {
  3288.     local src=$1
  3289.     local dst=$2
  3290.     local opt=$3
  3291.     local lop=$4
  3292.     #======================================
  3293.     # load not autoloadable fs modules
  3294.     #--------------------------------------
  3295.     modprobe squashfs &>/dev/null
  3296.     #======================================
  3297.     # store old FSTYPE value
  3298.     #--------------------------------------
  3299.     if [ ! -z "$FSTYPE" ];then
  3300.         FSTYPE_SAVE=$FSTYPE
  3301.     fi
  3302.     #======================================
  3303.     # probe filesystem
  3304.     #--------------------------------------
  3305.     if [ ! "$FSTYPE" = "nfs" ];then
  3306.         if [ ! -z "$lop" ];then
  3307.             probeFileSystem $lop
  3308.         else
  3309.             probeFileSystem $src
  3310.         fi
  3311.     fi
  3312.     if [ -z "$FSTYPE" ] || [ "$FSTYPE" = "unknown" ];then
  3313.         FSTYPE="auto"
  3314.     fi
  3315.     #======================================
  3316.     # decide for a mount method
  3317.     #--------------------------------------
  3318.     if [ ! -z "$lop" ];then
  3319.         # /.../
  3320.         # if loop mount is requested a fixed loop1 device
  3321.         # was set as src parameter. Because this fixed loop
  3322.         # name is used later too we stick to this device name
  3323.         # ----
  3324.         losetup /dev/loop1 $lop
  3325.     fi
  3326.     if ! mount -t $FSTYPE $opt $src $dst >/dev/null;then
  3327.         return 1
  3328.     fi
  3329.     if [ ! -z "$FSTYPE_SAVE" ];then
  3330.         FSTYPE=$FSTYPE_SAVE
  3331.     fi
  3332.     return 0
  3333. }
  3334. #======================================
  3335. # setupReadWrite
  3336. #--------------------------------------
  3337. function setupReadWrite {
  3338.     # /.../
  3339.     # check/create read-write filesystem used for
  3340.     # overlay data
  3341.     # ----
  3342.     local rwDir=/read-write
  3343.     local rwDevice=`echo $UNIONFS_CONFIG | cut -d , -f 1`
  3344.     mkdir -p $rwDir
  3345.     if [ $LOCAL_BOOT = "no" ] && [ $systemIntegrity = "clean" ];then
  3346.         if [ "$RELOAD_IMAGE" = "yes" ] || \
  3347.             ! mount -o ro $rwDevice $rwDir >/dev/null
  3348.         then
  3349.             #======================================
  3350.             # store old FSTYPE value
  3351.             #--------------------------------------
  3352.             if [ ! -z "$FSTYPE" ];then
  3353.                 FSTYPE_SAVE=$FSTYPE
  3354.             fi
  3355.             #======================================
  3356.             # probe filesystem
  3357.             #--------------------------------------
  3358.             probeFileSystem $rwDevice
  3359.             if [ ! "$FSTYPE" = "unknown" ];then
  3360.                 Echo "Checking filesystem for RW data on $rwDevice..."
  3361.                 e2fsck -p $rwDevice
  3362.             fi
  3363.             #======================================
  3364.             # restore FSTYPE
  3365.             #--------------------------------------
  3366.             if [ ! -z "$FSTYPE_SAVE" ];then
  3367.                 FSTYPE=$FSTYPE_SAVE
  3368.             fi
  3369.             if [ "$RELOAD_IMAGE" = "yes" ] || \
  3370.                 ! mount -o ro $rwDevice $rwDir >/dev/null
  3371.             then
  3372.                 Echo "Creating filesystem for RW data on $rwDevice..."
  3373.                 if ! mke2fs -T ext3 -j $rwDevice >/dev/null;then
  3374.                     Echo "Failed to create ext3 filesystem"
  3375.                     return 1
  3376.                 fi
  3377.                 e2fsck -p $rwDevice >/dev/null
  3378.             fi
  3379.         else
  3380.             umount $rwDevice
  3381.         fi
  3382.     fi
  3383.     return 0
  3384. }
  3385. #======================================
  3386. # mountSystemUnified
  3387. #--------------------------------------
  3388. function mountSystemUnified {
  3389.     local loopf=$1
  3390.     local roDir=/read-only
  3391.     local roDevice=`echo $UNIONFS_CONFIG | cut -d , -f 2`
  3392.     #======================================
  3393.     # create read only mount point
  3394.     #--------------------------------------
  3395.     mkdir -p $roDir
  3396.     #======================================
  3397.     # check read/only device location
  3398.     #--------------------------------------
  3399.     if [ ! -z "$NFSROOT" ];then
  3400.         roDevice="$imageRootDevice"
  3401.     fi
  3402.     #======================================
  3403.     # mount read only device
  3404.     #--------------------------------------
  3405.     if ! kiwiMount "$roDevice" "$roDir" "" $loopf;then
  3406.         Echo "Failed to mount read only filesystem"
  3407.         return 1
  3408.     fi
  3409.     #======================================
  3410.     # check union mount method
  3411.     #--------------------------------------
  3412.     if [ -f $roDir/fsdata.ext3 ];then
  3413.         export haveDMSquash=yes
  3414.         mountSystemDMSquash
  3415.     else
  3416.         mountSystemOverlay
  3417.     fi
  3418. }
  3419. #======================================
  3420. # mountSystemDMSquash
  3421. #--------------------------------------
  3422. function mountSystemDMSquash {
  3423.     local roDir=/read-only
  3424.     local snDevice=/dev/mapper/sys_snap
  3425.     local rwDevice=`echo $UNIONFS_CONFIG | cut -d , -f 1`
  3426.     local roDevice=`echo $UNIONFS_CONFIG | cut -d , -f 2`
  3427.     local orig_loop=$(losetup -r -s -f $roDir/fsdata.ext3)
  3428.     local orig_sectors=$(blockdev --getsize $orig_loop)
  3429.     local snap_sectors=$(blockdev --getsz $rwDevice)
  3430.     local free_sectors=0
  3431.     local used_sectors=0
  3432.     local chunk=8
  3433.     local flags=p
  3434.     local count=0
  3435.     #======================================
  3436.     # check read-write persistency
  3437.     #--------------------------------------
  3438.     if getDiskDevice $rwDevice | grep -q ram;then
  3439.         flags=n
  3440.     fi
  3441.     #======================================
  3442.     # create snapshot device
  3443.     #--------------------------------------
  3444.     dmsetup create sys_snap --notable
  3445.     echo "0 $orig_sectors snapshot $orig_loop $rwDevice $flags $chunk" |\
  3446.         dmsetup load sys_snap
  3447.     #======================================
  3448.     # resume snapshot and origin devices
  3449.     #--------------------------------------
  3450.     dmsetup resume sys_snap
  3451.     #======================================
  3452.     # mount snapshot as root to /mnt
  3453.     #--------------------------------------
  3454.     mount $snDevice /mnt
  3455.     #======================================
  3456.     # check free size and snapshot size
  3457.     #--------------------------------------
  3458.     snap_sectors=$(($snap_sectors * 80 / 100))
  3459.     for i in $(df --block-size 512 /mnt | tail -n1);do
  3460.         count=`expr $count + 1`
  3461.         if [ $count = 3 ];then
  3462.             used_sectors=$i
  3463.         fi
  3464.         if [ $count = 4 ];then
  3465.             free_sectors=$i
  3466.         fi
  3467.     done
  3468.     if [ $snap_sectors -lt $free_sectors ];then
  3469.         # /.../
  3470.         # the snapshot space if less than the free space
  3471.         # of the filesystem. Therefore we need to resize
  3472.         # the filesystem to the free space of the snapshot
  3473.         # ----
  3474.         Echo "*** WARNING ***"
  3475.         Echo "The snapshot space is: $snap_sectors 512B sectors"
  3476.         Echo "which is smaller than the filesystem reported"
  3477.         Echo "free sectors of: $free_sectors"
  3478.         #umount /mnt
  3479.         #snap_sectors=$(($snap_sectors + $used_sectors))
  3480.         #resize2fs -f -p $snDevice "$snap_sectors"s
  3481.         #mount $snDevice /mnt
  3482.     fi
  3483. }
  3484. #======================================
  3485. # mountSystemClicFS
  3486. #--------------------------------------
  3487. function mountSystemClicFS {
  3488.     local loopf=$1
  3489.     local roDir=/read-only
  3490.     local rwDevice=`echo $UNIONFS_CONFIG | cut -d , -f 1`
  3491.     local roDevice=`echo $UNIONFS_CONFIG | cut -d , -f 2`
  3492.     local clic_cmd=clicfs
  3493.     local haveBytes
  3494.     local haveKByte
  3495.     local haveMByte
  3496.     local size
  3497.     #======================================
  3498.     # load fuse module
  3499.     #--------------------------------------
  3500.     modprobe fuse &>/dev/null
  3501.     #======================================
  3502.     # create read only mount point
  3503.     #--------------------------------------
  3504.     mkdir -p $roDir
  3505.     #======================================
  3506.     # check read/only device location
  3507.     #--------------------------------------
  3508.     if [ ! -z "$NFSROOT" ];then
  3509.         roDevice="$imageRootDevice"
  3510.     fi
  3511.     #======================================  
  3512.     # check kernel command line for log file  
  3513.     #--------------------------------------  
  3514.     if [ -n "$cliclog" ]; then  
  3515.         clic_cmd="$clic_cmd -l $cliclog"  
  3516.     fi  
  3517.     #======================================
  3518.     # check read/write device location
  3519.     #--------------------------------------
  3520.     getDiskDevice $rwDevice | grep -q ram
  3521.     if [ $? = 0 ];then
  3522.         haveKByte=`cat /proc/meminfo | grep MemFree | cut -f2 -d:| cut -f1 -dk`
  3523.         haveMByte=`expr $haveKByte / 1024`
  3524.         haveMByte=`expr $haveMByte \* 7 / 10`
  3525.         clic_cmd="$clic_cmd -m $haveMByte"
  3526.     else
  3527.         haveBytes=`blockdev --getsize64 $rwDevice`
  3528.         haveMByte=`expr $haveBytes / 1024 / 1024`
  3529.         clic_cmd="$clic_cmd -m $haveMByte -c $rwDevice --ignore-cow-errors"
  3530.     fi
  3531.     #======================================
  3532.     # mount/check clic file
  3533.     #--------------------------------------
  3534.     if [ ! -z "$NFSROOT" ];then
  3535.         #======================================
  3536.         # clic exported via NFS
  3537.         #--------------------------------------
  3538.         if ! kiwiMount "$roDevice" "$roDir" "" $loopf;then
  3539.             Echo "Failed to mount NFS filesystem"
  3540.             return 1
  3541.         fi
  3542.         if [ ! -e "$roDir/fsdata.ext3" ];then
  3543.             Echo "Can't find clic fsdata.ext3 in NFS export"
  3544.             return 1
  3545.         fi
  3546.     else
  3547.         #======================================
  3548.         # mount clic container
  3549.         #--------------------------------------
  3550.         if [ -z "$loopf" ];then
  3551.             loopf=$roDevice
  3552.         fi
  3553.         if ! $clic_cmd $loopf $roDir; then  
  3554.             Echo "Failed to mount clic filesystem"
  3555.             return 1
  3556.         fi 
  3557.     fi
  3558.     #======================================
  3559.     # mount root over clic
  3560.     #--------------------------------------
  3561.     size=`stat -c %s $roDir/fsdata.ext3`
  3562.     size=$((size/4096))
  3563.     # we don't want reserved blocks...
  3564.     tune2fs -m 0 $roDir/fsdata.ext3
  3565.     # we don't want automatic filesystem check...
  3566.     tune2fs -i 0 $roDir/fsdata.ext3
  3567.     if [ ! $LOCAL_BOOT = "no" ];then
  3568.         e2fsck -p $roDir/fsdata.ext3
  3569.     fi
  3570.     if [ $LOCAL_BOOT = "no" ];then
  3571.         resize2fs $roDir/fsdata.ext3 $size
  3572.     fi
  3573.     mount -o loop,noatime,nodiratime,errors=remount-ro,barrier=0 \
  3574.         $roDir/fsdata.ext3 /mnt
  3575.     if [ ! $? = 0 ];then
  3576.         Echo "Failed to mount ext3 clic container"
  3577.         return 1
  3578.     fi
  3579.     export haveClicFS=yes
  3580.     return 0
  3581. }
  3582. #======================================
  3583. # mountSystemOverlay
  3584. #--------------------------------------
  3585. function mountSystemOverlay {
  3586.     local roDir=/read-only
  3587.     local rwDir=/read-write
  3588.     local xiDir=/xino
  3589.     local rwDevice=`echo $UNIONFS_CONFIG | cut -d , -f 1`
  3590.     local unionFST=`echo $UNIONFS_CONFIG | cut -d , -f 3`
  3591.     #======================================
  3592.     # create read write mount points
  3593.     #--------------------------------------
  3594.     for dir in $rwDir $xiDir;do
  3595.         mkdir -p $dir
  3596.     done
  3597.     #======================================
  3598.     # check read/write device location
  3599.     #--------------------------------------
  3600.     getDiskDevice $rwDevice | grep -q ram
  3601.     if [ $? = 0 ];then
  3602.         # /.../
  3603.         # write part is a ram location, use tmpfs for ram
  3604.         # disk data storage
  3605.         # ----
  3606.         if ! mount -t tmpfs tmpfs $rwDir >/dev/null;then
  3607.             return 1
  3608.         fi
  3609.     else
  3610.         # /.../
  3611.         # write part is not a ram disk, create ext3 filesystem on it
  3612.         # check and mount the filesystem
  3613.         # ----
  3614.         if ! setupReadWrite; then
  3615.             return 1
  3616.         fi
  3617.         if ! mount $rwDevice $rwDir >/dev/null;then
  3618.             Echo "Failed to mount read/write filesystem"
  3619.             return 1
  3620.         fi
  3621.     fi
  3622.     #======================================
  3623.     # setup overlay mount
  3624.     #--------------------------------------
  3625.     if [ $unionFST = "aufs" ];then
  3626.         mount -t tmpfs tmpfs $xiDir >/dev/null || retval=1
  3627.         mount -t aufs \
  3628.             -o dirs=$rwDir=rw:$roDir=ro,xino=$xiDir/.aufs.xino aufs /mnt \
  3629.         >/dev/null || return 1
  3630.     else
  3631.         mount -t unionfs \
  3632.             -o dirs=$rwDir=rw:$roDir=ro unionfs /mnt
  3633.         >/dev/null || return 1
  3634.     fi
  3635.     usleep 500000
  3636.     return 0
  3637. }
  3638. #======================================
  3639. # mountSystemCombined
  3640. #--------------------------------------
  3641. function mountSystemCombined {
  3642.     local mountDevice=$1
  3643.     local loopf=$2
  3644.     local roDevice=$mountDevice
  3645.     if [ "$haveLVM" = "yes" ]; then
  3646.         local rwDevice="/dev/kiwiVG/LVRoot"
  3647.     elif [ "$haveLuks" = "yes" ]; then
  3648.         local rwDevice="/dev/mapper/luksReadWrite"
  3649.     else
  3650.         local rwDevice=`getNextPartition $mountDevice`
  3651.     fi
  3652.     mkdir /read-only >/dev/null
  3653.     # /.../
  3654.     # mount the read-only partition to /read-only and use
  3655.     # mount option -o ro for this filesystem
  3656.     # ----
  3657.     if ! kiwiMount "$roDevice" "/read-only" "" $loopf;then
  3658.         Echo "Failed to mount read only filesystem"
  3659.         return 1
  3660.     fi
  3661.     # /.../
  3662.     # mount a tmpfs as /mnt which will become the root fs (/) later on
  3663.     # and extract the rootfs tarball with the RAM data and the read-only
  3664.     # and read-write links into the tmpfs.
  3665.     # ----
  3666.     local rootfs=/read-only/rootfs.tar
  3667.     if [ ! -f $rootfs ];then
  3668.         Echo "Can't find rootfs tarball"
  3669.         umount "$roDevice" &>/dev/null
  3670.         return 1
  3671.     fi
  3672.     # /.../
  3673.     # count inode numbers for files in rootfs tarball
  3674.     # ----
  3675.     local inr=`tar -tf $rootfs | wc -l`
  3676.     inr=`expr $inr \* 11 / 10 / 1024`
  3677.     inr=$inr"k"
  3678.     # /.../
  3679.     # mount tmpfs, reserve max 512MB for the rootfs data
  3680.     # ----
  3681.     mount -t tmpfs tmpfs -o size=512M,nr_inodes=$inr /mnt >/dev/null || return 1
  3682.     if ! validateTarSize $rootfs;then
  3683.         systemException \
  3684.             "Not enough RAM space available for temporary data" \
  3685.         "reboot"
  3686.     fi
  3687.     cd /mnt && tar xf $rootfs >/dev/null && cd /
  3688.     # /.../
  3689.     # create a /mnt/read-only mount point and move the /read-only
  3690.     # mount into the /mnt root tree. After that remove the /read-only
  3691.     # directory and create a link to /mnt/read-only instead
  3692.     # /read-only -> /mnt/read-only
  3693.     # ----
  3694.     mkdir /mnt/read-only >/dev/null
  3695.     mount --move /read-only /mnt/read-only >/dev/null
  3696.     rm -rf /read-only >/dev/null
  3697.     ln -s /mnt/read-only /read-only >/dev/null || return 1
  3698.     if ! echo $rwDevice | grep -q loop;then
  3699.         if partitionSize $rwDevice &>/dev/null;then
  3700.             # /.../
  3701.             # mount the read-write partition to /mnt/read-write and create
  3702.             # a link to it: /read-write -> /mnt/read-write 
  3703.             # ----
  3704.             mkdir /mnt/read-write >/dev/null
  3705.             mount $rwDevice /mnt/read-write >/dev/null
  3706.             rm -f /read-write >/dev/null
  3707.             ln -s /mnt/read-write /read-write >/dev/null
  3708.         fi
  3709.     fi
  3710.     if [ "$LOCAL_BOOT" = "yes" ] && [ "$haveLuks" = "yes" ];then
  3711.         mkdir -p /mnt/luksboot
  3712.         ( cd /mnt && rm boot && ln -sf luksboot/boot boot )
  3713.     fi
  3714. }
  3715. #======================================
  3716. # mountSystemStandard
  3717. #--------------------------------------
  3718. function mountSystemStandard {
  3719.     local mountDevice=$1
  3720.     if [ ! -z $FSTYPE ]          && 
  3721.        [ ! $FSTYPE = "unknown" ] && 
  3722.        [ ! $FSTYPE = "auto" ]
  3723.     then
  3724.         kiwiMount "$mountDevice" "/mnt"
  3725.     else
  3726.         mount $mountDevice /mnt >/dev/null
  3727.     fi
  3728.     return $?
  3729. }
  3730. #======================================
  3731. # mountSystem
  3732. #--------------------------------------
  3733. function mountSystem {
  3734.     local retval=0
  3735.     local OLDIFS=$IFS
  3736.     IFS=$IFS_ORIG
  3737.     #======================================
  3738.     # set primary mount device
  3739.     #--------------------------------------
  3740.     local mountDevice="$imageRootDevice"
  3741.     if [ ! -z "$1" ];then
  3742.         mountDevice="$1"
  3743.     fi
  3744.     #======================================
  3745.     # wait for storage device to appear
  3746.     #--------------------------------------
  3747.     if ! echo $mountDevice | grep -q loop;then
  3748.         waitForStorageDevice $mountDevice
  3749.     fi
  3750.     #======================================
  3751.     # check root tree type
  3752.     #--------------------------------------
  3753.     if [ ! -z "$COMBINED_IMAGE" ];then
  3754.         mountSystemCombined "$mountDevice" $2
  3755.         retval=$?
  3756.     elif [ ! -z "$UNIONFS_CONFIG" ];then
  3757.         local unionFST=`echo $UNIONFS_CONFIG | cut -d , -f 3`
  3758.         if [ "$unionFST" = "clicfs" ];then
  3759.             mountSystemClicFS $2
  3760.         else
  3761.             mountSystemUnified $2
  3762.         fi
  3763.         retval=$?
  3764.     else
  3765.         mountSystemStandard "$mountDevice"
  3766.         retval=$?
  3767.     fi
  3768.     IFS=$OLDIFS
  3769.     return $retval
  3770. }
  3771. #======================================
  3772. # cleanDirectory
  3773. #--------------------------------------
  3774. function cleanDirectory {
  3775.     local directory=$1
  3776.     shift 1
  3777.     local save=$@
  3778.     local tmpdir=`mktemp -d`
  3779.     for saveItem in $save;do
  3780.         mv $directory/$saveItem $tmpdir >/dev/null
  3781.     done
  3782.     rm -rf $directory/*
  3783.     mv $tmpdir/* $directory
  3784.     rm -rf $tmpdir
  3785. }
  3786. #======================================
  3787. # cleanInitrd
  3788. #--------------------------------------
  3789. function cleanInitrd {
  3790.     cp /usr/bin/chroot /bin
  3791.     cp /usr/sbin/klogconsole /bin
  3792.     cp /sbin/killproc /bin
  3793.     cp /sbin/halt /bin/reboot
  3794.     for dir in /*;do
  3795.         case "$dir" in
  3796.             "/lib")   continue ;;
  3797.             "/lib64") continue ;;
  3798.             "/bin")   continue ;;
  3799.             "/mnt")   continue ;;
  3800.             "/read-only") continue ;;
  3801.             "/read-write") continue ;;
  3802.             "/xino")  continue ;;
  3803.             "/dev")   continue ;;
  3804.         esac
  3805.         rm -rf $dir/* &>/dev/null
  3806.     done
  3807.     if test -L /read-only;then
  3808.         rm -f /read-only
  3809.     fi
  3810.     if test -L /read-write;then
  3811.         rm -f /read-write
  3812.     fi
  3813.     # mount opens fstab so we give them one
  3814.     touch /etc/fstab
  3815.     hash -r
  3816. }
  3817. #======================================
  3818. # searchAlternativeConfig
  3819. #--------------------------------------
  3820. function searchAlternativeConfig {
  3821.     # Check config.IP in Hex (pxelinux style)
  3822.     localip=$IPADDR
  3823.     hexip1=`echo $localip | cut -f1 -d'.'`
  3824.     hexip2=`echo $localip | cut -f2 -d'.'`
  3825.     hexip3=`echo $localip | cut -f3 -d'.'`
  3826.     hexip4=`echo $localip | cut -f4 -d'.'`
  3827.     hexip=`printf "%02X" $hexip1 $hexip2 $hexip3 $hexip4`
  3828.     STEP=8
  3829.     while [ $STEP -gt 0 ]; do
  3830.         hexippart=`echo $hexip | cut -b -$STEP`
  3831.         Echo "Checking for config file: config.$hexippart"
  3832.         fetchFile KIWI/config.$hexippart $CONFIG
  3833.         if test -s $CONFIG;then
  3834.             break
  3835.         fi
  3836.         let STEP=STEP-1
  3837.     done
  3838.     # Check config.default if no hex config was found
  3839.     if test ! -s $CONFIG;then
  3840.         Echo "Checking for config file: config.default"
  3841.         fetchFile KIWI/config.default $CONFIG
  3842.     fi
  3843. }
  3844. #======================================
  3845. # runHook
  3846. #--------------------------------------
  3847. function runHook {
  3848.     HOOK="/hooks/$1.sh"
  3849.     if [ -e $HOOK ]; then
  3850.         . $HOOK
  3851.     fi
  3852. }
  3853. #======================================
  3854. # getNextPartition
  3855. #--------------------------------------
  3856. function getNextPartition {
  3857.     part=$1
  3858.     nextPart=`echo $part | sed -e "s/\(.*\)[0-9]/\1/"`
  3859.     nextPartNum=`echo $part | sed -e "s/.*\([0-9]\)/\1/"`
  3860.     nextPartNum=`expr $nextPartNum + 1`
  3861.     nextPart="${nextPart}${nextPartNum}"
  3862.     echo $nextPart
  3863. }
  3864. #======================================
  3865. # startShell
  3866. #--------------------------------------
  3867. function startShell {
  3868.     # /.../
  3869.     # start a debugging shell on ELOG_BOOTSHELL
  3870.     # ----
  3871.     if [ -z "$kiwistderr" ] && [ ! -z $kiwidebug ];then
  3872.         Echo "Starting boot shell on $ELOG_BOOTSHELL"
  3873.         setctsid -f $ELOG_BOOTSHELL /bin/bash -i
  3874.     fi
  3875. }
  3876. #======================================
  3877. # killShell
  3878. #--------------------------------------
  3879. function killShell {
  3880.     # /.../
  3881.     # kill debugging shell on ELOG_BOOTSHELL
  3882.     # ----
  3883.     local umountProc=0
  3884.     if [ ! -e /proc/mounts ];then
  3885.         mount -t proc proc /proc
  3886.         umountProc=1
  3887.     fi
  3888.     if [ -z "$kiwistderr" ];then
  3889.         Echo "Stopping boot shell"
  3890.         fuser -k $ELOG_BOOTSHELL >/dev/null
  3891.     fi
  3892.     if [ $umountProc -eq 1 ];then
  3893.         umount /proc
  3894.     fi
  3895. }
  3896. #======================================
  3897. # waitForStorageDevice
  3898. #--------------------------------------
  3899. function waitForStorageDevice {
  3900.     # /.../
  3901.     # function to check access on a storage device
  3902.     # which could be a whole disk or a partition.
  3903.     # the function will wait until the size of the
  3904.     # storage device could be obtained or the check
  3905.     # counter equals 4
  3906.     # ----
  3907.     local device=$1
  3908.     local check=0
  3909.     while true;do
  3910.         partitionSize $device &>/dev/null
  3911.         if [ $? = 0 ];then
  3912.             sleep 1; return 0
  3913.         fi
  3914.         if [ $check -eq 4 ];then
  3915.             return 1
  3916.         fi
  3917.         Echo "Waiting for device $device to settle..."
  3918.         check=`expr $check + 1`
  3919.         sleep 2
  3920.     done
  3921. }
  3922.  
  3923. #======================================
  3924. # waitForBlockDevice
  3925. #--------------------------------------
  3926. function waitForBlockDevice {
  3927.     # /.../
  3928.     # function to check if the given block device
  3929.     # exists. If not the function will wait until the
  3930.     # device appears or the check counter equals 4
  3931.     # ----
  3932.     local device=$1
  3933.     local check=0
  3934.     while true;do
  3935.         if [ -b $device ] || [ $check -eq 4 ];then
  3936.             break
  3937.         fi
  3938.         Echo "Waiting for device $device to settle..."
  3939.         check=`expr $check + 1`
  3940.         sleep 2
  3941.     done
  3942. }
  3943.  
  3944. #======================================
  3945. # fetchFile
  3946. #--------------------------------------
  3947. function fetchFile {
  3948.     # /.../
  3949.     # the generic fetcher which is able to use different protocols
  3950.     # tftp,ftp, http, https. fetchFile is used in the netboot linuxrc
  3951.     # and uses curl and atftp to download files from the network
  3952.     # ----
  3953.     local path=$1
  3954.     local dest=$2
  3955.     local izip=$3
  3956.     local host=$4
  3957.     local type=$5
  3958.     if test -z "$path"; then
  3959.         systemException "No path specified" "reboot"
  3960.     fi
  3961.     if test -z "$host"; then
  3962.         if test -z "$SERVER"; then
  3963.             systemException "No server specified" "reboot"
  3964.         fi
  3965.         host=$SERVER
  3966.     fi
  3967.     if test -z "$type"; then
  3968.         if test -z "$SERVERTYPE"; then
  3969.             type="tftp"
  3970.         else
  3971.             type="$SERVERTYPE"
  3972.         fi
  3973.     fi
  3974.     if test "$izip" = "compressed"; then
  3975.         path="$path.gz"
  3976.     fi
  3977.     case "$type" in
  3978.         "http")
  3979.             if test "$izip" = "compressed"; then
  3980.                 curl -f http://$host/$path 2>$TRANSFER_ERRORS_FILE |\
  3981.                     gzip -d > $dest 2>>$TRANSFER_ERRORS_FILE
  3982.             else
  3983.                 curl -f http://$host/$path > $dest 2> $TRANSFER_ERRORS_FILE
  3984.             fi
  3985.             loadCode=$?
  3986.             ;;
  3987.         "https")
  3988.             if test "$izip" = "compressed"; then
  3989.                 curl -f -k https://$host/$path 2>$TRANSFER_ERRORS_FILE |\
  3990.                     gzip -d > $dest 2>>$TRANSFER_ERRORS_FILE
  3991.             else
  3992.                 curl -f -k https://$host/$path > $dest 2> $TRANSFER_ERRORS_FILE
  3993.             fi
  3994.             loadCode=$?
  3995.             ;;
  3996.         "ftp")
  3997.             if test "$izip" = "compressed"; then
  3998.                 curl ftp://$host/$path 2>$TRANSFER_ERRORS_FILE |\
  3999.                     gzip -d > $dest 2>>$TRANSFER_ERRORS_FILE
  4000.             else
  4001.                 curl ftp://$host/$path > $dest 2> $TRANSFER_ERRORS_FILE
  4002.             fi
  4003.             loadCode=$?
  4004.             ;;
  4005.         "tftp")
  4006.             validateBlockSize
  4007.             # /.../
  4008.             # atftp activates multicast by '--option "multicast"'
  4009.             # and deactivates it again  by '--option "disable multicast"'
  4010.             # ----
  4011.             multicast_atftp="multicast"
  4012.             if test "$multicast" != "enable"; then 
  4013.                 multicast_atftp="disable multicast"
  4014.             fi
  4015.             if test "$izip" = "compressed"; then
  4016.                 # mutlicast is disabled because you can't seek in a pipe
  4017.                 atftp \
  4018.                     --option "disable multicast" \
  4019.                     --option "blksize $imageBlkSize" -g -r $path \
  4020.                     -l /dev/stdout $host 2>$TRANSFER_ERRORS_FILE |\
  4021.                     gzip -d > $dest 2>>$TRANSFER_ERRORS_FILE
  4022.             else
  4023.                 atftp \
  4024.                     --option "$multicast_atftp"  \
  4025.                     --option "blksize $imageBlkSize" \
  4026.                     -g -r $path -l $dest $host &> $TRANSFER_ERRORS_FILE
  4027.             fi
  4028.             loadCode=$?
  4029.             ;;
  4030.         *)
  4031.             systemException "Unknown download type: $type" "reboot"
  4032.             ;;
  4033.     esac
  4034.     loadStatus=`cat $TRANSFER_ERRORS_FILE`
  4035.     return $loadCode
  4036. }
  4037.  
  4038. #======================================
  4039. # putFile
  4040. #--------------------------------------
  4041. function putFile {
  4042.     # /.../
  4043.     # the generic putFile function is used to upload boot data on
  4044.     # a server. Supported protocols are tftp, ftp, http, https
  4045.     # ----
  4046.     local path=$1
  4047.     local dest=$2
  4048.     local host=$3
  4049.     local type=$4
  4050.     if test -z "$path"; then
  4051.         systemException "No path specified" "reboot"
  4052.     fi
  4053.     if test -z "$host"; then
  4054.         if test -z "$SERVER"; then
  4055.             systemException "No server specified" "reboot"
  4056.         fi
  4057.         host=$SERVER
  4058.     fi
  4059.     if test -z "$type"; then
  4060.         if test -z "$SERVERTYPE"; then
  4061.             type="tftp"
  4062.         else
  4063.             type="$SERVERTYPE"
  4064.         fi
  4065.     fi
  4066.     case "$type" in
  4067.         "http")
  4068.             curl -f -T $path http://$host/$dest > $TRANSFER_ERRORS_FILE 2>&1
  4069.             return $?
  4070.             ;;
  4071.         "https")
  4072.             curl -f -T $path https://$host/$dest > $TRANSFER_ERRORS_FILE 2>&1
  4073.             return $?
  4074.             ;;
  4075.         "ftp")
  4076.             curl -T $path ftp://$host/$dest  > $TRANSFER_ERRORS_FILE 2>&1
  4077.             return $?
  4078.             ;;
  4079.         "tftp")
  4080.             atftp -p -l $path -r $dest $host >/dev/null 2>&1
  4081.             return $?
  4082.             ;;
  4083.         *)
  4084.             systemException "Unknown download type: $type" "reboot"
  4085.             ;;
  4086.     esac
  4087. }
  4088.  
  4089. #======================================
  4090. # importBranding
  4091. #--------------------------------------
  4092. function importBranding {
  4093.     # /.../
  4094.     # include possible custom boot loader and bootsplash files
  4095.     # to the system to allow to use them persistently
  4096.     # ----
  4097.     if [ -f /image/loader/message ];then
  4098.         if ! canWrite /mnt/boot;then
  4099.             Echo "Can't write to boot, import of boot message skipped"
  4100.         else
  4101.             mv /image/loader/message /mnt/boot
  4102.         fi
  4103.     fi
  4104.     if [ -f /image/loader/branding/logo.mng ];then
  4105.     if [ -d /mnt/etc/bootsplash/themes ];then
  4106.         for theme in /mnt/etc/bootsplash/themes/*;do
  4107.             if [ -d $theme/images ];then
  4108.                 if ! canWrite $theme;then
  4109.                     Echo "Can't write to $theme, import of boot theme skipped"
  4110.                     continue
  4111.                 fi
  4112.                 cp /image/loader/branding/logo.mng  $theme/images
  4113.                 cp /image/loader/branding/logov.mng $theme/images
  4114.                 cp /image/loader/branding/*.jpg $theme/images
  4115.                 cp /image/loader/branding/*.cfg $theme/config
  4116.             fi
  4117.         done    
  4118.     fi
  4119.     fi
  4120. }
  4121.  
  4122. #======================================
  4123. # validateRootTree
  4124. #--------------------------------------
  4125. function validateRootTree {
  4126.     # /.../
  4127.     # after the root of the system image has been mounted we should
  4128.     # check whether that mount is a valid system tree or not. Therefore
  4129.     # some sanity checks are made here
  4130.     # ----
  4131.     if [ ! -x /mnt/sbin/init ];then
  4132.         systemException "/sbin/init no such file or not executable" "reboot"
  4133.     fi
  4134. }
  4135.  
  4136. #======================================
  4137. # getDiskID
  4138. #--------------------------------------
  4139. function getDiskID {
  4140.     # /.../
  4141.     # this function is able to turn a given standard device
  4142.     # name into the udev ID based representation
  4143.     # ----
  4144.     local device=$1
  4145.     if [ -z "$device" ];then
  4146.         return
  4147.     fi
  4148.     if echo $device | grep -q "kiwiVG"; then
  4149.         echo $device
  4150.         return
  4151.     fi
  4152.     for i in /dev/disk/by-id/*;do
  4153.         if echo $i | grep -q edd-;then
  4154.             continue
  4155.         fi
  4156.         local dev=`readlink $i`
  4157.         dev=/dev/`basename $dev`
  4158.         if [ $dev = $device ];then
  4159.             echo $i
  4160.             return
  4161.         fi
  4162.     done
  4163.     echo $device
  4164. }
  4165. #======================================
  4166. # getDiskDevice
  4167. #--------------------------------------
  4168. function getDiskDevice {
  4169.     # /.../
  4170.     # this function is able to turn the given udev disk
  4171.     # ID label into the /dev/ device name
  4172.     # ----
  4173.     local device=`readlink $1`
  4174.     if [ -z "$device" ];then
  4175.         echo $1
  4176.         return
  4177.     fi
  4178.     device=`basename $device`
  4179.     device=/dev/$device
  4180.     echo $device
  4181. }
  4182. #======================================
  4183. # getDiskModel
  4184. #--------------------------------------
  4185. function getDiskModels {
  4186.     # /.../
  4187.     # this function returns the disk identifier as
  4188.     # registered in the sysfs layer
  4189.     # ----
  4190.     local models=`cat /sys/block/*/device/model 2>/dev/null`
  4191.     if [ ! -z "$models" ];then
  4192.         echo $models; return
  4193.     fi
  4194.     echo "unknown"
  4195. }
  4196. #======================================
  4197. # setupInittab
  4198. #--------------------------------------
  4199. function setupInittab {
  4200.     # /.../
  4201.     # setup default runlevel according to /proc/cmdline
  4202.     # information. If textmode is set to 1 we will boot into
  4203.     # runlevel 3
  4204.     # ----
  4205.     local prefix=$1
  4206.     if cat /proc/cmdline | grep -qi "textmode=1";then
  4207.         sed -i -e s"@id:.*:initdefault:@id:3:initdefault:@" $prefix/etc/inittab
  4208.     fi
  4209. }
  4210. #======================================
  4211. # setupConfigFiles
  4212. #--------------------------------------
  4213. function setupConfigFiles {
  4214.     # /.../
  4215.     # all files created below /config inside the initrd are
  4216.     # now copied into the system image
  4217.     # ----
  4218.     local file
  4219.     local dir
  4220.     cd /config
  4221.     find . -type f | while read file;do
  4222.         dir=$(dirname $file)
  4223.         if ! canWrite /mnt/$dir;then
  4224.             Echo "Can't write to $dir, read-only filesystem... skipped"
  4225.             continue
  4226.         fi
  4227.         if [ ! -d /mnt/$dir ];then
  4228.             mkdir -p /mnt/$dir
  4229.         fi
  4230.         cp $file /mnt/$file
  4231.     done
  4232.     cd /
  4233.     rm -rf /config
  4234. }
  4235. #======================================
  4236. # activateImage
  4237. #--------------------------------------
  4238. function activateImage {
  4239.     # /.../
  4240.     # move the udev created nodes from the initrd into
  4241.     # the system root tree call the pre-init phase which
  4242.     # already runs in the new tree and finaly switch the
  4243.     # new tree to be the new root (/) 
  4244.     # ----
  4245.     #======================================
  4246.     # setup image name
  4247.     #--------------------------------------
  4248.     local name
  4249.     if [ ! -z "$stickSerial" ];then
  4250.         name="$stickSerial on -> $stickDevice"
  4251.     elif [ ! -z "$imageName" ];then
  4252.         name=$imageName
  4253.     elif [ ! -z "$imageRootName" ];then
  4254.         name=$imageRootName
  4255.     elif [ ! -z "$imageRootDevice" ];then
  4256.         name=$imageRootDevice
  4257.     elif [ ! -z "$imageDiskDevice" ];then
  4258.         name=$imageDiskDevice
  4259.     else
  4260.         name="unknown"
  4261.     fi
  4262.     #======================================
  4263.     # move union mount points to system
  4264.     #--------------------------------------
  4265.     local roDir=/read-only
  4266.     local rwDir=/read-write
  4267.     local xiDir=/xino
  4268.     if [ -d $roDir ];then
  4269.         mkdir -p /mnt/$roDir && mount --move /$roDir /mnt/$roDir
  4270.     fi
  4271.     if [ -d $rwDir ];then
  4272.         mkdir -p /mnt/$rwDir && mount --move /$rwDir /mnt/$rwDir
  4273.     fi
  4274.     if [ -d $xiDir ];then
  4275.         mkdir -p /mnt/$xiDir && mount --move /$xiDir /mnt/$xiDir
  4276.     fi
  4277.     #======================================
  4278.     # move live CD mount points to system
  4279.     #--------------------------------------
  4280.     local cdDir=/livecd
  4281.     if [ -d $cdDir ];then
  4282.         mkdir -p /mnt/$cdDir && mount --move /$cdDir /mnt/$cdDir
  4283.     fi
  4284.     #======================================
  4285.     # move device nodes
  4286.     #--------------------------------------
  4287.     Echo "Activating Image: [$name]"
  4288.     reopenKernelConsole
  4289.     udevPending
  4290.     mount --move /dev /mnt/dev
  4291.     udevKill
  4292.     umount -t devpts /mnt/dev/pts
  4293.     #======================================
  4294.     # copy boot log file into system image
  4295.     #--------------------------------------
  4296.     mkdir -p /mnt/var/log
  4297.     rm -f /var/log/boot.msg
  4298.     rm -f /mnt/boot/grub/mbrid
  4299.     cp -f /mnt/dev/shm/initrd.msg /mnt/var/log/boot.msg
  4300.     cp -f /var/log/boot.kiwi /mnt/var/log/boot.kiwi
  4301.     #======================================
  4302.     # run preinit stage
  4303.     #--------------------------------------
  4304.     Echo "Calling preinit phase..."
  4305.     cd /mnt
  4306.     /mnt/sbin/pivot_root . mnt >/dev/null 2>&1
  4307.     if test $? != 0;then
  4308.         PIVOT=false
  4309.         cleanInitrd && mount --move . / && chroot . ./preinit
  4310.         chroot . rm -f  ./preinit
  4311.         chroot . rm -f  ./include
  4312.         chroot . rm -rf ./image
  4313.     else
  4314.         PIVOT=true
  4315.         ./preinit
  4316.         rm -f  ./preinit
  4317.         rm -f  ./include
  4318.         rm -rf ./image
  4319.     fi
  4320. }
  4321. #======================================
  4322. # bootImage
  4323. #--------------------------------------
  4324. function bootImage {
  4325.     # /.../
  4326.     # call the system image init process and therefore
  4327.     # boot into the operating system
  4328.     # ----
  4329.     local reboot=no
  4330.     local option=$@
  4331.     #======================================
  4332.     # turn runlevel 4 to 5 if found
  4333.     #--------------------------------------
  4334.     option=$(echo $@ | sed -e s@4@5@)
  4335.     echo && Echo "Booting System: $option"
  4336.     export IFS=$IFS_ORIG
  4337.     #======================================
  4338.     # check for reboot request
  4339.     #--------------------------------------
  4340.     if [ $LOCAL_BOOT = "no" ] || [ ! -z "$KIWI_RECOVERY" ];then
  4341.         if [ ! -z "$OEM_REBOOT" ] || [ ! -z "$REBOOT_IMAGE" ];then
  4342.             reboot=yes
  4343.         fi
  4344.     fi
  4345.     #======================================
  4346.     # directly boot/reboot
  4347.     #--------------------------------------
  4348.     # /.../
  4349.     # we already checked the filesystem
  4350.     # no reason for boot.rootfsck to try again
  4351.     # ----
  4352.     if [ ! $UTIMER = 0 ];then
  4353.         kill $UTIMER
  4354.     fi
  4355.     export ROOTFS_FSCK="0"
  4356.     mount -n -o remount,rw / &>/dev/null
  4357.     exec < dev/console >dev/console 2>&1
  4358.     if [ $PIVOT = "true" ];then
  4359.         umount -n -l /mnt
  4360.     fi
  4361.     umount proc &>/dev/null && \
  4362.     umount proc &>/dev/null
  4363.     if [ $reboot = "yes" ];then
  4364.         Echo "Reboot requested... rebooting now"
  4365.         exec chroot . /sbin/reboot -f -i
  4366.     else
  4367.         exec chroot . /sbin/init $option
  4368.     fi
  4369. }
  4370. #======================================
  4371. # setupUnionFS
  4372. #--------------------------------------
  4373. function setupUnionFS {
  4374.     # /.../
  4375.     # export the UNIONFS_CONFIG environment variable
  4376.     # which contains a three part coma separated list of the
  4377.     # following style: rwDevice,roDevice,unionType. The
  4378.     # devices are stores by disk ID if possible
  4379.     # ----
  4380.     local rwDevice=`getDiskID $1`
  4381.     local roDevice=`getDiskID $2`
  4382.     local unionFST=$3
  4383.     rwDeviceLuks=$(luksOpen $rwDevice luksReadWrite)
  4384.     roDeviceLuks=$(luksOpen $roDevice luksReadOnly)
  4385.     if [ ! $rwDeviceLuks = $rwDevice ];then
  4386.         rwDevice=$rwDeviceLuks
  4387.         export haveLuks="yes"
  4388.     fi
  4389.     if [ ! $roDeviceLuks = $roDevice ];then
  4390.         roDevice=$roDeviceLuks
  4391.         export haveLuks="yes"
  4392.     fi
  4393.     export UNIONFS_CONFIG="$rwDevice,$roDevice,$unionFST"
  4394. }
  4395. #======================================
  4396. # canWrite
  4397. #--------------------------------------
  4398. function canWrite {
  4399.     # /.../
  4400.     # check if we can write to the given location
  4401.     # If no location is given the function test
  4402.     # for write permissions in /mnt.
  4403.     # returns zero on success.
  4404.     # ---
  4405.     local dest=$1
  4406.     if [ -z "$dest" ];then
  4407.         dest=/mnt
  4408.     fi
  4409.     if [ ! -d $dest ];then
  4410.         return 1
  4411.     fi
  4412.     if touch $dest/can-write &>/dev/null;then
  4413.         rm $dest/can-write
  4414.         return 0
  4415.     fi
  4416.     return 1
  4417. }
  4418. #======================================
  4419. # xenServer
  4420. #--------------------------------------
  4421. function xenServer {
  4422.     # /.../
  4423.     # test if we are running a Xen dom0 kernel
  4424.     # ---
  4425.     local check=/proc/xen/capabilities
  4426.     if cat $check 2>/dev/null | grep "control_d" &>/dev/null; then
  4427.         return 0
  4428.     fi
  4429.     return 1
  4430. }
  4431. #======================================
  4432. # makeLabel
  4433. #--------------------------------------
  4434. function makeLabel {
  4435.     # /.../
  4436.     # create boot label and replace all spaces with
  4437.     # underscores. current bootloaders show the
  4438.     # underscore sign as as space in the boot menu
  4439.     # ---
  4440.     if [ -z "$loader" ];then
  4441.         loader="grub"
  4442.     fi
  4443.     if [ ! $loader = "syslinux" ];then
  4444.         echo $1 | tr " " "_"
  4445.     else
  4446.         echo $1
  4447.     fi
  4448. }
  4449. #======================================
  4450. # waitForX
  4451. #--------------------------------------
  4452. function waitForX {
  4453.     # /.../
  4454.     # wait for the X-Server with PID $xserver_pid to
  4455.     # become read for client calls
  4456.     # ----
  4457.     local xserver_pid=$1
  4458.     local testx=/usr/sbin/testX
  4459.     local err=1
  4460.     while kill -0 $xserver_pid 2>/dev/null ; do
  4461.         sleep 1
  4462.         if test -e /tmp/.X11-unix/X0 && test -x $testx ; then
  4463.             $testx 16 2>/dev/null
  4464.             err=$?
  4465.             # exit code 1 -> XOpenDisplay failed...
  4466.             if test $err = 1;then
  4467.                 Echo "TestX: XOpenDisplay failed"
  4468.                 return 1
  4469.             fi
  4470.             # exit code 2 -> color or dimensions doesn't fit...
  4471.             if test $err = 2;then
  4472.                 Echo "TestX: color or dimensions doesn't fit"
  4473.                 kill $xserver_pid
  4474.                 return 1
  4475.             fi
  4476.             # server is running, detach oom-killer from it
  4477.             echo -n '-17' > /proc/$xserver_pid/oom_adj
  4478.             return 0
  4479.         fi
  4480.     done
  4481.     return 1
  4482. }
  4483. #======================================
  4484. # startX
  4485. #--------------------------------------
  4486. function startX {
  4487.     # /.../
  4488.     # start X-Server and wait for it to become ready
  4489.     # ----
  4490.     export DISPLAY=:0
  4491.     local XServer=/usr/bin/Xorg
  4492.     if [ -x /usr/X11R6/bin/Xorg ];then
  4493.         XServer=/usr/X11R6/bin/Xorg
  4494.     fi
  4495.     $XServer -deferglyphs 16 vt07 &
  4496.     export XServerPID=$!
  4497.     if ! waitForX $XServerPID;then
  4498.         Echo "Failed to start X-Server"
  4499.         return 1
  4500.     fi
  4501.     return 0
  4502. }
  4503. #======================================
  4504. # stoppX
  4505. #--------------------------------------
  4506. function stoppX {
  4507.     if [ -z "$XServerPID" ];then
  4508.         return
  4509.     fi
  4510.     if kill -0 $XServerPID 2>/dev/null; then
  4511.         sleep 1 && kill $XServerPID
  4512.         while kill -0 $XServerPID 2>/dev/null; do
  4513.             sleep 1
  4514.         done
  4515.     fi
  4516. }
  4517. #======================================
  4518. # luksOpen
  4519. #--------------------------------------
  4520. function luksOpen {
  4521.     # /.../
  4522.     # check given device if it uses the LUKS extension
  4523.     # if yes open the device and return the new
  4524.     # /dev/mapper/ device name
  4525.     # ----
  4526.     local ldev=$1
  4527.     local name=$2
  4528.     local info
  4529.     if [ -z $name ];then
  4530.         name=luksroot
  4531.     fi
  4532.     if [ -e /dev/mapper/$name ];then
  4533.         echo /dev/mapper/$name; return
  4534.     fi
  4535.     if ! cryptsetup isLuks $ldev &>/dev/null;then
  4536.         echo $ldev; return
  4537.     fi
  4538.     while true;do
  4539.         if [ ! -e /tmp/luks ];then
  4540.             Dialog \
  4541.                 --stdout --insecure \
  4542.                 --passwordbox "$(getText "Enter LUKS passphrase")" 10 60 |\
  4543.                 cat > /tmp/luks
  4544.         fi
  4545.         info=$(cat /tmp/luks | cryptsetup luksOpen $ldev $name 2>&1)
  4546.         if [ $? = 0 ];then
  4547.             break
  4548.         fi
  4549.         rm -f /tmp/luks
  4550.         Dialog --stdout --timeout 10 --msgbox "\"Error: $info\"" 8 60
  4551.     done
  4552.     echo /dev/mapper/$name
  4553. }
  4554. #======================================
  4555. # luksResize
  4556. #--------------------------------------
  4557. function luksResize {
  4558.     # /.../
  4559.     # check given device if it is a mapped device name
  4560.     # and run cryptsetup resize on the mapper name
  4561.     # ----
  4562.     local ldev=$1
  4563.     if [ ! "$haveLuks" = "yes" ] || [ ! -e $ldev ];then
  4564.         return
  4565.     fi
  4566.     local name=$(basename $ldev)
  4567.     local dmap=$(dirname  $ldev)
  4568.     if [ ! "$dmap" = "/dev/mapper" ];then
  4569.         return
  4570.     fi
  4571.     cryptsetup resize $name
  4572. }
  4573. #======================================
  4574. # luksClose
  4575. #--------------------------------------
  4576. function luksClose {
  4577.     # /.../
  4578.     # close all open LUKS mappings
  4579.     # ----
  4580.     local name
  4581.     for i in /dev/mapper/luks*;do
  4582.         name=$(basename $i)
  4583.         cryptsetup luksClose $name
  4584.     done
  4585. }
  4586. #======================================
  4587. # selectLanguage
  4588. #--------------------------------------
  4589. function selectLanguage {
  4590.     # /.../
  4591.     # select language if not yet done. The value is
  4592.     # used for all dialog windows with i18n support
  4593.     # ----
  4594.     local title="\"Select Language\""
  4595.     local list="en_US \"[ English ]\" on"
  4596.     local list_orig=$list
  4597.     local zh_CN=Chinese
  4598.     local zh_TW=Taiwanese
  4599.     local ru_RU=Russian
  4600.     local de_DE=German
  4601.     local ar_AR=Arabic
  4602.     local cs_CZ=Czech
  4603.     local el_GR=Greek
  4604.     local es_ES=Spanish
  4605.     local fi_FI=Finnish
  4606.     local fr_FR=French
  4607.     local hu_HU=Hungarian
  4608.     local it_IT=Italian
  4609.     local ja_JP=Japanese
  4610.     local ko_KR=Korean
  4611.     local nl_NL=Dutch
  4612.     local pl_PL=Polish
  4613.     local pt_BR=Portuguese
  4614.     local sv_SE=Swedish
  4615.     local tr_TR=Turkish
  4616.     local code
  4617.     local lang
  4618.     if [ -f /.profile ];then
  4619.         importFile < /.profile
  4620.     fi
  4621.     if [ "$DIALOG_LANG" = "ask" ];then
  4622.         for code in $(echo $kiwi_language | tr "," " ");do
  4623.             if [ $code = "en_US" ];then
  4624.                 continue
  4625.             fi
  4626.             eval lang=\$$code
  4627.             list="$list $code \"[ $lang ]\" off"
  4628.         done
  4629.         if [ "$list" = "$list_orig" ];then
  4630.             DIALOG_LANG=en_US
  4631.             return
  4632.         fi
  4633.         DIALOG_LANG=$(runInteractive \
  4634.             "--stdout --no-cancel --radiolist $title 20 40 10 $list"
  4635.         )
  4636.     fi
  4637. }
  4638. #======================================
  4639. # getText
  4640. #--------------------------------------
  4641. function getText {
  4642.     # /.../
  4643.     # return translated text
  4644.     # ----
  4645.     export LANG=$DIALOG_LANG.utf8
  4646.     local text=$(gettext kiwi "$1")
  4647.     if [ ! -z "$2" ];then
  4648.         text=$(echo $text | sed -e s"@%1@$2@")
  4649.     fi
  4650.     if [ ! -z "$3" ];then
  4651.         text=$(echo $text | sed -e s"@%2@$3@")
  4652.     fi
  4653.     echo "$text"
  4654. }
  4655. #======================================
  4656. # displayEULA
  4657. #--------------------------------------
  4658. function displayEULA {
  4659.     # /.../
  4660.     # display in a dialog window the text part of the
  4661.     # selected language file or the default file 
  4662.     # /license.txt or /EULA.txt
  4663.     # ----
  4664.     local code=$(echo $DIALOG_LANG | cut -f1 -d_)
  4665.     #======================================
  4666.     # check license files
  4667.     #--------------------------------------
  4668.     local files=$(find /license.*.txt 2>/dev/null)
  4669.     if [ -z "$files" ];then
  4670.         return
  4671.     fi
  4672.     #======================================
  4673.     # use selected file or default
  4674.     #--------------------------------------
  4675.     code=/license.$code.txt
  4676.     if [ ! -f $code ];then
  4677.         code=/license.txt
  4678.         if [ ! -f $code ];then
  4679.             code=/EULA.txt
  4680.         fi
  4681.     fi
  4682.     #======================================
  4683.     # check selected file and show it
  4684.     #--------------------------------------
  4685.     if [ ! -f $code ];then
  4686.         Echo "License file $code not found... skipped"
  4687.         return
  4688.     fi
  4689.     while true;do
  4690.         Dialog --textbox $code 20 70 \
  4691.             --and-widget --extra-button \
  4692.             --extra-label "$(getText "No")" \
  4693.             --ok-label "$(getText "Yes")" \
  4694.             --cancel-label "$(getText "Cancel")" \
  4695.             --yesno "$(getText "Do you accept the license agreement ?")" \
  4696.             5 45
  4697.         case $? in
  4698.             0 ) break
  4699.                 ;;
  4700.             1 ) continue
  4701.                 ;;
  4702.             * ) systemException \
  4703.                     "License not accepted... reboot" \
  4704.                 "reboot"
  4705.                 ;;
  4706.         esac
  4707.     done
  4708. }
  4709. #======================================
  4710. # ddn
  4711. #--------------------------------------
  4712. function ddn {
  4713.     # /.../
  4714.     # print disk device name (node name) according to the
  4715.     # linux device node specs: If the last character of the
  4716.     # device is a letter, attach the partition number. If the
  4717.     # last character is a number, attach a 'p' and then the
  4718.     # partition number.
  4719.     # ----
  4720.     local lastc=$(echo $1 | sed -e 's@\(^.*\)\(.$\)@\2@')
  4721.     if echo $lastc | grep -qP "^\d+$";then
  4722.         echo $1"p"$2
  4723.         return
  4724.     fi
  4725.     echo $1$2
  4726. }
  4727. #======================================
  4728. # dn
  4729. #--------------------------------------
  4730. function dn {
  4731.     # /.../
  4732.     # print disk name (device name) according to the
  4733.     # linux device node specs: If the last character of the
  4734.     # device is a letter remove pX if the last character is
  4735.     # a number remove the number
  4736.     # ----
  4737.     local part=$(getDiskDevice $1)
  4738.     local lastc=$(echo $part | sed -e 's@\(^.*\)\(.$\)@\2@')
  4739.     if echo $lastc | grep -qP "^\d+$";then
  4740.         part=$(echo $part | tr -d [0-9]+)
  4741.     else
  4742.         part=$(echo $part | sed -e s@p.*@@)
  4743.     fi
  4744.     echo $part
  4745. }
  4746. #======================================
  4747. # runInteractive
  4748. #--------------------------------------
  4749. function runInteractive {
  4750.     # /.../
  4751.     # run shell program in interactive shell and echo the
  4752.     # output to the calling terminal. The input file is
  4753.     # not allowed to contain a newline at the end of the
  4754.     # file. The input file is changed due to that call
  4755.     # ----
  4756.     local r=/tmp/rid
  4757.     echo "dialog $@ > /tmp/out" > $r
  4758.     if [ -e /dev/fb0 ];then
  4759.         setctsid $ELOG_EXCEPTION fbiterm -m $UFONT -- bash -i $r || return
  4760.     else
  4761.         setctsid $ELOG_EXCEPTION bash -i $r || return
  4762.     fi
  4763.     cat /tmp/out && rm -f /tmp/out $r
  4764. }
  4765. #======================================
  4766. # SAPMemCheck
  4767. #--------------------------------------
  4768. function SAPMemCheck {
  4769.     # /.../
  4770.     # if OEM SAP option is set this function checks
  4771.     # for enough memory to perform a SAP installation
  4772.     # ----
  4773.     if [ ! -z "$nomemcheck" ];then
  4774.         return
  4775.     fi
  4776.     local mem=`grep -i MemTotal /proc/meminfo | awk '{ print $2 }'`
  4777.     if [ "$mem" -lt 1900000 ]; then
  4778.         Echo "This installation requires at least 2 GB of RAM"
  4779.         Echo -b "but only $(( ${mem} / 1024 )) MB were detected."
  4780.         Echo -b "You can override this check by passing"
  4781.         Echo -b "'nomemcheck=1' to the kernel commandline."
  4782.         systemException \
  4783.             "SAPMemCheck failed... reboot" \
  4784.         "reboot"
  4785.     fi
  4786. }
  4787. #======================================
  4788. # SAPCPUCheck
  4789. #--------------------------------------
  4790. function SAPCPUCheck {
  4791.     # /.../
  4792.     # if OEM SAP option is set this function checks
  4793.     # for the supported system architecture to perform
  4794.     # a SAP installation
  4795.     # ----
  4796.     if [ ! -z "$nocpucheck" ];then
  4797.         return
  4798.     fi
  4799.     local cpu=`uname -m`
  4800.     if [ "$cpu" != "x86_64" ]; then
  4801.         Echo "This installation requires a 64Bit CPU (x86_64) but"
  4802.         Echo -b "a $cpu CPU was detected. You can override this check"
  4803.         Echo -b "by passing 'nocpucheck=1' to the kernel commandline."
  4804.         systemException \
  4805.             "SAPCPUCheck failed... reboot" \
  4806.         "reboot"
  4807.     fi
  4808. }
  4809. #======================================
  4810. # SAPCheckStorageSize
  4811. #--------------------------------------
  4812. function SAPStorageCheck {
  4813.     # /.../
  4814.     # if OEM SAP option is set this function checks
  4815.     # if the available storage space is big enough
  4816.     # to perform a SAP installation
  4817.     # ----
  4818.     if [ ! -z "$nohdcheck" ];then
  4819.         return
  4820.     fi
  4821.     local hwinfo=/usr/sbin/hwinfo
  4822.     local ROOT_DEVICE=$1
  4823.     local ROOT_EXCLUDE=$2
  4824.     if [ ! -n "$ROOT_DEVICE" ];then
  4825.         ROOT_DEVICE="."
  4826.     fi
  4827.     if [ -z "$ROOT_EXCLUDE" ];then
  4828.         ROOT_EXCLUDE=$ROOT_DEVICE
  4829.     fi
  4830.     local size_rootkB=$(partitionSize $ROOT_DEVICE)
  4831.     local DATA_DEVICE=""
  4832.     local size_datakB=""
  4833.     local main_memory_KB=`awk -F" " '{if (match ($1,"^MemTotal")) print $2}' \
  4834.         /proc/meminfo`
  4835.     local main_memory_MB=$(( ${main_memory_KB} / 1024 ))
  4836.     local main_memory_GB=$(( ${main_memory_MB} / 1024 ))
  4837.     local MIN_DATA_DEV_SIZE=200 # GB
  4838.     local MIN_ROOT_DEV_SIZE=$(( ${main_memory_GB} * 2 + 40 + 3 ))
  4839.     local NUM=`$hwinfo --disk | grep -c "Hardware Class:"`
  4840.     local req_size_datakB=""
  4841.     local req_size_rootkB=""
  4842.     local result=0
  4843.     #======================================
  4844.     # Calculate size requirements
  4845.     #--------------------------------------
  4846.     if [ "$NUM" != "1" ]; then
  4847.         # /.../
  4848.         # more than 1 disk, so we expect some more
  4849.         # sophisticated setup
  4850.         # ----
  4851.         req_size_datakB=$(( 1024*1024*${MIN_DATA_DEV_SIZE} ))
  4852.         req_size_rootkB=$(( 1024*1024*${MIN_ROOT_DEV_SIZE} ))
  4853.     else
  4854.         # /.../
  4855.         # only 1 disk, which must be large enough for <root>+<data>
  4856.         # ----
  4857.         req_size_datakB=$((
  4858.             1024*1024*${MIN_DATA_DEV_SIZE} + 1024*1024*${MIN_ROOT_DEV_SIZE}
  4859.         ))
  4860.         req_size_rootkB=$req_size_datakB
  4861.     fi
  4862.     #======================================
  4863.     # Search a data disk
  4864.     #--------------------------------------
  4865.     local deviceDisks=`$hwinfo --disk |\
  4866.         grep "Device File:" | cut -f2 -d: |\
  4867.         cut -f1 -d"(" | sed -e s"@$ROOT_DEVICE@@" -s s"@$ROOT_EXCLUDE@@"`
  4868.     for DATA_DEVICE in $deviceDisks;do
  4869.         break
  4870.     done
  4871.     #======================================
  4872.     # Check size
  4873.     #--------------------------------------
  4874.     if [ $size_rootkB -lt $req_size_rootkB ];then
  4875.         result=1
  4876.     fi
  4877.     if [ ! -z "$DATA_DEVICE" ]; then
  4878.         size_datakB=$(partitionSize $DATA_DEVICE)
  4879.         if [ $size_datakB -lt $req_size_datakB ];then
  4880.             result=2
  4881.         fi
  4882.     fi
  4883.     #======================================
  4884.     # Print message on error
  4885.     #--------------------------------------
  4886.     case $result in
  4887.         1 ) Echo "The installation requires at least"
  4888.             Echo -b "$(( ${req_size_rootkB} / 1024 / 1024 )) GB disk space"
  4889.             Echo -b "for the root partition. You can override this check"
  4890.             Echo -b "by passing 'nohdcheck=1' to the kernel commandline."
  4891.             systemException \
  4892.                 "SAPStorageCheck failed... reboot" \
  4893.             "reboot"
  4894.             ;;
  4895.         2 ) Echo "The installation requires at least"
  4896.             Echo -b "$(( ${req_size_datakB} / 1024 / 1024 )) GB disk space"
  4897.             Echo -b "for the data partition (second partition)."
  4898.             Echo -b "You can override this check"
  4899.             Echo -b "by passing 'nohdcheck=1' to the kernel commandline."
  4900.             systemException \
  4901.                 "SAPStorageCheck failed... reboot" \
  4902.             "reboot"
  4903.             ;;
  4904.     esac
  4905. }
  4906. #======================================
  4907. # SAPDataStorageSetup
  4908. #--------------------------------------
  4909. function SAPDataStorageSetup {
  4910.     # /.../
  4911.     # if OEM SAP option is set this function searches for
  4912.     # a disk which is not the system disk and sets it
  4913.     # up as LVM container for later use
  4914.     # ----
  4915.     local ROOT_DEVICE=$1
  4916.     local ROOT_EXCLUDE=$2
  4917.     local hwinfo=/usr/sbin/hwinfo
  4918.     local input=/tmp/fdisk.input
  4919.     local storage
  4920.     #======================================
  4921.     # Search a data disk
  4922.     #--------------------------------------
  4923.     if [ ! -n "$ROOT_DEVICE" ];then
  4924.         ROOT_DEVICE="."
  4925.     fi
  4926.     if [ ! -n "$ROOT_EXCLUDE" ];then
  4927.         ROOT_EXCLUDE=$ROOT_DEVICE
  4928.     fi
  4929.     local deviceDisks=`$hwinfo --disk |\
  4930.         grep "Device File:" | cut -f2 -d: |\
  4931.         cut -f1 -d"(" | sed -e s"@$ROOT_DEVICE@@" -s s"@$ROOT_EXCLUDE@@"`
  4932.     for storage in $deviceDisks;do
  4933.         break
  4934.     done
  4935.     if [ -z "$storage" ];then
  4936.         Echo "SAPDataStorageSetup: No data disk found... skipped"
  4937.         return
  4938.     fi
  4939.     #======================================
  4940.     # Partition the data disk
  4941.     #--------------------------------------
  4942.     Echo "Setting up $storage as SAP data device..."
  4943.     cat > $input < /dev/null
  4944.     dd if=/dev/zero of=$storage bs=512 count=1 &>/dev/null
  4945.     for cmd in n p 1 . . t 8e w q; do
  4946.         if [ $cmd = "." ];then
  4947.             echo >> $input
  4948.             continue
  4949.         fi
  4950.         echo $cmd >> $input
  4951.     done
  4952.     fdisk $storage < $input 1>&2
  4953.     if test $? != 0; then
  4954.         systemException "Failed to create partition table" "reboot"
  4955.     fi
  4956.     #======================================
  4957.     # Add volume group and filesystem
  4958.     #--------------------------------------
  4959.     local diskpart=$(ddn $storage 1)
  4960.     pvcreate -ff -y $diskpart
  4961.     vgcreate data_vg $diskpart
  4962.     lvcreate -l 100%FREE -n sapdata data_vg
  4963.     mke2fs -T ext3 -j /dev/data_vg/sapdata
  4964.     if test $? != 0; then
  4965.         systemException "Failed to create sapdata volume" "reboot"
  4966.     fi
  4967. }
  4968. #======================================
  4969. # SAPStartMediaChanger
  4970. #--------------------------------------
  4971. function SAPStartMediaChanger {
  4972.     local runme=/var/lib/YaST2/runme_at_boot
  4973.     local ininf=/etc/install.inf
  4974.     startX
  4975.     test -e $runme && mv $runme /tmp
  4976.     test -e $ininf && mv $ininf /tmp
  4977.     yast2 --noborder --fullscreen inst_autosetup   initial
  4978.     yast2 --noborder --fullscreen inst_sap_wrapper initial
  4979.     stoppX
  4980.     test -e /tmp/runme_at_boot && mv /tmp/runme_at_boot $runme
  4981.     test -e /tmp/install.inf && mv /tmp/install.inf $ininf
  4982. }
  4983.