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.