Come Personalizzare Fedora Core 6 e generare la iso del DVD.

La necessità di personalizzare la distribuzione Fedora core 6 è nata nell'ambito del mio lavoro presso l' Aula Didattica Taliercio per dare un ausilio agli studenti nell'installazione di LinuX. Lo scopo della Fedora Core 6 Aula Taliercio è quello di offrire una distribuzione agli studenti

  1. che abbia tutti i pacchetti aggiornati all'ultima versione disponibile senza che un utente una volta installato il PC debba per forza di cose scaricare svariati MByte di aggiornamenti dalla rete;
  2. che includa pacchetti che non fanno parte della distribuzione originale Fedora ma che si trovano su altri repository, o rigernerati con delle personalizzazioni. (Vedi README-AulaTaliercio);
  3. personalizzata con degli script di post-installazione per configurare ad hoc alcuni programmi, impostare quali servizi devono essere attivi etc...

L'ambiente per iniziare la personalizzazione della Fedora richiede innanzitutto un sistema installato con la stessa architettura (i386 per la Fedora a 32 bit, X86_64 per la fedora a 64 bit, ppc ... ) e stessa versione (la 6 nel nostro caso) della distribuzione che si vuole modificare, una directory di lavoro, supponiamo sia /linux, dove copiare il contenuto del DVD originale di Fedora Core 6. Avendo a disposizione solo la iso della distribuzione possiamo accedere ai dati in essa contenuti con il comando
mount -o loop nomefile.iso mount_point

A questo punto il contenuto della directory sarà:

/linux
/linux/README-Accessibility
/linux/GPL
/linux/.discinfo
/linux/isolinux
/linux/images
/linux/repodata
/linux/Fedora
/linux/eula.txt
/linux/fedora.css
/linux/stylesheet-images
/linux/RPM-GPG-KEY
/linux/RPM-GPG-KEY-beta
/linux/RPM-GPG-KEY-fedora-rawhide
/linux/RPM-GPG-KEY-rawhide
/linux/RPM-GPG-KEY-fedora
/linux/RPM-GPG-KEY-fedora-test
/linux/RPM-GPG-KEY-fedora-extras
/linux/RELEASE-NOTES-en_US.html
/linux/RPM-GPG-KEY-fedora-legacy

Per avere a disposizione tutti gli strumenti necessari a rigenerare la iso del DVD di Fedora dobbiamo installare i pacchetti anaconda, anaconda-runtime e createrepo. Quindi da shell invochiamo i comandi:

yum install anaconda-runtime
yum install anaconda
yum install createrepo

Configuriamo un po' di variabili d'ambiente:

export PATH=$PATH:/usr/lib/anaconda-runtime
export PYTHONPATH=/usr/lib/anaconda
TOPPATH=/linux

Per trovare tra varie versioni di rpm in un repository quella più recente usiamo novi.

Novi vuole in input tutte le directory che contengono gli rpm da analizzare (tipicamente quella della distribuzione originale e quella del repository che contiene gli ultimi update) e una directory di output dove mettere le ultime versioni degli rpm.

Adesso bisogna spostare gli rpm ottenuti tramite novi nella directory /${TOPPATH}/Fedora/RPMS/ che contiene tutti gli rpm che andranno a far parte della distribuzione, dopo aver rimosso gli rpm delle versioni precedenti. Ora bisogna decidere che pacchetti extra aggiungere e controllare le dipendenze che hanno tramite yum. Per fare questo l'ideale è avere a disposizione una macchina da installare per i test. Una via alternativa ma più complicata (io non l'ho esplorata questa) è ricrearsi una copia del database degli rpm in una directory differente da quella di default di Fedora e poi provare ad installare i singoli pacchetti sul db copia e in un ambiente di chroot vedi opzioni --dbpath --root del comando rpm. Fatto ciò bisogna in qualche modo istruire anaconda su che pacchetti installare e su come presentare all'utente la scelta pacchetti avanzata, editando il file comps.xml che si trova in ${TOPPATH}/Fedora/base/.

Alla fine di questo documento è riportato l'esempio del comps.xml usato nel nostro caso.

È giunto il momento di creare il repository dai nuovi pacchetti:

rpm --import $TOPPATH/RPM-GPG-KEY*
cd ${TOPPATH}/Fedora/RPMS
createrepo -v -g ../base/comps.xml

Viene creata la directory repodata contenente i file in formato xml che descrivono il repository e che sono necessari ad anaconda e a yum per la ricerca degli rpm: sovrascriviamo il contenuto di ${TOPPATH}/repodata/ e poi repodata non ci serve più:

