213 lines
8.4 KiB
Markdown
213 lines
8.4 KiB
Markdown
# Bootloader
|
|
|
|
Il primo software ad essere eseguito, ha lo scopo di caricare un kernel e consegnargli il controllo. Il kernel carichera' i driver necessari, inizializzera' l'hardware e carichera' il SO.
|
|
|
|
*GRUB* e' il bootloader piu' utilizzato. Dalla versione 2 supporta anche LiveCD ISO.
|
|
|
|
Il primo settore del disco (512 byte) e' chiamato *Mater Boot Record* (MBR) e contiene la tabella delle partizioni e anche il *codice bootstrap* (installato tra l'MBR e la prima partizione). All'accensione del computer, questo codice minimale viene caricato, eseguito e passa il controllo a un bootloader (GRUB) secondario su disco, che carichera' il SO.
|
|
|
|
### Limitazioni MBR
|
|
|
|
- massimo 4 partizioni primarie
|
|
- dimensioni massime del disco di 2TB
|
|
|
|
A causa di tali limitazioni e' stato creato un nuovo schema di partizionamento, *GPT* (*GUID Partition Table*), parte dello standard UEFI.
|
|
|
|
## /boot
|
|
|
|
I file necessari per il processo di avvio sono memorizzati in una partizione avviabile, montata in `/boot/`. La partizione di avvio, in genere, e' la prima partizione del disco e termina prima del cilindro 1024 (528 MB), per ragioni di compatibilita' storica. Le dimensioni consigliate per tale partizione sono di circa 300 MB.
|
|
|
|
### Contenuto
|
|
|
|
Il nome di molti file termina col suffisso *-VERSION*, che sta a indicare la versione del kernel Linux.
|
|
|
|
```bash
|
|
ll /boot/
|
|
|
|
Permissions Size User Group Date Modified Name
|
|
.rw-r--r-- 279k root root 6 ott 01:00 config-6.11.2-amd64
|
|
drwxr-xr-x - root root 8 ott 22:02 grub
|
|
.rw-r--r-- 40M root root 20 ott 09:41 initrd.img-6.11.2-amd64
|
|
.rw-r--r-- 9,9M root root 6 ott 01:00 vmlinuz-6.11.2-amd64
|
|
```
|
|
|
|
#### Config file
|
|
|
|
Questo file, chiamato di solito `config-VERSION` memorizza i parametri di configurazione per il kernel Linux. Generato automaticamente, non deve essere modificato dall'utente.
|
|
|
|
#### System map
|
|
|
|
Il file `System.map-VERSION` e' una tabella che abbina variabili o funzioni (*symbol names*) alla posizione corrispondente nella memoria.
|
|
|
|
#### Linux kernel
|
|
|
|
Il kernel del SO. Il nome di solito e' `vmlinux-VERSION`. Si puo' anche trovare col nome `vmlinuz`, che indica che si tratta di un file compresso.
|
|
|
|
#### Initial RAM disk
|
|
|
|
Contiene un filesystem root minimale caricato in RAM, contenente utility e moduli del kernel affinche' sia possibile montare il vero filesystem root.
|
|
|
|
#### Bootloader related files
|
|
|
|
Si trovano di solito in `/boot/grub/` e includono file di configurazione di GRUB (`grub.cfg`) e moduli (in `/boot/grub/i386-pc/`)
|
|
|
|
```bash
|
|
ll /boot/grub/
|
|
|
|
Permissions Size User Group Date Modified Name
|
|
drwxr-xr-x - root root 3 set 2023 fonts
|
|
.rw------- 6,6k root root 8 ott 22:02 grub.cfg
|
|
.rw-r--r-- 1,0k root root 20 ott 09:34 grubenv
|
|
drwxr-xr-x - root root 16 lug 21:34 i386-pc
|
|
drwxr-xr-x - root root 16 lug 21:34 locale
|
|
.rw-r--r-- 2,4M root root 16 lug 21:34 unicode.pf2
|
|
```
|
|
|
|
## GRUB2
|
|
|
|
### Installare GRUB2
|
|
|
|
```bash
|
|
grub-install --boot-directory=/boot /dev/sda
|
|
```
|
|
|
|
### Configurare GRUB2
|
|
|
|
Il file di configurazione predefinito e': `/boot/grub/grub.cfg`. Questo file viene generato automaticamente e la modifica e' sconsigliata. Per apportare delle modifiche alla configurazione di GRUB e' necessario modificare il file `/etc/default/grub` e quindi eseguire il comando `update-grub`.
|
|
|
|
Una lista delle principali opzioni:
|
|
|
|
- `GRUB_DEFAULT=` : indica la voce di menu' predefinita per l'avvio. Puo' avere valore numerico (come 0, 1, ecc.)
|
|
- `GRUB_SAVEDEFAULT=`: se questa voce e' impostata su `true` e `GRUB_DEFAULT=save`, l'opzione di avvio predefinita sara' sempre l'ultima selezionata
|
|
- `GRUB_TIMEOUT=`: il timeout, in secondi, prima che sia avviata la voce di menu predefinita. Se impostato su `0`, il sistema avviera' la voce predefinita senza mostrare un menu. Se impostato su `-1`, il sistema attendera' fino a quando l'utente selezionera' un'opzione
|
|
- `GRUB_CMDLINE_LINUX=`: opzioni che verranno aggiunte come parametri all'avvio al kernel
|
|
- `GRUB_CMDLINE_LINUX_DEFAULT=`: parametri aggiuntivi solo per la voce predefinita
|
|
- `GRUB_PASSWORD=`changeme
|
|
- `GRUB_GFXMODE=`1920x1080
|
|
- `GRUB_ENABLE_CRYPTODISK=y`: GRUB cerchera' dischi crittografati
|
|
|
|
#### Voci del menu
|
|
|
|
Le voci di menu personalizzate vengono di solito aggiunte al file `/etc/grub.d/40_custom`.
|
|
|
|
```bash
|
|
menuentry "Default OS" {
|
|
set root=(hd0,1) # primo disco e prima partizione
|
|
linux /vmlinuz root=/dev/sda1 ro quiet splash
|
|
initrd /initrd.img
|
|
}
|
|
```
|
|
|
|
Il testo tra "" verra' visualizzato come etichetta della voce nel menu di avvio. il parametro `set root` definisce il disco e la partizione in cui si trova il filesystem root (i dischi sono numerati da zero, quindi hd0 indica il primo disco. Le partizioni sono numerate a partire dal numero uno).
|
|
|
|
Invece di specificare direttamente il dispositivo e la partizione, e' possibile anche indicare lo UUID (*Universal Unique Identifier*):
|
|
|
|
```bash
|
|
search --no-floppy --fs-uuid --set=root 8c6d327e-e96e-44f3-8423-979ed6eb7cc8
|
|
```
|
|
|
|
La riga `linux` indica dove si trova il kernel per il SO. Successivamente, sulla stessa riga, e' possibile passare dei parametri al kernel. Nell'esempio sopra, la partizione di root deve essere montata in sola lettura (`ro`), sono disabilitati la maggior parte dei messaggi di log (`quiet`) e viene visualizzata una schermata di avvio (`splash`).
|
|
|
|
```bash
|
|
ll /
|
|
|
|
Permissions Size User Group Date Modified Name
|
|
lrwxrwxrwx - root root 3 set 2023 bin -> usr/bin
|
|
drwxr-xr-x - root root 20 ott 09:41 boot
|
|
drwxr-xr-x - root root 20 ott 15:08 dev
|
|
drwxr-xr-x - root root 20 ott 09:41 etc
|
|
drwxr-xr-x - root root 3 ago 19:02 home
|
|
lrwxrwxrwx - root root 8 ott 22:02 initrd.img -> boot/initrd.img-6.11.2-amd64
|
|
lrwxrwxrwx - root root 8 ott 22:02 initrd.img.old -> boot/initrd.img-6.10.12-amd64
|
|
lrwxrwxrwx - root root 3 set 2023 lib -> usr/lib
|
|
lrwxrwxrwx - root root 3 set 2023 lib64 -> usr/lib64
|
|
drwxr-xr-x - root root 3 set 2023 media
|
|
drwxr-xr-x - root root 3 set 2023 mnt
|
|
drwxr-xr-x - root root 5 ott 15:31 opt
|
|
dr-xr-xr-x - root root 20 ott 09:34 proc
|
|
drwx------ - root dado 19 ott 20:34 root
|
|
drwxr-xr-x - root root 20 ott 10:19 run
|
|
lrwxrwxrwx - root root 3 set 2023 sbin -> usr/sbin
|
|
drwxr-xr-x - root root 3 set 2023 srv
|
|
dr-xr-xr-x - root root 20 ott 17:26 sys
|
|
drwxrwxrwt - root root 20 ott 16:44 tmp
|
|
drwxr-xr-x - root root 3 set 2023 usr
|
|
drwxr-xr-x - root root 22 set 2023 var
|
|
lrwxrwxrwx - root root 8 ott 22:02 vmlinuz -> boot/vmlinuz-6.11.2-amd64
|
|
lrwxrwxrwx - root root 8 ott 22:02 vmlinuz.old -> boot/vmlinuz-6.10.12-amd64
|
|
```
|
|
|
|
### shell di GRUB2
|
|
|
|
Per entrare nella shell, premere `c` nella schermata dei menu.
|
|
|
|
1) Il comando `ls` mostra un elenco dei dischi e delle partizioni trovati da GRUB2:
|
|
|
|
```bash
|
|
grub> ls
|
|
(proc) (hd0) (hd0,msdos1)
|
|
```
|
|
|
|
Nell'esempio, un solo disco `hd0` con una sola partizione `hd0,msdos1`.
|
|
|
|
2) Per trovare il kernel e initrd, affinche' sia possibile avviare il sistema:
|
|
|
|
```bash
|
|
grub> ls (hd0,msdos1)/
|
|
lost+found/ bin/ boot/ cdrom/ dev/ etc/ home/ lib/
|
|
lib64/ media/ mnt/ opt/ proc/ root/ run/ sbin/
|
|
srv/ sys/ tmp/ usr/ var/ vmlinuz vmlinuz.old
|
|
initrd.img initrd.img.old
|
|
```
|
|
|
|
3) Impostare la partizione di avvio
|
|
|
|
```bash
|
|
grub> set root=(hd0,msdos1)
|
|
```
|
|
|
|
4) Caricare il kernel Linux e indicare al kernel dove si trova il filesystem di root con l'opzione `root=`
|
|
|
|
```bash
|
|
grub> linux /vmlinuz-6.10.12-amd64 root=/dev/sda1
|
|
```
|
|
|
|
5) Caricare initdr e quindi avviare il sistema
|
|
|
|
```bash
|
|
grub> initrd /initrd.img
|
|
grub> boot
|
|
```
|
|
|
|
## GRUB Legacy
|
|
|
|
### Installare GRUB Legacy
|
|
|
|
```bash
|
|
grub-install --boot-directory=/boot DEVICE
|
|
|
|
grub-install --boot-directory=/boot /dev/sda
|
|
```
|
|
|
|
### Installare GRUB Legacy dalla shell di GRUB
|
|
|
|
```bash
|
|
```bash
|
|
grub> root (hd0,0) # Impostare il dispositivo di avvio. Nell'esempio, la prima partizione del primo disco
|
|
grub> setup (hd0) # Installare GRUB Legacy
|
|
```
|
|
|
|
|
|
#### Voci del menu
|
|
|
|
Le voci e le impostazioni del menu legacy di GRUB sono memorizzate in `/boot/grub/menu.lst`. A differenza di GRUB2, sia i dischi che le partizioni sono numerate a partire da zero.
|
|
|
|
```bash
|
|
title My Linux Distro
|
|
root (hd0,0)
|
|
kernel /vmlinuz root=/dev/sda1 ro
|
|
initrd /initrd.img
|
|
module /boot/grub/i386-pc/json.mod
|
|
```
|
|
I moduli (presenti in `/boot/grub/i386-pc/`), che aggiungono funzionalita' extra, vengono caricati usando il comando `module`, seguito dal percorso completo del modulo (`.mod`).
|