Support installation of the currently running grml live system
authorMichael Prokop <mika@grml.org>
Wed, 20 May 2009 17:23:49 +0000 (19:23 +0200)
committerMichael Prokop <mika@grml.org>
Wed, 20 May 2009 17:23:52 +0000 (19:23 +0200)
debian/changelog
grml2usb
grml2usb.8.txt

index 202acdc..9a21644 100644 (file)
@@ -1,3 +1,10 @@
+grml2usb (0.9.6) unstable; urgency=low
+
+  * Support installation of the currently running grml live
+    system ("grml2usb /live/image /dev/sdx1").
+
+ -- Michael Prokop <mika@grml.org>  Wed, 20 May 2009 19:22:59 +0200
+
 grml2usb (0.9.5) unstable; urgency=low
 
   * Fix dashes of options in manpage (thanks for the bugreport,
 grml2usb (0.9.5) unstable; urgency=low
 
   * Fix dashes of options in manpage (thanks for the bugreport,
index 9a9bb24..f8a53c4 100755 (executable)
--- a/grml2usb
+++ b/grml2usb
@@ -18,7 +18,7 @@ from inspect import isroutine, isclass
 import datetime, logging, os, re, subprocess, sys, tempfile, time
 
 # global variables
 import datetime, logging, os, re, subprocess, sys, tempfile, time
 
 # global variables
-PROG_VERSION = "0.9.5"
+PROG_VERSION = "0.9.6"
 MOUNTED = set()  # register mountpoints
 TMPFILES = set() # register tmpfiles
 DATESTAMP = time.mktime(datetime.datetime.now().timetuple()) # unique identifier for syslinux.cfg
 MOUNTED = set()  # register mountpoints
 TMPFILES = set() # register tmpfiles
 DATESTAMP = time.mktime(datetime.datetime.now().timetuple()) # unique identifier for syslinux.cfg
@@ -1425,6 +1425,47 @@ def handle_bootloader_config(grml_flavour, device, target):
             logging.critical("Fatal: %s" % error)
             sys.exit(1)
 
             logging.critical("Fatal: %s" % error)
             sys.exit(1)
 
+def handle_dir(live_image, device):
+    """Main logic for copying files of the currently running grml system.
+
+    @live_image: directory where currently running live system resides (usually /live/image)
+    @device: partition where the specified ISO should be installed to"""
+
+    logging.info("Using %s as install base" % live_image)
+
+    if os.path.isdir(device):
+        logging.info("Specified target is a directory, not mounting therefor.")
+        device_mountpoint = device
+        remove_device_mountpoint = False
+    else:
+        device_mountpoint = tempfile.mkdtemp(prefix="grml2usb")
+        register_tmpfile(device_mountpoint)
+        remove_device_mountpoint = True
+        try:
+            mount(device, device_mountpoint, "")
+        except CriticalException, error:
+            logging.critical("Fatal: %s" % error)
+            cleanup()
+            sys.exit(1)
+
+    try:
+        grml_flavour = identify_grml_flavour(live_image)
+        logging.info("Identified grml flavour \"%s\"." % grml_flavour)
+        install_iso_files(grml_flavour, live_image, device, device_mountpoint)
+    except TypeError:
+        logging.critical("Fatal: a critical error happend during execution (not a grml ISO?), giving up")
+        sys.exit(1)
+    finally:
+        if remove_device_mountpoint:
+            try:
+                unmount(device_mountpoint, "")
+                if os.path.isdir(device_mountpoint):
+                    os.rmdir(device_mountpoint)
+                    unregister_tmpfile(device_mountpoint)
+            except CriticalException, error:
+                logging.critical("Fatal: %s" % error)
+                cleanup()
+
 
 def handle_iso(iso, device):
     """Main logic for mounting ISOs and copying files.
 
 def handle_iso(iso, device):
     """Main logic for mounting ISOs and copying files.
@@ -1434,10 +1475,6 @@ def handle_iso(iso, device):
 
     logging.info("Using ISO %s" % iso)
 
 
     logging.info("Using ISO %s" % iso)
 
-    if os.path.isdir(iso):
-        logging.critical("TODO: /live/image handling not yet implemented - sorry")
-        sys.exit(1)
-
     iso_mountpoint = tempfile.mkdtemp(prefix="grml2usb")
     register_tmpfile(iso_mountpoint)
     remove_iso_mountpoint = True
     iso_mountpoint = tempfile.mkdtemp(prefix="grml2usb")
     register_tmpfile(iso_mountpoint)
     remove_iso_mountpoint = True
@@ -1662,7 +1699,10 @@ def main():
 
     # main operation (like installing files)
     for iso in isos:
 
     # main operation (like installing files)
     for iso in isos:
-        handle_iso(iso, device)
+        if os.path.isdir(iso):
+            handle_dir(iso, device)
+        else:
+            handle_iso(iso, device)
 
     # install mbr
     if not os.path.isdir(device):
 
     # install mbr
     if not os.path.isdir(device):
index 75d3662..822341d 100644 (file)
@@ -34,11 +34,8 @@ grub doesn't work for you check out the --syslinux option.
 Options
 -------
 
 Options
 -------
 
-The ISO[s] is the path to one or multiple grml-ISOs.
-/////////////////////////////////////////////////////////////////////////////
-TODO:
-as well as the path to the currently running live-system (being /live/image).
-/////////////////////////////////////////////////////////////////////////////
+The ISO[s] should be the path to one or multiple grml-ISOs and/or the path to
+the currently running live-system (being /live/image).
 
 The device either might be a device name like /dev/sdx1 or a directory. When
 specifying a device name the device is mounted automatically. When specifying a
 
 The device either might be a device name like /dev/sdx1 or a directory. When
 specifying a device name the device is mounted automatically. When specifying a
@@ -266,13 +263,13 @@ or:
 Finally create a filesystem and execute grml2usb as needed:
 
   # mkfs.vfat /dev/loop1
 Finally create a filesystem and execute grml2usb as needed:
 
   # mkfs.vfat /dev/loop1
-  # grml2usb --bootloader-only /grml/isos/grml-small_2008.11.iso /dev/loop1
+  # grml2usb --bootloader-only /grml/isos/grml-small_2009.05.iso /dev/loop1
 
 Performance tracing
 ~~~~~~~~~~~~~~~~~~~
 
   # blktrace -d /dev/sdx -o - | blkparse -i -
 
 Performance tracing
 ~~~~~~~~~~~~~~~~~~~
 
   # blktrace -d /dev/sdx -o - | blkparse -i -
-  # grml2usb grml_2008.11.iso /dev/sdx1
+  # grml2usb grml_2009.05.iso /dev/sdx1
 
 [[X6]]
 Troubleshooting and Pitfalls when booting
 
 [[X6]]
 Troubleshooting and Pitfalls when booting
@@ -319,6 +316,7 @@ isolinux/syslinux fixes the problem.
 Frequently Asked Questions (FAQ)
 --------------------------------
 
 Frequently Asked Questions (FAQ)
 --------------------------------
 
+[[X5]]
 Where can I get grml2usb?
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Where can I get grml2usb?
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -342,11 +340,11 @@ harddisk immediately.  grml2usb copies just the compressed chroot filesystem
 (being the squashfs file), some further informational files and a bootloader to
 your device. This way you don't need as much space as with a harddisk
 installation (just a USB device with >=ISO size) and when rebooting the system
 (being the squashfs file), some further informational files and a bootloader to
 your device. This way you don't need as much space as with a harddisk
 installation (just a USB device with >=ISO size) and when rebooting the system
-your changes will be lost (even though a persistent root feature is
-work-in-progress). Think of using a better CD version: booting is (usually)
-faster, you don't need to burn a new CD when a new ISO version arrives (just
-install the new ISO using grml2usb) and you can carry additional files on a
-writable medium with yourself.
+your changes will be lost (unless you are using the persistency feature, see
+link:http://wiki.grml.org/doku.php?id=persistency[http://wiki.grml.org/doku.php?id=persistency]).
+Think of using a better CD version: booting is (usually) faster, you don't need
+to burn a new CD when a new ISO version arrives (just install the new ISO using
+grml2usb) and you can carry additional files on a writable medium with yourself.
 
 Why is there a menu.lst and a grub.cfg inside /boot/grub/?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Why is there a menu.lst and a grub.cfg inside /boot/grub/?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -375,12 +373,33 @@ The following message:
 ... is "normal". grub-install sends those messages to stderr. To avoid hiding any
 possible real error messages grml2usb doesn't ignore those messages.
 
 ... is "normal". grub-install sends those messages to stderr. To avoid hiding any
 possible real error messages grml2usb doesn't ignore those messages.
 
+grub-install complains about /boot/grub/device.map?!
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The following message:
+
+  grub-probe: error: Cannot open `/boot/grub/device.map'
+
+... is "normal" (at least with grub1). This isn't a problem, because the
+device.map file will be generated on the target device anyway.
+
+grub-install complains about a unary operator?!
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The following message:
+
+  '/usr/sbin/grub-install: line 374: [: =: unary operator expected'
+
+... is "normal". Just ignore it.
+
 I'm getting something like "Error: /usr/share/grml2usb/grub/splash.xpm.gz can not be read"!?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 I'm getting something like "Error: /usr/share/grml2usb/grub/splash.xpm.gz can not be read"!?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Looks like you've just the grml2usb script available. Please make sure you've
-the grml2usb Debian package installed. It's available via
-link:http://deb.grml.org/[the grml-testing Debian repository].
+Looks like you've only the grml2usb script itself available. Please make sure
+you've the grml2usb Debian package installed. The most resent stable version is
+available via link:http://deb.grml.org/[the grml-testing Debian repository].  If
+you do not have a Debian system please see section <<X5,Where can I get
+grml2usb?>> in this FAQ.
 
 Why do I have to use a FAT16 filesystem?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Why do I have to use a FAT16 filesystem?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -412,11 +431,11 @@ of your grml2usb commandline (consider using the "\--verbose" option).
 Usage examples
 --------------
 
 Usage examples
 --------------
 
-  # grml2usb /home/grml/grml_2008.11.iso /dev/sdx1
+  # grml2usb /home/grml/grml_2009.05.iso /dev/sdx1
 
 Install specified ISO on device /dev/sdx1.
 
 
 Install specified ISO on device /dev/sdx1.
 
-  # grml2usb /home/grml/grml_2008.11.iso /home/grml/grml_small_2008.11.iso /dev/sdx1
+  # grml2usb /home/grml/grml_2009.05.iso /home/grml/grml_small_2009.05.iso /dev/sdx1
 
 Install specified ISOs on device /dev/sdx1 for multibooting ISOs.
 Note: boot "grml" as usual, for booting grml-small use "grml-small on the
 
 Install specified ISOs on device /dev/sdx1 for multibooting ISOs.
 Note: boot "grml" as usual, for booting grml-small use "grml-small on the
@@ -424,31 +443,40 @@ bootprompt, for grml64 use "grml64" and so on... The *first* specified ISO is
 the one being the default (when just pressing enter or waiting until the timeout
 is reached).
 
 the one being the default (when just pressing enter or waiting until the timeout
 is reached).
 
-  # grml2usb --fat16 /home/grml/grml_2008.11.iso /dev/sdx1
+  # grml2usb /live/image /dev/sdx1
+
+Install currently running grml live system on device /dev/sdx1.
+
+  # grml2usb /live/image /home/grml/grml_2009.05.iso /dev/sdx1
+
+Install currently running grml live system and the specified
+ISO on device /dev/sdx1 for multibooting.
+
+  # grml2usb --fat16 /home/grml/grml_2009.05.iso /dev/sdx1
 
 Install specified ISO on device /dev/sdx1 and format partition /dev/sdx1 with
 FAT16 filesystem.
 
 
 Install specified ISO on device /dev/sdx1 and format partition /dev/sdx1 with
 FAT16 filesystem.
 
-  # grml2usb --syslinux /home/grml/grml_2008.11.iso /dev/sdx1
+  # grml2usb --syslinux /home/grml/grml_2009.05.iso /dev/sdx1
 
 Install specified ISO on device /dev/sdx1 and use syslinux as bootloader
 (instead of grub being the default).
 
 ///////////////////////////////////////////////////////////////////////////////////////
   # grml2usb --kernel=/boot/vmlinuz-2.6.28-grml --initrd=/boot/initrd.img-2.6.28-grml \
 
 Install specified ISO on device /dev/sdx1 and use syslinux as bootloader
 (instead of grub being the default).
 
 ///////////////////////////////////////////////////////////////////////////////////////
   # grml2usb --kernel=/boot/vmlinuz-2.6.28-grml --initrd=/boot/initrd.img-2.6.28-grml \
-             /home/grml/grml_2008.11.iso /dev/sdx1
+             /home/grml/grml_2009.05.iso /dev/sdx1
 
 Install specified ISO on device /dev/sdx1 but use given kernel and initrd
 instead of the ones provided by the ISO.
 
   # grml2usb --squashfs=/grml/grml-live/grml_cd/live/grml.squashfs \
 
 Install specified ISO on device /dev/sdx1 but use given kernel and initrd
 instead of the ones provided by the ISO.
 
   # grml2usb --squashfs=/grml/grml-live/grml_cd/live/grml.squashfs \
-             /home/grml/grml_2008.11.iso /dev/sdx1
+             /home/grml/grml_2009.05.iso /dev/sdx1
 
 Install specified ISO on device /dev/sdx1 but use given squashfs
 file instead of the one provided by the ISO.
 ///////////////////////////////////////////////////////////////////////////////////////
 
 
 Install specified ISO on device /dev/sdx1 but use given squashfs
 file instead of the one provided by the ISO.
 ///////////////////////////////////////////////////////////////////////////////////////
 
-  # grml2usb --bootoptions="lang=de ssh=mysecret" grml_2008.11.iso /dev/sdx1
+  # grml2usb --bootoptions="lang=de ssh=mysecret" grml_2009.05.iso /dev/sdx1
 
 Install specified ISO on device /dev/sdx1 and use "lang=de ssh=mysecret" as
 default bootoptions.
 
 Install specified ISO on device /dev/sdx1 and use "lang=de ssh=mysecret" as
 default bootoptions.