Traccia: alfs_paco

ALFS PACO

DESCRIZIONE:

Il programma paco può essere utilizzato insieme con nALFS per tracciare l'installazione di un intero sistema LFS. Questo è fatto editando appropriatamente i profili XML di ALFS. Questo hint intende fornire le istruzioni per editare questi profili e integrare paco in ALFS nel modo più pulito e sicuro possibile.

ALLEGATI:

La patch di paco per i profili di LFS-6.1: http://paco.sourceforge.net/dl/profile-LFS-6.1-paco.patch

PREREQUISITI:

  1. Il programma paco. Versione 1.10.0 o successiva http://sourceforge.net/project/showfiles.php?group_id=118115

HINT:

0.INTRODUZIONE:

Ci sono principalmente due modi per integrare paco in ALFS: il modo “forza bruta”, e il modo pulito.
In questo hint si ha intenzione di descrivere il modo pulito nel dettaglio, ma prima si desidera dire alcune parole circa il metodo “forza bruta”, il quale effettivamente funziona bene, ed è stato felicemente utilizzato fino ad oggi da diversi utenti di ALFS.

Nota: indipendentemente dal metodo utilizzato, prima di eseguire nALFS, il tarball di paco deve essere copiato nella directory dove risiedono gli altri pacchetti di LFS.

1.IL METODO FORZA BRUTA:

In breve, questo metodo consiste nell'(ab)usare dell'elemento <execute command=“paco”> per includere ogni comando che installa file nel sistema. Come esempio, guardare il pezzo di codice XML seguente, preso dal file capitolo06/binutils.xml nel profilo LFS-6.1, il quale installa il pacchetto binutils:

---[ inizio XML ]---

<make> 
  <param>tooldir=/usr</param>
  <param>install</param>
</make>
<copy>
  <source>../&binutils-directory;/include/libiberty.h</source>
  <destination>/usr/include</destination>
</copy>

---[ fine XML ]---

Il frammento sopra potrebbe essere paco-izzato in questo modo:

---[ inizio XML ]---
<execute command="paco">
  <param>-lp binutils-&binutils-version;</param>
  <param>make tooldir=/usr install</param>
</execute>
<execute command="paco">
  <param>-lp+ binutils-&binutils-version;</param>
  <param>cp ../&binutils-directory;/include/libiberty.h</param>
  <param>/usr/include</param>
</execute>

---[ fine XML ]---  

Se si ha familiarità con paco, questo è pittosto chiaro.
Con questo metodo è sempre possibile tracciare le installazioni dei pacchetti, non importa la complessità o il numero dei comandi coinvolti, ma non è molto… si sa, intelligente, perché non approfitta della varietà degli elementi definiti in ALFS DTD, e sostituisce ognuno di loro con l'elemento <execute>.
Nella prossima sezione si descriverà nel dettaglio il processo di compilazione di un sistema LFS con nALFS e paco in un modo indubbiamente migliore.

2.IL MODO PULITO:

[ Nota per gli impazienti: Andare direttamente alla sezione 2.1 di questo hint. ]

2.0.IL MODO PULITO:

Per tenere i log delle installazioni dei pacchetti, paco utilizza una libreria condivisa per impacchettare i comandi che installano file nel sistema. Internamente, giusto prima di generare questi comandi, paco imposta le seguenti variabili d'ambiente:

  • LD_PRELOAD contiene il percorso alla menzionata libreria condivisa libpaco-log, la quale è responsabile di rilevare le chiamate di sistema che installano file nel sistema. Una volta che libpaco-log è precaricata, essa rintraccia il resto delle variabili dall'ambiente.
  • PACO_TMPFILE contiene il path al file di log temporaneo intermedio utilizzato per comunicare con libpaco-log e paco.
  • Se PACO_DEBUG è impostata a “yes”, allora libpaco-log stampa informazioni di debug.
  • PACO_INCLUDE e PACO_EXCLUDE sono elenchi di elementi separati da due punti di percorsi per includere o escludere i file creati quando vengono loggati.

Quello che si andrà a fare in ALFS è di utilizzare l'elemento XML <variable> per impostare quelle variabili “a mano”.

