domenica 26 settembre 2010

ArchBang progetto di distribuzione che combina una versione leggera di Arch Linux con l'aumento ancora più leggero window manager Openbox Desktop.

ArchBang è indipendente da un progetto di distribuzione che combina una versione leggera di Arch Linux con l'aumento ancora più leggero window manager Openbox Desktop, tutti a fornire un'esperienza senza soluzione di continuità per l'utente finale ad aderire ai principi di "The Way Old arch".


ArchBang è disponibile nelle versioni per le piattaforme i686 e x86-64.

Altre risorse essenziali, comprese le sue sedi dei repository Gitorious.


Le novità della nuova versione:


  • No more LXDE
  • Removed xdg-menu for dmenu (Dynamic Menu ftw!)
  • Thunar is back & PCMan File Manager is out
  • New Theme
  • Just VLC for your media needs (removed Exaile & Gnome Mplayer)
  • Added GIMP!
  • Xfburn instead of Graveman
  • Gnumeric added
  • Evince instead of Xpdf
  • Places pipe-menu
  • Linux Kernel version: 2.6.35.5-1

Aggiornamenti:

ArchBang Linux ArchBang Linux Willensky Aristide has announced the release of ArchBang Linux 2011.02, an Arch-based distribution featuring the lightweight Openbox window manager: "ArchBang 2011.02 is out in the wild! New Linux kernel 2.6.37; Thunar properly configured; look changed a bit; base-devel added; documentation updated; from now on there will be no code name, the format will simply be ArchBang-YYYY.MM. If you have Symbiosis fully updated with everything working perfectly, you don’t need to get this release. Future releases of ArchBang will pretty much have the same set of applications (unless there is a new breathtaking application available). Note: Some people experienced random kernel panic with the new 2.6.37 because they forgot to blacklist some modules that normally had to be disabled for their Broadcom wireless card."


More details in the release announcement.


Download (MD5): ArchBang-2011.02.04-i686.iso (530MB), ArchBang-2011.02.04-x86_64.iso (579MB).


Ultime versioni pubblicate:


• 2011-02-05: Distribution Release: ArchBang Linux 2011.02
• 2011-01-28: Distribution Release: ArchBang Linux 2011.01
• 2010-10-07: Distribution Release: ArchBang Linux 2010.10
• 2010-09-23: Distribution Release: ArchBang Linux 2010.09


Screenshots.





Se ti è piaciuto l'articolo , iscriviti al feed cliccando sull'immagine sottostante per tenerti sempre aggiornato sui nuovi contenuti del blog:


giovedì 23 settembre 2010

Quirky Linux, distro derivata dalla ben più famosa Puppy Linux un po' particolare.

Quella che stiamo per vedere è una distro derivata dalla ben più famosa Puppy Linux un po' particolare: Barry Kauler, infatti, il creatore della stessa Puppy, ha deciso di realizzare questa distro per - parole sue - sperimentare nuove idee.

A tal proposito, l'autore tiene a precisare di aver deciso il nome Quirky (che potremmo rendere in italiano con il termine "strambo"), per via del fatto che alcune delle idee alla base della sua nascita siano, per l'appunto, alquanto stravaganti.

Bene, adesso mettiamoci al lavoro.


Ovviamente vi siete già procurati l'immagine ISO della nuova distro (non ancora? Date un'occhiata al sito di Puppy Linux e troverete i link dai quali scaricarla), avete masterizzato il file su disco, avete impostato il BIOS del vostro pc in modo da eseguire il boot per prima dall'unità ottica, avete inserito il disco con Lupu nel lettore ed avete avviato il pc: ecco la prima schermata che vedrete:

come prima cosa, impostate il layout della tastiera

adesso settate le impostazioni relative alla localizzazione

e dopo quelle relativa al fuso orario

successivamente dovremo configurare il server X: scegliendo Probe potete tentare una configurazione automatica; se sapete quale sia il driver funzionante, potete scegliere Choose, altrimenti con VESA farete funzionare ogni hardware compatibie con questo standard

nel nostro caso, il tentativo di configurazione automatica non ha riconosciuto il monitor: per prima cosa, dovremo quindi indicarne le caratteristiche

poi dovremo indicare quale modalità di funzionamento desideriamo impostare

e finalmente, ecco il nostro Quirky in modalità Live

per installare la distro sul pc, cliccate sull'icona Install, indicata dal mouse nell'immagine qui sopra; nella finestra che vi si aprirà, cliccate sul pulsante per avviare l'Universal Installer:

scegliete la voce Internal (IDE o SATA) hard drive

subito dopo dovrete indicare il disco (nel nostro esempio ne è presente solo uno) sul quale installare Quirky

se il disco non dovesse essere partizionato, vi verrà richiesto di utilizzare GParted per creare le partizioni necessarie; come nei precedenti, anche in questo tutorial non tratteremo l'uso di GParted: in ogni caso vi rimando alla guida che trovate su questo blog a questo link (oppure alle guide che trovate facilmente su internet).

ad operazioni di partizionamento eseguite, cliccate sull'iconcina indicata in figura

confermate la vostra scelta

adesso indicate dove siano i file di installazione di Quirky: indicate il CD (almeno se sino adesso avete seguito questo tutorial ed avviato il vostro sistema proprio da CD)

confermate l'avvenuto inserimento del CD

scegliete il tipo di installazione da eseguire: FRUGAL o FULL. Nel nostro tutorial, vedremo la seconda modalità.


A questo punto, se nel vostro pc era già installato un boot loader (GRUB o LiLo che sia) vi verranno mostrate, tramite un editor di testo, le voci da aggiungere nel relativo file di configurazione per consentire l'avvio di Quirky


Se sul vostro pc non è installato alcun boot loader, allora dovremo provvedere: chiudete la finestra dell'editor di testo e scegliete la voce raffigurata qui sotto:


Salvo che non abbiate particolari esigenze, scegliete la prima opzione, ovvero l'installazione automatica di GRUB (simple)


Adesso indicate la modalità video che GRUB utilizzerà (nel dubbio, la prima è la più sicura)


Indicate la partizione su cui installare i file di GRUB


Scegliete dove installare GRUB


La prima opzione richiede che sulla partizione su cui avete installato Puppy abbiate settato, in fase di partizionamento, il flag che classifica la partizione stessa come bootabile; mentre la terza dovrebbe permettervi di avviare Quirky senza altri settaggi. Alla fine, se tutto è andato a buon fine, dovreste vedere questa finestra


A questo punto riavviate quindi il pc, ricordandovi di rimuovere il disco


Riavviando, la prima schermata che dovreste incontrare è quella di GRUB


Dopo il riavvio, dovrete configurare nuovamente la tastiera e le impostazioni di localizzazione

il fuso orario

ed infine il server X

ed alla fine ecco la vostra nuova Quirky pronta per l'uso


Se ti è piaciuto l'articolo , iscriviti al feed cliccando sull'immagine sottostante per tenerti sempre aggiornato sui nuovi contenuti del blog:


mercoledì 22 settembre 2010

Mageia, Mandriva rinasce dalle sue ceneri.

Che Mandriva stesse in pessime situazioni finanziarie lo sapevamo già da tempo ma da qualche ora è arrivata la mazzata finale per gli utenti che hanno sempre amato la distribuzione user-friendly francese.

Dopo anni di successi e numerosi consensi ottenuti da tutta la comunità open source, gli sviluppatori di Mandriva hanno annunciato il distacco dalla società omonima per lanciare un progetto tutto nuovo, basato proprio su Mandriva Linux: Mageia.