cp ${TOPPATH}/Fedora/RPMS/repodata/* ${TOPPATH}/repodata/
rm -rf ${TOPPATH}/Fedora/RPMS/repodata

Ora ritorniamo nella directory principale e rimuoviamo alcuni file che poi verranno rigenerati:

cd ${TOPPATH}
find ${TOPPATH} -name TRANS.TBL -exec rm -f {} \;
find ${TOPPATH} -name boot.cat -exec rm -f {} \;

Con buildinstall andiamo a rigenerare i file nelle directory ${TOPPATH}/images e ${TOPPATH}/isolinux

buildinstall --comp ${TOPPATH}/Fedora/base/comps.xml --version 1 \
    --product "Fedora Core 6 Aula Taliercio" --release 1         \
    --prodpath Fedora ${TOPPATH}

Ora dobbiamo aggiungere la parte di script di post-installazione. Si tratta di creare un file tipo kickstart per l'installazione. Salviamo il file kickstart supponiamo adt.cfg nella directory ${TOPPATH}/isolinux e poi andiamo ad editare il file ${TOPPATH}/isolinux/isolinux.cfg che viene letto dall'installer (anaconda) e contiene le informazioni su come caricare il kernel.

Esempio del file isolinux.cfg utilizzato per la Fedora dell'Aula Taliercio
default ks
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
label linux
   kernel vmlinuz
   append initrd=initrd.img
label text
   kernel vmlinuz
   append initrd=initrd.img text
label ks
   kernel vmlinuz
   append initrd=initrd.img method=cdrom ks=cdrom:/isolinux/adt.cfg
label local
   localboot 1
label memtest86
   kernel memtest
   append -

Esempio del file adt.cfg utilizzato per la Fedora dell'Aula Taliercio
install
cdrom
graphical
firewall --enabled --ssh
selinux --disabled
auth --useshadow --enablemd5
# Run the Setup Agent on first boot
firstboot --enable
#importo tutte le chiavi dal CDROM
%pre
rpm --import /mnt/source/RPM*
%post
echo "Installazione di bluej...";
tar xpvfz /mnt/source/AULA-TALIERCIO/software/bluej213.tgz -C /mnt/sysimage/;
# copio il file di configurazione di gnome con il desktop predefinito
cp /mnt/source/AULA-TALIERCIO/config/%gconf-tree.xml \        /mnt/sysimage/etc/gconf/gconf.xml.defaults/%gconf-tree.xml
cp /mnt/source/AULA-TALIERCIO/desktoptaliercio.jpg   \        /mnt/sysimage/usr/share/backgrounds/images/
echo "Configuro i servizi che partiranno all'avvio...";
chkconfig atd off
chkconfig nfslock off
chkconfig apmd off
chkconfig ntpd off

Da questo breve esempio possiamo già vedere due cose interessanti:

  1. Il cdrom durante l'installazione viene montato in /mnt/source
  2. Il sistema operativo che si sta installando è accessibile dal path /mnt/sysimage/

Generiamo la iso del DVD:

mkisofs -R -J -T -v -no-emul-boot -boot-load-size 4 -boot-info-table \
    -V "Fedora Core 6 Aula Taliercio" -b isolinux/isolinux.bin       \
    -c isolinux/boot.cat -x "lost+found"                             \
    -o /tmp/FC6-i386-dvd-AulaTaliercio.iso ${TOPPATH}

Volendo possiamo inserire l'md5 nella iso così possiamo sempre controllarne la correttezza con checkisomd5

/usr/lib/anaconda-runtime/implantisomd5 /tmp/FC6-i386-dvd-AulaTaliercio.iso


Modifiche al file comps.xml

Esempio del file comps.xml utilizzato per la Fedora dell'Aula Taliercio
<group>
    <id>aulataliercio</id>
    <name>Aula Taliercio</name>
    <description>Raccolta di applicazioni usate in aula come Xspim, plugin
(flash,video,pdf) per il browser web firefox, compilatore java 1.5 ...</description>
    <default>true</default>
    <uservisible>true</uservisible>
    <packagelist>
        <packagereq type="mandatory">a52dec</packagereq>
        <packagereq type="mandatory">aalib</packagereq>
        <packagereq type="default">AdobeReader_ita</packagereq>
        <packagereq type="mandatory">akode</packagereq>
        <packagereq type="default">java-1.5.0-sun</packagereq>
        <packagereq type="optional">java-1.5.0-sun-jdbc</packagereq>

        .............
        .............

</packagelist>
</group>
<category>
    <id>ADT-applicazioni</id>
      <name>Aula Taliercio</name>
      <description>Raccolta di applicazioni usate in aula come Xspim, plugin (flash,video,pdf) per il firefox web, compila tore java 1.5 ...</description>
    <grouplist>
          <groupid>aulataliercio</groupid>
    </grouplist>
</category>

Si tratta di creare una sezione group dove è importante che l'id sia unico in tutto il file. Aver impostato uservisible a true fa si che nella scelta dei pacchetti personalizzata un utente possa scegliere se installare o no le applicazioni che fanno parte del menù "Aula Taliercio".
Con il tag packagereq andiamo a specificare tutte le applicazioni che fanno parte del nuovo gruppo appena creato. L'attributo type determina come anaconda tratta l'applicazione in fase di installazione:

  1. optional  il pacchetto di default non viene installato ma l'utente può decidere di installarlo con la scelta personalizzata.
  2. default  il pacchetto viene installato per default ma l'utente può decidere di non installarlo con la scelta personalizzata.
  3. mandatory  il pacchetto viene installato per default e l'utente non può decidere perchè non compare nella lista dei pacchetti selezionabili.
I nomi dei pacchetti da usare con il tag packagereq si ottengono con il comando

rpm -qp --queryformat %{NAME} nomefile.rpm

Nella sezione "category" andiamo a specificare con <groupid>aulataliercio</groupid>
che la lista delle applicazioni "Aula Taliercio" deve comparire tra quelle che un utente vede in fase di installazione durante la scelta personalizzata dei pacchetti.

Alcuni Link molto utili sui quali mi sono basato per questo lavoro:

Per ricreare la iso del DVD di Fedora:


Per "trattare" con gli rpm:




Ing. Nerio Da Canal
nerio@nerio.it
nerio@adt.unipd.it
adtman@adt.unipd.it