Eigene Debian ISO bauen

Eigene Debian ISO bauen

Vorbereitung

Für den Beginn wird das Paket Live-Build benötigt. Hiermit können ISO Dateien erstellt werden.

Zunächst wir das Paket installiert. Live Build ist eine Zusammenstellung aus mehreren Programmen für die Erstellung von Live Systemen.

apt install live-build -y

Aufbau der Grundstruktur

Die Grundstruktur wird über das Tool lb config erstellt.

lb config \
--architecture amd64 \
--binary-image iso-hybrid \
--bootloaders grub-efi \
--cache true \
--debian-installer live \
--debian-installer-gui false \
--distribution bullseye \
--image-name <Name> \
--iso-application <Name> \
--iso-preparer <Hersteller> \
--iso-publisher <Hersteller> \
--iso-volume <Name> \
--memtest memtest86+ \
--archive-areas "main contrib non-free" \
--mode debian 

Dieser Befehl baut die Grundstruktur im Verzeichnis auf. Dabei wird die Konfiguration erstellt.

Die Grundstruktur sieht wie folgt aus:

.
├── auto                        #main live-build configuration
├── config
│   ├── archives                #package mirrors/repositories
│   ├── hooks                   #extra scripts to run during build stages
│   ├── includes.binary         #files to include on the ISO filesystem
│   ├── includes.chroot         #files to include in the live system's filesystem
│   ├── includes.installer      #files to include in the installer's filesystem
│   ├── package-lists
│   │   └── *.list.chroot		#packages to install on the live system
│   │   └── *.list.binary		#packages to place in the APT repository on the ISO image
│   ├── packages.chroot         #standalone .deb packages to install on the live system
│   └── task-lists              #tasksel tasks to install on the live system
├── doc			#user documentation
├── Makefile	#main automation, dependencies management, ...
└── scripts		#extra automation scripts

Bootloader

Danach wird in das eben erstellte Verzeichnis die Bootloader aus dem Beispielverzeichnis geladen.

cp -R /usr/share/live/build/bootloaders/ config/

Im weiteren müssen die Programme für den Bootloader in der ISO bereitgestellt werden. Dafür wird eine Liste an Programmen in die Programliste geladen.

#Grub Liste
echo "efibootmgr grub-common grub-pc-bin grub2-common grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed grub-efi-ia32-bin libefiboot1 libefivar1 mokutil os-prober shim-helpers-amd64-signed shim-signed shim-signed-common shim-unsigned" > config/package-lists/grubs.list.binary

Eigenes Design

Damit der Bootloader sein eigenes Aussehen erhält müssen die Dateien dafür bearbeitet werden. In der lb config wurde zuvor definiert, dass der Grub Bootloader genutzt werden soll. Daher wird hier der Grub-EFI Bootloader bearbeitet.

nano config/bootloaders/grub-pc/live-theme/theme.txt

In dieser Datei wird der Titel der Grub Installationsmenüs geändert.

desktop-image: "../splash.png"
title-color: "#ffffff"
title-font: "DejaVu Sans Bold 16"
title-text: "<Name>" #Hier ändern
message-font: "Unifont Regular 16"
terminal-font: "Unifont Regular 16"

#help bar at the bottom
+ label {
        top = 100%-50
        left = 0
        width = 100%
        height = 20
        text = "@KEYMAP_SHORT@"
        align = "center"
        color = "#ffffff"
	font = "DejaVu Sans Bold 14"
}

#boot menu
+ boot_menu {
        left = 10%
        width = 80%
        top = 52%
        height = 48%-80
        item_color = "#a8a8a8"
	item_font = "DejaVu Sans Bold 14"
        selected_item_color= "#ffffff"
	selected_item_font = "DejaVu Sans Bold 14"
        item_height = 16
        item_padding = 0
        item_spacing = 4
	icon_width = 0
	icon_heigh = 0
	item_icon_space = 0
}

#progress bar
+ progress_bar {
        id = "__timeout__"
        left = 15%
        top = 100%-80
        height = 16
        width = 70%
        font = "DejaVu Sans Regular 14"
        text_color = "#000000"
        fg_color = "#ffffff"
        bg_color = "#a8a8a8"
        border_color = "#ffffff"
        text = "@TIMEOUT_NOTIFICATION_LONG@"
}