I nuovi capi dell’azienda, dopo aver messo alla porta buona parte degli sviluppatori del gruppo Mandriva, hanno deciso di concentrare i loro sforzi unicamente nell’ambito server per i mercati europei mentre in quello desktop per i mercati emergenti.

Questa scelta ha ovviamente lasciato l’amaro in bocca a migliaia di utenti che ora temono per le sorti della versione community.


Gli ex impiegati di Edge-IT, azienda affiliata alla società francese Mandriva S.A., per gran parte sviluppatori del progetto Mandriva, dopo esser stati liquidati e scorporati dall’azienda madre, hanno deciso di proseguire da soli per la propria strada, portando avanti il progetto al quale stavano lavorando da anni.


Nasce così Mageia, nuova distribuzione Linux che si prefissa di proseguire sul tracciato solcato ormai da Mandriva, visto che il suo team di sviluppo sarà formato da ben oltre 50 programmatori ex-Mandriva, convintissimi nel proseguire nel progetto open source.


Già pronti per mettersi all’opera, i neo sviluppatori di Mageia sono soltanto alla ricerca delle strutture idonee per cominciare il proprio lavoro: una distribuzione Linux innovativa e completa, che risulti stabile, robusta ma allo stesso tempo semplice da utilizzare.



Mandriva Linux, prima conosciuta come Mandrake Linux, e' (o meglio era) una distribuzione GNU/Linux nata nel 1998 orientata principalmente al desktop, alla facilità di gestione ed installazione, particolarmente consigliata agli utenti meno esperti.


La facilità della distribuzione era principalmente dovuta ai molti assistenti ed alle procedure guidate che si trovano negli strumenti di configurazione e che, quindi, permettono anche ad un utente con modeste conoscenze informatiche di amministrare il sistema abbastanza agevolmente.


Nata come derivazione di Red Hat, cui aggiungeva l'allora nuovo desktop grafico KDE, ma è ormai completamente indipendente.


Degno di nota il particolare sistema di gestione dei pacchetti, chiamato urpmi, che si occupa di scaricare, installare e provvedere alle dipendenze di un programma in automatico, ed il Centro di Controllo, da dove, attraverso i procedimenti guidati, si possono controllare i vari aspetti del sistema.


Aggiornamenti (via Distrowatch):


Mageia Anne Nicolas has announced the availability of the second alpha release of Mageia 1, a new distribution created by former developers and contributors to Mandriva Linux: "As outlined in the Mageia roadmap, here comes 'Primavera', the second alpha release. Again, this has been a very busy month: our build system is now running fully and the list of supported software has grown to over 6,100 source RPMS, including full integration of LibreOffice and Eclipse, RPM 4.8.1 and KDE 4.6.1. Now we need you for tests! Alpha 2 is available through two DVDs in 32-bit and 64-bit flavours. You can also find a dual CD ISO image, including both 32-bit and 64-bit architecture for minimal installation."

See the
release announcement and release notes for more information.

Download: mageia-dvd-1-Alpha2-i586.iso (4,091MB, MD5), mageia-dvd-1-Alpha2-x86_64.iso (3,636MB, MD5).


Ultime versioni pubblicate:
• 2011-03-15: Development Release: Mageia 1 Alpha 2
• 2011-02-15: Development Release: Mageia 1 Alpha 1
Se ti è piaciuto l'articolo , iscriviti al feed cliccando sull'immagine sottostante per tenerti sempre aggiornato sui nuovi contenuti del blog:

martedì 21 settembre 2010

IpCop firewall rilasciato sotto la licenza GPL sviluppato con il tradizionale stile dell'Open Source.

IpCop è un firewall software basato su una distribuzione Linux che ha lo scopo di fornire un semplice e configurabile firewall utilizzando l'hardware di un comune PC.

Inizialmente, IpCop era un fork di SmoothWall.


Successivamente lo sviluppo ha seguito strade diverse ed ora le due distribuzioni si differenziano molto.


IpCop è rilasciato sotto la licenza GPL ed è sviluppata con il tradizionale stile dell'Open Source; il progetto viene sviluppato grazie alla collaborazione di diversi sviluppatori sparsi per l'intero globo. L'interfaccia grafica è disponibile in 17 lingue diverse. La distribuzione include anche un raffinato e semplice sistema di aggiornamento.


L'ultima versione, la 1.4.21, è stata rilasciata il 23 luglio 2008. La versione 2.0, basata sul kernel 2.6, è attualmente in fase di sviluppo.


Cos'è IPCop?

IPCop è una mini-distribuzione GNU/Linux opensource adatta a realizzare un firewall hardware/software. Garantisce un'efficiente sicurezza della rete impedendo intrusioni esterne non autorizzate.


È un'ottima soluzione per piccole reti, reti aziendali e SOHO (Small Office-Home Office). Può essere adattata ad ogni esigenza e può essere usata anche su hardware piuttosto datato. Può essere usata da amministratori di rete che non conoscono Linux per creare un firewall Linux-based, oppure può essere utilizzata da chi ne capisce di più (di Linux ovviamente!) ma non ha il tempo per configurare manualmente un PC.


Il progetto IPCop è attivo da un paio d'anni e nelle ultima versioni è risultato essere così maturo da acquistare crescente successo in una vasta comunità di utenti e di sviluppatori.


Il manifesto della distribuzione si articola nei seguenti punti:


  • Offrire una distribuzione Firewall Linux stabile sicura e opensource

  • Creare ed offrire una distribuzione Firewall Linux estremamente configurabile

  • Offrire una distribuzione Firewall Linux di facile manutenzione


Caratteristiche tecniche di IPCop.

IpCop offre un'ampia gamma di caratteristiche tecniche: si va dal Linux netfilter standard con capacità di NAT al supporto per DMZ via DNAT, dal supporto DHCP (sia server che client) al supporto NTP per sincronizzare e servire la data e l'ora, dalla possibilità di attivare un proxy a quella di attivare un IDS. Inoltre supporta quattro schede di rete e un numero illimitato di connessioni VPN, oltre ad offrire la possibilità di backup e restore della configurazione. È inoltre facilmente estendibile grazie a numerosi moduli presenti in Internet.


IpCop non richiede molta potenza di calcolo per poter funzionare egregiamente: è richiesto un Pentium II con 64 Mb di ram e qualche GB di hard disk. Se si intende utilizzare le funzioni di proxy sono consigliati 256 MB di ram e qualche GB in più libero. Ovviamente per l'installazione del sistema è necessario un lettore CD.


Nomenclatura delle interfacce di rete.

IPCop nomina le interfacce di rete con dei colori. Ecco i significati:


  • ROSSO - rappresenta l'interfaccia connessa ad internet.

  • VERDE - rappresenta l'interfaccia per la rete interna.

  • BLU - rappresenta l'interfaccia per una seconda rete interna o per una rete wireless.

  • ARANCIONE - rappresenta l'interfaccia per un'eventuale zona DMZ in cui si trovano server che offrono servizi all'esterno.

La configurazione minima, che vedremo in questo articolo, prevede due interfacce di rete: ROSSO (internet) e VERDE (la rete da proteggere); tuttavia non è difficile estendere queste istruzioni per la configurazione un firewall più complesso.


Nel caso esistano due reti locali che devono rimanere separate si utilizza anche l'interfaccia BLU.


Installazione.

Prima di procedere con l'installazione è necessario controllare che il disco su cui installeremo IPCop non contenga dati per noi importanti; infatti la procedura di installazione cancellerà l'intera tabella delle partizioni.


Cominciamo quest'avventura procurandoci l'immagine ISO del disco di installazione da www.ipcop.org e scrivendola su un CD. Ora possiamo partire con l'installazione del nostro futuro firewall. È necessario assicurarsi che il PC sul quale andrà installato IPCop faccia il boot da CD.


