# Einführung in Linux
YALC - Yet Another Linux Course
Author: Daniel Schubert

# LINUX

### Das universelle Betriebssystem

Eine Einführung - Teil 14

Deutsche Angestellten Akademie

Frage: Fragen zur letzten Stunde?

### 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:
  - GRUB Legacy (bis GRUB 0.9x): ext2, ext3, UFS, UFS2, ReiserFS, FAT, JFS, Minix, FFS, XFS, mit distributionsspezifischen Erweiterungen auch weitere;
  - GRUB2 (ab GRUB 1.9x) zusätzlich ext4, ZFS und btrfs.
- 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.

https://de.wikipedia.org/wiki/Grand_Unified_Bootloader
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:

- einen C-Compiler
- diverse Bibliotheken

-     ~$ sudo apt install build-essential

- https://packages.debian.org/stretch/build-essential

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