Im weiteren wird ein Hintergrundbild hinzugefügt dafür legt man im Verzeichnis config/bootloaders/grub-pc/ eine PNG Datei mit dem Namen splash.png ab.

Nun wird das Grub Menü angepasst:

nano config/bootloaders/grub-pc/grub.cfg

Hier wird die gesamte Struktur gelöscht und neu aufgebaut.

source /boot/grub/config.cfg

#----------------

CUSTOM MENU

#----------------


# Installer (if any)
if @ENABLE_INSTALL_MENU@; then

#source	/boot/grub/install_start.cfg


submenu 'Install <Name> ...' --hotkey=i {

	source /boot/grub/theme.cfg
	
	menuentry 'German' --hotkey=g {
		linux	@KERNEL_DI@ vga=788 theme=dark lang=de_DE keyboard-layouts=de locale=de_DE.UTF-8 @APPEND_INSTALL@ --- quiet
		initrd	@INITRD_DI@
	}
	
	menuentry 'English' --hotkey=e {
		linux	@KERNEL_DI@ vga=788 theme=dark lang=en_EN keyboard-layouts=en locale=en_EN.UTF-8 @APPEND_INSTALL@ --- quiet
		initrd	@INITRD_DI@
	}
	
	menuentry 'Other Language' --hotkey=o {
		linux	@KERNEL_DI@ vga=788 theme=dark @APPEND_INSTALL@ --- quiet
		initrd	@INITRD_DI@
	}
}

fi

submenu 'Utilities...' --hotkey=u {

	source /boot/grub/theme.cfg

	menuentry "Memory Diagnostic Tool (@MEMTEST_VERSION@)" --hotkey=m {
		linux16 @MEMTEST_BIN@
	}
	
	menuentry "UEFI Firmware Settings" --hotkey=f {
		fwsetup
	}

	menuentry 'Rescue mode' --hotkey=r {
		linux	@KERNEL_DI@ rescue/enable=true vga=788 @APPEND_INSTALL@ --- quiet
		initrd	@INITRD_DI@
	}

}

Startet man nun in das Menü, so wird einem Vorgeschlagen das man Installieren kann wodrauf die Abfrage folgt, ob man auf Deutsch, Englisch oder eine eigene Auswahl treffen möchte. Danach startet die Installation von Debian.

Neben der Installation findet man auch den Punkt Utilities. Hier findet man den Memory Test, den Start in das UEFI Betriebssystem und den Recovery Modus.

Es müssen nun noch die benötigten GRUB Pakete in die ISO geschrieben werden. Dafür wird in die Datei config/package-lists/grubs.list.binary die benötigten Pakete geschrieben.

echo "efibootmgr grub-common grub-pc-bin grub2-common grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed grub-efi-ia32-bin libefiboot1 libefivar1 mokutil os-prober shim-helpers-amd64-signed shim-signed shim-signed-common shim-unsigned" > config/package-lists/grubs.list.binary

Pakete installieren die nach der Installation verfügbar sein sollen

Damit alle Pakete installiert sind muss wieder eine Liste erstellt werden. Diese ist aber keine .binary Liste sondern eine .chroot Liste. In dieser wird nun nginx mit installiert. Dadurch haben wir nach dem Start ein

echo "ca-certificates apt-transport-https wget nginx gnupg gnupg2 gnupg1 curl" > config/package-lists/software.list.chroot

Skripte in der Installation ausführen

Live Build gibt einem die Möglichkeit während der Installation Skripte auszuführen. Dies ist für mache Installation notwendig die nicht über APT oder DPKG ausgeführt werden können oder es Einstellungen auf dem System vorzunehmen. Dafür muss in dem Verzeichnis config/hooks/normal/ ein sogenannter Hook erstellt werden. Hooks sind einfach gesagt nur Skripte, die ausgeführt werden zu einem bestimmten Zeitpunkt.

nano config/hooks/normal/neue-sourcelist.chroot

In dieser Datei soll einfach nur eine weitere Sourceliste zu APT hinzugefügt werden.

#!/bin/sh

set -e

echo "deb http://deb.example.com/debian bullseye main" | tee /etc/apt/source.lists.d/other-list.list

apt update -y && apt upgrade -y

Nun muss das Skript noch ausführbar gemacht werden.

chmod +x onfig/hooks/normal/neue-sourcelist.chroot

