help="format specified partition with FAT16")
parser.add_option("--force", dest="force", action="store_true",
help="force any actions requiring manual interaction")
+parser.add_option("--grub", dest="grub", action="store_true",
+ help="install grub bootloader instead of (default) syslinux")
parser.add_option("--grub-mbr", dest="grubmbr", action="store_true",
help="install grub into MBR instead of (default) PBR")
parser.add_option("--lilo-binary", dest="lilobin", action="store", type="string",
parser.add_option("--skip-syslinux-config", dest="skipsyslinuxconfig", action="store_true",
help="skip generation of syslinux configuration files")
parser.add_option("--syslinux", dest="syslinux", action="store_true",
- help="install syslinux bootloader instead of grub")
+ help="install syslinux bootloader (deprecated as it's the default)")
parser.add_option("--syslinux-mbr", dest="syslinuxmbr", action="store_true",
help="install syslinux master boot record (MBR) instead of default")
parser.add_option("--verbose", dest="verbose", action="store_true",
# with manipulation of files on the octet level, like shell
# arrays, e.g. in MBR creation.
+
def array2string(a):
"""Convert a list of integers [0;255] to a string."""
return struct.pack("%sB" % len(a), *a)
+
def string2array(s):
"""Convert a (bytes) string into a list of integers."""
return struct.unpack("%sB" % len(s), s)
else:
grub_device = device
+ logging.info("Installing grub as bootloader")
logging.debug("grub-install --recheck --no-floppy --root-directory=%s %s",
device_mountpoint, grub_device)
proc = subprocess.Popen(["grub-install", "--recheck", "--no-floppy",
proc.wait()
if proc.returncode != 0:
# raise Exception("error executing grub-install")
- logging.critical("Fatal: error executing grub-install (please check the grml2usb FAQ or use --syslinux)")
+ logging.critical("Fatal: error executing grub-install (please check the grml2usb FAQ or drop the --grub option)")
logging.critical("Note: if using grub2 consider using the --grub-mbr option because grub2's PBR feature is broken.")
cleanup()
sys.exit(1)
# by default we use grub, so install syslinux only on request
if options.syslinux:
- try:
- install_syslinux(device)
- except CriticalException, error:
- logging.critical("Fatal: %s", error)
- cleanup()
- sys.exit(1)
- else:
+ logging.info("Note: the --syslinux option is deprecated as syslinux is grml2usb's default. Continuing anyway.")
+
+ if options.grub:
if not which("grub-install"):
logging.critical("Fatal: grub-install not available (please install the grub package or use the --syslinux option)")
cleanup()
logging.critical("Fatal: %s", error)
cleanup()
sys.exit(1)
+ else:
+ try:
+ install_syslinux(device)
+ except CriticalException, error:
+ logging.critical("Fatal: %s", error)
+ cleanup()
+ sys.exit(1)
def execute_lilo(lilo, device):
# make sure we have syslinux available
if not which("syslinux") and not options.copyonly:
- raise Exception("syslinux not available (either install it or consider dropping the --syslinux option)")
+ raise Exception("syslinux not available (either install it or consider using the --grub option)")
# lilo's mbr is broken, use the one from syslinux instead:
if not os.path.isfile("/usr/lib/syslinux/mbr.bin"):
bootsplash = search_file(ffile, iso_mount)
exec_rsync(bootsplash, syslinux_target + ffile)
- for filename in 'addons.cfg', 'default.cfg', 'distri.cfg', 'hidden.cfg', 'grml.cfg', 'grml.png', 'hd.cfg', 'isoprompt.cfg', 'options.cfg','vesamenu.c32', 'vesamenu.cfg', 'grml.png':
- path = search_file(filename, iso_mount)
+ # avoid the "file is read only, overwrite anyway (y/n) ?" question
+ # of mtools by syslinux ("mmove -D o -D O s:/ldlinux.sys $target_file")
+ if os.path.isfile(syslinux_target + 'ldlinux.sys'):
+ os.unlink(syslinux_target + 'ldlinux.sys')
+
+ if not search_file('default.cfg', iso_mount + '/boot/isolinux/'):
+ logging.critical("Fatal: file default.cfg could not be found.")
+ logging.critical("Note: this grml2usb version requires an ISO generated by grml-live >=0.9.24 ...")
+ logging.critical(" ... either use grml releases >=2009.10 or switch to an older grml2usb version.")
+ raise
+
+ for filename in 'addons.cfg', 'default.cfg', 'distri.cfg', 'hidden.cfg', \
+ 'grml.cfg', 'grml.png', 'hd.cfg', 'isoprompt.cfg', 'options.cfg', \
+ 'vesamenu.c32', 'vesamenu.cfg', 'grml.png':
+ path = search_file(filename, iso_mount + '/boot/isolinux/')
exec_rsync(path, syslinux_target + filename)
grub_target = target + '/boot/grub/'
if os.path.isfile("/usr/share/grub/ascii.pf2"):
exec_rsync('/usr/share/grub/ascii.pf2', grub_target + 'ascii.pf2')
+
def install_iso_files(grml_flavour, iso_mount, device, target):
"""Copy files from ISO to given target
data.write(generate_main_syslinux_config())
data.close
+
def adjust_syslinux_bootoptions(src_name, dst_name, flavour):
append_re = re.compile("^(\s*append.*)$", re.I)
- boot_re = re.compile("/boot/([a-zA-Z0-9_]+/)+(\w+)")
+ boot_re = re.compile("/boot/([a-zA-Z0-9_]+/)+([a-zA-Z0-9._]+)")
flavour_re = re.compile("(label.*)(grml\w+)")
default_re = re.compile("(default.cfg)")
src = open(src_name, "r")
dst = open(dst_name, "w")
+ # do NOT write "None" in kernel cmdline
+ if options.bootoptions is None:
+ bootopt = ""
+ else:
+ bootopt = options.bootoptions
+
for line in src:
- line = boot_re.sub(r'/boot/release/%s/\2 ' % flavour, line)
- line = flavour_re.sub(r'\1 %s-\2' % flavour, line)
+ line = boot_re.sub(r'/boot/release/%s/\2 ' % flavour, line)
+ line = flavour_re.sub(r'\1 %s-\2' % flavour, line)
line = default_re.sub(r'%s-\1' % flavour, line)
line = append_re.sub(r'\1 live-media-path=/live/%s/ ' % flavour, line)
+ line = append_re.sub(r'\1 boot=live %s ' % bootopt, line)
dst.write(line)
src.close()
dst.close()
data.close()
-
-
def handle_syslinux_config(grml_flavour, target):
"""Main handler for generating syslinux configuration
add_syslinux_entry("%s/additional.cfg" % syslinux_target, grml_flavour)
-
-
-
def handle_bootloader_config(grml_flavour, device, target):
"""Main handler for generating bootloader's configuration
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.
# finally be politely :)
logging.info("Finished execution of grml2usb (%s). Have fun with your grml system.", PROG_VERSION)
-
if __name__ == "__main__":
try:
main()