Da ora in avanti, i file nel profilo di LFS-6.1 saranno referenziati utilizzando percorsi relativi alla directory del profilo di LFS-6.1, come se fossero creati quando si spacchetta il tarball profile-LFS-6.1.tar.bz2.
Tutte le variabili PACO_* possono essere impostate nel file LFS.xml, all'inizio di ogni capitolo nel quale ogni pacchetto è installato, sebbene questo non danneggi se sono impostate durante tutta l'installazione di LFS.
La variabile LD_PRELOAD deve essere impostata separatamente in ogni profilo XML in cui si installi un pacchetto. Più precisamente, deve essere settata ogni volta che si esegue un comando install (o un gruppo di questi) in questi profili.
Per assicurare che la libreria libpaco-log sia caricata solo durante l'esecuzione dei comandi install, si devono riunire insieme in un separato <stage>.
Pertanto, la variabile LD_PRELOAD è impostata soltanto in quello stage, e si previene la contaminazione dei log con tutti i file creati durante i comandi configurazione, patch e costruzione.
Attualmente, nei profili di LFS-6.1, l'intero processo di compilazione e installazione di un pacchetto avviene in un singolo stage chiamato “Installing”. Si andrà a suddividere quello stage in diverse parti più piccole, definendo questi nuovi tipi di stage:

  • Building: Si applicano le patch. Il pacchetto viene configurato e costruito.
  • Installing: Si imposta LD_PRELOAD, e il pacchetto viene installato.
  • Logging: Si utilizza Paco per creare un log per il pacchetto installato, leggendo la lista dei file da loggare dal PACO_TMPFILE.

Gli stage Unpacking e Cleanup non sono modificati.
Lo stage Building può essere omesso in quei pacchetti che non necessitano essere configurati o compilati, tipo lfs-bootscripts o man-pages.

IMPORTANTE: Il file PACO_TMPFILE deve essere rimosso all'inizio dello stage Installing, e alla fine dello stage Logging, per pulire la lista dei file da loggare.

Vedere un esempio di come dovrebbe essere fatto nella sezione 2.3 di sotto.

2.1.Applicare Patch al profilo LFS

Tutte le modifiche possono essere fatte automaticamente in un solo passo, applicando la patch profile-LFS-6.1-paco.patch dalla directory del profilo LFS-6.1:

$ patch -Np1 -i </percorso/verso/la/patch>

Questo hint potrebbe finire qui, dal momento che la patch suddetta fa tutte le modifiche necessarie, ma verranno date informazioni dettagliate su quello che in realtà viene fatto da questa patch, per chi ne vuol sapere di più, o per chi vuole personalizzarla secondo le proprie esigenze.

2.2.Ricettario per farlo manualmente

Si considererà che non si sia interessati nel tenere traccia delle installazioni dei pacchetti nel capitolo 5 (“Costruzione di un Sistema temporaneo”), così che tutti i file XML della directory del capitolo05 che installano pacchetti saranno lasciati così come sono.

chapter05/creatingtoolsdir.xml

---[ inizio frammento del file ]---
<source>&ncurses-package;</source>
<source>&paco-package;</source>
<source>&patch-package;</source>

---[ fine frammento del file ]---

config/package.ent

Devono essere aggiunte le seguenti 3 linee:

---[ inizio frammento del file ]---

<!ENTITY paco-version "1.10.0">
<!ENTITY paco-package "paco-&paco-version;.tar.bz2">
<!ENTITY paco-directory "paco-&paco-version;">

---[ fine frammento del file ]---

config/paco.ent

Devono essere create il file config/paco.ent, contenente le entità relative a paco:

  
  ---[ inizio file ]---
  
  <!-- PACO_TMPFILE -->
  <!ENTITY paco-tmpfile "/tmp/paco.tmp">
  
  <!-- LD_PRELOAD (path to the libpaco-log  shared library) -->
  <!ENTITY paco-lib "/usr/lib/libpaco-log.so">
  
  <!-- path to the paco log directory -->
  <!ENTITY paco-logdir "/var/log/paco">
  
  <!-- PACO_INCLUDE and PACO_EXCLUDE -->
  <!ENTITY paco-include "/">
  <!ENTITY paco-exclude "/tmp:/tools:/sources">
  
  <!-- PACO_DEBUG -->
  <!ENTITY paco-debug "no_thanks">
  
  <!-- different XML "macros":
    'paco-clear'        rimuove il file log temporaneo.
    'paco-ld-preload'   imposta la variabile LD_PRELOAD.
    'paco-log-dirname'  esegue "paco -lD" per loggare i pacchetti.
  -->
  <!ENTITY paco-clear "<remove>&paco-tmpfile;</remove>">
  
  <!ENTITY paco-ld-preload
    "<environment>
      <variable name='LD_PRELOAD'>&paco-lib;</variable>
    </environment>">
    
  <!ENTITY paco-log-dirname
    "<execute command='paco'>
      <param>-lD &lt; &paco-tmpfile;</param>
    </execute>
    &paco-clear;">
  
 ---[ fine file ]---
 

chapter06/paco.xml

Paco in sé dovrebbe essere installato come primo pacchetto nel capitolo 6, così si deve creare il file chapter06/paco.xml, con i comandi necessari per installarlo:

---[ inizio file ]---

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE alfs SYSTEM "../DTD/ALFS.dtd"
[
<!ENTITY % general_entities SYSTEM "../config/general.ent">
<!ENTITY % package_entities SYSTEM "../config/package.ent">
<!ENTITY % paco_entities SYSTEM "../config/paco.ent">
%general_entities;
%package_entities;
%paco_entities;
]>
<alfs>
  <package name="paco" version="&paco-version;">
    <stage name="Unpacking">
      <unpack>
        <archive>&packages_dir;/&paco-package;</archive>
        <destination>&build_dir;</destination>
      </unpack>
    </stage>
    <stage name="Installing">
      <stageinfo>
        <base>&build_dir;/&paco-directory;</base>
      </stageinfo>
      <configure>
        <param>--prefix=/usr</param>
        <param>--disable-gpaco</param>
        <param>--sysconfdir=/etc</param>
      </configure>
      <make />
      <make>
        <param>install</param>
      </make>
      <textdump>
        <file>/etc/pacorc</file>
        <content>
          =LOGDIR=&paco-logdir;
          =INCLUDE=&paco-include;
          =EXCLUDE=&paco-exclude;
        </content>
      </textdump>
    </stage>
    <stage name="Cleanup">
      <remove>&build_dir;/&paco-directory;</remove>
    </stage>
  </package>
</alfs>

---[ fine file ]---

LFS.xml

Il file LFS.xml deve essere editato per includere l'installazione di paco, giusto dopo la sezione 'basic-dev' nel capitolo 6:

---[ inizio frammento del file ]---

<xi:include href="chapter06/basic-dev.xml" />
<xi:include href="chapter06/paco.xml" />
<xi:include href="chapter06/libc-headers.xml" />

---[ fine frammento del file ]---

Le variabili d'ambiente di paco devono essere impostate nel capitoli 6, 7, 8 e 9.
Per ciascuno di questi capitoli, nell'elemento <environment>, devono essere inserite le impostazioni delle seguenti variabili:

---[ inizio frammento del file ]---

<variable name="PACO_DEBUG">&paco-debug;</variable>
<variable name="PACO_TMPFILE">&paco-tmpfile;</variable>
<variable name="PACO_INCLUDE">&paco-include;</variable>
<variable name="PACO_EXCLUDE">&paco-exclude;</variable>

---[ fine frammento del file ]---