Custom Branding

Nun wird ein Custom Branding auf das Debian Systemgesetzt. es soll beim Start in Grub Bootmenü nicht Debian angezeigt werden sondern der eigene Name. Ebenso soll auf der Shell ein eigener Text beim Login angezeigt werden.

Dafür müssen einige Verzeichnisse erstellt werden.

mkdir config/includes.chroot_after_packages/etc/
mkdir config/includes.chroot_after_packages/etc/default

Dann wird der Inhalt hinzugefügt.

echo "<Eigener Name> \n \n" | tee config/includes.chroot_after_packages/issue
echo "<Eigener Name>" | tee config/includes.chroot_after_packages/issue.net
echo "<Text der beim Start angezeigt wird>" | tee config/includes.chroot_after_packages/motd

Nun wird noch die Grub Konfiguration geändert:

nano config/includes.chroot_after_packages/etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="<Eigener Name>"
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

Installer Einstellungen

Der Installer bei einer Debian Installation lässt sic ebenso an die eigenen Bedürfnisse anpassen. Dafür wird eine preseed.cfg erstellt.

nano config/includes.installer/preseed.cfg
#### Contents of the preconfiguration file

### Splash
d-i debian-installer/splash boolean false

### Localization
# Preseeding only locale sets language, country and locale.
#d-i debian-installer/locale string de_DE

# Keyboard selection.
# keymap is an alias for keyboard-configuration/xkb-keymap
#d-i keymap select de

### Console
#d-i console-setup/ask_detect boolean false
#d-i console-setup/layoutcode string de
#d-i console-setup/variantcode string

### Network configuration
# netcfg will choose an interface that has link if possible. This makes it
# skip displaying a list if there is more than one interface.
d-i netcfg/choose_interface select auto
# Explicitly set the nameservers
#d-i    netcfg/get_nameservers  string 8.8.8.8 8.8.4.4

# To pick a particular interface instead:
#d-i netcfg/choose_interface select eth1

# Any hostname and domain names assigned from dhcp take precedence over
# values set here. However, setting the values still prevents the questions
# from being shown, even if values come from dhcp.
#d-i netcfg/get_hostname seen true
#d-i netcfg/get_domain seen true
#d-i netcfg/get_hostname string <eigener Hostname>
#d-i     netcfg/get_domain       string 

#eigenes Netzwerk manuell
d-i netcfg/disable_autoconfig boolean true

# If you want to force a hostname, regardless of what either the DHCP
# server returns or what the reverse DNS entry for the IP is, uncomment
# and adjust the following line.
#d-i netcfg/hostname string <eigener Hostname>

# Disable that annoying WEP key dialog.
d-i netcfg/wireless_wep string

### Account setup
# Create root login
d-i passwd/root-login boolean true

# Skip creation of a normal user account.
d-i passwd/make-user boolean false

### create a password with `printf "joyent" | mkpasswd -s -m md5`
# This password gets removed in late_command
# TODO: Figure out how to not set a password here. Use value "!"?
#d-i passwd/root-password-crypted password $1$qHFOhAjw$AjgoyfS8u32uqV8qsL1r70

### Clock and time zone setup
#d-i clock-setup/utc boolean true
#d-i time/zone string UTC
#d-i clock-setup/ntp boolean true
#d-i clock-setup/ntp-server string 0.debian.pool.ntp.org
### Programs

#tasksel tasksel/first multiselect standard, ssh-server, desktop, gnome-desktop
#d-i pkgsel/include string openssh-server standard
#d-i pkgsel/upgrade select none
#popularity-contest popularity-contest/participate boolean false


# Vorgabewert für das Protokoll des Spiegel-Servers: http.
#d-i mirror/protocol string ftp
d-i mirror/country string manual
d-i mirror/http/hostname string ftp2.de.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

In diesem Beispiel muss ein Netzwerk Konfiguriert werden und wird nicht über DHCP eingestellt. Ebenso soll kein weiterer Benutzer angelegt werden und es wird schon ein Hostname festgelegt. Dazu wird Tasksel im Installer nicht ausgeführt.

ISO bauen

Damit die ISO erstellt wird muss nun nur noch der Build Befehl ausgeführt werden im config Verzeihnis

lb build

Nun hat man erfolgreich seine eigene ISO gebaut.