From: Michael Prokop Date: Wed, 20 May 2009 17:23:49 +0000 (+0200) Subject: Support installation of the currently running grml live system X-Git-Tag: v0.9.6~1 X-Git-Url: https://git.grml.org/?p=grml2usb.git;a=commitdiff_plain;h=627d8d8f3b3b8963ae8657c19bc020bbbf9b5a93 Support installation of the currently running grml live system --- diff --git a/debian/changelog b/debian/changelog index 202acdc..9a21644 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 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, diff --git a/grml2usb b/grml2usb index 9a9bb24..f8a53c4 100755 --- a/grml2usb +++ b/grml2usb @@ -18,7 +18,7 @@ from inspect import isroutine, isclass 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 @@ -1425,6 +1425,47 @@ def handle_bootloader_config(grml_flavour, device, target): 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. @@ -1434,10 +1475,6 @@ def handle_iso(iso, device): 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 @@ -1662,7 +1699,10 @@ def main(): # 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): diff --git a/grml2usb.8.txt b/grml2usb.8.txt index 75d3662..822341d 100644 --- a/grml2usb.8.txt +++ b/grml2usb.8.txt @@ -34,11 +34,8 @@ grub doesn't work for you check out the --syslinux option. 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 @@ -266,13 +263,13 @@ or: 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 - - # grml2usb grml_2008.11.iso /dev/sdx1 + # grml2usb grml_2009.05.iso /dev/sdx1 [[X6]] Troubleshooting and Pitfalls when booting @@ -319,6 +316,7 @@ isolinux/syslinux fixes the problem. Frequently Asked Questions (FAQ) -------------------------------- +[[X5]] 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 -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/? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -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. +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"!? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -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 <> in this FAQ. Why do I have to use a FAT16 filesystem? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -412,11 +431,11 @@ of your grml2usb commandline (consider using the "\--verbose" option). 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. - # 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 @@ -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). - # 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. - # 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 \ - /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 \ - /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. /////////////////////////////////////////////////////////////////////////////////////// - # 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.