Multiboot USB-Stick

Aus Leupers.net-Wiki
Wechseln zu: Navigation, Suche

Preparation

Login as root. Ubuntu users can run the following to get a root shell:

# sudo bash

Plug-in the USB-Stick and find its device name; e.g. using the following command:

# dmesg

Script

#!/bin/bash

if [ $# -eq 0 ] ; then
   echo "USAGE: $0 <device>"
   echo " e.g.: $0 /dev/sdb"
   echo
   exit 1
fi

DEVICE=$1
VOLUME=SLEMultiBt
MNTPOINT=/mnt
ISODIR=${MNTPOINT}/boot/iso

echo "## Verfiying that USB stick is not mounted..."
mount | grep ${DEVICE}1 > /dev/null
if [ $? -eq 0 ] ; then
	echo "! WARNING: Device ${DEVICE}1 still mounted!"
	echo -n "! Trying to unmount..."
	umount ${DEVICE}1
	mount | grep ${DEVICE}1 > /dev/null
	if [ $? -eq 1 ] ; then
		echo "  -->  OK."
	else
		echo "  -->  ERROR: Umount failed."
		exit
	fi
fi

echo "## Current partition table:"
parted ${DEVICE} print
echo "## Cleaning partition table and setting msdos label..."
parted ${DEVICE} mklabel msdos
echo "## Creating partition..."
parted -s --align none ${DEVICE} mkpart primary 1 100%

echo "## Creating FAT32 filesystem..."
mkfs.vfat -F 32 -n ${VOLUME} ${DEVICE}1

echo "## Mounting USB stick..."
mount ${DEVICE}1 ${MNTPOINT}
 
echo "## Installing grub2..."
grub-install --no-floppy --root-directory=/mnt ${DEVICE}
 
echo "## Creating grub.cfg..."
cat <<\EOF> ${MNTPOINT}/boot/grub/grub.cfg
menuentry "Desinfec't 2013" {
        set isofile=/boot/iso/desinfect-2013.iso
        loopback loop \$isofile
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=\$isofile file=/cdrom/preseed/ubuntu.seed noplymoth locale=de_DE bookkbd=de console-setup/layoutcode=de debian-installer/language=de 
        initrd (loop)/casper/initrd.lz
}

set sysresciso="/boot/iso/systemrescuecd-x86-3.5.0.iso"
menuentry "SystemRescueCD 3.5.0 (64bit, default boot options)" {
   set isofile=\$sysresciso
   loopback loop \$isofile
   set gfxpayload=keep
   linux  (loop)/isolinux/rescue64 setkmap=de
   initrd (loop)/isolinux/initram.igz
}
menuentry "SystemRescueCD 3.5.0 (64bit, cache all files in memory)" {
   set isofile=\$sysresciso
   loopback loop \$isofile
   set gfxpayload=keep
   linux  (loop)/isolinux/rescue64 setkmap=de docache
   initrd (loop)/isolinux/initram.igz
}
menuentry "SystemRescueCD 3.5.0 (64bit, directly start the grahical environment)" {
   set isofile=\$sysresciso
   loopback loop \$isofile
   set gfxpayload=keep
   linux  (loop)/isolinux/rescue64 setkmap=de dostartx
   initrd (loop)/isolinux/initram.igz
}
menuentry "SystemRescueCD 3.5.0 (64bit, disable Kernel-Mode-Settings)" {
   set isofile=\$sysresciso
   loopback loop \$isofile
   set gfxpayload=keep
   linux  (loop)/isolinux/rescue64 setkmap=de nomodeset
   initrd (loop)/isolinux/initram.igz
}
menuentry "SystemRescueCD 3.5.0 (64bit, alternative kernel with default options)" {
   set isofile=\$sysresciso
   loopback loop \$isofile
   set gfxpayload=keep
   linux  (loop)/isolinux/altker64 setkmap=de
   initrd (loop)/isolinux/initram.igz
}

menuentry "Memory Test (memtest86+ 2.11)" {
 linux16 /boot/iso/memtest86+-2.11.bin
}
EOF

echo "## Creating directory..."
mkdir ${ISODIR}

echo "## Coping ISO files (this may take a while)..."
FILES="\
   /home/stefan/Downloads/desinfect-2013.iso           \
   /home/stefan/Downloads/systemrescuecd-x86-3.5.0.iso \
   /home/stefan/Downloads/memtest86+-2.11.bin          \
   "
for file in $FILES ; do
	echo "- $file"
	cp $file ${ISODIR}
done

echo "## Syncing disks..."
sync

echo "## Unmounting USB stick..."
umount ${DEVICE}1

exit 0

Test (without Reboot)

Den USB-Stick kann man - ohne Reboot des eigenen Rechners - ganz einfach testen durch:

# qemu -m 512 /dev/sdb
oder
# qemu -m 512 -usb -usbdevice tablet /dev/sdb

Bei letzterem Befehl wurden Optionen ergänzt, um zu verhindern, dass die Maus im qemu-Fenster gefangen und immer erst mit Shift-Ctrl befreit werden muss.

Mögliche Probleme / Fehler

grub-install

Fehlermeldung:

/usr/sbin/grub-bios-setup: Warnung: Die MSDOS-Partitionsbezeichnung hat keinen Freiraum nach dem MBR, Einbettung würde unmöglich sein.
/usr/sbin/grub-bios-setup: Warnung: Einbettung ist nicht möglich. GRUB kann in dieser Konfiguration nur mittels Blocklisten installiert werden. Blocklisten sind allerdings UNZUVERLÄSSIG und deren Verwendung wird daher nicht empfohlen..
/usr/sbin/grub-bios-setup: Fehler: mit Blocklisten wird nicht fortgesetzt.

Lösung:
Die Partition, die man anlegt, sollte nicht ganz vorne (Sektor 0) anfangen. Daher wird parted auch nicht mit dem Start "0" aufgerufen, sondern mit "1":
   parted -s --align none <device> mkpart primary 1 100%

Booten

Problem:
Aktuell habe ich leider noch das Problem, dass zwar das Booten vom Stick, die Auswahl in grub und auch das Laden des Kernels von einem der ISOs funktioniert...
... aber es beim Kernelboot dann diverse Meldungen über nicht gefundene Devices gibt und ich nur in einer "Not-Konsole" lande. :-(

Lösung:
Leider bisher noch keine.  :-(

Ich verwende ein aktuelles (K)ubuntu 12.10 mit allen verfügbaren Updates:

> grub-install -v
grub-install (GRUB) 2.00-7ubuntu11

Interessanterweise funktioniert es - sogar mit der gleichen grub-Version - bei einem Kollegen einwandfrei, so dass er wohl durch erneutes Ausführung von

grub-install --no-floppy --root-directory=/mnt ${DEVICE}

meinen USB-Stick fixen konnte. :-)

Ich/wir forschen noch weiter... Update folgt...

ISO-Downloads

Wenn man nicht weiss, was für Parameter für eine bestimmte LiveCD in den Menüeintrag kommen, hilft oft ein Blick in die original Konfigurationsdateien der Images. Dazu kann man das entsprechende Image einfach mounten und sich die syslinux.cfg, isolinux.cfg und/oder grub.cfg Dateien anschauen.

Für viele LiveCDs finden sich im Internet bereits getestete grub.cfg Einträge.

Helpful Links