Old:ACPI e DSDT: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
m (ha spostato ACPI e DSDT a Old:ACPI e DSDT)
 
(35 versioni intermedie di 10 utenti non mostrate)
Riga 1: Riga 1:
=Introduzione=
{{Old}}
LAMP � l'acronimo di Linux Apache Mysql Php e indica l'ambiente libero (e anche gratuito in questo caso) di programmazione di applicazioni Web che � possibile costruire dalla somma delle parti di queste eccezionali applicazioni a sorgente aperto.
== Introduzione ==


Questa guida non fornisce alcun elemento per la configurazione ottimale dei server presi in esame (Apache e MySQL). Essa non � intesa ad amministrare tali servizi su macchine in produzione, ma solo a fornire all' utente domestico e allo sviluppatore web un ambiente correttamente configurato senza introdurre sensibili rischi per la sicurezza del computer usato.
ACPI ('''Advanced Configuration and Power Interface''') è uno standard industriale aperto che definisce l'interfaccia tra S.O. e BIOS per l'amministrazione e la configurazione delle risorse di un PC. ACPI prevede che le informazioni a basso livello sul sistema (batteria, luminosità LCD, pulsanti Fn, ecc.) siano contenute nella DSDT ('''Differentiated System Description Table''').  


Per il dettaglio sulla configurazione di quanto preso in esame Vi invitiamo pertanto a visitare in primo luogo i siti [http://httpd.apache.org Httpd Apache], [http://www.php.net PHP.net] e [http://www.mysql.org MySQL.org] e, quando presenti, le guide specifiche messe a disposizione da questa Community.
Il problema principale del supporto ad ACPI in Linux risiede nella presenza di errori (ma anche di controlli espliciti su alcune caratteristiche peculiari del S.O. soprastante) nella tabella DSDT: purtroppo, molti fornitori di hardware non sono in grado, o non vogliono fornire tabelle DSDT completamente funzionali secondo gli standard ACPI.


Buona lettura!
Per questo motivo, per utilizzare appieno le possibilità offerte da alcuni PC, soprattutto laptop, è necessario correggere la DSDT e istruire il kernel affinché nel processo di boot carichi la tabella fornita da noi invece di quella fornita dal BIOS.


=Il server http=
== Aggiornamento del BIOS ==
==Apache==
[http://httpd.apache.org/ Apache] � il frutto del lavoro della [http://www.apache.org/ Apache Software Foundation]. Tra le caratteristiche che ne fanno il server HTTP pi� diffuso evidenziamo che:
* � software libero;
* gira sulle pi� svariate piattaforme (*nix, Windows, ec...);
* � sviluppato in accordo con le pi� recenti specifiche per i servizi http.
Secondo [http://news.netcraft.com/archives/web_server_survey.html Netcraft] Apache, con una percentuale del 68% (febbraio 2005), � il server http pi� usato in assoluto.


Apache deve il suo nome all' omonima trib� di indiani nordamericani, famosa per le straordinarie doti di resistenza e strategia. Visto per� che il software � stato inizialmente sviluppato come una serie di patches ad un altro server http, nell' uso comune Apache significa anche "A Patchy Server".
Per cominciare è indispensabile aggiornare il BIOS con l’ultima versione disponibile, sperando che la nuova versione contenga una tabella DSDT con meno errori della precedente :P.


La pronuncia corretta di Apache suona grossomodo come "APACI".
== Installazione nel kernel del supporto ACPI ==


Il progetto Apache � suddiviso principalmente in due rami distinti (ne esiste un terzo, ma � nella fase di sviluppo alpha al momento): la versione 1.3 (la versione "vecchia" molto robusta e testata) e la versione 2.0 (dal design innovativo rispetto alla precedente).
Per poter utilizzare ACPI è necessario disporre di un kernel in cui sia stato abilitato il supporto ACPI. Praticamente tutte le distribuzioni forniscono kernel precompilati con il supporto ACPI attivato. Nel caso, però, vi trovaste a dover (o voler) compilare autonomamente un kernel con il supporto ACPI, le voci necessarie sono le seguenti:
===Apache 1.3===
====Installazione====
L' installazione nuda e cruda di Apache 1.3 in Debian � di una semplicit� disarmante. Tutto quello che avremo bisogno di fare consiste nel dare il comando:
<pre># apt-get install apache</pre>
al termine del download ci viene chiesto se vogliamo abilitare suExec: a meno di utilizzi professionali, possiamo tranquillamente rispondere "No".
====Verifica====
A questo punto il nostro server web � gi� attivo, ma possiamo anche verificarlo tramite il comando '''ps''':
<pre>$ ps aux |grep apache
root      7378  0.0  0.4  4592  2228 pts/1    S    12:01  0:00 /usr/sbin/apache
www-data  7379  0.0  0.4  4592  2364 pts/1    S    12:01  0:00 /usr/sbin/apache
www-data  7380  0.0  0.4  4592  2364 pts/1    S    12:01  0:00 /usr/sbin/apache
www-data  7381  0.0  0.4  4592  2204 pts/1    S    12:01  0:00 /usr/sbin/apache
www-data  7382  0.0  0.4  4592  2204 pts/1    S    12:01  0:00 /usr/sbin/apache
www-data  7383  0.0  0.4  4592  2204 pts/1    S    12:01  0:00 /usr/sbin/apache</pre>
Notiamo subito uno dei meccanismi principali di Apache: esistono svariati processi in esecuzione. Per la precisione abbiamo 1 processo propriet� dell' utente root e ben 5 processi di propriet� dell' utente www-data, come possiamo vedere con il comando '''pstree''':
<pre>$ pstree -uc |grep apache
    ??apache???apache(www-data)
    ?        ??apache(www-data)
    ?        ??apache(www-data)
    ?        ??apache(www-data)
    ?        ??apache(www-data)</pre>
Il primo processo (padre) viene lanciato da root e ed il suo unico compito consiste nel genere e controllare i restanti processi (figli). Sono questi ultimi a rispondere alle richieste http ed a fornire le pagine. In questo modo Apache gira con privilegi minimi (quelli dell' utente www-data) ed in caso di una sua eventuale compromissione gli effetti sul sistema sono in qualche misura limitati.


====Configurazione====
<pre>ACPI (Advanced Configuration and Power Interface) Support --->
La configurazione di Apache � un compito estremamente delicato e pu� richiedere conoscenze anche notevoli in svariati ambiti quali networking, programmazione e amministrazione di sistema. Dato che questa guida si propone fondamentalmente di illustrare i passi necessari ad installare e configurare un sistema per uso non professionale, ci limiteremo agli aspetti macroscopici della configurazione.
    ACPI Support --->
        <*> AC Adapter
        <*> Battery
        <*> Button
        <*> Processor</pre>


I files di configurazione di Apache risiedono nella directory '''/etc/apache''' al cui interno troviamo svariati files. Quello di cui ci occuperemo qui � il file di controllo principale e cio� '''httpd.conf'''. Apriamo il file con il nostro editor di fiducia (dobbiamo essere root per modificare questo file) e vediamo quali sono le direttive principali su cui agiremo.
== Strumenti per lavorare con le DSDT ==


'''server-pool size'''
Per poter leggere e compilare una DSDT è necessario il compilatore ASL di Intel, che in Debian esiste già precompilato a partire da Etch; altrimenti è liberamente disponibile per il download a [http://developer.intel.com/technology/iapc/acpi/downloads.htm questo] indirizzo.
Alla riga 130 del file di configurazione originale troviamo il primo blocco da prendere in esame: si tratta della direttiva che dice ad Apache il numero minimo e massimo di processi "figlio" da mantenere in memoria. Ogni processo "figlio" risponde ad un numero prefissato di richieste, dopodich� viene ucciso (mondo crudele) e ne viene generato uno nuovo. Esaminiamo la direttiva:
<pre>MinSpareServers 5
MaxSpareServers 10</pre>
Come default Apache genera 5 processi, ma se il carico aumenta pu� arrivare fino a 10 figli simultanei. Per un sistema domestico � sicuramente eccessivo ed io consiglio di porre queste limitazioni:
<pre>MinSpareServers 1
MaxSpareServers 2</pre>


'''Number of servers to start initially'''
Per utilizzare la DSDT corretta sono disponibili due metodi:
Questo blocco (riga 153) dice ad Apache quanti sono i figli da generare al momento dell' avvio del server. Il default �:
* il primo prevede l'applicazione di una [ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/patches/release/ patch per il kernel] e l'inserimento della nuova DSDT direttamente nel kernel, che quindi  sarà da ricompilare ogni volta che si fanno cambiamenti alla DSDT;
<pre>StartServers 5</pre>
* il secondo inserisce la nuova DSDT all'interno dell'initrd, e quindi non necessita la ricompilazione del kernel, a patto che nel vostro kernel sia stata inclusa una [http://gaugusch.at/kernel.shtml patch apposita]. Al momento la patch menzionata è inclusa nei kernel delle maggiori distribuzioni (sicuramente in Debian, Ubuntu, Suse, e Mandriva).
che noi cambieremo in:
<pre>StartServers 1</pre>


'''Listen'''
=== Installare il compilatore ASL ===
Questo blocco (riga 192) indica ad Apache su quale porta TCP restare in attesa di richeste http. E' anche possibile specificare una particolare accoppiata di indirizzo IP + porta TCP. Possiamo tranquillamente lasciare commentata la direttiva ed il nostro server sar� in ascolto sulla porta 80 per tutti gli indirizzi configurati sul sistema.


'''BindAddress'''
Uno dei motivi per cui le DSDT sono spesso difettose è che vengono compilate con il compilatore fornito da Microsoft, invece che con quello fornito da Intel. Curiosamente i sistemi Microsoft riescono ad evitare gli errori commessi dal compilatore della stessa società, mentre, come si può immaginare, la stessa cosa non succede per Linux.
Alla riga 199 abbiamo la direttiva che specifica a quale specifico indirizzo IP associare Apache. Come per il punto precedente, lasciamo pure il valore di default.


'''ServerName'''
Per installare il compilatore Intel è sufficiente avere nel <code>sources.list</code> un repository per Etch, ed impartire, da root, il comando
Con questa direttiva (alla linea 276) diciamo ad Apache quale � il suo nome. Questo � particolarmente utile nel caso abbiamo a disposizione un [[FQDN]] (a questo proposito puoi consultare la guida [[Server Web Casalingo]]).
<pre>
# aptitude install iasl
</pre>


'''DocumentRoot'''
Se invece avete scaricato i sorgenti, per avere il compilatore ASL funzionante è necessario compilarlo:
Con questa direttiva (riga 284) indichiamo ad Apache quale directory del nostro sistema deve corrispondere alla radice del Web Server. Il default va pi� che bene: ricordatevi quindi che tutti i vostri files che volete pubblicare sul server http dovranno risiedere in '''/var/www''' o in una sua sotto-directory.
<pre>$ tar -zxvf acpica-unix-20050624.tar.gz
$ cd acpica-unix-20050624/compiler
$ make</pre>


{{Warningbox|� fondamentale per il funzionamento di Apache che i files che devono essere visibili via Web siano leggibili da parte dell' utente '''www-data''' e che le sotto-directory di /var/www siano raggiunbili dallo stesso utente}}
=== Ottenere una DSDT ===
Questo � il minimo indispensabile che ci occorre sapere per poter utilizzare proficuamente Apache: salviamo il file e procediamo a riavviare Apache. Per fare questo possiamo procedere in due modi distinti:
* metodo standard <pre><nowiki># apachectl graceful
/usr/sbin/apachectl graceful: httpd gracefully restarted</nowiki></pre>
* metodo debian init.d <pre><nowiki># /etc/init.d/apache restart
Restarting apache.</nowiki></pre>
Senza dubbio '''apachectl''' � il metodo da preferire. Oltre a riavviare Apache possiamo controllare altri aspetti del server web. Tra questi quello che inizialmente pu� risultare pi� comodo consiste nel controllo della sintassi del file di configurazione.<br>
Facciamo un esempio:
<pre># apachectl configtest
Syntax error on line 49 of /etc/apache/httpd.conf:
ServerType takes one argument, 'inetd' or 'standalone'</pre>
lo script mi avvisa che alla riga 49 di httpd.conf c'� un errore di sintassi: la direttiva ServerType supporta un solo argomento, mentre nel file ne sono specificati almeno 2. Se controllo �a riga incriminata scopro che:
<pre>ServerType is either inetd, or standalone.  Inetd mode is only supported on</pre>
Noto subito che manca il commendo (#) a inizio riga, provvedo a reinserirlo e quindi controllo nuovamente la configurazione:
<pre># apachectl configtest
Syntax OK</pre>


Se non abbiamo fatto pasticci, una volta riavviato il server Apache, baster� puntare il nostro browser all' indirizzo '''http://127.0.0.1''' per vedere la pagina di default installata dal manutentore del pacchetto Debian:
È possibile ottenere la DSDT attualmente installata per poi correggere gli eventuali errori e problemi, copiandola da un file reso appositamente disponibile dal filesystem virtuale <code>/sys</code>:
[[Immagine:Apache_installazione.png|thumb|center|Pagina di Benvenuto di Apache]]
<pre># cat /sys/firmware/acpi/tables/DSDT > dsdt.dat</pre>


{{box|Nota Bene: Directory home degli utenti|Per default Apache permette anche a ciascun utente del sistema di avere una propria home. Poniamo l' esempio dell' utente '''pippo''': all' interno di /home/pippo l' utente dovr� semplicemente creare la directory '''public_html''' per poter accedere ai files in essa contenuti attraverso l' indirizzo '''http://127.0.0.1/~pippo/'''}}
Ciò creerà un file '''dsdt.dat''' che contiene la DSDT compilata.
Per poterne leggere il contenuto è necessario decompilarla con il compilatore ASL appena installato:
<pre>$ iasl -d dsdt.dat</pre>


Ora non ci resta che inserire i nostri files in /var/www o nella nostra public_html per poter cominciare ad usare Apache!
Verrà generato un file di testo denominato '''dsdt.dsl''', che contiene la DSDT. Questo file può essere aperto con un normale editor di testi e modificato a seconda delle esigenze e dei problemi riscontrati.


====Supporto SSL====
Per vedere quali sono i problemi spesso è sufficiente ricompilare il file ottenuto: il compilatore ASL fornirà una serie di warning sulle ottimizzazioni che è possibile fare (e le farà automaticamente) ed, eventualmente, segnalerà degli errori, la cui soluzione può essere, ad esempio, ricercata su Internet.
Abilitando il supporto a SSL (Secure Socket Layer) � possibile instaurare un canale di comunicazione crittografato tra il nostro server web ed i browser che richiedono le pagine.


Tra i vantaggi in termini di sicurezza che l' uso di SSL comporta, segnalo:
Ad ogni modo una lettura del codice della DSDT può essere istruttiva. Il linguaggio è abbastanza simile al C e con qualche minima conoscenza è possibile comprendere i principali costrutti logici.
* transito di informazioni sensibili (passwords, dati personali, ecc...) in internet attraverso un canale crittografato sicuro;
* accertamento dell' identit� del server e/o del client web tramite certificati digitali.


Il supporto SSL per Apache pu� essere abilitato in due modi distinti:
Nel codice di alcune DSDT è stato trovato un controllo (if .. then) sulla lunghezza del nome del S.O. soprastante (17 lettere, proprio come "Microsoft Windows") come requisito per l'attivazione di alcune funzioni dell'ACPI.
* realizzazione di un nuovo server Apache con supporto SSL (vedi: '''apt-cache show apache-ssl''');
* implementazione di Apache e Apache SSL nel medesimo server grazie a mod_ssl.


In questa guida vedremo l' installazione e configurazione di '''mod_ssl'''.
Una volta corretti gli errori ricompilare il file '''dsdt.dsl'''.
       
<pre>$ iasl -tc dsdt.dsl</pre>


Procediamo con l' installazione del pacchetto:
Verranno generati due file dalla compilazione:
<pre>
*: dsdt.hex
# apt-get install libapache-mod-ssl
</pre>


===Apache 2.0===
*: DSDT.aml
====Installazione====
L'installazione di Apache2 � perfettamente uguale a quella precedentemente illustrata per Apache:
<pre>
# apt-get install apache2-mpm-prefork
</pre>


Il [[metapacchetto]] ''apache2'' � presente, ma installa '''apache2-mpm-worker''', che risulta non essere compatibile con '''libapache2-mod-php4'''.
{{ Warningbox | È possibile scaricare una custom DSDT già pronta e corretta da Internet per molti portatili in commercio: http://acpi.sourceforge.net/dsdt/tables }}


======I diversi pacchetti======
==== Un esempio: la mia DSDT ====
La pacchettizzazione Debian, per�, � leggermente diversa, per poter gestire le nuove caratteristiche introdotte in Apache2: esistono quattro diversi pacchetti di Apache2, ognuno con delle caratteristiche diverse (relativamente alla gestione dei thread e dei child):
; apache2-mpm-perchild : la soluzione adottata in questo pacchetto fa in modo che vengano avviati un numero definito di processi, i quali possono creare dei thread in base al carico della macchina. Una peculiarit� � la possibilit� di assegnare dei permessi diversi ad ogni processo, vincolarlo ad un singono ''virtual host'', cos� da gestire facilmente la redistribuzione delle risorse e/o personalizzare il servizio offerto;
; apache2-mpm-prefork : I thread sono disabilitati, e la gestione dei '''pool di processi''' viene gestita come per Apache1 (''MinSpareServers'' e ''MaxSpareServers'');
; apache2-mpm-threadpool : pacchetto di transizione;
; apache2-mpm-worker : la soluzione � intermedia rispetto a perchild e prefork.


Quello che a noi interessa � '''apache2-mpm-prefork''', visto che � l'unico ad essere compatibile con le librerie che offrono il supporto per php4.
Nel mio sistema (PC desktop, scheda madre Chaintech) ho da qualche tempo un problema con l'inizializzazione delle porte USB, tale che circa nel 40% dei casi (ma mai due volte di seguito) il PC si blocca durante il boot, e devo riavviare forzatamente.


====Verifica====
Per cercare di risolvere la cosa ho analizzato la mia tabella DSDT.
Per verificare la corretta installazione di Apache2, � sufficiente aprire un browser ed inserire l'indirizzo [http://localhost/].
L'ho estratta, e quando ho provato a ricompilarla ho avuto il seguente output:
Se Apache � stato installato correttamente, apparir� una schermata simile a questa:
<pre>
[[Immagine:Apache2_installazione.png|thumb|center|Schermata di benvenuto di Apache2]]
$ iasl -tc dsdt.dsl


====Configurazione====
Intel ACPI Component Architecture
Le regole di configurazione viste precedentemente per Apache valgono anche per Apache2.<br />
ASL Optimizing Compiler version 20060113 [Jan 22 2006]
Sono per� presenti delle sostanziali differenze a livello strutturale, per quanto riguarda la struttura della directory '''/etc/apache2''', che riguardano l'organizzazione dei file e la gestione dei ''VirtualHost'' e dei ''moduli''.
Copyright (C) 2000 - 2006 Intel Corporation
Supports ACPI Specification Revision 3.0a


=====Organizzazione dei file=====
dsdt.dsl  290:    Method (\_WAK, 1, NotSerialized)
Durante il passaggio da Apache ad Apache2, sono state apportate delle modifiche ai file di configurazione, ai loro nomi e all'organizzazione delle directory contenenti le configurazione dei ''VirtualHost' e dei ''moduli'', il tutto per disporre di un sistema di gestione flessibile e facilmente gestibile:
Warning  2078 -                ^ Reserved method must return a value (_WAK)


======File di Configurazione======
dsdt.dsl  318:            Store (Local0, Local0)
Il file di configurazione di Apache2 si chiama '''apache2.conf''', ed adotta la stessa sintassi del vecchio file di configurazione '''httpd.conf''', che � ancora presente nella directory '''/etc/apache2''' e viene richiamato all'interno del file di configurazione generale, per motivi di compatibilit�... consiglio, comunque, di non utilizzarlo, in quando � un file di transizione, e in futuro potrebbe venir rimosso da apache2.
Error    1048 -                        ^ Method local variable is not initialized (Local0)


======Moduli======
dsdt.dsl  323:             Store (Local0, Local0)
La gestione dei moduli ha subito una profonda modifica rispetto alla versione 1 di Apache: non � pi� legata ad un solo file, ma a due directory: '''/etc/apache2/mods-available''' e '''/etc/apache2/mods-enabled'''.
Error    1048 -                         ^ Method local variable is not initialized (Local0)
; mods-available : contiene i file che permettono il caricamento dei moduli. I file presenti all'interno di questa directory sono divisibili, tramite le loro estensioni, in due categorie: i file con estensione ''.load'' contengono le istruzioni necessarie al caricameto dei moduli; i file con estensione ''.config'', invece, contengono le eventuali opzioni di configurazione da passare al modulo.


; mods-enables : contiene dei link ai file presenti nella directory '''mods-available'''. All'avvio di Apache verranno caricati i moduli i cui file di canfigurazione presentano un link in questa directory.
dsdt.dsl  2368:             Store (Local0, Local0)
Error    1048 -                         ^ Method local variable is not initialized (Local0)


======Siti======
ASL Input: dsdt.dsl - 4804 lines, 160190 bytes, 1781 keywords
In apache2, a differenza di apache1, tutti i siti vengono gestiti tramite ''siti''.
Compilation complete. 3 Errors, 1 Warnings, 0 Remarks, 465 Optimizations
La struttura utilizzata per la gestione di questi � del tutto simile a quella dei moduli: sono presenti due directory: '''/etc/apache2/sites-available''' e '''/etc/apache2/sites-enabled''' che funzionano esattamente come illustrato precedentemente.
</pre>
Il concetto � semplice: ogni file presente in '''sites-available''' rappresenta un sito, con tutti i sottodomini associati. Per abilitarli � sufficiente un link simbolico in '''sites-enabled'''.
Anche in questo caso, inoltre, apache2 mette a disposizione due comodi comandi per la gestione dei siti: '''a2ensite''' e '''a2dissite''', che hanno la funzione, rispettivamente, di attivare e disattivare un sito.
 
L'utilizzo di questi due tool � semplicissimo:
* se si lancia il comando senza parametri, verr� mostrata la lista di tutti i siti disponibili
* se si indica il sito su cui effettuare l'operazione, questa verr� eseguita.
 
Per rendere effettive le modifiche � necessario riavviare apache2.
 
=====Supporto SSL=====
Per Apache2, a differenza di Apache1, non esiste un pacchetto '''apache-ssl''' per attivare il supporto [[Glossario:ssl | ssl]]. Per attivare il supporto ssl � necessario modificare la configurazione di apache.


Per abilitare il supporto, e creare i certificati necessari al funzionamento dell'ssl, bisogna installare openssl:
in sostanza, c'è un errore ripetuto identico tre volte (<code>Error 1048</code>), oltre ad un warning. Andiamo a vedere le sezioni incriminate. La prima è:
<pre>
<pre>
# apt-get install openssl
Scope (\_SI)
{
    Method (_MSG, 1, NotSerialized)
    {
        Store (Local0, Local0)
    }
    Method (_SST, 1, NotSerialized)
    {
        Store (Local0, Local0)
    }
}
</pre>
</pre>
Come si vede viene utilizzata due volte la variabile <code>Local0</code>, ma non viene mai dichiarata.


Oltre a questo, deve essere abilitato il modulo ''ssl'', con il comando prima descritto per la gestione dei moduli in Apache2:
Vediamo di capire almeno un minimo il significato di questo pezzo di codice.
La funzione <code>Store</code> è una funzione di assegnazione verso destra: alla variabile a destra viene assegnato il valore (o il valore della variabile) che si trova a sinistra.
 
In questo caso, però, è evidente che questa assegnazione è del tutto inutile, perché viene assegnato alla variabile <code>Local0</code> il valore che ha già, quindi per correggere l'errore non faccio altro che cancellare l'istruzione commentandola:
<pre>
<pre>
# a2enmod ssl
Scope (\_SI)
{
    Method (_MSG, 1, NotSerialized)
    {
//        Store (Local0, Local0)
    }
    Method (_SST, 1, NotSerialized)
    {
//        Store (Local0, Local0)
    }
}
</pre>
</pre>
Come si vede i commenti sono marcati come in C.


Per la generazione del certificato, apache2 offre il comando:
Facendo questa correzione anche nelle altre posizioni segnalate vengono eliminati tutti gli errori, quindi passiamo al warning. Il codice è questo:
<pre>
<pre>
# apache2-ssl-certificate
Method (\_WAK, 1, NotSerialized)
{
    Store (0xFF, DBG1)
    SALD (0x00)
    SFAN (0xFF)
    Notify (\_SB.PCI0.PX40.UAR1, 0x00)
    If (OSFL)
    {
        Notify (\_SB.PWRB, 0x02)
    }
    Else
    {
        If (LEqual (RTCW, 0x00))
        {
            Notify (\_SB.PWRB, 0x02)
        }
    }
    Notify (\_SB.PCI0.USB0, 0x00)
    Notify (\_SB.PCI0.USB1, 0x00)
    Notify (\_SB.PCI0.USB2, 0x00)
    Notify (\_SB.PCI0.USB3, 0x00)
}
</pre>
</pre>
che, tramite una serie di domande, creer� nella direcotry '''/etc/apache2/ssl/''' due file: ''apache.pem'' ed il certificato.
Le ultime righe mi danno la prova che l'errore ha a che fare con le porte USB, come avevo già notato.  


Ora aggiungiamo un ''sito'' con supporto ssl: con il nostro editor preferito creiamo un file di testo in '''/etc/apache2/sites-available''' come nel seguente esempio (il nome del file pu� essere, ad esempio, '''default-ssl'''):
Cercando in rete scopro che il metodo <code>\_WAK</code>, che è una funzione utilizzata al risveglio da uno stato di risparmio energetico (o di spegnimento), deve restituire un valore, che indichi se l'operazione di risveglio è riuscita o meno.
<pre>
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile    /etc/apache2/ssl/apache.pem
    SSLCertificateKeyFile /etc/apache2/ssl/apache.pem


    ServerAdmin admin@dominio.org
Una possibile diagnosi del mio problema, a questo punto, è che in certi casi durante il boot viene richiamato questo metodo, e il sistema si blocca in attesa di un risultato, che però non viene mai restituito. (N.d.A.: la diagnosi è evidentemente sbagliata, perché il problema persiste :()
    ServerName server.dominio.org


    ErrorLog /var/log/apache2/error_ssl.log
Io non ho idea di come reperire, nel codice, l'informazione sull'esito dell'inizializzazione delle porte USB, quindi non mi è possibile correggere il codice in modo che assolva alla funzione per cui è stato scritto, ma posso usare un workaround, e fare in modo che restituisca comunque un esito positivo.  
    LogLevel warn
    CustomLog /var/log/apache2/access_ssl.log combined
    ServerSignature On
    DocumentRoot /var/www/apache2-default


    <Directory />
Per fare questo si trova (in rete), senza entrare nei dettagli, che è sufficiente aggiungere alla fine del metodo, subito prima dell'ultima parentesi graffa, la riga
        Options FollowSymLinks
<pre>
        AllowOverride None
Return(Package(0x02){0x00, 0x00})
    </Directory>
    <Directory /var/www/apache2-default>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
 
    ScriptAlias /cgi-local/ /var/www/apache2-default/cgi-bin/
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/var/www/apache2-default/cgi-bin">
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
    </Directory>
 
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
    </Directory>
 
    Alias /icons/ "/usr/share/apache2/icons/"
    Alias /manual/ "/usr/share/doc/apache2-doc/manual/"
 
    <Directory "/usr/share/apache2/icons">
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
</pre>
</pre>
Dopo le correzioni il codice viene ricompilato senza errori né warning :D


Molte delle opzioni contenute nell'esempio sono prese pari pari dal file '''/etc/apache2/sites-available/default'''.
Ora però mi viene una curiosità, e mi metto a cercare nel codice la scritta "Microsoft". Questo è quello che ne viene fuori:
 
Mancano due modifiche, prima di avere il supporto ssl attivo: Apache non � in ascolto sulla porta 443, quella normalmente utilizzata da apache-ssl, e quindi lo dobbiamo istruire modificando il file '''/etc/apache2/ports.conf''' aggiungendo la riga:
<pre>
<pre>
Listen 443
Method (\_SB.PCI0._INI, 0, NotSerialized)
{
    If (STRC (\_OS, "Microsoft Windows"))
    {
        Store (0x56, SMIP)
    }
    Else
    {
        If (STRC (\_OS, "Microsoft Windows NT"))
    {
        Store (0x58, SMIP)
        Store (0x00, OSFX)
        Store (0x00, OSFL)
    }
    Else
    {
    Store (0x57, SMIP)
    Store (0x02, OSFX)
    Store (0x02, OSFL)
    }
}
</pre>
</pre>
Anche senza conoscere il linguaggio, il codice è facilmente interpretabile: "se il Sistema Operativo si chiama 'Microsoft Windows' assegna il valore (esadecimale) <code>0x56</code> alla variabile <code>SMIP</code>, se invece si chiama 'Microsoft Windows NT' assegna <code>0x58</code> alla variabile <code>SMIP</code> e zero alle variabili <code>OSFX</code> e <code>OSFL</code>; se il S.O. è diverso da quelli elencati assegna alle tre variabili, rispettivamente, <code>0x57</code>, <code>0x02</code> e <code>0x02</code>".


Come ultima cosa, importantissima, bisogna attivare il sito che abbiamo appena creato (sempre utilizzando i comodi comandi che Apache2 ci mette a disposizione). Sar� quindi sufficiente un
Per qualche motivo a me ignoto chi ha impostato questa DSDT ha fatto in modo di cambiare le funzionalità del sottosistema ACPI a seconda del S.O. che si usa. Poiché questo non mi rende particolarmente felice, ho modificato il codice in questo modo, eliminando di fatto il controllo:
<pre>
<pre>
# a2ensite default-ssl
Method (\_SB.PCI0._INI, 0, NotSerialized)
{
//    If (STRC (\_OS, "Microsoft Windows"))
//    {
//        Store (0x56, SMIP)
//    }
//    Else
//    {
//        If (STRC (\_OS, "Microsoft Windows NT"))
//    {
        Store (0x58, SMIP)
        Store (0x00, OSFX)
        Store (0x00, OSFL)
//    }
//    Else
//    {
//    Store (0x57, SMIP)
//    Store (0x02, OSFX)
//    Store (0x02, OSFL)
//    }
}
</pre>
</pre>
questo se si scelto di creare un file separato per i siti che avranno il supporto ssl... Un'altra pratica molto diffusa quella di gestire ogni singolo sito come un file, quindi le direttive per l'abilitazione del supporto ssl vengono scritte all'interno del file ''generale'' di quel sito (in questo caso il file '''default''').


Per rendere effettive tutte le modifiche, riavviamo apache:
Ora il mio sistema funziona un pochino meglio :-)
<pre>
 
# /etc/init.d/apache2 restart
Aggiornamento: ricontrollando il codice ho notato che le tre variabili <code>SMIP</code>, <code>OSFX</code> e <code>OSFL</code> vengono inizializzate altrove, e quindi, in sostanza, il presente codice è inutile (se non dannoso ;-)), quindi l'ho semplicemente eliminato.
</pre>


=====Far convivere Apache e Apache2=====
Alcune volte pu essere utile far convivere Apache1 e Apache2 sulla stessa macchina (magari durante un periodo di migrazione)...a tale proposito, buona norma modificare il numero della porta su cui uno dei due server in ascolto.
Normalmente si ''sposta'' Apache2 dalla porta '''80''' alla '''8080''' (sempre se su questa non configurato un server proxy).


Per modificare la porta su cui Apache2 � in ascolto � sufficiente modificare il file '''/etc/apache/ports.conf''' sostituendo al numero '''80''', '''8080'''. Nel file '''ports.conf''' avremo, quindi, una riga come la seguente:
Vorrei far notare che le correzioni che sono state fatte <b>non sono</b> delle <b>vere</b> correzioni, ma dei workaround: non ci si assicura che il codice faccia quel che deve fare, ma solo che non ci siano errori formali.
<pre>
Listen 8080
</pre>


=Il processore PHP=
Purtroppo la correzione <b>vera</b> di questi errori è al di là delle nostre possibilità, perché richiede, oltre alla conoscenza del linguaggio di programmazione, una conoscenza approfondita di come si comporta il nostro hardware, e nella grande maggioranza dei casi queste informazioni sono tenute segrete.
PHP � un [[acronimo ricorsivo]] per "PHP: Hypertext Preprocessor" e cio� "PHP: preprocessore ipertestuale". Questo significa che i nostri script non vengono elaborati dai client (in questo caso dai browser) come ad esempio nel caso di javascript, ma che vengono eseguiti direttamente sul server il quale fornisce ai clients semplici pagine html. Un linguiaggio di questo tipo viene chiamato anche '''server-side''' (lato server), in contrapposizione ai linguaggi '''client-side''' (lato client).


La cosa pi� interessante nell'uso di PHP � che si tratta di un linguaggio estremamente semplice per il principiante, ma che, tuttavia, offre molte prestazioni avanzate al programmatore di professione.
== Aggiornare il Kernel ==


Con PHP non siete limitati soltanto ad un output in HTML. Le possibilit� di PHP, infatti, includono l'abilit� di generare immagini, files PDF e perfino filmati Flash al volo (utilizzando libswf e Ming). Sarete in grado di generare facilmente qualsiasi testo, come XHTML e qualsiasi altro file XML. PHP pu� autogenerare questi file, e salvarli nel file system, piuttosto che eseguire un printing esterno, o creare server-side cache per contenuti dinamici.  
Come abbiamo già detto, è possibile inserire la tabella DSDT generata in modo statico nel kernel, oppure renderla disponibili tramite initrd.


Una delle caratteristiche pi� importanti e significative di PHP � la possibilit` di supportare una completa gamma di databases. Scrivere una pagina web collegata ad un database � incredibilmente semplice.
*:Il primo metodo prevede di includere la DSDT nel kernel. Questo comporta la ricompilazione del kernel al termine della procedura. Se usate questo metodo avete bisogno del file '''dsdt.hex'''.


PHP fa anche da supporto per dialogare con altri servizi utilizzando i protocolli del tipo LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (in Windows) e innumerevoli altri. Potete anche aprire network sockets ed interagire usando qualsiasi altro protocollo. Inoltre supporta l'interscambio di dati complessi WDDX tra, virtualmente, tutti i linguaggi di programmazione web. A proposito di interconessioni, PHP supporta l'installazione dei JavaObjects e l'utilizzo di questi come oggetti PHP in modo trasparente. Si pu� anche usare la nostra estensione CORBA per accedere ad oggetti remoti.
*:Il secondo metodo prevede di passare la DSDT al kernel durante il caricamento nella fase di boot tramite initrd. Se usate questo metodo avete bisogno del file '''DSDT.aml'''.
{{box|Nota Bene:|Questo elenco delle funzionalit� offerte da PHP � tratto dal manuale online di PHP e precisamente dal capitolo [http://it2.php.net/manual/it/intro-whatcando.php Che cosa pu� fare PHP?]}}


==Installazione==
Anche installare PHP non un compito per nulla complesso.
===PHP e Apache 1.3===
Vediamo subito come procedere a abilitare PHP per il nostro server Apache in maniera minimale:
<pre># apt-get install libapache-mod-php4</pre>
Apt scaricher il modulo per Apache, le eventuali dipendenze e aggiorner anche il file di configurazione dei moduli (/etc/apache/modules.conf).


Tutto quello che dovremo fare manualmente � di riavviare Apache, altrimenti non ci fornir� gli script Php elaborati, ma ci permetter� unicamente di scaricarli. Come abbiamo gi� visto nella sezione relativa all' installazione di Apache il comando �:
Il metodo initrd è probabilmente preferibile, soprattutto se dovete fare diversi cambiamenti alla vostra DSDT, perché non richiede la ricompilazione del kernel per ogni nuova DSDT generata.
<pre># apachectl graceful
/usr/sbin/apachectl graceful: httpd gracefully restarted</pre>


Ora, anche se a livello minimale, Apache � in grado fornire al nostro browser l' output degli script elaborati dal motore PHP. Non ci resta altro da fare che [[#Test|testarne]] il funzionamento.
=== Installazione Metodo statico ===


===PHP e Apache 2.0===
È necessario applicare una patch al kernel per far sì che sia in grado di leggere la nuova DSDT.  
Per abilitare il Php in Apache2 bisogna installare il modulo apposito:
Per fare questo ci spostiamo nella directory dove sono presenti i sorgenti:
<pre>
<pre>
# apt-get install libapache2-mod-php4
$ cd /usr/src/linux-2.6.8
$ patch -p1 < /percorso_dove_avete_salvato_la_patch
</pre>
</pre>


Durante l'installazione verr� aggiornata la configurazione di Apache2 per attivare il supporto a php4, inoltre verr� automaticamente riavviato il server Web.
Se non appaiono errori, significa che la patch è stata applicata correttamente.


==Test==
Copiamo il file dsdt.hex, rinominandolo in dsdt_table.h, nella directory dei sorgenti del kernel:
Il modo pi� semplice per testare la nostra installazione di PHP consiste nel preparare uno script e tentare di visualizzarlo nel nostro browser.
<pre>
$ cp dsdt.hex /usr/src/linux-2.6.8/include/acpi/dsdt_table.h
</pre>


Possiamo procedere in due modi fondamentalmente: creare uno script nella '''DocumentRoot''' del server web, e cio� '''/var/www''' (se non l' avete modificata in ahttpd.conf) oppure nella nostra '''public_html.
Infine ricompiliamo il kernel. Se non ci sono errori al prossimo avvio del PC il supporto ACPI è caricato correttamente senza alcun problema.


Nel caso vogliate creare o spostare files all' interno della DocumentRoot di Apache � indispensabile tenere sempre a mente che quella directory e le directory in essa contenute sono visibili anche da altri computer (nella eventuale lan o su internet): prestate estrema attenzione ai permessi di scrittura di questi files!
=== Installazione Metodo initrd ===


Un consiglio personale consiste nell' agire sempre come utente '''www-data''' quando operate nella DocumentRoot: vi risparmierete patemi in fatto di permessi e sicurezza. Per loggarci come utente www-data � sufficiente operare in questo modo:
Se usate un kernel standard Debian non è necessario ricompilare il kernel: è sufficiente posizionare la tabella DSDT nel posto giusto e ricreare l'initrd o l'initramfs.  
<pre>$ whoami
Per fare questo dovete prima verificare se il vostro kernel usa l'initrd o l'initramfs.
keltik
I kernel Debian standard usano l'initramfs a partire dalla versione 2.6.14 compresa, ma per essere sicuri è sufficiente usare il comando <code>file</code>.  
$ su
Per esempio nel mio sistema ho:
Password:
# whoami
root
# su - www-data
$ whoami
www-data</pre>
Siamo cos� passati dal nostro utente normale all' utente root e da questo siamo diventati l' utente www-data (il passaggio tramite l' utente root ci evita di dover fornire la password per www-data). Avendo usato il comando '''su - ''' abbiamo effettuato un login vero e proprio, ereditando tutte le variabili locali per www-data.
 
Ora possiamo operare in tranquillit� nella DocumentRoot (che � anche la $HOME dell' utente www-data).
 
Se invece scegliamo di usare la nostra public_html, non dovremo fare altro che creare il file al suo interno usando il nostro utente normale.
 
Usiamo il nostro editor preferito e creiamo il file prova.php che conterr� questo codice:
<pre><?php phpinfo(); ?></pre>
 
{{box|Nota Bene|Aldil� di quale sia il vostro editor preferito, consiglio caldamente di imparare quantomeno i rudimenti di '''vi''': questo editor testuale infatti � presente nella quasi totalit� dei sistemi operativi *nix, � molto pratico anche durante sessioni telnet o ssh e - con un minimo di allenamento - dispone di tutta la potenza necessaria ad un editor di codice}}
 
Se tutto � andato bene, puntando il browser all' indiritto http://127.0.0.1/prova.php (nel caso di aver usato la DocumentRoot) oppure http://127.0.0.1/~utente/prova.php vedremo una pagina html che riporta molte informazioni utili sul nostro nuovo ambiente di sviluppo (versione del software, moduli di apache, moduli di php, variabili di ambiente, ecc...).
 
=Il Database Server=
==MySQL==
Passiamo adesso ad installare il server di database MySQL.
<pre># apt-get install mysql-server</pre>
che, oltre al server MySQL, installer� per noi anche il client, alcuni tools e le librerie indispensabili.
 
A questo punto il server MySQL dovrebbe essere installato ed avviato automaticamente. Possiamo controllare usando il solito comando '''ps''' oppure '''/etc/init.d/mysql status'''.
{{Warningbox|MySQL inizialmente � accessibile unicamente all' utente '''root''' senza alcuna password.}}
{{box|Nota Bene:|Negli esempi seguenti ho digitando i comandi mysql su righe diverse per renderli pi� leggibili, ma nulla vieta di scrivere tutto di seguito sulla medesima linea.}}
La nostra prima preoccupazione dovrebbe essere senz' altro quella di impostare una passowrd per l' utente root. Ecco come fare:
<pre>
$ mysql -u root
mysql> SET PASSWORD
    -> FOR root@localhost
    -> =
    -> PASSWORD('la_tua_password')
    -> ;
Query OK, 0 rows affected (0.08 sec)
 
mysql> exit
Bye
$
</pre>
{{box|Nota Bene:|Se non funziona il comando '''mysql -u root''' provare con '''mysql -u root -p''' e se richiede la password lasciarla vuota e premere invio.}}
Se ora proviamo a loggarci nuovamente, dovremmo vederci negato l' accesso in questo modo:
<pre>
<pre>
$ mysql -u root
$ file /boot/initrd.img-2.6.12-1-686-smp
ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)
/boot/initrd.img-2.6.12-1-686-smp: Linux Compressed ROM File System data, little endian \
size 5046272 version #2 sorted_dirs CRC 0x5c015a8f, edition 0, 2920 blocks, 338 files
</pre>
</pre>
Riproviamo usando la password che abbiamo scelto in precedenza:
che è un tipico initrd Debian e usa il cramfs, e anche
<pre>
<pre>
$ mysql -u root -pla_tua_password
$ file /boot/initrd.img-2.6.15-1-686-smp
Welcome to the MySQL monitor. Commands end with ; or \g.
/boot/initrd.img-2.6.15-1-686-smp: gzip compressed data, from Unix, max compression
</pre>
</pre>
{{box|Nota Bene:|Lo switch "-p" usato nel comando ''mysql'' prevede che la password venga digitata '''senza spazi tra il -p e la password effettiva'''. Non si tratta di un mio errore di battitura!<br> Se invece usiamo lo switch "-p" senza specificare alcuna password, questa ci verr� richiesta interattivamente.}}
che invece è un initramfs.
Usare utenti con privilegi alti non � mai una buona idea, per cui provvediamo a creare un utente a cui concederemo i privilegi minimi (ma al quale potremo dare privilegi pi� alti per database specifici):
<pre>
mysql> GRANT USAGE ON *.*
    -> TO 'utente'@'localhost'
    -> IDENTIFIED BY 'la_tua_password'
    -> ;
Query OK, 0 rows affected (0.02 sec)


mysql> FLUSH PRIVILEGES;
Distro diverse da Debian non usano il cramfs, e può darsi che a questa prima analisi si trovi comunque un file compresso con <code>gzip</code>: per indagare oltre è sufficiente decomprimere una copia del file (notate l'aggiunta del suffisso .gz, senza il quale <code>gunzip</code> rifiuta di decomprimere il file): l'initramfs è un archivio <code>cpio</code>.
Query OK, 0 rows affected (0.04 sec)
</pre>
Se ora proviamo a loggarci con il nuovo utente, dovremmo riuscire ad autenticarci usando le credenziali specificate con il comando GRANT.


Ora creiamo un database nuovo:
<pre>
<pre>
mysql> CREATE DATABASE prova;
$ cp /boot/initrd.img-2.6.15-1-686-smp initramfs.gz
Query OK, 1 row affected (0.00 sec)
$ gunzip initramfs.gz
 
$ file initramfs
mysql> show databases;
initramfs: ASCII cpio archive (SVR4 with no CRC)
+----------+
| Database |
+----------+
| mysql    |
| prova    |
| test    |
+----------+
3 rows in set (0.02 sec)
</pre>
</pre>
ed assegnamo all' utente che abbiamo creato in precedenza piena diritti di amministrazione al database:
<pre>
mysql> GRANT ALL PRIVILEGES
    -> ON prova.*
    -> TO 'utente'@'localhost'
    -> ;
Query OK, 0 rows affected (0.02 sec)


mysql> FLUSH PRIVILEGES;
Se usate l'initrd (da root):
Query OK, 0 rows affected (0.04 sec)
</pre>
Se ora ci logghiamo con il nostro utente e chiediamo una lista dei database, vedremo unicamente quelli su cui abbiamo privilegi:
<pre>
<pre>
mysql> show databases;
# cp DSDT.aml /etc/mkinitrd/DSDT
+----------+
# mkinitrd -o initrd-<versione>  <versione>
| Database |
+----------+
| prova    |
+----------+
1 row in set (0.00 sec)
</pre>
</pre>
Selezioniamo il database su cui operare col comando:
in cui <code><versione></code> è il nome della directory che contiene i moduli, e che trovate in <code>/lib/modules/</code>.
 
Se usate l'initramfs (sempre da root):
<pre>
<pre>
mysql> USE prova;
# cp DSDT.aml /etc/mkinitramfs/DSDT.aml
# mkinitramfs -o initrd-<versione>  <versione>  
</pre>
</pre>
Ora creiamo una tabella all' interno del database ''prova'', giusto per verificare che sia tutto a posto:
con le stesse avvertenze di prima.
<pre>
mysql> CREATE TABLE tabella (colonna1 VARCHAR(20), colonna2 VARCHAR(20));
Query OK, 0 rows affected (0.42 sec)


mysql> DESCRIBE tabella;
Se il vostro kernel non comprende la patch che gli permette di leggere la DSDT nell'initrd, dovete ricompilarlo. Prima però applicate la patch, spostandovi nella directory dove sono presenti i sorgenti:
+----------+-------------+------+-----+---------+-------+
<pre>$ cd /usr/src/linux-2.6.8
| Field    | Type        | Null | Key | Default | Extra |
$ patch -p1 < / percorso_dove_avete_salvato_la_patch</pre>
+----------+-------------+------+-----+---------+-------+
| colonna1 | varchar(20) | YES  |    | NULL    |      |
| colonna2 | varchar(20) | YES  |    | NULL    |      |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.08 sec)
</pre>


Se non abbiamo ottenuto errori passiamo al punto successivo, altrimenti verifichiamo tutti i passaggi precedenti.
Al momento in cui si scrive, se usate l'initramfs vi serve anche una seconda patch che trovate allo stesso indirizzo della prima (in futuro verranno probabilmente unificate).


==MySQL e PHP==
Prima di compilare è necessario assicurarsi che i seguenti moduli (ramdisk e initrd) siano compilati staticamente nel kernel:
Per poter usare MySQL attraverso pagine PHP dobbiamo installareil modulo '''php4-mysql''' e riavviare Apache:
<pre>
<pre>
# apt-get install php4-mysql
Device Drivers --->
# apachectl graceful
    Block Devices --->
/usr/sbin/apachectl graceful: httpd gracefully restarted
        <*> RAM disk support
        [*] Initial RAM disk (initrd) support
</pre>
</pre>


Ora possiamo verificare se siamo effettivamente in grado di accedere a MySQL.<br>
Inoltre è necessario controllare che l’opzione '''Read DSDT from initrd''' sia selezionata nel menu delle opzioni ACPI:
La procedura � simile a quella vista in precedenza per testare la corretta installazione di PHP:
<pre>
* logghiamoci come utente root oppure spostiamoci nella nostra directory '''public_html''';
Power management options (ACPI, APM) --->
* creaimo il file mysql.php che conterr� questo codice:
    ACPI (Advanced Configuration and Power Interface) Support --->
<pre><nowiki>
        [*] Read DSDT from initrd
<?php
 
// si collega al database, altrimenti esce e ritorna un errore
 
mysql_connect('localhost','utente','la_tua_password') or die(mysql_error());
 
?></nowiki>
</pre>
</pre>
* apriamo un browser e puntiamolo alla pagina appena creata ( http://localhost/mysql.php oppure http://localhost/~utente/mysql.php);
** se quello che vediamo una pagina bianca, significa che PHP in grado di dialogare con MySQL;
** se otteniamo l' errore '''Fatal error: call to undefined function - mysql_connect()''' significa che il modulo php4-mysql non stato installato correttamente o che non abbiamo riavviato Apache;
** se otteniamo l' errore '''Warning: mysql_connect(): Access denied for user: xxxxxxxx''' significa che abbiamo scritto male le credenziali da utilizzare.


==PhpMyAdmin==
Se queste opzioni non sono abilitate, abilitarle e ricompilare il kernel. Se sono già abilitate non è necessario ricompilare il kernel ;-).  
Questo software � un validissimo alleato nel lavoro quotidiano di manutenere un server MySQL, anche se in locale e/o domestico: tra i suoi pregi segnalo l' ottima usabilit� e l' interfaccia web.


Questo pacchetto si installa con il comando:
Ora il kernel è pronto ad accettare la DSDT con initrd.
Se non avete a disposizione i tool mkinitrd e/o mkinitramfs che Debian mette a disposizione è necessario modificare l'initrd che avete, ma prima di farlo è fortemente consigliato di farne una copia di backup:
<pre>
<pre>
# apt-get install phpmyadmin php4 php4-gd
# cp /boot/initrd-kernel-2.6.8.img /boot/initrd-kernel-2.6.8.img.bak
# echo -n "INITRDDSDT123DSDT123" >> /boot/initrd-kernel-2.6.8.img
# cat DSDT.aml >> /boot/initrd-kernel-2.6.8.img
</pre>
</pre>
Ci verr quindi chiesto quale server http dovr essere riconfigurato automaticamente. In base alla versione di Apache che abbiamo installato in precedenza possiamo scegliere '''apache''' oppure '''apache2'''.
Al termine della configurazione scegliamo di riavviare Apache e cominciamo subito ad utilizzare PhpMyAdmin puntando il browser all'indirizzo http://localhost/phpmyadmin/
[[Immagine:Phpmyadmin_table.png|thumb|center|Schermata di esempio di PhpMyAdmin]]


=Conclusioni=
Riavviare e controllare se il supporto ACPI funziona. Ricordarsi di aggiornare i bootloader!
Ora si ha a disposizione un sistema completo per l'utilizzo di script in php (ed anche per il loro sviluppo).


== Siti ufficiali dei progetti ==


----
* http://acpi.sourceforge.net
Autore: [[Utente:Keltik|Keltik]] 07:20, Giu 20, 2005 (EDT)<br/>
* http://www.acpi.info/
[[Utente:MaXeR|MaXeR]] 07:59, Lug 18, 2005 (EDT)

Versione attuale delle 09:43, 8 mag 2016

Emblem-important.png Attenzione. Questa guida è obsoleta. Viene mantenuta sul Wiki solo per motivi di natura storica e didattica.


Introduzione

ACPI (Advanced Configuration and Power Interface) è uno standard industriale aperto che definisce l'interfaccia tra S.O. e BIOS per l'amministrazione e la configurazione delle risorse di un PC. ACPI prevede che le informazioni a basso livello sul sistema (batteria, luminosità LCD, pulsanti Fn, ecc.) siano contenute nella DSDT (Differentiated System Description Table).

Il problema principale del supporto ad ACPI in Linux risiede nella presenza di errori (ma anche di controlli espliciti su alcune caratteristiche peculiari del S.O. soprastante) nella tabella DSDT: purtroppo, molti fornitori di hardware non sono in grado, o non vogliono fornire tabelle DSDT completamente funzionali secondo gli standard ACPI.

Per questo motivo, per utilizzare appieno le possibilità offerte da alcuni PC, soprattutto laptop, è necessario correggere la DSDT e istruire il kernel affinché nel processo di boot carichi la tabella fornita da noi invece di quella fornita dal BIOS.

Aggiornamento del BIOS

Per cominciare è indispensabile aggiornare il BIOS con l’ultima versione disponibile, sperando che la nuova versione contenga una tabella DSDT con meno errori della precedente :P.

Installazione nel kernel del supporto ACPI

Per poter utilizzare ACPI è necessario disporre di un kernel in cui sia stato abilitato il supporto ACPI. Praticamente tutte le distribuzioni forniscono kernel precompilati con il supporto ACPI attivato. Nel caso, però, vi trovaste a dover (o voler) compilare autonomamente un kernel con il supporto ACPI, le voci necessarie sono le seguenti:

ACPI (Advanced Configuration and Power Interface) Support ---> 
    ACPI Support ---> 
        <*> AC Adapter
        <*> Battery
        <*> Button
        <*> Processor

Strumenti per lavorare con le DSDT

Per poter leggere e compilare una DSDT è necessario il compilatore ASL di Intel, che in Debian esiste già precompilato a partire da Etch; altrimenti è liberamente disponibile per il download a questo indirizzo.

Per utilizzare la DSDT corretta sono disponibili due metodi:

  • il primo prevede l'applicazione di una patch per il kernel e l'inserimento della nuova DSDT direttamente nel kernel, che quindi sarà da ricompilare ogni volta che si fanno cambiamenti alla DSDT;
  • il secondo inserisce la nuova DSDT all'interno dell'initrd, e quindi non necessita la ricompilazione del kernel, a patto che nel vostro kernel sia stata inclusa una patch apposita. Al momento la patch menzionata è inclusa nei kernel delle maggiori distribuzioni (sicuramente in Debian, Ubuntu, Suse, e Mandriva).

Installare il compilatore ASL

Uno dei motivi per cui le DSDT sono spesso difettose è che vengono compilate con il compilatore fornito da Microsoft, invece che con quello fornito da Intel. Curiosamente i sistemi Microsoft riescono ad evitare gli errori commessi dal compilatore della stessa società, mentre, come si può immaginare, la stessa cosa non succede per Linux.

Per installare il compilatore Intel è sufficiente avere nel sources.list un repository per Etch, ed impartire, da root, il comando

# aptitude install iasl

Se invece avete scaricato i sorgenti, per avere il compilatore ASL funzionante è necessario compilarlo:

$ tar -zxvf acpica-unix-20050624.tar.gz
$ cd acpica-unix-20050624/compiler
$ make

Ottenere una DSDT

È possibile ottenere la DSDT attualmente installata per poi correggere gli eventuali errori e problemi, copiandola da un file reso appositamente disponibile dal filesystem virtuale /sys:

# cat /sys/firmware/acpi/tables/DSDT > dsdt.dat

Ciò creerà un file dsdt.dat che contiene la DSDT compilata. Per poterne leggere il contenuto è necessario decompilarla con il compilatore ASL appena installato:

$ iasl -d dsdt.dat

Verrà generato un file di testo denominato dsdt.dsl, che contiene la DSDT. Questo file può essere aperto con un normale editor di testi e modificato a seconda delle esigenze e dei problemi riscontrati.

Per vedere quali sono i problemi spesso è sufficiente ricompilare il file ottenuto: il compilatore ASL fornirà una serie di warning sulle ottimizzazioni che è possibile fare (e le farà automaticamente) ed, eventualmente, segnalerà degli errori, la cui soluzione può essere, ad esempio, ricercata su Internet.

Ad ogni modo una lettura del codice della DSDT può essere istruttiva. Il linguaggio è abbastanza simile al C e con qualche minima conoscenza è possibile comprendere i principali costrutti logici.

Nel codice di alcune DSDT è stato trovato un controllo (if .. then) sulla lunghezza del nome del S.O. soprastante (17 lettere, proprio come "Microsoft Windows") come requisito per l'attivazione di alcune funzioni dell'ACPI.

Una volta corretti gli errori ricompilare il file dsdt.dsl.

$ iasl -tc dsdt.dsl

Verranno generati due file dalla compilazione:

  • dsdt.hex
  • DSDT.aml
Warning.png ATTENZIONE
È possibile scaricare una custom DSDT già pronta e corretta da Internet per molti portatili in commercio: http://acpi.sourceforge.net/dsdt/tables


Un esempio: la mia DSDT

Nel mio sistema (PC desktop, scheda madre Chaintech) ho da qualche tempo un problema con l'inizializzazione delle porte USB, tale che circa nel 40% dei casi (ma mai due volte di seguito) il PC si blocca durante il boot, e devo riavviare forzatamente.

Per cercare di risolvere la cosa ho analizzato la mia tabella DSDT. L'ho estratta, e quando ho provato a ricompilarla ho avuto il seguente output:

$ iasl -tc dsdt.dsl

Intel ACPI Component Architecture
ASL Optimizing Compiler version 20060113 [Jan 22 2006]
Copyright (C) 2000 - 2006 Intel Corporation
Supports ACPI Specification Revision 3.0a

dsdt.dsl   290:     Method (\_WAK, 1, NotSerialized)
Warning  2078 -                 ^ Reserved method must return a value (_WAK)

dsdt.dsl   318:             Store (Local0, Local0)
Error    1048 -                         ^ Method local variable is not initialized (Local0)

dsdt.dsl   323:             Store (Local0, Local0)
Error    1048 -                         ^ Method local variable is not initialized (Local0)

dsdt.dsl  2368:             Store (Local0, Local0)
Error    1048 -                         ^ Method local variable is not initialized (Local0)

ASL Input:  dsdt.dsl - 4804 lines, 160190 bytes, 1781 keywords
Compilation complete. 3 Errors, 1 Warnings, 0 Remarks, 465 Optimizations

in sostanza, c'è un errore ripetuto identico tre volte (Error 1048), oltre ad un warning. Andiamo a vedere le sezioni incriminate. La prima è:

Scope (\_SI)
{
    Method (_MSG, 1, NotSerialized)
    {
        Store (Local0, Local0)
    }
    Method (_SST, 1, NotSerialized)
    {
        Store (Local0, Local0)
    }
}

Come si vede viene utilizzata due volte la variabile Local0, ma non viene mai dichiarata.

Vediamo di capire almeno un minimo il significato di questo pezzo di codice. La funzione Store è una funzione di assegnazione verso destra: alla variabile a destra viene assegnato il valore (o il valore della variabile) che si trova a sinistra.

In questo caso, però, è evidente che questa assegnazione è del tutto inutile, perché viene assegnato alla variabile Local0 il valore che ha già, quindi per correggere l'errore non faccio altro che cancellare l'istruzione commentandola:

Scope (\_SI)
{
    Method (_MSG, 1, NotSerialized)
    {
//        Store (Local0, Local0)
    }
    Method (_SST, 1, NotSerialized)
    {
//        Store (Local0, Local0)
    }
}

Come si vede i commenti sono marcati come in C.

Facendo questa correzione anche nelle altre posizioni segnalate vengono eliminati tutti gli errori, quindi passiamo al warning. Il codice è questo:

Method (\_WAK, 1, NotSerialized)
{
    Store (0xFF, DBG1)
    SALD (0x00)
    SFAN (0xFF)
    Notify (\_SB.PCI0.PX40.UAR1, 0x00)
    If (OSFL)
    {
        Notify (\_SB.PWRB, 0x02)
    }
    Else
    {
        If (LEqual (RTCW, 0x00))
        {
            Notify (\_SB.PWRB, 0x02)
        }
    }
    Notify (\_SB.PCI0.USB0, 0x00)
    Notify (\_SB.PCI0.USB1, 0x00)
    Notify (\_SB.PCI0.USB2, 0x00)
    Notify (\_SB.PCI0.USB3, 0x00)
}

Le ultime righe mi danno la prova che l'errore ha a che fare con le porte USB, come avevo già notato.

Cercando in rete scopro che il metodo \_WAK, che è una funzione utilizzata al risveglio da uno stato di risparmio energetico (o di spegnimento), deve restituire un valore, che indichi se l'operazione di risveglio è riuscita o meno.

Una possibile diagnosi del mio problema, a questo punto, è che in certi casi durante il boot viene richiamato questo metodo, e il sistema si blocca in attesa di un risultato, che però non viene mai restituito. (N.d.A.: la diagnosi è evidentemente sbagliata, perché il problema persiste :()

Io non ho idea di come reperire, nel codice, l'informazione sull'esito dell'inizializzazione delle porte USB, quindi non mi è possibile correggere il codice in modo che assolva alla funzione per cui è stato scritto, ma posso usare un workaround, e fare in modo che restituisca comunque un esito positivo.

Per fare questo si trova (in rete), senza entrare nei dettagli, che è sufficiente aggiungere alla fine del metodo, subito prima dell'ultima parentesi graffa, la riga

Return(Package(0x02){0x00, 0x00})

Dopo le correzioni il codice viene ricompilato senza errori né warning :D

Ora però mi viene una curiosità, e mi metto a cercare nel codice la scritta "Microsoft". Questo è quello che ne viene fuori:

Method (\_SB.PCI0._INI, 0, NotSerialized)
{
    If (STRC (\_OS, "Microsoft Windows"))
    {
        Store (0x56, SMIP)
    }
    Else
    {
        If (STRC (\_OS, "Microsoft Windows NT"))
    {
        Store (0x58, SMIP)
        Store (0x00, OSFX)
        Store (0x00, OSFL)
    }
    Else
    {
    Store (0x57, SMIP)
    Store (0x02, OSFX)
    Store (0x02, OSFL)
    }
}

Anche senza conoscere il linguaggio, il codice è facilmente interpretabile: "se il Sistema Operativo si chiama 'Microsoft Windows' assegna il valore (esadecimale) 0x56 alla variabile SMIP, se invece si chiama 'Microsoft Windows NT' assegna 0x58 alla variabile SMIP e zero alle variabili OSFX e OSFL; se il S.O. è diverso da quelli elencati assegna alle tre variabili, rispettivamente, 0x57, 0x02 e 0x02".

Per qualche motivo a me ignoto chi ha impostato questa DSDT ha fatto in modo di cambiare le funzionalità del sottosistema ACPI a seconda del S.O. che si usa. Poiché questo non mi rende particolarmente felice, ho modificato il codice in questo modo, eliminando di fatto il controllo:

Method (\_SB.PCI0._INI, 0, NotSerialized)
{
//    If (STRC (\_OS, "Microsoft Windows"))
//    {
//        Store (0x56, SMIP)
//    }
//    Else
//    {
//        If (STRC (\_OS, "Microsoft Windows NT"))
//    {
        Store (0x58, SMIP)
        Store (0x00, OSFX)
        Store (0x00, OSFL)
//    }
//    Else
//    {
//    Store (0x57, SMIP)
//    Store (0x02, OSFX)
//    Store (0x02, OSFL)
//    }
}

Ora il mio sistema funziona un pochino meglio :-)

Aggiornamento: ricontrollando il codice ho notato che le tre variabili SMIP, OSFX e OSFL vengono inizializzate altrove, e quindi, in sostanza, il presente codice è inutile (se non dannoso ;-)), quindi l'ho semplicemente eliminato.


Vorrei far notare che le correzioni che sono state fatte non sono delle vere correzioni, ma dei workaround: non ci si assicura che il codice faccia quel che deve fare, ma solo che non ci siano errori formali.

Purtroppo la correzione vera di questi errori è al di là delle nostre possibilità, perché richiede, oltre alla conoscenza del linguaggio di programmazione, una conoscenza approfondita di come si comporta il nostro hardware, e nella grande maggioranza dei casi queste informazioni sono tenute segrete.

Aggiornare il Kernel

Come abbiamo già detto, è possibile inserire la tabella DSDT generata in modo statico nel kernel, oppure renderla disponibili tramite initrd.

  • Il primo metodo prevede di includere la DSDT nel kernel. Questo comporta la ricompilazione del kernel al termine della procedura. Se usate questo metodo avete bisogno del file dsdt.hex.
  • Il secondo metodo prevede di passare la DSDT al kernel durante il caricamento nella fase di boot tramite initrd. Se usate questo metodo avete bisogno del file DSDT.aml.


Il metodo initrd è probabilmente preferibile, soprattutto se dovete fare diversi cambiamenti alla vostra DSDT, perché non richiede la ricompilazione del kernel per ogni nuova DSDT generata.

Installazione Metodo statico

È necessario applicare una patch al kernel per far sì che sia in grado di leggere la nuova DSDT. Per fare questo ci spostiamo nella directory dove sono presenti i sorgenti:

$ cd /usr/src/linux-2.6.8
$ patch -p1 < /percorso_dove_avete_salvato_la_patch

Se non appaiono errori, significa che la patch è stata applicata correttamente.

Copiamo il file dsdt.hex, rinominandolo in dsdt_table.h, nella directory dei sorgenti del kernel:

$ cp dsdt.hex /usr/src/linux-2.6.8/include/acpi/dsdt_table.h

Infine ricompiliamo il kernel. Se non ci sono errori al prossimo avvio del PC il supporto ACPI è caricato correttamente senza alcun problema.

Installazione Metodo initrd

Se usate un kernel standard Debian non è necessario ricompilare il kernel: è sufficiente posizionare la tabella DSDT nel posto giusto e ricreare l'initrd o l'initramfs. Per fare questo dovete prima verificare se il vostro kernel usa l'initrd o l'initramfs. I kernel Debian standard usano l'initramfs a partire dalla versione 2.6.14 compresa, ma per essere sicuri è sufficiente usare il comando file. Per esempio nel mio sistema ho:

$ file /boot/initrd.img-2.6.12-1-686-smp
/boot/initrd.img-2.6.12-1-686-smp: Linux Compressed ROM File System data, little endian \
size 5046272 version #2 sorted_dirs CRC 0x5c015a8f, edition 0, 2920 blocks, 338 files

che è un tipico initrd Debian e usa il cramfs, e anche

$ file /boot/initrd.img-2.6.15-1-686-smp
/boot/initrd.img-2.6.15-1-686-smp: gzip compressed data, from Unix, max compression

che invece è un initramfs.

Distro diverse da Debian non usano il cramfs, e può darsi che a questa prima analisi si trovi comunque un file compresso con gzip: per indagare oltre è sufficiente decomprimere una copia del file (notate l'aggiunta del suffisso .gz, senza il quale gunzip rifiuta di decomprimere il file): l'initramfs è un archivio cpio.

$ cp /boot/initrd.img-2.6.15-1-686-smp initramfs.gz
$ gunzip initramfs.gz
$ file initramfs
initramfs: ASCII cpio archive (SVR4 with no CRC)

Se usate l'initrd (da root):

# cp DSDT.aml /etc/mkinitrd/DSDT
# mkinitrd -o initrd-<versione>  <versione> 

in cui <versione> è il nome della directory che contiene i moduli, e che trovate in /lib/modules/.

Se usate l'initramfs (sempre da root):

# cp DSDT.aml /etc/mkinitramfs/DSDT.aml
# mkinitramfs -o initrd-<versione>  <versione> 

con le stesse avvertenze di prima.

Se il vostro kernel non comprende la patch che gli permette di leggere la DSDT nell'initrd, dovete ricompilarlo. Prima però applicate la patch, spostandovi nella directory dove sono presenti i sorgenti:

$ cd /usr/src/linux-2.6.8
$ patch -p1 < / percorso_dove_avete_salvato_la_patch

Al momento in cui si scrive, se usate l'initramfs vi serve anche una seconda patch che trovate allo stesso indirizzo della prima (in futuro verranno probabilmente unificate).

Prima di compilare è necessario assicurarsi che i seguenti moduli (ramdisk e initrd) siano compilati staticamente nel kernel:

Device Drivers ---> 
    Block Devices ---> 
        <*> RAM disk support 
        [*] Initial RAM disk (initrd) support

Inoltre è necessario controllare che l’opzione Read DSDT from initrd sia selezionata nel menu delle opzioni ACPI:

Power management options (ACPI, APM) ---> 
    ACPI (Advanced Configuration and Power Interface) Support ---> 
        [*] Read DSDT from initrd

Se queste opzioni non sono abilitate, abilitarle e ricompilare il kernel. Se sono già abilitate non è necessario ricompilare il kernel ;-).

Ora il kernel è pronto ad accettare la DSDT con initrd. Se non avete a disposizione i tool mkinitrd e/o mkinitramfs che Debian mette a disposizione è necessario modificare l'initrd che avete, ma prima di farlo è fortemente consigliato di farne una copia di backup:

# cp /boot/initrd-kernel-2.6.8.img /boot/initrd-kernel-2.6.8.img.bak
# echo -n "INITRDDSDT123DSDT123" >> /boot/initrd-kernel-2.6.8.img
# cat DSDT.aml >> /boot/initrd-kernel-2.6.8.img

Riavviare e controllare se il supporto ACPI funziona. Ricordarsi di aggiornare i bootloader!

Siti ufficiali dei progetti