LINUX

Das universelle Betriebssystem

Eine Einführung - Teil 14

Deutsche Angestellten Akademie

Der Boot Prozess

Boot Ablauf

  • efi ( bios ) lädt bootloader ( grub2 )
  • bootloader lädt kernel
  • Kernel ist modularisiert -> Keine Dateisystemtreiber!!
  • Lösung: Kernel bindet initrd als RAM-Disk ein
  • initrd -> enthält zum Systemstart notwendige Module ( zB Dateisystemtreiber, damit Kernel root Partition einbinden kann )
  • System startet.
~$ lsblk

NAME                     MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                        8:0    0 223,6G  0 disk  
├─sda1                     8:1    0   245M  0 part  /boot/efi
├─sda2                     8:2    0   511M  0 part  /boot
└─sda3                     8:3    0 222,9G  0 part  
  └─sda3_crypt           253:0    0 222,8G  0 crypt 
    ├─xubuntu--vg-root   253:1    0 215,1G  0 lvm   /
    └─xubuntu--vg-swap_1 253:2    0   7,7G  0 lvm  

  					

Der Bootloader wohnt in /boot/efi

Inhalt von /boot


root@workhorse:/boot# ls
config-4.9.0-7-amd64  initrd.img-4.9.0-7-amd64	System.map-4.9.0-8-amd64
config-4.9.0-8-amd64  initrd.img-4.9.0-8-amd64	vmlinuz-4.9.0-7-amd64
grub		      System.map-4.9.0-7-amd64	vmlinuz-4.9.0-8-amd64
					

initrd angucken:

~$ lsinitramfs /boot/initrd.img-$(uname -r)

grub - Grand Unified Boot Loader

  • Liest verschiedene Dateisysteme:
  • Bootet verschiedene Betriebssysteme per Auswahlmenü und automatischem Zeitablauf (Linux und Windows als Multi-Boot-System).
  • Bootet Betriebssysteme von Festplatten, Disketten, CD- und DVD-Laufwerken sowie Flash-Disks.
  • Verfügt über einen eingebauten Kommandozeileninterpreter (Shell).
  • Ist relativ einfach konfigurierbar (Farben, Hintergrundbild, Struktur usw.).
  • Kann mit einem Passwort gesichert werden.
  • Kann über TFTP bereitgestellte Linux-Kernel booten.
Interessante Dateien:

/etc/default/grub -> Anpassungen

/etc/grub.d/ -> scripts die boot.cfg generieren

00_header*
05_debian_theme*
10_linux*
20_linux_xen*
20_memtest86+*
30_os-prober*
30_uefi-firmware*
40_custom*
41_custom*

/boot/grub/grub.cfg -> nicht bearbeiten!

/etc/default/grub


GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

GRUB_BACKGROUND="/usr/share/images/grub/050817-N-3488C-028.tga"

					
Aussehen verändern

nach Änderung:

sudo update-grub
optional: grub-customizer

grub-customizer aus quellen bauen

grub-customizer ppa

Quelle: https://www.makeuseof.com/tag/bootkit-nemesis-genuine-threat/

Secure Boot

  • bootet ausschliesslich Signierte Kernel. Einzige mögliche Signatur: kommt von Microsoft......
  • Microsoft stellt Linux-Distributoren Key zur Verfügung -> ein paar Distrib. unterstützen Secure Boot.
  • Debian zur Zeit nicht.
  • Secure Boot verhindert Starten von selbst kompilierten Kerneln
  • Microsoft kontrolliert also auf ALLEN Mainboards welche Betriebssysteme bei aktiviertem Secure Boot starten können. Auf ALLEN.

C und C-Compiler

Ein einfaches C-Programm

#include<stdio.h>
int main() {
	printf("Hello World\n");
	return 0;
}
						

Wir benötigen:

Code compilieren:
~$  gcc hello.c -o hello

# Programm ausführen
~$ ./hello
					

Begriffe

C Programmiersprache - Der Linux-Kernel ist in „C“ geschrieben
Compiler Übersetzt den Quellcode in Maschinencode
gcc Gnu C-Compiler Collection
Bibliotheken Fertige Funktionen, die in andere Programme eingebunden werden ( unter Windoes oft *.dll-Dateien )
make arbeitet Regeln und Abhängigkeitsdefinitionen in „Makefile“ ab -> startet den gcc

der Linux Kernel

Befehle

  • lsusb
  • lscpu
  • lspci
  • lsmem
  • lshw
  • Kernelmodule
  • lsmod - listet geladene KM
  • modprobe - laden und löschen v. KM
  • insmod - lädt KM ohne Abhängigkeiten
  • rmmod - löscht KM ohne Abhängigkeiten

Was zum?? ist ein Kernel Modul??

  • ein Stück kompilierten Codes, der zur Laufzeit in den Kernel eingefügt werden kann ( zb Treiber )
  • Erweitert d. Funktionalität d. Kernels
  • Reboot de Systems nicht nötig
  • Ohne Module müsste man Monolithische Kernel bauen und neue Funktionalität direkt ins Kernel Image integrieren
  • -> Kernel Image wird grösser sein
  • Die meisten Hardwarekomponenten in eurem Computer haben einen zugehörigen Treiber.
  • Ein großer Teil eines laufenden Kernels ist Treibercode.
  • Ein Treiber kann statisch in die Kerneldatei auf der Festplatte eingebaut werden.
Moderne Linuxe bieten umfangreichen Treiber-Support, manuelles Laden von KM ist praktisch nie nötig.

Gegenbeispiel:

NVIDIA Treiber f. Gaming GraKas
manche Drucker ( jaaa, immer noch... )

Manuelle Konfiguration von KM

/etc/modprobe.d/*.conf

Liste der Kernelmodule

~$ basename -s ".ko" $(find /lib/modules/$(uname -r) \ 
   -type f -name "*.ko") 

Wir bauen ein Kernel-Modul

Wir benötigen hierfür git:

~$ sudo apt install git

Ein Album als kernelmodul?? https://github.com/usrbinnc/netcat-cpi-kernel-module

wir bauen uns einen Kernel

  1. Download der Kernel Quellen
  2. Installieren der build tools
  3. Kernel bauen ;-)

Aktuelle Kernel Quellen herunterladen https://www.kernel.org


$ sudo apt-get install build-essential \ 
	libncurses5-dev gcc libssl-dev bc

# für XXXXXXX entspr. Kernel Version einsetzen!
$ cd ~/Downloads
$ tar xvf linux-XXXXXXX.tar.xz

$ cd linux-XXXXXXX
$ cp /boot/config-4.13-XXXXXXX .config

$ make menuconfig

					
Folgendes bitte zu Hause probieren::
# Das dauert jetzt....
# ca 90min auf einem Core i3 @2.4MHz
# -j 4 -> Nutze 4 Kerne

~$ make -j4 deb-pkg  

#Kernel installieren:
~$ sudo dpkg -i ../linux-*.deb

# reboot -> neuen Kernel wählen 
				
Debian Handbbok - Installing a kernel