chapter0?/*.xml
Per concludere, il lavoro più duro: Ogni profilo XML nel quale sia stato installato un qualsiasi pacchetto deve essere modificato, se si vuole che il pacchetto sia loggato.
Fino a che tutti i pacchetti non sono installati nello stesso modo, non sarà facile apportare le modifiche in modo automatico.
Segue un esempio di come dovrebbe essere fatto in pratica.

2.3.Esempio

Prendere il file chapter06/zlib.xml. Per semplificarlo, si sono tolte alcune parti come lo stage “Patching” e il checksum md5. Questo file è un buon esempio, perché i comandi install e non-install avvengono alternativamente.
Senza utilizzare paco il file sarebbe così:

  ---[ inizio file ]---

  <?xml version="1.0" encoding="iso-8859-1"?>
  <!DOCTYPE alfs SYSTEM "../DTD/ALFS.dtd"
  [
  <!ENTITY % general_entities SYSTEM "../config/general.ent">
  <!ENTITY % package_entities SYSTEM "../config/package.ent">
  %general_entities;
  %package_entities;
  ]>
  <alfs>
    <package name="zlib" version="&zlib-version;">
      <stage name="Unpacking">
        <unpack>
          <archive>&packages_dir;/&zlib-package;</archive>
          <destination>&build_dir;</destination>
        </unpack>
      </stage>
      <stage name="Installing">
        <stageinfo>
          <base>&build_dir;/&zlib-directory;</base>
        </stageinfo>
        <configure>
          <param>--prefix=/usr</param>
          <param>--shared</param>
        </configure>
        <make />
        <make>
          <param>install</param>
        </make>
        <remove>/lib/libz.so</remove>
        <link>
          <option>force</option>
          <target>../../lib/libz.so.&zlib-version;</target>
          <name>/usr/lib/libz.so</name>
        </link>
        <make>
          <param>clean</param>
        </make>
        <configure>
          <param>--prefix=/usr</param>
        </configure>
        <make />
        <make>
          <param>install</param>
        </make>
        <permissions mode="644">
          <name>/usr/lib/libz.a</name>
        </permissions>
      </stage>
      <stage name="Cleanup">
        <remove>&build_dir;/&zlib-directory;</remove>
      </stage>
    </package>
  </alfs>

  ---[ fine file ]---

Ed ecco lo stesso file, ma utilizzando paco per tracciare l'installazione.
Le nuove righe aggiunte sono marcate con un '+' all'inizio. Le righe modificate sono marcate con '!':

  ---[ inizio file ]---

  <?xml version="1.0" encoding="iso-8859-1"?>
  <!DOCTYPE alfs SYSTEM "../DTD/ALFS.dtd"
  [
  <!ENTITY % general_entities SYSTEM "../config/general.ent">
  <!ENTITY % package_entities SYSTEM "../config/package.ent">
+ <!ENTITY % paco_entities SYSTEM "../config/paco.ent">
+ %paco_entities;
  %general_entities;
  %package_entities;
  ]>
  <alfs>
    <package name="zlib" version="&zlib-version;">
      <stage name="Unpacking">
        <unpack>
          <archive>&packages_dir;/&zlib-package;</archive>
          <destination>&build_dir;</destination>
        </unpack>
      </stage>
!     <stage name="Building">
        <stageinfo>
          <base>&build_dir;/&zlib-directory;</base>
        </stageinfo>
        <configure>
          <param>--prefix=/usr</param>
          <param>--shared</param>
        </configure>
        <make />
+     </stage>
+     <stage name="Installing">
        <stageinfo>
+         &paco-ld-preload;
          <base>&build_dir;/&zlib-directory;</base>
        </stageinfo>
+       &paco-clear;
        <make>
          <param>install</param>
        </make>
        <remove>/lib/libz.so</remove>
        <link>
          <option>force</option>
          <target>../../lib/libz.so.&zlib-version;</target>
          <name>/usr/lib/libz.so</name>
        </link>
+     </stage>
+     <stage name="Building">
+       <stageinfo>
+         <base>&build_dir;/&zlib-directory;</base>
+       </stageinfo>
        <make>
          <param>clean</param>
        </make>
        <configure>
          <param>--prefix=/usr</param>
        </configure>
        <make />
+     </stage>
+     <stage name="Installing">
+       <stageinfo>
+         &paco-ld-preload;
+         <base>&build_dir;/&zlib-directory;</base>
+       </stageinfo>
        <make>
          <param>install</param>
        </make>
        <permissions mode="644">
          <name>/usr/lib/libz.a</name>
        </permissions>
+     </stage>
+     <stage name="Logging">
+       <stageinfo>
+         <base>&build_dir;/&zlib-directory;</base>
+       </stageinfo>
+       &paco-log-dirname;
      </stage>
      <stage name="Cleanup">
        <remove>&build_dir;/&zlib-directory;</remove>
      </stage>
    </package>
  </alfs>

  ---[ fine file ]---

Analizziamo le diverse modifiche che sono state fatte:

Primo, sono incluse le entità paco. Questo è ottenuto con le righe:

  <!ENTITY % paco_entities SYSTEM "../config/paco.ent">
  %paco_entities;

Lo stage Installing originale è stato suddiviso in stage differenti:

# “Building” (primo passo):
Il pacchetto è configurato e compilato. Nessun file è installato nel sistema, così si lasciano i comandi intatti.

# “Installing” (primo passo):
Vengono installati alcuni file, così si deve impostare la variabile d'ambiente LLD_PRELOAD all'inizio dello stage. Questo è fatto dalla “macro” XML paco-ld-preload:

  <stageinfo>
    &paco-ld-preload;
    <base>&build_dir;/&zlib-directory;</base>
  </stageinfo>

E siccome è il primo stage “Installing” in questo file, il file temporaneo libpaco-log viene rimosso per assicurare che non venga loggato nessun file installato da qualche precedente pacchetto installato:

  &paco-clear;

# “Building” (secondo passo):
Il pacchetto è nuovamente riconfigurato per installare la libreria statica.
La variabile LD_PRELOAD non è automaticamente azzerata perché l'ambiente impostato nello <stageinfo> del precedente stage non è visto da quello corrente.

# “Installing” (secondo passo):
Viene installata la libreria statica. Viene impostata nuovamente la variabile LD_PRELOAD, ma questa volta non si usa “&paco-clear”, perché non si vuole sovrascrivere i file già loggati, ma aggiungere nuovi file nel log.

# “Logging”:
Questo è uno stage completamente nuovo.
Adesso che l'elenco dei file che devono essere loggati è salvato nel file temporaneo libpaco-log, un comando “paco -lp” crea il log per il pacchetto. Questo è fatto con la “macro” XML paco-log-dirname. E' importante notare che questa macro funziona quando il nome della directory dalla quale il pacchetto è compilato è la stessa del nome del pacchetto e di come si vuole che sia loggato. Questo è generalmente vero per tutti i pacchetti, con le seguenti eccezioni:

  • vim e tcl: perché la directory creata quando si scompattano i tarball hanno un nome “non standard” (vim63 e tcl5.8.3).
  • Tutti i pacchetti che hanno bisogno di essere compilati in una directory dedicata, separata dai sorgenti (gcc, glibc, e2fsprogs).

In questi casi, la macro &paco-log-dirname; dovrebbe essere sostituita dalle seguenti righe:

  <execute command="paco">
    <param>-lp foo-&foo-version;</param>
    <param>&lt; &paco-tmpfile;</param>
  </execute>
  &paco-clear;

dove 'foo' è il nome del pacchetto da loggare.

3.FINE

Questo hint finisce qui. Adesso dovrebbe essere possibile al lettore compilare un intero sistema LFS con la sola pressione del tasto Enter, avendo controllato almeno ogni byte scritto sull'hard disk. He!

E questo è solo l'inizio. Con poche modifiche, le istruzioni sopra possono essere applicate per installare anche tutte le altre quisquillie di BLFS…

RICONOSCIMENTI:

Si desidera ringraziare specialmente lo staff di ALFS. Sono veramente impressionato delle possibilità del sistema ALFS.
Non più notti sprecate davanti al monitor del computer, digitando “./configure && make && make install” come degli zombie…

Voglio ringraziare anche Brad Bailey per la creazione della versione iniziale della patch alfs-paco, e per aver incoraggiato la scrittura di questo hint.

E concludendo, non posso dimenticare le persone che hanno aiutato lo sviluppo di paco.

CHANGELOG:

  • [2005-10-24] Hint iniziale
 
alfs_paco.txt · Ultima modifica: 2015/08/08 14:22 (modifica esterna)