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.
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 |
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 |
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. |
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.
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 |
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). |
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 |
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.
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 |
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 |
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
|
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.
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.
|
Se ora si va a guardare l'organizzazione della directory contenente il sistema, questa è organizzata nel modo seguente
|