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
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
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}
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:
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
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: