[Fedora-livecd-list] [PATCH 2/3] Support the propagation of an installed Live image

Frederick Grose fgrose at gmail.com
Mon Dec 6 02:44:09 UTC 2010


Re: Bug 448030 <https://bugzilla.redhat.com/show_bug.cgi?id=448030> - RFE:
create a bootable Live USB stick from the running livecd

From: Frederick Grose <fgrose at gmail.com>
Date: Sun, 5 Dec 2010 17:57:06 -0500

Subject: [PATCH 2/3] Support the propagation of an installed Live image

Adjust the size-checking and boot configuration code to support
propagation of an installed Live image from the running or an
attached source.  Copy the livecd-iso-to-disk script to the new
installations to support continued or self propagation.
---
 tools/livecd-iso-to-disk.sh |  115
++++++++++++++++++++++++++-----------------
 1 files changed, 70 insertions(+), 45 deletions(-)

diff --git a/tools/livecd-iso-to-disk.sh b/tools/livecd-iso-to-disk.sh
index 9593c64..3ca4ea7 100755
--- a/tools/livecd-iso-to-disk.sh
+++ b/tools/livecd-iso-to-disk.sh
@@ -337,7 +337,7 @@ if [ $(id -u) != 0 ]; then
 fi

 detectsrctype() {
-    if [ -e $SRCMNT/LiveOS/squashfs.img ]; then
+    if [[ -e $SRCMNT/$LIVEOS/osmin.img ]]; then
         srctype=live
         return
     fi
@@ -575,54 +575,52 @@ if [ -n "$efi" -a ! -d $SRCMNT/EFI/boot ]; then
     exitclean
 fi

-# let's try to make sure there's enough room on the stick
-if [ -d $SRCMNT/LiveOS ]; then
-    check=$SRCMNT/LiveOS
-else
-    check=$SRCMNT
-fi
+# Let's try to make sure there's enough room on the target device.
 if [[ -d $TGTMNT/$LIVEOS ]]; then
     tbd=($(du -B 1M $TGTMNT/$LIVEOS))
-    [[ -s $TGTMNT/$LIVEOS/$HOMEFILE ]] && \
+    if [[ -s $TGTMNT/$LIVEOS/$HOMEFILE ]] && [[ -n $keephome ]]; then
         homesize=($(du -B 1M $TGTMNT/$LIVEOS/$HOMEFILE))
-    ((homesize > 0)) && [[ -n $keephome ]] && ((tbd -= homesize))
+        ((tbd -= homesize))
+    fi
 else
     tbd=0
 fi
-targets="$TGTMNT/$SYSLINUXPATH"
-if [[ -n $efi ]]; then
-    targets+=" $TGTMNT/EFI/boot"
+
+if [[ live == $srctype ]]; then
+    targets="$TGTMNT/$SYSLINUXPATH"
+    [[ -n $efi ]] && targets+=" $TGTMNT/EFI/boot"
+    [[ -n $xo ]] && targets+=" $TGTMNT/boot/olpc.fth"
+    duTable=($(du -c -B 1M $targets 2> /dev/null))
+    ((tbd += ${duTable[*]: -2:1}))
 fi
-duTable=($(du -c -B 1M $targets 2> /dev/null))
-((tbd += ${duTable[*]: -2:1}))

-sources="$SRCMNT/isolinux"
-[[ -n $efi ]] && sources+=" $SRCMNT/EFI/boot"
-if [[ -n $skipcompress ]]; then
-    if [[ -s $SRCMNT/LiveOS/squashfs.img ]]; then
-        if mount -o loop $SRCMNT/LiveOS/squashfs.img $SRCMNT; then
-            livesize=($(du -B 1M --apparent-size
$SRCMNT/LiveOS/ext3fs.img))
-            umount $SRCMNT
-        else
-            echo "WARNING: --skipcompress or --xo was specified but the
-            currently-running kernel can not mount the SquashFS from the
source
-            file to extract it. Instead, the compressed SquashFS will be
copied
-            to the target device."
-            skipcompress=""
-        fi
+if [[ -n $skipcompress ]] && [[ -s $SRCMNT/$LIVEOS/squashfs.img ]]; then
+    if mount -o loop $SRCMNT/$LIVEOS/squashfs.img $SRCMNT; then
+        livesize=($(du -B 1M --apparent-size $SRCMNT/LiveOS/ext3fs.img))
+        umount $SRCMNT
+    else
+        echo "WARNING: --skipcompress or --xo was specified but the
+        currently-running kernel can not mount the SquashFS from the source
+        file to extract it. Instead, the compressed SquashFS will be copied
+        to the target device."
+        skipcompress=""
     fi
-    duTable=($(du -c -B 1M $sources 2> /dev/null))
+fi
+
+if [[ live == $srctype ]]; then
+    thisScriptpath=$(readlink -f "$0")
+    sources="$SRCMNT/$LIVEOS/ext3fs.img $SRCMNT/$LIVEOS/osmin.img"
+    [[ -z $skipcompress ]] && sources+=" $SRCMNT/$LIVEOS/squashfs.img"
+    sources+=" $SRCMNT/isolinux $SRCMNT/syslinux"
+    [[ -n $efi ]] && sources+=" $SRCMNT/EFI/boot"
+    duTable=($(du -c -B 1M "$thisScriptpath" $sources 2> /dev/null))
     ((livesize += ${duTable[*]: -2:1}))
-else
-    sources+=" $check/osmin.img $check/squashfs.img"
-    duTable=($(du -c -B 1M $sources 2> /dev/null))
-    livesize=${duTable[*]: -2:1}
 fi

 freespace=($(df -B 1M --total $TGTDEV))
 freespace=${freespace[*]: -2:1}

-if [ "$srctype" = "live" ]; then
+if [[ live == $srctype ]]; then
     tba=$((overlaysizemb + homesizemb + livesize + swapsizemb))
     if ((tba > freespace + tbd)); then
         needed=$((tba - freespace - tbd))
@@ -641,7 +639,7 @@ if [ "$srctype" = "live" ]; then
         printf "    Space needed:  %15s  MiB\n\n" $needed
         printf "  To fit the installation on this device,
         \r  free space on the target, or decrease the
-        \r  requested size total by:    %s  MiB\n\n" $needed
+        \r  requested size total by:  %6s  MiB\n\n" $needed
         exitclean
     fi
 fi
@@ -694,17 +692,17 @@ if [ "$srctype" = "live" -a -z "$skipcopy" ]; then
     echo "Copying live image to the target device."
     [ ! -d $TGTMNT/$LIVEOS ] && mkdir $TGTMNT/$LIVEOS
     [ -n "$keephome" -a -f "$TGTMNT/$HOMEFILE" ] && mv $TGTMNT/$HOMEFILE
$TGTMNT/$LIVEOS/$HOMEFILE
-    if [ -n "$skipcompress" -a -f $SRCMNT/LiveOS/squashfs.img ]; then
-        mount -o loop $SRCMNT/LiveOS/squashfs.img $SRCMNT || exitclean
+    if [ -n "$skipcompress" -a -f $SRCMNT/$LIVEOS/squashfs.img ]; then
+        mount -o loop $SRCMNT/$LIVEOS/squashfs.img $SRCMNT || exitclean
         copyFile $SRCMNT/LiveOS/ext3fs.img $TGTMNT/$LIVEOS/ext3fs.img ||
(umount $SRCMNT ; exitclean)
         umount $SRCMNT
-    elif [ -f $SRCMNT/LiveOS/squashfs.img ]; then
-        copyFile $SRCMNT/LiveOS/squashfs.img $TGTMNT/$LIVEOS/squashfs.img
|| exitclean
-    elif [ -f $SRCMNT/LiveOS/ext3fs.img ]; then
-        copyFile $SRCMNT/LiveOS/ext3fs.img $TGTMNT/$LIVEOS/ext3fs.img ||
exitclean
+    elif [ -f $SRCMNT/$LIVEOS/squashfs.img ]; then
+        copyFile $SRCMNT/$LIVEOS/squashfs.img $TGTMNT/$LIVEOS/squashfs.img
|| exitclean
+    elif [ -f $SRCMNT/$LIVEOS/ext3fs.img ]; then
+        copyFile $SRCMNT/$LIVEOS/ext3fs.img $TGTMNT/$LIVEOS/ext3fs.img ||
exitclean
     fi
-    if [ -f $SRCMNT/LiveOS/osmin.img ]; then
-        copyFile $SRCMNT/LiveOS/osmin.img $TGTMNT/$LIVEOS/osmin.img ||
exitclean
+    if [ -f $SRCMNT/$LIVEOS/osmin.img ]; then
+        copyFile $SRCMNT/$LIVEOS/osmin.img $TGTMNT/$LIVEOS/osmin.img ||
exitclean
     fi
     sync
 fi
@@ -720,7 +718,19 @@ if [ \( "$srctype" = "installer" -o "$srctype" =
"netinst" \) -a -z "$skipcopy"
     sync
 fi

-cp $SRCMNT/isolinux/* $TGTMNT/$SYSLINUXPATH
+# Adjust syslinux sources for replication of installed images
+# between filesystem types.
+if [[ -d $SRCMNT/isolinux/ ]]; then
+    cp $SRCMNT/isolinux/* $TGTMNT/$SYSLINUXPATH
+elif [[ -d $SRCMNT/syslinux/ ]]; then
+    cp $SRCMNT/syslinux/* $TGTMNT/$SYSLINUXPATH
+    if [[ -f $SRCMNT/syslinux/extlinux.conf ]]; then
+        mv $TGTMNT/$SYSLINUXPATH/extlinux.conf \
+            $TGTMNT/$SYSLINUXPATH/isolinux.cfg
+    elif [[ -f $SRCMNT/syslinux/syslinux.cfg ]]; then
+        mv $TGTMNT/$SYSLINUXPATH/syslinux.cfg
$TGTMNT/$SYSLINUXPATH/isolinux.cfg
+    fi
+fi
 BOOTCONFIG=$TGTMNT/$SYSLINUXPATH/isolinux.cfg
 # Set this to nothing so sed doesn't care
 BOOTCONFIG_EFI=
@@ -732,6 +742,21 @@ if [ -n "$efi" ]; then
     rm -f $TGTMNT/EFI/boot/grub.conf
 fi

+if [[ live == $srctype ]]; then
+    # Copy this installer script.
+    cp -fTp "$thisScriptpath" $TGTMNT/$LIVEOS/livecd-iso-to-disk &>
/dev/null
+
+    # When the source is an installed Live USB/SD image, restore the boot
config
+    # file to a base state before updating.
+    if [[ -d $SRCMNT/syslinux/ ]]; then
+        echo "Preparing boot config file."
+        sed -i -e "s/root=live:[^ ]*/root=live:CDLABEL=name/"\
+               -e "s/liveimg .* quiet/liveimg quiet/"\
+                    $BOOTCONFIG $BOOTCONFIG_EFI
+        sed -i -e "s/^timeout.*$/timeout\ 100/"\
+               -e "/^totaltimeout.*$/d" $BOOTCONFIG
+    fi
+fi
 echo "Updating boot config file"
 # adjust label and fstype
 if [ -n "$LANG" ]; then
-- 
1.7.3.2
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.fedoraproject.org/pipermail/livecd/attachments/20101205/e98f4d1b/attachment.html 


More information about the livecd mailing list