Preparare un sistema gentoo "binary-only", senza portage e toolchain etc...
L'idea è simile a quella di EmbeddedGentoo, ma si vuole produrre una gentoo linux "normale" (quindi con glibc, baselayout, udev, etc...) semplicemente priva di alcune sue parti. È possibile creare una gentoo "completa" senza portage e toolchain, oppure un sistema ancor più ridotto.
GNAP
Check out GNAP!
Il sistema viene preparato a priori sull'host "di sviluppo" (devel host) e poi installato, escludendo le parti non necessarie, sull'host definitivo (target host).
premesse
- la ricetta che segue è stata preparata tra febbraio ed aprile 2009 ed aggiornata agli stage e portage tree di maggio 2010. In futuro andrà adattata di conseguenza...
anche se al momento in cui scrivo non sono ancora stable, utilizzo baselayout2, OpenRC
(vedi anche http://www.gentoo.org/doc/en/openrc-migration.xml di Gentoo)
il mio sistema così configurato funziona per me, YMMV.
- io lavoro in un chroot su un altro sistema linux
- teoricamente si può fare anche nella root di un sistema funzionante a patto che la configurazione (USE flags, ottimizzazioni, etc) sia uguale
non sempre è possibile usare sul devel host CFLAGS ottimizzate per il target host. Ad esempio, compilando su una Via EPIA M10000 per un Asus EeePC non posso usare -march=pentium-m quindi rimarrò su -march=i686 abilitando anche MMX ed SSE. Le differenze di prestazioni finali saranno comunque minime.
- CFLAGS, USE flags, keywords, versioni, etc... vanno ovviamente personalizzati secondo le proprie necessità
se /usr/portage è in comune con altre gentoo, consiglio di impostare una PKGDIR differente per ognuna, per non correre rischi
invece /var/tmp/ccache dovrebbe poter venire condivisa senza problemi tra installazioni diverse
development tree
parto da http://distfiles.gentoo.org/releases/x86/autobuilds/current-stage3/stage3-i686-20100511.tar.bz2 e portage tree aggiornato
modifico /etc/make.conf:
CFLAGS="-O2 -march=i686 -mmmx -msse -mfpmath=sse -fomit-frame-pointer -pipe" CXXFLAGS="${CFLAGS}" CHOST="i686-pc-linux-gnu" FEATURES="buildpkg ccache parallel-fetch" USE="-X -acl -berkdb -fortran -gpm -ipv6 -mudflap -nls -openmp -tcpd fbcon mmx sse" LINGUAS="en"creo /etc/portage/package.keywords:
=sys-apps/baselayout-2.0.1 ~x86 =sys-apps/openrc-0.6.1-r1 ~x86 =sys-kernel/gentoo-sources-2.6.33-r2 ~x86 =sys-kernel/linux-headers-2.6.33 ~x86
creo /etc/portage/package.use:
sys-kernel/gentoo-sources symlink
modifico /etc/locale.gen:
en_US ISO-8859-1 en_US.UTF-8 UTF-8
- 'emergio' ccache, aggiorno headers e quindi libc, ricompilo system, aggiungo grub ed i sorgenti del kernel:
# emerge ccache # emerge linux-headers glibc && rm /etc/._cfg0000_locale.gen # emerge -e system # emerge grub gentoo-sources
To be updated:
il tree risultante contiene già tutto il necessario a creare (dopo aver compilato un kernel) un sistema funzionante. Spazio occupato dal development tree:
/ (escluse le voci seguenti) circa 410MiB
/usr/portage ~1GiB compresi distfiles e packages, >130k inodes
/usr/src 350MiB
/var/tmp/ccache 115MiB
è ovviamente possibile aggiungere anche altri ebuilds che non verranno installati nel target host ma che possono tornare utili durante lo sviluppo, ad esempio:
# emerge vim gentoolkit epm genlop
target tree
Una volta effettuato l'emerge di tutto quel che ci serve e preparato un kernel, siamo pronti a creare il target tree. In linea di massima l'idea è prendere l'elenco di emerge -ep system, togliere ciò che non si vuole, ri-aggiungere dal devel tree eventuali files necessari.
Per evitare che le dipendenze tra ebuilds impongano l'installazione di pacchetti non desiderati si può utilizzare /etc/portage/profile/package.provided durante l'installazione del target tree; è tuttavia importante ricordarsi di escluderlo (ad esempio rinominando /etc/portage/profile in /etc/portage/profile.OFF) quando ci si rimette a usare portage nel devel tree.
Ovviamente al termine delle fasi descritte sotto rimangono comunque da fare i passi conclusivi di qualsiasi installazione gentoo (installare grub, settare /etc/fstab, impostare una password per l'utente root, eccetera).
sistema completo senza portage e dev tools
Non verranno installati: portage, gcc, toolchain, eselect*, i vari *-updater e *-cleaner
/etc/portage/profile/package.provided:
app-admin/eselect-1.0.11-r1 app-admin/eselect-ctags-1.8 app-admin/eselect-news-20080320 app-admin/eselect-vi-1.1.5 app-admin/perl-cleaner-1.05 app-admin/python-updater-0.5 sys-apps/busybox-1.12.2-r1 sys-apps/portage-2.1.6.11 sys-devel/autoconf-2.63 sys-devel/automake-1.10.2 sys-devel/binutils-2.18-r3 sys-devel/bison-2.3 sys-devel/flex-2.5.35 sys-devel/gcc-4.3.2-r3 sys-devel/gnuconfig-20080928 sys-devel/libtool-1.5.26 sys-devel/m4-1.4.12 sys-devel/make-3.81 sys-devel/patch-2.5.9 sys-kernel/linux-headers-2.6.29
- installazione ebuilds:
# mkdir /target # ROOT=/target emerge -avkN system # ROOT=/target emerge -avkN grub
file e directory e /dev da copiare/creare:
# cd /target # mkdir dev mnt proc root sys; chmod 700 root # tar xfj /stage1-x86-2008.0.tar.bz2 ./dev
spazio occupato nel target tree (versione precedente da gcc-4.1.2): 164MiB
- tempo dal boot del kernel (dopo grub) al login: ~ 13 secondi
sistema senza tool install-time
Under construction
Questa parte non è ancora finita, testata, provata, avviata, o anche solo lontanamente pensata.
Questa configurazione è priva degli strumenti solitamente necessari solo al momento dell'installazione.
/etc/portage/profile/package.provided:
app-admin/python-updater-0.5 sys-apps/portage-2.1.6.7 sys-libs/timezone-data-2008i
- installazione ebuilds:
# mkdir /target # ROOT=/target emerge -avkN baselayout udev e2fsprogs openssh util-linux grub
- files da copiare:
timezone
# cp /usr/share/zoneinfo/Europe/Rome /target/etc/localtime
parti di grub
# cp /boot/grub/...........
