LEZIONE del 4 Ottobre

Nonostante la grande diffusione dei personal computer, tipicamente equipaggiati con sistemi operativi proprietari (Windows e MacOS) il cui sviluppo ed evoluzione è motivato, a detta delle case produttrici, per migliorare e valorizzare le specifiche caratteristiche delle piattaforme cui sono indirizzati, la numerosa famiglia di dialetti del sistema operativo Unix , BSD4.2, Irix, Xenix, Aix, Au*x, Ultrix, Eunice, Sistem V, SunOS, MacOS X, Solaris, Linux, NetBSD, OpenBSD, FreeBSD e via dicendo, rappresenta il migliore esempio di sistema multipiattaforma che realizza in modo chiaro ed elegante i principi di funzionamento del nucleo dei moderni sistemi operativi.

Boot del Sistema

La trasparenza con cui il sistema operativo UNIX appare all'utente è apprezzabile fin dalle prime battute, quando il sistema inizia a prendere il controllo della macchina durante la fase di boot.

E' responsabilità del caricatore iniziale, il cosidetto LInux LOader, attivare le primissime azioni immediatamente successive alla sequenza di test effettuati dal BIOS nella fase di boot hardware. La loro esecuzione dipende dalle istruzioni contenute in un file di testo nella directory /etc, chiamato lilo.conf, qualora si utilizzi il loader lilo e del quale è riportato di seguito un possibile esempio.

prompt
timeout=50
default=linux
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
message=/boot/message
lba32

image=/boot/vmlinuz-2.4.18-14
	label=linux
	initrd=/boot/initrd-2.4.18-14.img
	read-only
	vga=788
	append="hdc=ide-scsi root=LABEL=/"

other=/dev/hda1
	optional
	label=dos

Esempio di file /etc/lilo.conf

L'installazione delle azioni indicate deve avvenire, in modalità superuser, lanciando da console il comando

§ /sbin/lilo -v

in modo da registrare le informazioni precedenti nel cosiddetto settore MBR (Master Boot Record) del disco.

Se, invece, si impiega il più moderno grub (GRand Unified Bootloader), il file di configurazione prende il nome di grub.conf ed è posizionato in /boot/grub. La sua struttura è analoga al precedente ma con qualche differenza, come appare nell'esempio riportato di seguito, e non è necessaria alcuna azione di aggiornamento dopo che è stato modificato.

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd0,1)
#          kernel /boot/vmlinuz-version ro root=/dev/hda2
#          initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,1)/boot/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-31.9)
        root (hd0,1)
        kernel /boot/vmlinuz-2.4.20-31.9 ro root=LABEL=/ hdc=ide-scsi
        initrd /boot/initrd-2.4.20-31.9.img
title Windoows XP
        rootnoverify (hd0,0)
        chainloader +1

Esempio di file grub.conf

In entrambi i casi sono presenti alcune linee di configurazione per ogni sistema presente sul disco e dal quale è possibile effettuare il boot. Nella riga in cui è presente la parola chiave label (lilo.conf) oppure title (grub.conf) viene assegnata un'etichetta al sistema in questione mentre le righe contigue specificano i paramentri necessari per passare alla fase successiva di boot con la quale viene caricato in memoria il kernel.

Durante le primissime fasi del boot, riportate nel seguito esattamente come sono visibili sulla console riga per riga, il sistema acquisisce le informazioni essenziali relative alla struttura dell'hardware sul quale andrà ad installarsi