Via!


La prima schermata che comparirà sarà quella per la scelta della lingua.

Successivamente si dovrà scegliere da quale dispositivo effettuare l'installazione. Scegliamo CD-ROM.

Ci verrà chiesto se vogliamo procedere con la creazione di una nuova tabella delle partizioni. Scegliamo SI e aspettiamo che le partizioni vengano create e formattate.

Quindi attendiamo la copia dei file sul disco.

Ci verrà quindi chiesto quale sarà la nostra interfaccia di rete GREEN, di indicare il layout della tastiera e il fuso orario, di settare un nome host e di dominio per il nostro firewall.

Da notare la citazione dantesca: «Caron, non ti crucciare, vuolsi così colà dove si puote ciò che si vuole, e più non dimandare.»

Successivamente dovremo decidere quale sarà la configurazione del nostro firewall: in questo articolo parleremo della semplice installazione di IPCop per la protezione di una sola rete LAN, quindi scegliamo GREEN+RED.

Dovremo quindi assegnare gli indirizzi IP alle interfacce GREEN e RED, definire la password di root per l'accesso da terminale e la password dell'utente admin per l'accesso da interfaccia web.

Ora l'installazione è completata. Possiamo quindi riavviare il sistema.


Configurazione base.

Per la configurazione del nostro nuovo firewall accediamo all'interfaccia di configurazione web che risponde all'indirizzo https://indirizzoIPinterfacciaGREEN:445/, dove 192.168.17.253 è l'indirizzo IP lato GREEN del firewall che, in questo esempio, avevo assegnato in precedenza.

Ci apparirà una schermata simile alla seguente:

Possiamo ora navigare all'interno dei menù per accedere alle varie parti della configurazione del firewall. Sono presenti le seguenti voci:

  • Sistema: qui possiamo trovare le utilità per la configurazione del sistema e di IPCop stesso

  • Stato: qui troviamo le informazioni dettagliate sullo stato del firewall

  • Network: le utilità per configurare/amministrare le connessioni di rete

  • Servizi: la configurazione/amministrazione dei servizi disponibili sul firewall

  • VPN: la configurazione delle possibili reti private virtuali (VPN)

  • Log: permette di visualizzare i vari log di IPCop (Proxy, IDS, ...)


Ad esempio, se vogliamo creare una VPN con un altro firewall andremo sul menù VPN: sul menù servizi potremo decidere quali servizi avviare sul nostro firewall, come il proxy, il server DHCP e a altri.



Addon.


Le potenzialità di IPCop sono davvero notevoli, anche grazie al fatto che è possibile installare degli addon per estendere le funzioni del nostro firewall.


Il metodo più facile per installare degli addon è usare il modulo "Addon Server", scaricabile sempre da firewalladdons.sourceforge.net/


Procediamo quindi a scaricare dal sito l'ultima versione, copiamo il file sul firewall e da una console impartiamo i seguenti comandi:


# tar zxvf addons-2.3-CLI-b2.tar.gz -C # cd addons # ./addoncfg -i

In seguito all'installazione, nel menù dell'interfaccia web comparirà la voce Addons, dalla quale sarà possibile installare gli addon con pochi clic.


Ecco brevemente presentati i principali addon:


  • OpenVPN: permette di creare VPN usando OpenVPN. (di default IPCop crea VPN IPSEC)

  • AutoShutDown: permette di spegnere automaticamente, ad una determinata ora, il nostro firewall.

  • Cop+: permette di aggiungere il supporto per l'autenticazione proxy e il filtraggio dei contenuti web con DansGuardian.

  • IPBill: permette la navigazione a tempo e a pagamento. Utile per internet point o simili.

  • NTPD: permette a IPCop di essere anche un Time Server NTP.

  • POPFile: permette a IPCop di essere anche un Mail Proxy e filtro anti-SPAM.

  • SquidGuard: aggiunge il supporto al filtraggio dei contenuti web con SquidGuard.


Vantaggi e Svantaggi.


Vantaggi.

Tra i vantaggi di avere un firewall basato su IPCop annoveriamo il fatto che si può installare su hardware obsoleto, che è Open Source, che non richiede un'approfondita conoscenza di Linux e Iptables e nemmeno una configurazione "manuale" dei vari servizi. È inoltre facile da installare e da gestire, sicuro e stabile allo stesso tempo. Teniamo inoltre presente che il costo di una soluzione commerciale simile è molto elevato.


Svantaggi.


Gli svantaggi principali che ho riscontrato sono riferibili al fatto di non avere supporto per DMZ via routing diretto ma solo via NAT. Inoltre IPCop indirizza tutto il traffico della rete interna verso la rete esterna: non è quindi utile in quelle situazioni in cui si vuole consentire agli utenti di accedere solo a determinati servizi.

fonti: IpCop & Pluto


Se ti è piaciuto l'articolo , iscriviti al feed cliccando sull'immagine sottostante per tenerti sempre aggiornato sui nuovi contenuti del blog:


lunedì 20 settembre 2010

Il Boot di Linux: come le diverse architetture eseguono la fase di "boot".

Questo articolo descrive i passi compiuti per avviare il kernel di Linux. Benché questo tipo di informazioni non sia rilevante per la funzionalità del sistema, risulta interessante vedere come le diverse architetture eseguono la fase di "boot".


Un computer è un apparato molto complesso, ed il suo sistema operativo è uno strumento elaborato che nasconde le complessità hardware per fornire un ambiente semplice e standardizzato all'utente finale. All'accensione del sistema, comunque, il software di sistema deve lavorare in un ambiente limitato, e deve caricare il kernel usando questo ambiente dalle scarse funzionalità.


Di seguito viene descritta la fase di boot per tre diverse piattaforme: l'antiquato PC e i più recenti calcolatori basati su Alpha e Sparc. Il PC occuperà la maggior parte dello spazio in questo articolo perché è ancora la piattaforma più diffusa, ed anche perché è quella più difficile da avviare. Purtroppo in questo articolo del Kernel Korner non troverete alcun codice d'esempio, perché il linguaggio Assembly è diverso su ciascuna piattaforma ed è di difficile comprensione per la maggior parte dei lettori.


Il calcolatore all'accensione.

Per consentire al computer di poter fare qualcosa quando viene acceso, il sistema è progettato in modo che il processori inizi ad eseguire le istruzioni del suo firmware. Il firmware è il "software non rimovibile" che si trova nella ROM del sistema; alcune case produttrici lo chiamano BIOS (Basic Input-Output System) per sottolineare il suo ruolo, altri lo chiamano PROM o "flash" per accentuare la sua implementazione in hardware, altri ancora lo chiamano "console" per focalizzare l'attenzione sull'interazione con l'utente.


Solitamente il firmware verifica che l'hardware lavori correttamente, recupera una parte del kernel dalla memoria di massa e lo esegue. Questa prima parte del kernel deve caricare la parte rimanente ed inizializzare tutto il sistema. In questo articolo non tratterò le problematiche del firmware, e mi limiterò a considerare il codice del kernel, il cui sorgente è distribuito all'interno di Linux.


Il PC.

Al momento dell'accensione, il microprocessore x86 (anche i recenti Pentium Pro) è solo un processore a 16 bit che vede solo 1 MB di memoria. Questo ambiente è chiamato "modalità reale", ed esiste per esigenze di compatibilità con microprocessori più vecchi della stessa famiglia. Tutto ciò che costituisce un sistema completo è vincolato a risiedere in questo spazio d'indirizzamento: il firmware, il buffer video, lo spazio per le schede di espansione e un po' di RAM (i maledetti 640kB).


