Ricompilare il Kernel con XEN e HUGEPAGES

martedì 3 novembre 2009 alle 03:57 | Pubblicato su Linux | 3 commenti
Tag: , , , , ,

Dopo giorni (ma in realtà erano mesi che volevo farlo) sono riuscito a ricompilare il kernel su Oracle Enterprise Linux 5.3. Si tratta di una installazione su una macchina virtuale XEN che ho fatto qualche settimana fa per installare e testare Oracle 11gR2. Una delle cose che ho notato gia tempo fa è che sia sulla macchina “ospitante” (Dom0 il linguaggio XEN) che sulle macchine para-virtualizzate linux non è configurato il supporto per le HugePages, mentre su una macchina fully-virtualised tale supporto è presente (la macchina fully virtualised mi era necessaria per installare un versione linux 32 bit, usata a suo tempo per testare 11gR1 quando la versione 64 bit non era ancora uscita).

Ho sempre pensato che se nel kernel compilato con il supporto XEN non c’era il supporto per le Huge Pages ci doveva essere un motivo ben preciso, qualche vincolo strutturale; purtroppo però a tutt’oggi non ho trovato una spiegazione di  cio’, non una nota dove si dica che le macchine virtuali non possono usare Huge Pages.

Un po’ di tempo fa ho scoperto, grazie al blog di Sergio Leunissen, che Oracle ha messo a disposizione un server YUM pubblico. Si tratta di un server da cui è possibile scaricare e installare in modo quasi automatico i pacchetti rpm aggiornati, utilizzando una utility chiamata appunto YUM. Chiaramente in questi aggiornamenti non sono inclusi le patch di sicurezza che vengono fornite solo con il supporto ULN. Da qui ho scaricato il pacchetto RPM dei sorgenti del kernel. Gia questa fase è stata per me problematica, perché con YUM non sono stato capace di farlo, ho scaricato l’rpm con wget e l’ho installato con rpm.

Una volta installati i sorgenti del kernel sono passato alla difficoltà successiva: come compilare il kernel? I pacchetti rpm con in sorgenti vengono installati con una struttura particolare, che non conoscevo molto, francamente io quando smanettavo di più con linux ero una amante della distrubuzione Slackware e della sua organizzazione a pacchetti tar.gz. In ogni caso ho scoperto l’utility rpmbuild, sulla quale però non è che la documentazione abbondi.

Fra mille ricerche il link più utile che ho trovato è stato senz’altro questo. In tutti però, compresi questo e questo manca una informazione chiara su come funziona la configurazione. Infatti io continuavo a modificare a mano il file .config aggiungendo le righe:

CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y

Ma sistematicamente osservavo che il make me le “spianava”, cancellava le righe togliendo di fatto il supporto alle Huge Pages. Da sottolineare poi un’altra cosa che non capivo: facendo make menuconfig (e un paio di volte mi sono fatto anche il make config con l’interminabile sfilza di domande) non compariva nessuna voce relativa alle stesse huge pages. Solo grazie ad un errore nel file .config ho poi scoperto che a  “resettare” il mio file .config era l’istruzione:

scripts/kconfig/conf -s arch/x86_64/Kconfig

lanciata da make. Ulteriori indagini mi hanno portato al file fs/Kconfig dove ho trovato:

config HUGETLBFS
bool “HugeTLB file system support”
depends X86 || IA64 || PPC64 || SPARC64 || SUPERH || (S390 && 64BIT) \
|| BROKEN
depends !XEN
help
hugetlbfs is a filesystem backing for HugeTLB pages, based on
ramfs. For architectures that support it, say Y here and read
<file:Documentation/vm/hugetlbpage.txt> for details.

If unsure, say N.

Che in sostanza stabilisce che se è selezionato il supporto per XEN viene disabilitato quello per le Huge Pages. Ho verificato, con “make menuconfig” ma anche deselezionando la voce “XEN -> Privileged Guest (domain 0)” sotto “File Systems -> Pseudo filesystems” non compare la voce “HugeTLB file system support”. (Non sono solo io ad aver problemi su come scrivere “filesystem” se come una unica parola  o come due divise, visto che sul questo menu’ compare scritto in entrambi i modi). Invece modificando il file fs/Kconfig così:

config HUGETLBFS
bool “HugeTLB file system support”
depends X86 || IA64 || PPC64 || SPARC64 || SUPERH || (S390 && 64BIT) \
|| BROKEN
#depends !XEN
default y
help
hugetlbfs is a filesystem backing for HugeTLB pages, based on
ramfs. For architectures that support it, say Y here and read
<file:Documentation/vm/hugetlbpage.txt> for details.

If unsure, say N.

Magicamente la voce “HugeTLB file system support” compare sotto “HugeTLB file system support”

Quindi sono riuscito a ricompilare il kernel con il supporto a XEN e alle Huge Pages, vedremo cosa accadrà.

Questi in sintesi i passi che ho seguito:

  1. scaricato il pacchetto  kernel-2.6.18-164.el5.src.rpm da public-yum.oracle.com
  2. aggiunto l’utente mockbuild con gruppo mockbuild (altrimenti non funziona l’installazione dell’rpm).
  3. installato con rpm -i kernel-2.6.18-164.el5.src.rpm; in questo modo finisce tutto sotto /usr/src/redhat, con una struttura particolare
  4. Secondo il consiglio visto da più parti, ad esempio anche qui, ho copiato tutto il contenuto di /usr/src/redhat in un’altro posto (/var/tmp/rpmbuild) e creando il file  ~/.rpmmacros con la riga %_topdir /var/tmp/rpmbuild.
  5. la radice per la compilazione dei sorgenti è diventata nel mio caso /var/tmp/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/, ho modificato il file Makefile impostando la variabile EXTRAVERSION = -xenhuge2.6.18-164  (come saggiamente indicato qui)
  6. modificato il file fs/Kconfig come descritto sopra
  7. lanciato il comando “make rpm ” La compilazione non è durata giorni, mi sembra circa un’ora.
  8. a questo punto sotto /var/tmp/rpmbuild/RPMS ho trovato il mio rpm che ho installato con rpm -i, piccola curiosità: sotto /boot mi sono trovato un file vmlinuz da 52 MB contro i 2 MB circa degli altri kernel.
  9. Ho creato l’immagine del ramdisk con mkinitrd, sempre come indicato dalla guida di HowToForge e modificato il file /boot/grub/menu.lst

Ho riavviato la macchina virtuale e selezionato dal menu di grup il nuovo kernel e incredibilmente è partita.  Curiosando sotto /var/tmp/rpmbuild/BUILD/kernel-2.6.18xenhuge2.6.18-164 ho visto un file vmlinuz da circa 2 MB, accanto a un file vmlinux da circa 52 MB (dimensione uguale al byte al file vmlinuz-2.6.18-xenhuge2.6.18-164 che rpm mi ha installato sotto /boot) allora ho provato a sostituire il file da 52 MB sotto boot con il file vmlinuz (opportunamente rinominato) ed ho riavviato. Anche così funziona. Evidentemente il file più piccolo è il kernel compresso ma al boot viene gestito in modo trasparente (indagherò su questo).

Conclusione

I motivi che mi hanno spinto a investire il mio tempo in queste ricerche ed esperimenti sono imperscrutabili. Un’operazione simile va contro il principio che cerco di adottare solitamente, ovvero seguire strade e metodi certificati. Solamente una morbosa curiosità, il fascino del lato oscuro di Linux giustificano cio’ che ho fatto. Sono però soddisfatto, perché potrò adesso testare Oracle su Linux con le Huge Pages.

 

 

 

 

3 commenti »

RSS feed for comments on this post. TrackBack URI

  1. “I motivi che mi hanno spinto a investire il mio tempo in queste ricerche ed esperimenti sono imperscrutabili.”

    ROTFL!😀

    • tu ridi, ma in questo mondo milioni di persone si affidano a macchine con instalato Windows senza che nessuno sappia veramente come funziona e cosa fa😀

  2. […] a Oracle Recovery…Enrico su Introduzione a Oracle Recovery…Cristian Cudizio su Ricompilare il Kernel con XEN …Rudy su Ricompilare il Kernel con XEN …Cristian Cudizio su Virtualizzazione […]


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: