From 861529137b34bd44bf6eb0c64a3a9a6c7b13095e Mon Sep 17 00:00:00 2001 From: piccihud Date: Sat, 19 Oct 2024 20:51:36 +0200 Subject: [PATCH] Aggiunto appunti prime tre lezioni --- 101/001_comandi_ispezione_hw.md | 122 +++++++++++++++++++++++ 101/002_avviare_il_sistema.md | 66 ++++++++++++ 101/003_runleve_riavvio_e_spegnimento.md | 15 +++ 3 files changed, 203 insertions(+) create mode 100644 101/001_comandi_ispezione_hw.md create mode 100644 101/002_avviare_il_sistema.md create mode 100644 101/003_runleve_riavvio_e_spegnimento.md diff --git a/101/001_comandi_ispezione_hw.md b/101/001_comandi_ispezione_hw.md new file mode 100644 index 0000000..fa8b56a --- /dev/null +++ b/101/001_comandi_ispezione_hw.md @@ -0,0 +1,122 @@ +## Comandi di ispezione delle periferiche + +I comandi `lspic` e `lsusb` elencano tutti i dispositivi PCI e USB identificati dal SO. Ogni parte hardware richiede un componente software per controllare il dispositivo corrispondente, chiamato *kernel modules*. I moduli el kernel LInux relativi ai dispositivi hardware sono anche chiamati *drivers*. + +### lscpi + +```bash + > lspci +00:00.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Root Complex +00:00.2 IOMMU: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 IOMMU +00:01.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) PCIe Dummy Host Bridge +00:01.2 PCI bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 PCIe GPP Bridge [6:0] +00:01.3 PCI bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 PCIe GPP Bridge [6:0] +``` +I numeri esadecimali all'inizio di ogni riga sono gli indirizzi univoci del corrispondente dispositivo. Per ottenere maggiori dettagli su un dispositivo: + +```bash +lspci -s 04:00.0 -v + +04:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a) + Subsystem: Intel Corporation Wi-Fi 6 AX200NGW + Flags: bus master, fast devsel, latency 0, IRQ 33, IOMMU group 0 + Memory at fcb00000 (64-bit, non-prefetchable) [size=16K] + Capabilities: [c8] Power Management version 3 + Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+ + Capabilities: [40] Express Endpoint, IntMsgNum 0 + Capabilities: [80] MSI-X: Enable+ Count=16 Masked- + Capabilities: [100] Advanced Error Reporting + Capabilities: [14c] Latency Tolerance Reporting + Capabilities: [154] L1 PM Substates + Kernel driver in use: iwlwifi +``` +Il **modulo del kernel** puo' essere identificato nella riga `Kernel driver in use:`. + +Un modo rapido per verificare quale modulo del kernel e' in uso per il dispositivo specificato: + +```bash +lspci -s 04:00.0 -k + +04:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a) + Subsystem: Intel Corporation Wi-Fi 6 AX200NGW + Kernel driver in use: iwlwifi + Kernel modules: iwlwifi +``` + +### lsusb + +```bash +lsusb + +Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +Bus 001 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver +Bus 001 Device 003: ID 8087:0029 Intel Corp. AX200 Bluetooth +Bus 001 Device 004: ID 3434:0381 Keychron Keychron V8 +Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub +Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub +Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub +Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub +``` + +Per maggiori dettagli su un dispositivo specifico: + +```bash +lsusb -vd 3434:0381 +``` + +### lsmod + +Mostra un elenco di tutti i moduli attualmente caricati: + +```bash +lsmod + +Module Size Used by +nft_chain_nat 12288 3 +xt_MASQUERADE 16384 1 +nf_nat 65536 2 nft_chain_nat,xt_MASQUERADE +bridge 389120 0 +stp 12288 1 bridge +llc 16384 2 bridge,stp +``` +dove `Size` indica la RAM occupata da modulo, byte. Mentre `Used by` indica i moduli dipendenti dal modulo colonna `Module`. + +### modprobe + +Comando usato per *caricare* o *scaricare* i moduli del kernel. + +```bash +modprobe -r module + +# se module non sia usato da un processo in esecuzione sul sistema +``` + +### lscpu e lshw + +Mostra informazioni riguardo alla cpu e all'hardware del sistema. + +### modinfo + +Mostra una descrizione del modulo specificato: `modinfo nvme_core`. Per la lista di tutti i parametri disponibili: `modinfo -p nvme_core`. + +I parametri personalizzati possono essere resi persistenti includendoli nel file `/etc/modprobe.conf/` o in file con estensione .conf nella directory `/etc/modprobe.d/`. + +Per impedire il caricamento di un modulo inserire la riga `blacklist module` nel file `/etc/modprobe.d/blacklist.conf`. + +## File informativi e File dei dispositivi + +I comandi precedenti sono dei front-end per leggere le informazioni hardware memorizzate dal SO. Tali informazioni sono presenti in file conservati nelle directory `/proc` e `/sys`. + +La directory `/proc` contiene informazioni relative ai processi in esecuzione e alle risorse hardware. Alcuni dei file importanti: + +- `/proc/cpuinfo` +- `/proc/meminfo` + +`/sys` contiene informazioni relative ai dispositivi hardware. + +Ogni file all'interno della directory `/dev/`, invece, e' associato a un dispositivo di sistema, in particolare a un dispositivo di archiviazione. I dispositivi rimovibili sono gestiti da `udev`, che crea i dispositivi corrispondenti in `/dev/`. Quando vengono rilevati dei nuovi dispositivi, `udev` cerca una regola corrispondente nella cartella `/etc/udev/rules.d/`. + +## Dispositivi di archiviazione + +Generalmente chiamati *block device*, in quanto i dati vengono letti in blocchi di dati. Ogni dispositivo a blocchi e' identificato da un file in `/dev/`. Dalla versione 2.6 del kernel, tutti i dispositivi, indipendentemente dal tipo di hardware, sono identificati come dispositivi SCSI, tramite la sigla `sd`. Le partizioni sono elencate numericamente. L'eccezione sono le *schede SD* e i dispositivi *nvme*. \ No newline at end of file diff --git a/101/002_avviare_il_sistema.md b/101/002_avviare_il_sistema.md new file mode 100644 index 0000000..90ff3bb --- /dev/null +++ b/101/002_avviare_il_sistema.md @@ -0,0 +1,66 @@ +## BIOS o UEFI + +Il kernel viene caricato da un programma chiamato *bootloader*, a sua volta caricato da un firmware preinstallato come il BIOS o UEFI. Una volta caricato, il kernel continua il processo di avvio identificando e caricando l'hardware. + +### BIOS + +Il BIOS (*Basic Input/Output System*) e' un programma memorizzato in un chip di memoria non volatile collegato alla scheda madre. + +I primi 440 byte nel primo dispositivo di archiviazione - seguendo l'ordine definito nel BIOS - sono il primo stadio del bootloader (*bootstrap*). I primi 512 byte di *ogni* dispositivo di archiviazione sono denominati *MBR* e contengono la tabella delle partizioni. + +I passaggi per l'avvio di un sistema dotato di BIOS sono: + +- Il processo POST (*power-on self-test*) identifica semplici guasti hardware +- Il BIOS attiva i componenti di base per caricare il sitema +- Il BIOS carica il primo stadio del bootloader dall'MBR (i primi 440 byte nel primo dispositivo di archiviazione) +- Il primo stadio del bootloader richiama il secondo, responsabile del caricamento del kernel. + +### UEFI + +UEFI (*Unified Extensible Firmware Interface*), e' sempre un firmware, come il BIOS, ma e' in grado di identificare le partizioni e leggere diversi filesystem. Inoltre non si basa sull'MBR, prendendo in considerazioni solo le impostazioni memorizzate nella sua memoria non volatile (NVRAM). Nella partizione *ESP* (*EFI System Partition*), di un *qualsiasi filesystem compatibile* (es. FAT32), sono contenuti dei programmi, chiamati *EFI applications*, che vengono eseguiti automaticamente o richiamati da un menu d'avvio. Una di queste applicazioni e' il bootloader. + +I passaggi per l'avvio di un sistema con UEFI sono: + +- Il processo POST (*power-on self-test*) identifica semplici guasti hardware +- UEFI attiva i componenti di base per caricare il sitema +- UEFI esegue l'applicazione predefinita memorizzata nel filesystem della partizione ESP. Di solito, il bootloader +- Il bootloader carica il kernel. + +UEFI supporta una funzione chiamata **Secure Boot**, che consente l'esecuzione solo di applicazioni EFI firmate, ossia autorizzate dal produttore. + +### Bootloader + +Uno dei piu' utilizzati e' GRUB. Permette di passare dei parametri al kernel, seguendo il modello `option=value`. + +Alcuni dei parametri: + +- `init`: imposta un iniziatore di sistema alternativo, per esempio `init=/bin/bash` +- `systemd.unit`: imposta il *target* da attivare, per esempio: `systemd.unit=graphical/target` +- `mem`: imposta la qualità di RAM disponibile per il sistema +- `quiet`: nasconde i messaggi di avvio +- `root`: imposta la partizione di root +- `rootflags`: opzioni di mount per il filesystem di root + +I parametri del kernel devono essere aggiunti al file `/etc/default/grub` alla riga `GRUB_CMDLINE_LINUX` per renderli persistenti. + +Una volta che il sistema e' in esecuzione, i parametri usati per la sessione corrente sono visibili nel file: + +```bash +cat /proc/cmdline + +BOOT_IMAGE=/vmlinuz-6.11.2-amd64 root=/dev/mapper/pc--vg-root ro systemd.show_status=1 quiet splash +``` + +## Inizializzazione del sistema + +L'inizializzazione del SO inizia quando il bootloader carica il kernel nella RAM. Il kernel aprira' l'*initramfs* (*initial RAM filesystem*), un filesystem temporaneo usato durante il processo di avvio. Il suo scopo principale e' quello di fornire i moduli richiesti, in modo che il kernel possa accedere al filesystem root *reale* del SO. + +Il kernel, non appena il filesystem root e' disponibile, montera' tutti i filesystem configurati in `/etc/fstab`, quindi eseguira' il primo programma, chiamato `init`, responsabile dell'esecuzione di tutti gli script e demoni di inizializzazione del sistema. Solo ora initramfs viene rimosso dalla RAM. + +### Ispezionare l'inizializzazione + +Tutti gli errori generano messaggi. Lo spazio di memoria in cui il kernel memorizza i suoi messaggi e' chiamato *kernel ring buffer*. + +Un comando per visualizzare i messaggi del kernel e' `dmesg -T`. Nei sistemi che usano *systemd* e' possibile usare il comando `journalctl -k`. L'opzione `-D` puo' essere usata per leggere messaggi di registro al di fuori della cartella `/var/log/journal`. + +I messaggi di log sono memorizzati in vari file all'interno della directory `/var/log/`. \ No newline at end of file diff --git a/101/003_runleve_riavvio_e_spegnimento.md b/101/003_runleve_riavvio_e_spegnimento.md new file mode 100644 index 0000000..717537a --- /dev/null +++ b/101/003_runleve_riavvio_e_spegnimento.md @@ -0,0 +1,15 @@ +## Sistema di init + +I servizi (o *demoni*) possono essere controllati da script di shell, come in `SysVinit`, o da un programma e dai suoi file di configurazione, come in `systemd`. + +Il sistema di init e' il primo programma lanciato dal kernel, quindi il suo **PID** (*Process Identification Number*) sara' sempre 1. + +### SysVinit + +Fornisce un set predefinito di stati di sistema, chiamati *runlevel*, numerati da 0 a 6. + +- **runlevel 0**: spegnimento del sistema +- **runlevel 1**, s o single: modalita' utente singolo, senza rete (manutenzione) +- **runlevel 2**,**3** o **4**: modalita' multiutente con accesso tramite console +- **runlevel 5**: modalita' multiutente grafica +- **runlevel 6**: riavvio del sistema \ No newline at end of file