X-Git-Url: https://git.grml.org/?p=grml2usb.git;a=blobdiff_plain;f=grml2usb;h=de95e5a4e1b0a2cead3bebf4c81b66dd9d692096;hp=e8b0f1aee15edd612c70b53965457f6bd22ae6fa;hb=8ae38e3285f270d3d782277632d4853663b94b49;hpb=0339fd8b85321b55b665a26909f82db3c06f817b diff --git a/grml2usb b/grml2usb index e8b0f1a..de95e5a 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.3" +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 @@ -283,9 +283,9 @@ menuentry "FreeDOS" { initrd /boot/addons/balder10.imz } -menuentry "MirBSD" { +menuentry "MirOS BSD" { set root=(hd0,%(install_partition)s) - linux /boot/addons/bsd4grml/ldbsd.com + multiboot /boot/addons/bsd4grml/ldbsd.com } menuentry "Boot OS of first partition on first disk" { @@ -315,6 +315,13 @@ menuentry "%(grml_flavour)s" { } ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] +menuentry "%(grml_flavour)s-persistent" { + set root=(hd0,%(install_partition)s) + linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet persistent live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s + initrd /boot/release/%(grml_flavour)s/initrd.gz +} + +## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] menuentry "%(grml_flavour)s2ram" { set root=(hd0,%(install_partition)s) linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ toram=%(grml_flavour)s %(bootoptions)s @@ -324,43 +331,43 @@ menuentry "%(grml_flavour)s2ram" { ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] menuentry "%(grml_flavour)s-debug" { set root=(hd0,%(install_partition)s) - linux /boot/release/%(grml_flavour)s/linux26 - initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ debug boot=live initcall_debug%(bootoptions)s + linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ debug boot=live initcall_debug%(bootoptions)s + initrd /boot/release/%(grml_flavour)s/initrd.gz } ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] menuentry "%(grml_flavour)s-x" { set root=(hd0,%(install_partition)s) - linux /boot/release/%(grml_flavour)s/linux26 - initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ startx=wm-ng %(bootoptions)s + linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ startx=wm-ng %(bootoptions)s + initrd /boot/release/%(grml_flavour)s/initrd.gz } ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] menuentry "%(grml_flavour)s-nofb" { set root=(hd0,%(install_partition)s) - linux /boot/release/%(grml_flavour)s/linux26 - initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=ofonly %(bootoptions)s + linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=ofonly %(bootoptions)s + initrd /boot/release/%(grml_flavour)s/initrd.gz } ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] menuentry "%(grml_flavour)s-failsafe" { set root=(hd0,%(install_partition)s) - linux /boot/release/%(grml_flavour)s/linux26 - initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal boot=live noautoconfig atapicd noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia maxcpus=1 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm %(bootoptions)s + linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal boot=live noautoconfig atapicd noapic noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia nosmp maxcpus=0 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm noresume selinux=0 edd=off %(bootoptions)s + initrd /boot/release/%(grml_flavour)s/initrd.gz } ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] menuentry "%(grml_flavour)s-forensic" { set root=(hd0,%(install_partition)s) - linux /boot/release/%(grml_flavour)s/linux26 - initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ nofstab noraid nolvm noautoconfig noswap raid=noautodetect %(bootoptions)s + linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ nofstab noraid nolvm noautoconfig noswap raid=noautodetect %(bootoptions)s + initrd /boot/release/%(grml_flavour)s/initrd.gz } ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] menuentry "%(grml_flavour)s-serial" { set root=(hd0,%(install_partition)s) - linux /boot/release/%(grml_flavour)s/linux26 - initrd /boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=vesafb:off console=tty1 console=ttyS0,9600n8 %(bootoptions)s + linux /boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal video=vesafb:off console=tty1 console=ttyS0,9600n8 %(bootoptions)s + initrd /boot/release/%(grml_flavour)s/initrd.gz } """ % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp, @@ -383,6 +390,11 @@ kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=pow initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] +title %(grml_flavour)s-persistent +kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet persistent live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s +initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz + +## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] title %(grml_flavour)s2ram kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ toram=%(grml_flavour)s %(bootoptions)s initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz @@ -404,7 +416,7 @@ initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] title %(grml_flavour)s-failsafe -kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal boot=live noautoconfig atapicd noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia maxcpus=1 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm %(bootoptions)s +kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal boot=live noautoconfig atapicd noapic noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia nosmp maxcpus=0 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm noresume selinux=0 edd=off %(bootoptions)s initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz ## flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] @@ -439,7 +451,7 @@ background = FFCC33 # define entries: title %(grml_flavour)s - Default boot (using 1024x768 framebuffer) -kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off vga=791 quiet boot=live nomce live-media-path=/live/%(grml_flavour)s/ +kernel (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/linux26 apm=power-off vga=791 quiet boot=live nomce live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s initrd (hd0,%(install_partition)s)/boot/release/%(grml_flavour)s/initrd.gz title Memory test (memtest86+) @@ -453,7 +465,7 @@ title FreeDOS kernel (hd0,%(install_partition)s)/boot/addons/memdisk initrd (hd0,%(install_partition)s)/boot/addons/balder10.imz -title MirBSD +title MirOS BSD kernel (hd0,%(install_partition)s)/boot/addons/bsd4grml/ldbsd.com """ % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp, @@ -532,6 +544,11 @@ LABEL bsd MENU LABEL bsd KERNEL /boot/addons/bsd4grml/ldbsd.com +# hardware detection tool +MENU LABEL hdt +KERNEL /boot/addons/hdt.c32 +APPEND pciids=/boot/addons/pci.ids + ## end of global configuration """ % {'grml_flavour': grml_flavour, 'local_datestamp': local_datestamp, 'bootoptions': bootoptions} ) @@ -552,6 +569,11 @@ KERNEL /boot/release/%(grml_flavour)s/linux26 APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s # flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] +LABEL %(grml_flavour)s-persistent +KERNEL /boot/release/%(grml_flavour)s/linux26 +APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet persistent live-media-path=/live/%(grml_flavour)s/ %(bootoptions)s + +# flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] LABEL %(grml_flavour)s2ram KERNEL /boot/release/%(grml_flavour)s/linux26 APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce vga=791 quiet live-media-path=/live/%(grml_flavour)s/ toram=%(grml_flavour)s %(bootoptions)s @@ -574,7 +596,7 @@ APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live n # flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] LABEL %(grml_flavour)s-failsafe KERNEL /boot/release/%(grml_flavour)s/linux26 -APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal boot=live noautoconfig atapicd noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia maxcpus=1 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm %(bootoptions)s +APPEND initrd=/boot/release/%(grml_flavour)s/initrd.gz apm=power-off boot=live nomce quiet live-media-path=/live/%(grml_flavour)s/ vga=normal boot=live noautoconfig atapicd noapic noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia nosmp maxcpus=0 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm noresume selinux=0 edd=off %(bootoptions)s # flavour specific configuration for %(grml_flavour)s [grml2usb for %(grml_flavour)s: %(local_datestamp)s] LABEL %(grml_flavour)s-forensic @@ -606,7 +628,10 @@ def install_grub(device): "--root-directory=%s" % device_mountpoint, device], stdout=file(os.devnull, "r+")) proc.wait() if proc.returncode != 0: - raise Exception("error executing grub-install") + # raise Exception("error executing grub-install") + logging.critical("Fatal: error executing grub-install (please check the grml2usb FAQ)" % error) + cleanup() + sys.exit(1) except CriticalException, error: logging.critical("Fatal: %s" % error) cleanup() @@ -869,7 +894,7 @@ def unmount(target, unmount_options): # make sure we unmount only already mounted targets target_unmount = False mounts = open('/proc/mounts').readlines() - mountstring = re.compile(".*%s.*" % re.escape(target)) + mountstring = re.compile(".*%s.*" % re.escape(os.path.realpath(target))) for line in mounts: if re.match(mountstring, line): target_unmount = True @@ -894,13 +919,18 @@ def check_for_usbdevice(device): """ usbdevice = re.match(r'/dev/(.*?)\d*$', device).group(1) - usbdevice = os.path.realpath('/sys/class/block/' + usbdevice + '/removable') - if os.path.isfile(usbdevice): - is_usb = open(usbdevice).readline() - if is_usb == "1": + # newer systems: + usbdev = os.path.realpath('/sys/class/block/' + usbdevice + '/removable') + if not os.path.isfile(usbdev): + # Ubuntu with kernel 2.6.24 for example: + usbdev = os.path.realpath('/sys/block/' + usbdevice + '/removable') + + if os.path.isfile(usbdev): + is_usb = open(usbdev).readline() + if is_usb.find("1"): return 0 - else: - return 1 + + return 1 def check_for_fat(partition): @@ -946,6 +976,7 @@ def copy_system_files(grml_flavour, iso_mount, target): squashfs = search_file(grml_flavour + '.squashfs', iso_mount) if squashfs is None: logging.critical("Fatal: squashfs file not found") + raise CriticalException("error locating squashfs file") else: squashfs_target = target + '/live/' + grml_flavour + '/' execute(mkdir, squashfs_target) @@ -1036,7 +1067,7 @@ def copy_addons(iso_mount, target): # grub all-in-one image allinoneimg = search_file('allinone.img', iso_mount) if allinoneimg is None: - logging.warn("Warning: allinone.img not found (that's fine if you don't need it") + logging.warn("Warning: allinone.img not found (that's fine if you don't need it)") else: logging.debug("cp %s %s" % (allinoneimg, addons + '/allinone.img')) proc = subprocess.Popen(["cp", allinoneimg, addons + 'allinone.img']) @@ -1045,7 +1076,7 @@ def copy_addons(iso_mount, target): # bsd imag bsdimg = search_file('bsd4grml', iso_mount) if bsdimg is None: - logging.warn("Warning: bsd4grml not found (that's fine if you don't need it") + logging.warn("Warning: bsd4grml not found (that's fine if you don't need it)") else: logging.debug("cp -a %s %s" % (bsdimg, addons + '/')) proc = subprocess.Popen(["cp", "-a", bsdimg, addons + '/']) @@ -1054,16 +1085,32 @@ def copy_addons(iso_mount, target): # freedos image balderimg = search_file('balder10.imz', iso_mount) if balderimg is None: - logging.warn("Warning: balder10.imz not found (that's fine if you don't need it") + logging.warn("Warning: balder10.imz not found (that's fine if you don't need it)") else: logging.debug("cp %s %s" % (balderimg, addons + '/balder10.imz')) proc = subprocess.Popen(["cp", balderimg, addons + 'balder10.imz']) proc.wait() + # install hdt and pci.ids only when using syslinux (grub doesn't support it) + if options.syslinux: + # hdt (hardware detection tool) image + hdtimg = search_file('hdt.c32', iso_mount) + if hdtimg: + logging.debug("cp %s %s" % (hdtimg, addons + '/hdt.c32')) + proc = subprocess.Popen(["cp", hdtimg, addons + '/hdt.c32']) + proc.wait() + + # pci.ids file + picids = search_file('pci.ids', iso_mount) + if picids: + logging.debug("cp %s %s" % (picids, addons + '/pci.ids')) + proc = subprocess.Popen(["cp", picids, addons + '/pci.ids']) + proc.wait() + # memdisk image memdiskimg = search_file('memdisk', iso_mount) if memdiskimg is None: - logging.warn("Warning: memdisk not found (that's fine if you don't need it") + logging.warn("Warning: memdisk not found (that's fine if you don't need it)") else: logging.debug("cp %s %s" % (memdiskimg, addons + '/memdisk')) proc = subprocess.Popen(["cp", memdiskimg, addons + 'memdisk']) @@ -1072,7 +1119,7 @@ def copy_addons(iso_mount, target): # memtest86+ image memtestimg = search_file('memtest', iso_mount) if memtestimg is None: - logging.warn("Warning: memtest not found (that's fine if you don't need it") + logging.warn("Warning: memtest not found (that's fine if you don't need it)") else: logging.debug("cp %s %s" % (memtestimg, addons + '/memtest')) proc = subprocess.Popen(["cp", memtestimg, addons + 'memtest']) @@ -1104,6 +1151,7 @@ def copy_bootloader_files(iso_mount, target): if not os.path.isfile("/usr/share/grml2usb/grub/splash.xpm.gz"): logging.critical("Error: /usr/share/grml2usb/grub/splash.xpm.gz can not be read.") + logging.critical("Please make sure you've the grml2usb Debian package installed!") raise else: logging.debug("cp /usr/share/grml2usb/grub/splash.xpm.gz %s" % grub_target + 'splash.xpm.gz') @@ -1143,8 +1191,12 @@ def install_iso_files(grml_flavour, iso_mount, device, target): return 0 elif not options.bootloaderonly: logging.info("Copying files. This might take a while....") - copy_system_files(grml_flavour, iso_mount, target) - copy_grml_files(iso_mount, target) + try: + copy_system_files(grml_flavour, iso_mount, target) + copy_grml_files(iso_mount, target) + except CriticalException, error: + logging.critical("Execution failed: %s", error) + sys.exit(1) if not options.skipaddons: if grml_flavour.endswith('-small'): @@ -1390,6 +1442,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. @@ -1399,10 +1492,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 @@ -1556,6 +1645,9 @@ def handle_compat_warning(device): def handle_logging(): """Log handling and configuration""" + if options.verbose and options.quiet: + parser.error("please use either verbose (--verbose) or quiet (--quiet) option") + if options.verbose: FORMAT = "Debug: %(asctime)-15s %(message)s" logging.basicConfig(level=logging.DEBUG, format=FORMAT) @@ -1597,6 +1689,8 @@ def main(): # make sure we have the appropriate permissions check_uid_root() + logging.info("Executing grml2usb version %s", PROG_VERSION) + if options.dryrun: logging.info("Running in simulation mode as requested via option dry-run.") @@ -1622,7 +1716,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):