Per rendere le cose più difficili, il firmware del PC può caricare solo mezzo kilobyte di codice, e stabilisce la sua configurazione di memoria prima del caricamento di questo primo settore. Qualunque sia il supporto di memorizzazione usato per il boot, il primo settore della partizione di boot viene caricato in memoria all'indirizzo 0x7c00, dove l'esecuzione inizia. Quello che succede a 0x7c00 dipende dal boot loader usato. Di seguito analizzeremo tre situazioni: nessun boot loader, lilo, loadlin.


Avviare zImage e bzImage.

Sebbene sia abbastanza raro avviare il sistema senza un boot loader, si può fare copiando il "raw kernel" (il file chiamato zImage) direttamente su un floppy. Un comando del tipo ``cat zImage > /dev/fd0'' funzionerà perfettamente su Linux, anche se su altri sistemi Unix l'unico modo sicuro per scrivere sul floppy è usare il comando dd. L'immagine "raw" sul floppy così creata può essere configurata usando il comando rdev, ma questo è al di fuori dell'argomento trattato qui.


Il file zImage è l'immagine compressa del kernel e si trova in arch/i386/boot dopo aver compilato il kernel con il comando make zImage o make boot (il secondo comando è quello che preferisco, perché funziona anche sulle altre piattaforme). Se abbiamo costruito una "big zImage" invece, il file si chiama bzImage e si trova nella stessa directory.