Linux version 2.4.20-20.9
       (bhcompile@stripples.devel.redhat.com) 
       (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #1
       Mon Aug 18 11:45:58 EDT 2003
BIOS-provided physical RAM map:
 BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
 BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
 BIOS-e820: 00000000000d8000 - 00000000000e0000 (reserved)
 BIOS-e820: 00000000000e4000 - 0000000000100000 (reserved)
 BIOS-e820: 0000000000100000 - 000000000bf70000 (usable)
 BIOS-e820: 000000000bf70000 - 000000000bf7f000 (ACPI data)
 BIOS-e820: 000000000bf7f000 - 000000000bf80000 (ACPI NVS)
 BIOS-e820: 000000000bf80000 - 000000000c000000 (reserved)
 BIOS-e820: 000000001bf80000 - 000000001c000000 (reserved)
 BIOS-e820: 00000000fff80000 - 0000000100000000 (reserved)
0MB HIGHMEM available.
191MB LOWMEM available.
On node 0 totalpages: 49008
zone(0): 4096 pages.
zone(1): 44912 pages.
zone(2): 0 pages.

Fase iniziale di boot

Come si può notare, nella prima riga appaiono le informazioni relative alla versione del kernel e del compilatore utilizzato per generarlo. Successivamente viene ricostruita la mappa fisica della memoria fornita dal BIOS e, quindi, l'organizzazione della stessa in livelli di cache fatta dalla specifica implementazione del kernel.

Fasi Successive del Boot

Nella fase successiva si procede al riconoscimento dell'hardware: la prima riga si riferisce alle primissime azioni effettuate dal kernel, in particolare, la determinazione del root file system per il caricamento di tutti i moduli ritenuti necessari al suo corretto funzionamento e l'inizializzazione dei relativi parametri. Si ricorda che, inizialmente, la partizione di root viene montata in modalità read-only. Solo successivamente verrà rimontata nella normale modalità read-write.

Dopo l'avvenuto riconoscimento della CPU e conseguente inizializzazione si passa, ovviamente, al riconoscimento della dimensione della memoria e all'inizializzazione delle tabelle di hash per l'accesso veloce alle sue pagine. A questo livello la memoria è vista strutturalmente secondo lo schema implementativo adottato dal kernel: si tratta di un livello d'astrazione scelto dagli implementatori con cui utilizzare al meglio l'hardware disponibile per l'accesso veloce alla memoria.

Kernel command line: ro root=LABEL=/ hdc=ide-scsi
ide_setup: hdc=ide-scsi
Initializing CPU#0
Detected 2392.412 MHz processor.
Console: colour VGA+ 80x25
Calibrating delay loop... 4771.02 BogoMIPS
Memory: 188300k/196032k available
        (1358k kernel code, 5816k reserved, 1004k data, 132k init,
         0k highmem)
Dentry cache hash table entries: 32768 (order: 6, 262144 bytes)
Inode cache hash table entries: 16384 (order: 5, 131072 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 8192 (order: 3, 32768 bytes)
Page-cache hash table entries: 65536 (order: 6, 262144 bytes)
CPU: Trace cache: 12K uops, L1 D cache: 8K
CPU: L2 cache: 256K
Intel machine check architecture supported.
Intel machine check reporting enabled on CPU#0.
CPU:     After generic, caps: bfebf9ff 00000000 00000000 00000000
CPU:             Common caps: bfebf9ff 00000000 00000000 00000000
CPU: Intel Mobile Intel(R) Celeron(R) CPU 2.40GHz stepping 09
Enabling fast FPU save and restore... done.
Enabling unmasked SIMD FPU exception support... done.
Checking 'hlt' instruction... OK.
POSIX conformance testing by UNIFIX
mtrr: v1.40 (20010327) Richard Gooch (rgooch@atnf.csiro.au)
mtrr: detected mtrr type: Intel
PCI: PCI BIOS revision 2.10 entry at 0xfd89b, last bus=2
PCI: Using configuration type 1
PCI: Probing PCI hardware
PCI: Using IRQ router ALI [10b9/1533] at 00:07.0
isapnp: Scanning for PnP cards...
isapnp: No Plug & Play device found

Riconoscimento dell'hardware

Nelle righe successive avviene il riconoscimento dello stato della CPU dopo l'inizializzazione; viene attivata l'unità floating point come accelleratore dell'aritmetica reale secondo lo standard IEEE ed, infine, si accede ai dispositivi hardware connessi sul cosiddetto PCI bus per ognuno dei quali va attivata un'opportuna entry nel vettore delle interruzioni con uno specificato livello IRQ di priorità. Infine si procede allo scanning delle schede plug-and-play.

A questo punto si può passare all'attivazione delle risorse relative alla connessione in rete, le socket. Si passa poi al controller IDE per accedere ai dischi dei quali viene riconosciuta la specifica geometria.
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
apm: BIOS not found.
Starting kswapd
VFS: Disk quotas vdquot_6.5.1
pty: 2048 Unix98 ptys configured
Serial driver version 5.05c (2001-07-08) with
        MANY_PORTS MULTIPORT SHARE_IRQ SERIAL_PCI ISAPNP enabled
ttyS0 at 0x03f8 (irq = 4) is a 16550A
PCI: Enabling device 00:08.0 (0000 -> 0003)
PCI: Assigned IRQ 10 for device 00:08.0
Redundant entry in serial pci_table.  Please send the output of
lspci -vv, this message (10b9,5457,103c,002a)
and the manufacturer and name of serial board or modem board
to serial-pci-info@lists.sourceforge.net.
register_serial(): autoconfig failed
Real Time Clock Driver v1.10e
Floppy drive(s): fd0 is 1.44M
FDC 0 is a post-1991 82077
NET4: Frame Diverter 0.46
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
Uniform Multi-Platform E-IDE driver Revision: 7.00beta3-.2.4
ide: Assuming 33MHz system bus speed for PIO modes;
     override with idebus=xx
ALI15X3: IDE controller at PCI slot 00:10.0
ALI15X3: chipset revision 196
ALI15X3: not 100% native mode: will probe irqs later
    ide0: BM-DMA at 0x2000-0x2007, BIOS settings: hda:DMA, hdb:pio
    ide1: BM-DMA at 0x2008-0x200f, BIOS settings: hdc:DMA, hdd:pio
hda: TOSHIBA MK4021GAS, ATA DISK drive
blk: queue c03cdfe0, I/O limit 4095Mb (mask 0xffffffff)
hdc: QSI CD-RW/DVD-ROM SBW-241, ATAPI CD/DVD-ROM drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
ide1 at 0x170-0x177,0x376 on irq 15
hda: attached ide-disk driver.
hda: host protected area => 1
hda: 78140160 sectors (40008 MB), CHS=4864/255/63, UDMA(100)
ide-floppy driver 0.99.newide
Partition check:
 hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 hda9 hda10 >
ide-floppy driver 0.99.newide
md: md driver 0.90.0 MAX_MD_DEVS=256, MD_SB_DISKS=27
md: Autodetecting RAID arrays.
md: autorun ...
md: ... autorun DONE.
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP, IGMP
IP: routing cache hash table of 1024 buckets, 8Kbytes
TCP: Hash tables configured (established 16384 bind 32768)
Linux IP multicast router 0.06 plus PIM-SM
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
RAMDISK: Compressed image found at block 0
Freeing initrd memory: 146k freed
VFS: Mounted root (ext2 filesystem).

Terza fase del boot

L'ulteriore passaggio consiste nella verifica di integrità delle partizioni in cui ciascun disco risulta suddiviso secondo le specifiche registrate nella cosiddetta partition table. Si ricorda che la modifica di queste informazioni vitali è possibile solamente da un sistema che è stato caricato da un disco diverso da quello su cui si vuol fare la modifica.

Successivamente si abilita il protocollo TCP/IP che è sempre attivo anche se il computer non è collegato in la rete. Oltre alle tabelle cache per IP, vengono attivati i diversi protocolli di trasporto ICMP, UDP, TCP e IGMP. Si passa, infine, al riconoscimento dei dispositivi usb e all'attivazione dei relativi driver.

Journalled Block Device driver loaded
kjournald starting.  Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
Freeing unused kernel memory: 132k freed
usb.c: registered new driver usbdevfs
usb.c: registered new driver hub
PCI: Assigned IRQ 10 for device 00:02.0
usb-ohci.c: USB OHCI at membase 0xcc84a000, IRQ 10
usb-ohci.c: usb-00:02.0, ALi Corporation. [ALi] USB 1.1 Controller
usb.c: new USB bus registered, assigned bus number 1
hub.c: USB hub found
hub.c: 4 ports detected
usb.c: registered new driver hiddev
usb.c: registered new driver hid
hid-core.c: v1.8.1 Andreas Gal, Vojtech Pavlik 
hid-core.c: USB HID support drivers
mice: PS/2 mouse device common for all mice
EXT3 FS 2.4-0.9.19, 19 August 2002 on ide0(3,2), internal journal
Adding Swap: 779112k swap-space (priority -1)
kjournald starting.  Commit interval 5 seconds
EXT3 FS 2.4-0.9.19, 19 August 2002 on ide0(3,5), internal journal
EXT3-fs: mounted filesystem with ordered data mode.
kjournald starting.  Commit interval 5 seconds
EXT3 FS 2.4-0.9.19, 19 August 2002 on ide0(3,7), internal journal
EXT3-fs: mounted filesystem with ordered data mode.
kjournald starting.  Commit interval 5 seconds
EXT3 FS 2.4-0.9.19, 19 August 2002 on ide0(3,3), internal journal
EXT3-fs: mounted filesystem with ordered data mode.
kjournald starting.  Commit interval 5 seconds
EXT3 FS 2.4-0.9.19, 19 August 2002 on ide0(3,9), internal journal
EXT3-fs: mounted filesystem with ordered data mode.
kjournald starting.  Commit interval 5 seconds
EXT3 FS 2.4-0.9.19, 19 August 2002 on ide0(3,6), internal journal
EXT3-fs: mounted filesystem with ordered data mode.
SCSI subsystem driver Revision: 1.00
hdc: attached ide-scsi driver.
scsi0 : SCSI host adapter emulation for IDE ATAPI devices
  Vendor: QSI       Model: CDRW/DVD SBW-241  Rev: VH04
  Type:   CD-ROM                             ANSI SCSI revision: 02

USB, Journaling, ecc

Nell'esempio preso in esame, i file system sono di tipo ext3 caratterizzati, rispetto a ext2, da un meccanismo di journaling capace, in caso di crash, di ristabilire rapidamente il più recente stato integro del disco.

STRUTTURA DEL FILE SYSTEM

Il numero e il tipo di servizi attivati durante la fase di boot determinano l'aspetto finale con cui il sistema si presenta all'utente finale. In particolare, il servizio di mount permette di montare un file-system per ogni specificata partizione, seguendo le istruzioni contenute nella tabella fstab che appare nella directory /etc. Nel seguito ne è riportato un esempio.
LABEL=/            /                   ext3        defaults              1 1
none               /dev/pts            devpts      gid=5,mode=620        0 0
/dev/hda10         /dos                vfat        rw,user,noauto        0 0
LABEL=/home        /home               ext3        defaults              1 2
none               /proc               proc        defaults              0 0
none               /dev/shm            tmpfs       defaults              0 0
LABEL=/usr         /usr                ext3        defaults              1 2
LABEL=/var         /var                ext3        defaults              1 2
matisse:/home      /mnt/matisse/home   nfs         rw,user,noauto        0 0
klimt:/home        /mnt/klimt/home     nfs         rw,user,noauto        0 0
/dev/hda8          swap                swap        defaults              0 0
/dev/fd0           /mnt/floppy         auto        noauto,owner,kudzu    0 0
/dev/cdrom         /mnt/cdrom          udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/sda	   /mnt/memstick       vfat        rw,user,noauto	 0 0
/dev/sda1	   /mnt/camera         auto        rw,user,noauto	 0 0
/mnt/somedata.iso  /mnt/CDdata         auto        loop,rw,user,noauto   0 0

Tabella per il montaggio dei file-system

Nella tabella fstab compaiono anche file-system speciali che rappresentano lo stato dei processi, i dispositivi periferici esterni (floppy disk, cdrom, ecc...) e l'area di swap per la memoria virtuale.

Tuttavia, la configurazione definitiva del sistema è completamente determinata dal cosiddetto runlevel, come si vedrà in maggior dettaglio nelle prossime lezioni. Per il momento si tenga presente che con il runlevel 3 il sistema si presenta in modalita` testuale mentre con 5 si è in presenza della modalità grafica poichè, in questo caso, viene attivato il server X. L'interfaccia grafica si realizza con l'attivazione di un certo numero di processi che "mantengono in vita" il cosiddetto Desktop. Attualmente, sono previsti nelle distribuzioni il desktop KDE, più agile e leggero, e GNOME più completo ma più oneroso come richiesta di risorse.

I processi che caratterizzano il funzionamento di Linux in modalità testo sono quelli riportati nella seguente tabella
  PID TTY      STAT   TIME COMMAND
    1 ?        S      0:04 init
    2 ?        SW     0:00 [keventd]
    3 ?        SWN    0:00 [ksoftirqd_CPU0]
    8 ?        SW     0:00 [bdflush]
    4 ?        SW     0:00 [kswapd]
    5 ?        SW     0:00 [kscand/DMA]
    6 ?        SW     0:00 [kscand/Normal]
    7 ?        SW     0:00 [kscand/HighMem]
    9 ?        SW     0:00 [kupdated]
   10 ?        SW     0:00 [mdrecoveryd]
   14 ?        SW     0:00 [kjournald]
   71 ?        SW     0:00 [khubd]
  175 ?        SW     0:00 [kjournald]
  176 ?        SW     0:00 [kjournald]
  177 ?        SW     0:00 [kjournald]
  178 ?        SW     0:00 [kjournald]
  179 ?        SW     0:00 [kjournald]
  416 ?        S      0:00 syslogd -m 0
  420 ?        SW     0:00 klogd -x
  438 ?        SW     0:00 portmap
  457 ?        SW     0:00 rpc.statd
  512 ?        SW     0:00 /sbin/cardmgr
  569 ?        SW     0:00 /usr/sbin/sshd
  583 ?        S      0:00 xinetd -stayalive -pidfile /var/run/xinetd.pid
  593 ?        S      0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
  614 ?        S      0:00 sendmail: accepting connections
  623 ?        S      0:00 sendmail: Queue runner@01:00:00 for /var/spool/client
  651 ?        S      0:00 crond
  662 ?        S      0:00 cupsd
  722 ?        S      0:00 xfs -droppriv -daemon
  740 ?        S      0:00 /usr/sbin/atd
  748 tty1     S      0:00 /sbin/mingetty tty1
  749 tty2     S      0:00 /sbin/mingetty tty2
  750 tty3     S      0:00 /sbin/mingetty tty3
  751 tty4     S      0:00 /sbin/mingetty tty4
  752 tty5     S      0:00 /sbin/mingetty tty5
  753 tty6     S      0:00 /sbin/mingetty tty6

Processi di sistema

Si tenga presente che le interfacce grafiche sono tipicamente impiegate dagli utenti finali su workstation mentre, in generale, i server sono normalmente gestiti in modalità testuale per mezzo di shell script personlizzati per ogni specifica installazione.

Dunque, sia in modalità testuale che in modalità grafica dopo essere entrati nel sistema, si supporrà d'ora in poi che l'utente apra un terminale dalla console. Tale operazione è automatica in modalità testuale mentre richiede l'esecuzione del programma xterm nell'ambiente grafico del Desktop, ottenuta con l'ausilio del mouse.

Una volta aperto l'Xterminal l'utente è in grado di dialogare col sistema utilizzando il linguaggio della shell che andremo ad analizzare in maggior dettaglio nelle prossime lezioni. Inizieremo, invece, dal file-system o, per meglio dire, dai file-system che Linux mette a disposizione. Innanzitutto, bisogna dire che l'organizzazione dei file su disco, fornita dai sistemi Unix, è molto ricca e consente ogni tipo di strutturazione delle informazioni.

Il file-system, basato su una sofisticata implementazione di I-node, consente di trasformare agevolmente la geometria 3D del disco, costruita sulla terna settore, testina e cilindro, in una struttura ramificata ad albero dove è persino possibile costruire dei cammini trasversali. I comandi che la shell mette a disposizione sono quelli riportati nella tabella
mkdir : crea una nuova directory
rmdir : rimuovi una nuova directory
cd : spostati nell'albero delle directory
ls : lista il contenuto della directory
ln -s : costruisci una connessione fra directory

Manipolazione delle Directory

Come si è accennato nella scorsa lezione, l'organizzazione dei file nei sistemi Unix viene normalmente realizzata attraverso un certo numero di partizioni (che possono vedersi come dischi virtuali), ciascuna delle quali contenente informazioni con determinate caratteristiche. Nelle distribuzioni Linux le partizioni sono tipicamente 4: /, /usr, /home e /var di cui, tuttavia, solo la prima è strettamente necessaria potendo, le rimanenti collassare in un'unica directory.

ORGANIZZAZIONE DEL SISTEMA

Storicamente l'evoluzione dei sistemi Unix si è realizzata organizzando il sistema in un certo numero di directory e sottodirectory, ciascuna delle quali contenenti file ben specificati secondo quanto rappresentato nella seguente tabella.

lost+found :
boot : kernel
dev : dispositivi
bin : eseguibili
sbin : eseguibili di sistema
etc : configurazione
lib : librerie
tmp : file temporanei
mnt : radici per il montaggio di file system diversi
misc :
opt :
tftpboot :
root : root home directory
proc : file system speciale contenente le informazioni sui processi
home : utenti
usr : sistema
var : amministrazione

Organizzazione del root file system

Se ora si va a guardare l'organizzazione della directory contenente il sistema, questa è organizzata nel modo seguente

boot.b
message
chain.b
os2_d.b
kernel.h
System.map-xxx
vmlinux-xxx
config-xxx
module-info-xxx
vmlinuz-xxx
initrd-xxx.img
System.map
vmlinuz

module-info

Organizzazione del Kernel
dove xxx rappresenta la release del Kernel che, per tutte distribuzioni di Linux, prende la forma seguente

Kernel.NumPrin. NumSec-N.S


Attualmente, i kernel sono arrivati alla release 2.6 ma sono ancora diffuse le release 2.4.