Skript zum Generieren des ISO-Images

Es handelt sich hier um ein "dummes" Skript, das schlicht die benötigten Befehle in Reihenfolge abarbeitet. Meine Empfehlung ist daher, das Skript nicht direkt, sondern die einzelnen Befehle manuell auszuführen. Natürlich ist hier reichlich Platz für eine vernünftige Strukturierung durch Parameter, Abfragen und Kontrollstrukturen (Freiwillige bitte vor!).
Bislang gab es ein eigenes Paket "Ubuntu Customization Kit" (uck), das genau diese Aufgabe sehr effizient und gut ausgeführt hat, da dieses aber nicht mehr gepflegt wird und mittlerweile nicht mehr ohne manuelle Korrekturen funktioniert, habe ich die manuelle Vorgehensweise in dem vorliegenden Skript zusammen gestellt.

Voraussetzungen:

  1. Als Umgebung wird hier ein Ubuntu 16.04 64-Bit vorausgesetzt, also dasselbe, das auch auf der Live-DVD installiert wird. Besteht hier ein Unterschied, muss der debootstrap-Befehl wie auch die die sources.list Datei manuell an das zukünftige Live-System angepasst werden.
  2. Diese Befehle setzen root-Berechtigung voraus, nicht nur damit alle Mounts durchgeführt werden können, sondern auch das erzeugte Squash-Filesystem intern die korrekten Berechtigungen erhält.
  3. Des weiteren sollte ein leeres Verzeichnis für die Erzeugung der Daten verwendet werden, in dessen Filesystem noch mindestens 5GB Platz ist. Je nach Software-Auswahl kann das natürlich variieren.
  4. In dieses Verzeichnis muss vorher die ISO-Datei des Original-Ubuntu-Images (hier: ubuntu-16.04.1-desktop-amd64.iso) abgelegt werden, damit die notwendigen Daten für UEFI, grub, .disk und isolinux abgekupfert werden können. Für mehr wird dieses Image aber nicht benötigt.
  5. Die Korrekturen für die Dateien grub.cfg und isolinux.cfg müssen manuell durchgeführt werden, weil dieses Abhängig von der Benennung der Kernel- und initrd- Dateien ist. Im Skript ist dieses an der Stelle vorgesehen, in der diese Dateien im vi Editor aufgerufen werden. Ein Beispiel für jede dieser Dateien habe ich unten angehängt.
  6. Die entstandene ISO-Datei kann je nach Größe auf eine CD oder DVD-Datei gebrannt werden und sollte anschließend direkt bootfähig sein.
  7. Soll ein USB-Stick als Installationsmedium verwendet werden, reicht es für ein EFI-Boot, den kompletten Verzeichnisbaum, wie er sich letztendlich im Verzeichnis "iso" befindet, auf den USB-Stick zu kopieren. Der USB-Stick muss allerdings als FAT32 formatiert, und das Verzeichnis "EFI" muss wirklich groß geschrieben werden. Soll im Legacy modus gebootet werden kann das Image auch per dd geschrieben werden, doch dann ist der Stick nicht mehr beschreibbar.

Als zusätzlicher Tipp kann noch erwähnt werden, dass die Paketauswahl nach belieben angepasst werden kann ("chroot apt install ..."), das Paket ubiquity-frontend-gtk wird nur benötigt, wenn die DVD oder der Stick auch für die Installation benötigt wird. Für ein reines Live-System ist es nicht notwendig. Das Squash-FS kann auch per "unsquashfs" aus der Original-Installations-DVD als Basis übernommen werden, das erspart die nachträgliche Experimemtier-Aktion um festzustellen, ob die Software-Auswahl ausreicht.

#! /bin/bash
#
# Original iso per loop mounten
mkdir cd-mount
mount -t iso9660 ./ubuntu-16.04.1-desktop-amd64.iso cd-mount/ -o ro,loop
#
# Verzeichnis fuer Live-System-Daten anlegen
mkdir iso
mkdir iso/casper
cp -rp cd-mount/EFI cd-mount/.disk cd-mount/boot cd-mount/isolinux cd-mount/pool cd-mount/dists iso/
#
# Basis-System anlegen
debootstrap --arch amd64 xenial squashfs
# ... oder wahlweise aus dem ISO extrahieren
# unsquashfs -f -d squashfs cd-mount/casper/filesystem.squashfs
# # virtuelle FS aus dem Wirt einhaengen mount --bind /dev squashfs/dev/ mount -t devpts devpts squashfs/dev/pts/ mount -t proc proc squashfs/proc mount -t sysfs sysfs squashfs/sys # # Konfig-Dateien für Paket-Installation aus dem Wirt übernehmen cp /etc/resolv.conf squashfs/etc/resolv.conf cp /etc/apt/sources.list squashfs/etc/apt/sources.list # # Benoetigte Pakete installieren chroot squashfs apt update # Kernel und ISO/USB-Bootdaten chroot squashfs apt install linux-image-generic language-pack-de tzdata console-setup casper ubiquity-casper lupin-casper # Desktop Unity und Libre-Office chroot squashfs apt install ubuntu-desktop language-pack-gnome-de libreoffice-help-de libreoffice-l10n-de libreoffice hunspell-de-de hyphen-de ubiquity-frontend-gtk # Development fuer VHS-Uebung xinv3d und einige Tools chroot squashfs apt install build-essential xserver-xorg-dev libdvd-pkg bind9-host nmap iptraf-ng lame ffmpeg vlc chroot squashfs dpkg-reconfigure libdvd-pkg # Cache aufraeumen chroot squashfs apt clean # initial ramdisk und kernel nach casper/ kopieren chroot squashfs update-initramfs -k all -c zcat squashfs/boot/initrd.img*|lzma -9c >iso/casper/initrd.lz cp squashfs/boot/vmlinuz* iso/casper/vmlinuz cp squashfs/boot/vmlinuz* iso/casper/vmlinuz.efi # Alle Mounts wieder aushaengen umount squashfs/dev/pts squashfs/dev squashfs/proc squashfs/sys cd-mount rm squashfs/etc/resolv.conf # squashfs-Datei aus der Zusammenstellung im Verzeichnis "squashfs" erzeugen mksquashfs squashfs iso/casper/filesystem.squashfs -noappend # Boot-Dateien fuer EFI (grub.cfg) und BIOS-Boot (isolinux.cfg) aendern vi iso/boot/grub/grub.cfg vi iso/boot/grub/loopback.cfg vi iso/isolinux/isolinux.cfg # Hintergrundbild fuer isolinux cp /usr/share/grub/swxwings_formation.tga iso/isolinux/ # Erzeugen des ISO-Files zum Brennen auf DVD genisoimage -cache-inodes -r -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -o vhs-2016-bo.iso iso # ISO fuer USB-Stick anpassen (-u ist zusaetzlich fuer UEFI) isohybrid -u vhs-2016-bo.iso

Beispiel: grub.cfg

if loadfont /boot/grub/font.pf2 ; then
	set gfxmode=auto
	insmod efi_gop
	insmod efi_uga
	insmod gfxterm
	terminal_output gfxterm
fi

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

menuentry "Try Ubuntu german without installing" {
	set gfxpayload=keep
	linux	/casper/vmlinuz.efi  file=/cdrom/preseed/ubuntu.seed boot=casper  locale=de_DE bootkbd=de console-setup/layoutcode=de quiet splash ---
	initrd	/casper/initrd.lz
}

Beispiel: isolinux.cfg

# Bootmenu from Burkhard Obergoeker, December 2016
default vesamenu.c32
#menu background swxwings_formation.tga
menu title VHS Linux 2016-12 Ubuntu 16.04 by Burkhard Obergoeker
label linux
  menu label Live Ubuntu starten
  kernel /casper/vmlinuz
#  append BOOT_IMAGE=/casper/vmlinuz boot=casper initrd=/casper/initrd.lz quiet splash -- debian-installer/language=de console-setup/layoutcode?=de
  append BOOT_IMAGE=/casper/vmlinuz boot=casper initrd=/casper/initrd.lz quiet splash -- locale=de bootkbd=de console-setup/layoutcode=de
label hd
  menu label Von lokaler Festplatte starten
  localboot 0x80