Avviare un kernel x86 è un compito complesso a causa del limite imposto alla memoria disponibile (in modalità reale. Il kernel di Linux cerca di massimizzare l'uso dei 640 kB bassi sposandosi più volte all'interno della memoria. Ma vediamo in dettaglio i passi compiuti da un kernel zImage; i seguenti nomi di file sono tutti relativi ad arch/i386/boot.


  • Il primo settore (eseguito a 0x7c00) sposta se stesso all'indirizzo 0x90000 e carica in sequenza alcuni settori ulteriori di codice, ottenendoli dal dispositivo usato per il boot tramite funzioni del firmware. La parte rimanente del kernel viene poi caricata all'indirizzo 0x10000. Questo comporta che la dimensione massima consentita sia di mezzo mega di dati (ma questa è l'immagine compressa). Il codice del boot sector si trova in bootsect.S, ed è un file Assembly in modalità reale.
  • Poi, il codice all'indirizzo 0x90200 (definito in setup.S) si prende cura di alcune inizializzazioni hardware e consente di cambiare la modalità testo di default (video.S). La selezione del modo testo è diventata una opzione di compilazione dal kernel 2.1.9 in poi.
  • Più tardi, tutto il kernel viene spostato da 0x10000 (64K) a 0x1000 (4K). Questo spostamento sovrascrive i dati del BIOS immagazzinati in RAM e, da questo momento in poi, non sarà più possibile eseguire chiamate al BIOS. La prima pagina fisica non viene toccata perché è la cosiddetta "pagina zero" (zero-page), usata per la gestione della memoria virtuale.
  • A questo punto setup.S passa in modalità protetta (protected mode) e salta a 0x1000, dove risiede il kernel. Tutta la memoria disponibile può essere finalmente vista, ed il sistema può cominciare a funzionare.


I passi visti in precedenza rappresentavano tutta la fase di avvio quando i kernel erano abbastanza piccoli da poter stare in mezzo megabyte (negli indirizzi tra 0x10000 e 0x90000). Quando il kernel era piccolo esso risiedeva a 0x1000, ma la continua aggiunta di funzionalità lo ha portato a superare il mezzo mega: il codice che si trova all'indirizzo 0x1000 non è più il vero kernel Linux, ma piuttosto il codice relativo alla decompressione del programma gzip. I seguenti passi sono poi necessari per decomprimere il vero kernel ed eseguirlo:


  • Il codice a 0x1000 è compressed/head.S, ed il suo ruolo è decomprimere il kernel: esso chiama la funzione decompress_kernel(), definita in compressed/misc.c, la quale chiama inflate() che scrive il suo output all'indirizzo 0x100000 (un mega). La memoria alta adesso viene vista, poiché il microprocessore è definitivamente fuori dal suo limitato ambiente iniziale (il modo reale).
  • Dopo la decompressione, head.S salta al vero inizio del kernel. Il codice attinente si trova in ../kernel/head.S, fuori dalla directory boot. La fase di boot è ora finita, e head.S (il codice che si trova in 0x100000, quello che si trovava in 0x1000 prima dell'introduzione del kernel compresso) può completare l'inizializzazione del microprocessore e chiamare start_kernel(). Da questo punto in poi, tutto il codice è scritto in C.
I vari movimenti di dati che avvengono durante la fase di boot sono rappresentati in figura.

La figura è anche disponibile in postscript come boot-lj.ps.

I passi descritti in precedenza valgono nell'assunzione che il kernel compresso non occupi più di mezzo mega. Bench´ questa ipotesi sia realizzata nella maggior parte dei casi, un sistema pieno di device driver e di filesystem compilati staticamente nel kernel può tranquillamente eccedere questo limite (questo sottolinea ancora una volta l'importanza della modularizzazione del kernel). Ad esempio, il limite può venir superato dai dischi di installazione del sistema: questi kernel devono contenere molti driver e superano facilmente il mezzo mega. Per poter avviare sistemi di queste dimensioni occorre qualche nuovo trucco. La soluzione adottata si chiama bzImage, ed è stata introdotta dalla versione 1.3.73 del kernel.


Un kernel bzImage viene generato dal comando "make bzImage", invocato dalla directory principale dei sorgenti del kernel. Questo tipo di immagine del kernel si avvia in modo molto simile alla zImage, con alcune piccole differenze:


  • Quando il sistema viene all'indirizzo 0x10000, una piccola routine di supporto viene invocata ogni volta che un blocco da 64 kB viene letto dal disco. La routine di supporto sposta i blocchi di dati nella memoria alta usando una speciale chiamata del BIOS. Solo i BIOS abbastanza recenti implementano questa funzionalità, e per questo il comando "make boot" genera ancora la zImage (almeno al momento in cui questo articolo viene scritto, ma in futuro potrebbe cambiare).
  • setup.S non sposta più il sistema a 0x1000 (4k), ma salta direttamente ad eseguire il codice all'indirizzo 0x100000 (1M), dopo essere passato in modalità protetta. L'indirizzo di "un mega" è quello dove i dati sono stati spostati dalla chiamata BIOS descritta nel passo precedente.
  • Il decompressore, che si trova all'indirizzo "un mega" scrive l'immagine del kernel decompresso in memoria bassa finché questa non è piena, poi scrive in memoria alta dopo l'immagine compressa. I due pezzi sono in seguito riassemblati all'indirizzo 0x100000 (un mega). Sono necessari molti spostamenti di memoria per eseguite questo lavoro correttamente, ma non è il caso di scendere in ulteriori dettagli.


La regola per costruire le bzImage si può trovare nel Makefile: essa interessa molti file contenuti in arch/i386/boot. Una bella caratteristica di bzImage è che quando kernel/head.S viene eseguito non si accorgerà del lavoro addizionale, e tutto continuerà come nel caso di zImage.


Lilo.

La maggior parte degli utenti di Linux-x86 non avviano il kernel dal floppy, e usano piuttosto il Linux Loader (LiLo) dall'hard disk. Lilo sostituisce parte del processo descritto in precedenza, in modo da essere in grado di avviare un kernel sparso in tutto un disco. Questo consente all'utente di avviare un file di kernel da una partizione, senza utilizzare il floppy.


In pratica, Lilo usa i servizi del BIOS per caricare i singoli settori dal disco e poi salta a setup.S. In altre parole, Lilo sistema le cose in memoria come fa bootsect.S per il raw kenrel; in questo modo il meccanismo di avvio tradizionale può essere completato senza problemi. Lilo è anche in grado di gestire la linea di comando del kernel e questa è già una buona ragione per evitare di avviare il raw kernel dal floppy.


Per avviare una bzImage tramite Lilo, è necessario disporre almeno della versione 18 di Lilo. Versioni più vecchie non sono in grado di caricare segmenti di codice in memoria alta, operazione necessaria per caricare immagini grosse.


Il principale svantaggio di Lilo sta nel suo uso del BIOS per caricare il sistema. Questo obbliga ad avere il kernel e altri file rilevanti in dischi che siano visti dal BIOS, e all'interno di questi solo nei primi 1024 cilindri (i BIOS più recenti aggirano questo limite giocando sporco con i parametri del disco, ma questo comporta che la tabella delle partizioni non rispecchi la geometria del disco: questo dischi non potranno più essere usati su calcolatori più vecchi). Come si vede, usando il firmware dei PC ci si rende facilmente conto di quanto tale architettura sia obsoleta.


Anche chi non usa Lilo, può apprezzare i file di documentazione distribuiti con il suo codice sorgente. Essi contengono molte informazioni interessanti sul processo di boot del PC e spiegano come fronteggiare quasi tutte le situazioni possibili.


Loadlin.

Se si vuole avviare il Sistema Operativo (maiuscolo) da un altro sistema operativo (minuscolo), allora Loadlin è lo strumento da usare. Il programma è simile a Lilo in quanto carica il kernel da una partizione del disco e quindi salta a setup.S. E` differente da Lilo in quanto non solo deve sottostare alle limitazioni del BIOS, ma deve anche sbarazzarsi di una configurazione di memoria prestabilita senza compromettente la stabilità del sistema. D'altro canto, Loadlin non è limitato alla lunghezza di mezzo kB perché non è un boot sector ma un completo file di codice eseguibile.

La versione 1.6 del programma e le successive sono in grado di caricare immagini bzImage.


Loadlin è in grado di passare una linea di comando al kernel e per questo è flessibile quanto Lilo; la maggior parte delle volte un utente di Loadlin finirà per scrivere un file linux.bat che passi per passare una linea del comando completa a Loadlin quando il comando linux viene invocato.


Loadlin può anche essere usato per trasformare un qualunque PC connesso in rete in una macchina Linux: a questo fine è solo necessario disporre di un'immagine del kernel predisposta per montare la "partizione di root" via NFS, l'eseguibile Loadlin ed un file linux.bat che contenga i corretti indirizzi Internet. Ovviamente serve anche un server NFS correttamente configurato, ma ogni macchina Linux può adempire questo compito. Per esempio, la seguente linea di comando commuta il PC della mia ragazza alfred.unipv.it in una workstation:


Ulteriori informazioni.

 loadlin c:\zimage rw nfsroot=/usr/root/alfred \    nfsaddrs=193.204.35.117:193.204.35.110:193.204.35.254:255.255.255.0:alfred.unipv.it  

Come si può immaginare, il codice non è così semplice come può apparire: in realtà esso deve occuparsi di molti dettagli, come passare al kernel la linea di comando, ricordarsi quale tecnica di boot viene utilizzata e così via. Il lettore curioso può guardare il codice sorgente per saperne di più e leggere i commenti degli autori contenuti nel codice. Si trovano molte informazioni nei commenti e spesso sono anche divertenti da leggere.


Personalmente non credo che qualcuno avrà mai bisogno di modificare il codice di boot, in quanto le cose diventano molto più interessanti quando il sistema è completamente attivo: a quel punto si possono sfruttare tutte le potenzialità del microprocessore e tutta la RAM disponibile senza impazzire con problemi troppo di basso livello.


L'Alpha.

La piattaforma Alpha è molto più matura del PC e il suo firmware riflette questa maturità. La mia esperienza con Alpha è limitata al firmware ARC, che del resto è il più diffuso.


Dopo aver compiuto il solito riconoscimento dei dispositivi, il firmware visualizza un menu di boot che permette di scegliere cosa avviare. Il firmware è in grado di leggere una partizione del disco (ma solo una partizione FAT), in questo modo l'utente è in grado di avviare un file, senza bisogno di smanettare con il boot sector e dover costruire una mappa dei blocchi del disco.


Il file che viene avviato è di solito linload.exe, il quale carica Milo (il "Mini Loader", il cui nome è uno scherzoso riferimento alla dimensione del programma). Per poter avviare Linux tramite il firmware ARC occorre avere una piccola partizione FAT sul disco rigido, per contenere linload.exe e Milo. Il kernel Linux non ha comunque bisogno di avere accesso alla partizione, a meno che non si debba aggiornare Milo, per cui il supporto per il filesystem FAT può essere lasciato fuori dal kernel senza per questo avere problemi.


In pratica, l'utente può scegliere tra diverse possibilità: il menu di boot può essere configurato per avviare Linux di default, e Milo può addirittura essere trasferito nella memoria flash della macchina, in modo da poter fare a meno della partizione FAT. In ogni caso, alla fine il controllo viene passato a Milo.


Il programma Milo è in qualche modo una versione ridotta del kernel Linux: contiene gli stessi device driver di Linux ed il supporto per alcuni filesystem; a differenza del kernel però non supporta la gestione dei processi e include il codice per l'inizializzazione dell'Alpha. Milo è in grado di impostare ed attivare la memoria virtuale, e può caricare un file sia da una partizione ext2 che da un disco iso9660. Il "file" in questione viene caricato all'indirizzo virtuale 0xfffffc0000300000 e viene eseguito. L'indirizzo virtuale usato è quello dove deve girare il kernel Linux: è improbabile che Milo sia usato per caricare qualcosa che non sia Linux, con l'eccezione del programma fmu (flash management utility) usato per salvare Milo nella flash ROM. fmu viene compilato per partire dallo stesso indirizzo virtuale del kernel ed è distribuito insieme a Milo).


E` interessante notare che Milo include anche un piccolo emulatore 386 ed alcune funzionalità del BIOS del PC. Questo supporto è necessario per eseguire l'autoinizializzazione delle periferiche ISA/PCI (le schede PCI, sebbene pretendano di essere indipendenti dal microprocessore, usano il codice macchina Intel nelle loro ROM).


Ma, se Milo fa tutto di questo, cosa è lasciato al kernel Linux?


Molto poco, in effetti. Il primo codice del kernel ad essere eseguito in Linux-Alpha è arch/alpha/kernel/head.S, il quale no fa altro che impostare alcuni puntatori e saltare a start_kernel(). In effetti, kernel/head.S per Alpha è molto piè corto dell'equivalente sorgente per x86.


Per chi non vuole usare Milo c'è un'altra alternativa, anche se non molto conveniente. In arch/alpha/boot risiedono i sorgenti di un "raw loader" che viene compilato usando il comando "make rawboot" dalla directory principale dei sorgenti Linux. Il programma è in grado di caricare un file da una regione sequenziale di una periferica (il floppy o il disco rigido) usando le chiamate del firmware.


In pratica, il raw loader svolge un compito simile a quello che bootsect.S svolge per la piattaforma PC, e questo obbliga a copiare il kernel su di un floppy o una partizione raw. Dovrebbe essere evidente come non ci siano veri motivi per provare questa tecnica, che è piuttosto complessa e non offre la flessibilità offerta da Milo. Personalmente non so neppure se questo loader funzioni ancora: il "PALcode" usato da Linux è esportato da Milo ed è diverso da quello ha esportato dal firmware ARC. Il PALcode è una libreria di funzioni di basso livello, usata dai microprocessori Alpha per implementare la paginazione e altre operazioni di basso livello. Se il PALcode attivo implementa operazioni diverse da quelle che il software si aspetta, il sistema non può funzionare.


La Sparc.

Avviare una macchina Sparc è simile ad avviare un Alpha dal punto di vista dell'utente, mentre è simile ad avviare un PC dal punto di vista software.


L'utente vede che il firmware carica un programma e lo esegue, il programma a sua volta può recuperare un file da una partizione del disco e decomprimerlo. Il "programma" in questione si chiama Silo, e può leggere un file sia da partizioni ext2 che ufs (SunOS, Solaris). A differenza di Milo (e similmente a Lilo), Silo può avviare anche un altro sistema operativo. Con Alpha non c'è bisogno questa funzionalità in quanto il firmware è già in grado di avviare diversi sistemi operativi: quando Milo esegue, la scelta è già stata fatta (ed è la Scelta Giusta).


Quando un calcolatore Sparc parte, il firmware carica un boot sector dopo aver eseguito la verifica dell'hardware e l'inizializzazione dei dispositivi. E` interessante notare come i dispositivi Sbus sono effettivamente indipendenti dalla piattaforma ed il loro programma di inizializzazione è codice Forth portabile, piuttosto che linguaggio macchina di un particolare microprocessore.


Il boot sector che viene caricato è quello che si trova in /boot/first.b nel filesystem Linux-Sparc, ed e' composta da 512 byte. Tale settore viene caricato all'indirizzo 0x4000 ed il suo ruolo è quello di recuperare dal disco /boot/second.b e metterlo all'indirizzo 0x280000 (2.5 MB); la scelta di questo indirizzo dipende dal fatto che le specifiche della Sparc richiedono che almeno 3 MB di RAM siano mappati durante la fase di boot.


Tutto il resto del lavoro viene fatto dal boot loader di secondo livello: esso è linkato con libext2.a per poter accedere alle partizioni di sistema, e può quindi caricare un'immagine del kernel dal filesystem Linux. second.b può anche decomprimere l'immagine perché include inflate.c, dal programma gzip.


Il codice di second.b utilizza un file di configurazione chiamato /etc/silo.conf, la cui struttura è molto simile al lilo.conf dei PC. Siccome il file viene letto durante la fase di boot, non occorre re-installare la mappa del kernel quando se ne aggiunge uno nuovo (a differenza di quanto si fa sul PC). Quando Silo mostra il suo prompt l'utente può di scegliere una qualsiasi immagine del kernel (o una altro sistema operativo) specificati in silo.conf, oppure si può specificare un percorso completo (una coppia device/pathname) in modo da caricare un'altra immagine di kernel senza dovere editare il file di configurazione.


Silo carica il file che viene avviata all'indirizzo 0x4000. Questo significa che il kernel deve essere più piccolo di 2.5 MB: se è più grande, Silo si rifiuterà di caricarlo per non sovrascrivere la sua propria immagine. Nessun kernel per Linux-Sparc concepibile attualmente può essere più grande di questo limite, a meno di compilarlo con "-g" per avere le informazioni di debugging disponibili. In questo caso bisogna usare il comando strip per ridurre l'immagine prima di passarla a Silo. Alla fine, Silo decomprime il kernel e lo rimappa, posizionando l'immagine all'indirizzo virtuale 0xf0004000. Il codice che viene eseguito dopo Silo è (come si può immaginare) arch/sparc/kernel/head.S. Il sorgente include tutta le tabelle di "trap" per il microprocessore ed il codice necessario per preparare il computer e chiamare start_kernel(). La versione per Sparc di head.S risulta abbastanza grande.


Da start_kernel() in poi.

Dopo che l'inizializzazione specifica per l'architettura è completata, init/main.c prende il controllo del microprocessore (qualunque sia il processore). La funzione start_kernel() chiama subito setup_arch(), che è l'ultima funzione dipendente dall'architettura. A differenza dell'altro codice, comunque, setup_arch() può sfruttare tutte le caratteristiche del microprocessore, ed è un codice molto più facile da comprendere rispetto a quelli descritti in precedenza. La funzione è definita in kernel/setup.c sotto ciascuna architettura supportata.


strart_kernel(), poi, inizializza tutti i sottosistemi dei kernel (IPC, networking, buffer cache, ecc.). Dopo aver completato l'inizializzazione, queste due linee completano la funzione:

 kernel_thread(init, NULL, 0); cpu_idle(NULL);  

Il thread init è il processo numero 1: esso monta la partizione di root ed esegue /linuxrc se CONFIG_INITRD è stato attivato in compilazione; la funzione quindi esegue il programma init. Se init non viene trovato, allora viene eseguito /etc/rc. In generale, l'uso di /etc/rc è sconsigliato, in quanto init è molto piè flessibile di uno script di shell nel gestire la configurazione del sistema. In effetti, la versione 2.1.32 del kernel ha rimosso l'invocazione di /etc/rc come obsoleta.


Se né init/etc/rc possono essere eseguiti, o se terminano, allora la funzione esegue /bin/sh ripetutamente (ma dalla 2.1.21 in poi la shell viene eseguita una volta solo). Questa funzionalità esiste solo come salvaguardia in caso di problemi: se l'amministratore del sistema rimuove o corrompe init per errore, o se viene tolto dal kernel il supporto per gli eseguibili a.out, dimenticandosi che il vecchio init non è stato ricompilato, allora si apprezzerà di avere almeno una shell attiva dopo aver fatto reboot.


Il kernel non ha nulla da fare dopo aver lanciato il processo numero 1, e tutto il resto è gestito nello spazio utente (da init, /etc/rc o /bin/sh).


E il processo 0? Si è visto come il cosiddetto "idle task" esegue cpu_idle(): questa funzione chiama idle() in un ciclo senza fine. La funzione idle() è dipendente dall'architettura e, solitamente, si occupa di spegnere il microprocessore per ridurre i consumi ed aumentare la durata del processore stesso.


Se ti è piaciuto l'articolo , iscriviti al feed cliccando sull'immagine sottostante per tenerti sempre aggiornato sui nuovi contenuti del blog:


giovedì 16 settembre 2010

La gestione della memoria in Linux: la memoria virtuale e la cache di buffer del disco.

Questa sezione descrive le caratteristiche di gestione della memoria di Linux, cioè la memoria virtuale e la cache di buffer del disco. Ne vengono descritti lo scopo, il funzionamento e le azioni necessarie da parte dell'amministratore di sistema.


Cosa è la memoria virtuale?


Linux supporta la memoria virtuale, cioè l'utilizzo di un disco come estensione della RAM in modo da aumentare di conseguenza la dimensione della memoria utilizzabile. Il kernel scrive il contenuto di un blocco di memoria che al momento non viene utilizzato sull'hard disk, in modo che la memoria possa essere usata per altre cose, e quando il contenuto originale serve ancora viene spostato di nuovo nella RAM. Questo processo è completamente trasparente all'utente: i programmi che girano sotto Linux vedono soltanto una memoria disponibile più grande del vero e non sanno che parte di essa risiede sull'hard disk. Naturalmente leggere e scrivere sull'hard disk è più lento (dell'ordine di un migliaio di volte) che usare la memoria vera, quindi i programmi non sono ugualmente veloci. La parte dell'hard disk che viene usato come memoria virtuale si chiama spazio di swap.


Linux può usare come spazio di swap sia un file normale nel filesystem che una partizione separata; una partizione è più veloce, ma è più facile modificare la dimensione di un file (non c'è bisogno di ripartizionare l'intero hard disk e probabilmente installare tutto da zero). Quando sapete la quantità di spazio di swap di cui avete bisogno vi conviene usare una partizione, ma se non siete sicuri create un file, usate il sistema per un po' per farvi un'idea e poi fate una partizione quando siete sicuri sulla sua dimensione.


Dovreste anche sapere che Linux permette di usare diversi file e partizioni di swap nello stesso momento. Per questo, se vi serve per un periodo uno spazio di swap più grande del normale, potete impostare un file temporaneo, invece di tenerlo tutto sempre allocato.


Una nota sulla terminologia dei sistemi operativi: in informatica di solito si distingue tra lo swapping (scrivere tutto il processo nello spazio di swap) e il paging (scriverci solo delle parti di dimensione fissa, di solito alcuni kilobyte, alla volta). Il paging di solito è più efficiente, ed è quello che fa Linux, ma la terminologia tradizionale di Linux parla comunque di swapping


La creazione di uno spazio di swap.

Un file di swap è un file ordinario e non viene considerato in maniera speciale dal kernel. L'unica cosa che importa al kernel è che non deve avere buchi e che sia preparato all'uso con mkswap. Deve risiedere su un disco locale, comunque, e non può trovarsi su un filesystem montato via NFS per ragioni di implementazione.


La parte sui buchi è importante: il file riserva lo spazio disco in modo che il kernel possa fare velocemente lo swap di una pagina senza dover fare tutti i passi necessari per allocare un settore di un disco ad un file. Il kernel usa semplicemente i settori che sono stati allocati per il file; dato che un buco significa che per quel posto nel file non sono allocati settori, non è bene che il kernel provi ad usarli.


Un modo buono per creare il file di swap senza buchi è usando questo comando:

$ dd if=/dev/zero of=/extra-swap bs=1024 count=1024 1024+0 records in 1024+0 records out $
dove /extra-swap è il nome del file di swap e la sua dimensione viene data dopo count=. È meglio che la dimensione sia un multiplo di 4, perché il kernel manda in swap pagine di memoria di 4 kilobyte. Se la dimensione non è un multiplo di 4 l'ultimo paio di kilobyte può restare inutilizzato.


Anche una partizione di swap non è in nessun modo una partizione speciale: la si crea come una qualsiasi altra partizione, l'unica differenza è che viene usata così com'è e non contiene un filesystem. È una buona idea segnare le partizioni di swap come tipo 82 (Linux swap); in questo modo renderete più chiara la tabella delle partizioni, anche se non è strettamente necessario per il kernel.


Dopo aver creato un file o una partizione di swap bisogna scrivere al suo inizio una firma che contiene delle informazioni di amministrazione usate dal kernel. Il comando per farlo è mkswap, che si usa così:


$ mkswap /extra-swap 1024 Setting up swapspace, size = 1044480 bytes $
Notate che lo spazio di swap non è ancora in uso: esiste, ma il kernel non lo usa per fornire memoria virtuale.

Va fatta molta attenzione nell'usare mkswap, dato che questo non controlla che il file o la partizione non siano usati per altre cose. Potete facilmente sovrascrivere file e partizioni importanti! Per fortuna di solito si usa mkswap solo quando si installa il sistema.


Il gestore di memoria di Linux limita la dimensione di ciascuno spazio di swap a circa 127 MB (per varie ragioni tecniche, il limite reale è (4096-10) * 8 * 4096 = 133890048 byte, o 127.6875 megabyte). Potete comunque usare fino a 8 spazi di swap simultaneamente, per un totale di circa 1 GB


Come si usa lo spazio di swap.

Uno spazio di swap inizializzato si mette in uso con swapon, che comunica al kernel che può essere utilizzato. Come argomento viene dato il percorso per il file o la partizione, quindi per cominciare ad usare uno spazio di swap temporaneo si può fare:

$ swapon /extra-swap $

Gli spazi di swap possono essere usati automaticamente elencandoli nel file /etc/fstab.
/dev/hda8        none        swap        sw     0     0 /swapfile        none        swap        sw     0     0

Gli script di avvio fanno partire il comando swapon -a, che comincerà ad usare come swap tutti gli spazi elencati in /etc/fstab. Il comando swapon è quindi necessario solo se si usano spazi di swap supplementari.


Si può controllare l'utilizzo degli spazi di swap usando il comando free, che dice la quantità totale di spazio di swap usata.

$ free              total       used       free     shared    buffers Mem:         15152      14896        256      12404       2528 -/+ buffers:            12368       2784 Swap:        32452       6684      25768 $

La prima linea di output (Mem:) mostra la memoria fisica. La colonna total non considera la memoria fisica usata dal kernel, che in genere è circa un megabyte, used mostra la quantità di memoria usata (nella seconda linea non vengono contati i buffer), free quella totalmente inutilizzata e shared quella condivisa da diversi processi: più è, meglio è. La colonna buffer mostra la dimensione corrente della cache di buffer del disco.


L'ultima linea (Swap:) mostra le stesse informazioni per gli spazi di swap. Se questa linea contiene tutti zeri, non avete attivato lo spazio di swap.


Le stesse informazioni sono disponibili con top o usando il filesystem proc, in particolare il file /proc/meminfo. Al momento è difficile avere delle informazioni sull'uso di uno spazio di swap specifico.


Uno spazio di swap può essere disabilitato con swapoff; in genere non è necessario farlo, tranne che per gli spazi di swap temporanei. Le pagine in uso nello spazio di swap vengono per prima cosa copiate nella memoria; se non c'è memoria fisica sufficiente vengono messe in un altro spazio di swap. Se non c'è abbastanza memoria virtuale per mantenere tutte le pagine Linux comincerà a fare rumore; dopo un po' di tempo dovrebbe tornare normale, ma nel frattempo il sistema è inutilizzabile. Bisognerebbe sempre controllare (ad esempio con free) che ci sia abbastanza memoria libera prima di disabilitare uno spazio di swap.


Tutti gli spazi di swap che vengono usati automaticamente con swapon -a possono essere disabilitati usando swapoff -a, che va a guardare in /etc/fstab per vedere quali spazi rimuovere. Gli spazi di swap attivati manualmente rimarranno in uso.


Talvolta può venire usato spazio di swap anche se c'è molta memoria fisica libera; ad esempio se ad un certo punto c'è bisogno di fare swap, ma poi un processo grande che occupava molta memoria fisica termina e libera la memoria. I dati messi in swap non vengono reinseriti in memoria automaticamente, ma solo quando servono, quindi la memoria fisica può restare libera per parecchio tempo. Non c'è bisogno di preoccuparsene, ma può essere confortante sapere cosa sta succedendo.


La condivisione dello spazio di swap con altri sistemi operativi.


La memoria virtuale viene usata da molti sistemi operativi; dato che ne hanno bisogno solo mentre stanno funzionando, cioè mai allo stesso tempo, gli spazi di swap di tutti i sistemi operativi presenti meno uno vanno sprecati, e sarebbe più efficiente se condividessero un solo spazio di swap. È possibile, ma richiede un po' di impegno.


Allocare lo spazio di swap.


Alcuni vi diranno di allocare uno spazio di swap corrispondente al doppio della vostra memoria fisica, ma è una regola approssimativa. Ecco come fare in modo corretto:

  • Stimate di quanta memoria avete bisogno: calcolate la quantità più alta di memoria di cui avrete mai bisogno in una volta sola, cioè la somma del fabbisogno di tutti i programmi che volete far girare contemporaneamente: lo potete fare facendoli girare tutti insieme.

    Ad esempio, se volete usare X dovreste allocargli circa 8 MB, gcc vuole qualche megabyte (alcuni file hanno bisogno di moltissima memoria, fino a decine di megabyte, ma di solito quattro bastano) e così via. Il kernel userà per sé circa un megabyte, le normali shell ed altri programmi qualche centinaia di kilobyte (diciamo un megabyte tutti insieme). Non c'è bisogno di tentare di essere esatti, basta una stima rozza, magari per eccesso.

    Ricordatevi che se ci sono diverse persone che usano il sistema in contemporanea consumeranno tutti della memoria; comunque, se due persone usano lo stesso programma contemporaneamente l'utilizzo complessivo di memoria non è di solito doppio, dato che le pagine di codice e le librerie condivise vengono usate solo una volta.

    Per stimare le necessità di memoria sono utili i comandi free e ps.

  • Aggiungete per sicurezza un po' di memoria alla stima del passo 1: la dimensione di alcuni programmi sarà sbagliata, o forse vi dimenticherete alcuni programmi che volete usare ed è meglio avere un po' di spazio extra per qualsiasi evenienza. Un paio di megabyte dovrebbero andare bene (è meglio allocare troppo spazio di swap che troppo poco, ma non c'è bisogno di strafare e allocare l'intero disco, dato che lo spazio di swap inutilizzato è sprecato; vedi sopra come fare per aggiungere altro spazio). Inoltre, dato che si lavora meglio con le cifre tonde, arrotondate il valore al megabyte superiore.

  • Basandovi sul calcolo qui sopra sapete di quanta memoria avete bisogno in totale. Per allocare lo spazio di swap dovete dunque sottrarre la dimensione della memoria fisica dalla memoria totale (in alcune versioni di UNIX dovete allocare dello spazio di swap anche per un'immagine della memoria fisica, quindi il totale calcolato nel passo 2 è lo swap necessario e non dovete fare la sottrazione).

  • Se lo spazio di swap calcolato è molto più grande della memoria fisica (più del doppio) dovreste investire in più memoria fisica, o le prestazioni saranno troppo basse.


È una buona idea avere comunque dello spazio di swap, anche se i calcoli indicano che non ne avete bisogno; Linux lo usa in modo piuttosto aggressivo, in modo che possa essere tenuta libera più memoria fisica possibile, e manderà in swap delle pagine di memoria che non vengono usate anche se non c'è ancora bisogno di memoria per altre cose. Un comportamento del genere evita di aspettare di fare swap nel momento in cui ce n'è bisogno---si può fare prima, quando il disco altrimenti non sta lavorando. Lo spazio di swap può essere suddiviso tra vari dischi, in modo da poter in qualche modo migliorare le prestazioni, a seconda delle loro velocità e degli schemi di accesso. Potete fare degli esperimenti con schemi diversi, ma farlo in modo corretto non è semplice. Non credete a chi dice che uno schema è sicuramente superiore ad un altro, perché non sempre è vero.


La cache di buffer.


Leggere da un disco è molto più lento che accedere a della memoria (reale). Oltre a ciò, è comune leggere la stessa parte del disco diverse volte in brevi periodi di tempo. Ad esempio, si può prima leggere un messaggio di posta elettronica, poi caricare lo stesso messaggio in un editor per rispondere, poi farlo leggere al programma di posta per copiarlo in una cartella. Oppure, considerate quanto spesso si può usare il comando ls su un sistema con molti utenti. Leggendo le informazioni dal disco e trattenendole in memoria finché non servono più si possono velocizzare le letture successive alla prima. Questo processo si chiama bufferizzazione del disco, e la memoria usata allo scopo è la cache di buffer.


Dato che la memoria è, sfortunatamente, una risorsa finita, anzi, scarsa, la cache di buffer di solito non può essere abbastanza grande (non può contenere tutti i dati che si vogliono usare). Quando la cache si riempie, i dati che non sono stati usati per il tempo più lungo vengono scartati e la memoria liberata viene usata per quelli nuovi.


La bufferizzazione del disco vale anche in scrittura; da una parte i dati scritti vengono spessi letti di nuovo (come per un codice sorgente che viene salvato in un file, e poi letto dal compilatore), quindi mettere in cache i dati che vengono scritti è una buona idea; dall'altra, solo mettendo i dati nella cache e non scrivendoli nel disco, il programma che li scrive gira più veloce. La scrittura si può fare in background, senza rallentare gli altri programmi.


La maggior parte dei sistemi operativi usano le cache di buffer (anche se si possono chiamare in altri modi), ma non tutte funzionano con i principi descritti sopra. Alcune sono write-through: i dati vengono scritti tutti insieme nel disco (vengono mantenuti anche nella cache, naturalmente), mentre la cache si chiama write-back se la scrittura viene fatta in un secondo tempo. Il write-back è più efficiente del write-through, ma anche più soggetto ad errori: se la macchina ha un crash, viene tolta la corrente al momento sbagliato o il floppy viene rimosso dal drive prima che i dati nella cache vengano scritti, i cambiamenti nella cache vengono persi; ciò può anche comportare che il filesystem (se ce n'è uno) non sia pienamente funzionante, perché forse i dati non scritti contenevano cambiamenti importanti alle informazioni di archiviazione.


Per questo non dovreste mai spegnere il computer senza usare una corretta procedura di shutdown, rimuovere un floppy dal drive senza smontarlo (se era stato montato) o dopo che qualsiasi programma che lo stia usando abbia segnalato di aver finito e che il led del floppy non si sia spento. Il comando sync fa il flush del buffer, cioè forza la scrittura di tutti i dati nel disco, e può essere usato quando si vuole essere certi che tutto venga scritto al sicuro. Nei sistemi UNIX tradizionali c'è un programma chiamato update in background che fa un sync ogni 30 secondi, in modo che non è in genere necessario usare sync. Linux ha un daemon aggiuntivo, bdflush, che fa un sync più imperfetto con frequenza maggiore per evitare il blocco improvviso dovuto al pesante input/output del disco causato a volte da sync.


Sotto Linux bdflush viene avviato da update. Di solito non c'è ragione per preoccuparsene, ma se per qualche ragione bdflush muore il kernel vi avviserà e dovrete riavviarlo a mano (/sbin/update).


La cache in genere non fa il buffer dei file ma di blocchi, che sono le unità più piccole dell'input/output dei dischi (sotto Linux di solito sono di 1 kB). In questo modo vengono messe in cache anche le directory, i superblocchi, altri dati di archiviazione dei filesystem e dischi che contengono un filesystem.


L'efficacia di una cache è principalmente decisa dalla sua dimensione: una cache piccola è praticamente inutile, dato che conterrà talmente pochi dati che tutti i dati in cache vengono tolti prima di venir riutilizzati. La dimensione critica dipende da quanti dati vengono letti e scritti e da quanto spesso vengono riutilizzati gli stessi. L'unico modo di saperlo è sperimentare.


Se la cache è di dimensione fissa non è neanche bene che sia troppo grande, perché potrebbe rimpicciolire troppo la memoria libera e rendere necessario fare swap (che è ugualmente lento). Per usare in modo più efficiente possibile la memoria reale Linux usa automaticamente tutta la RAM libera per la cache di buffer, ma rimpicciolisce la cache automaticamente quando i programmi hanno bisogno di più memoria.


Sotto Linux non dovete fare niente per utilizzare la cache, che funziona completamente in automatico; dovete solo seguire le procedure corrette per fare shutdown e per rimuovere i floppy.



Se ti è piaciuto l'articolo , iscriviti al feed cliccando sull'immagine sottostante per tenerti sempre aggiornato sui nuovi contenuti del blog: