Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[Initramfs] La cowboy_way e i segreti di genkernel
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) Risorse italiane (documentazione e tools)
View previous topic :: View next topic  
Author Message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4498
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Mon May 22, 2006 4:10 pm    Post subject: [Initramfs] La cowboy_way e i segreti di genkernel Reply with quote


    1. Introduzione
    2. Trasformare una initrd in una initramfs
    3. Rubare :roll: .. estrarre risorse da una initramfs
    4. Initramfs. Perché? I segreti di genkernel
    5. Howto. Costruire a mano una initramfs con raid e lvm2

    La versione sul wiki

    edit: la versione sul wiki è stata resa inaccessibile. segnalo perciò una cosa aderente al tema, che contiene una proposta di script automatico in stile genkernel self-made:
    in italiano
    in inglese

    1. In linea di massima, un kernel deve essere in grado di controllare autonomamente l'avvio di un sistema, dall'accessione fino alla completa disponibilità delle funzionalità esistenti. In acluni contesti particolari, però, vi sono elementi fisici o virtuali complessi che richiedono l'adozione di opportune variazioni rispetto alla programmazione standard incorporata, che devono essere realizzate nelle primissime fasi della procedura di boot (early userspace).

    Per realizzare questo scopo, in Linux, esistono due modalità tecniche distinte: le immagini disco (initrd) e gli archivi cpio (initramfs).
    Concettualmente funzionano allo stesso modo, caricando un insieme di programmi, dati di configurazione ed istruzioni per condurre a buon fine l'avvio. Tecnologicamente, invece, la seconda opzione possiede un'insieme di caratteristiche architettoniche che la rendono più vantaggiosa per generare automaticamente oggetti complessi.

    Naturalmente, tutto ciò è una vera iattura per noi nubbi, perchè, dopo avere speso risorse ed energie a comprendere i meccanismi alla base della prima tecnologia, ci rendiamo conto che,. oramai da tempo, il resto del mondo utlizza la seconda.
    L'altro giorno mi sono trovato a litigare con una initramfs per Xen prodotta con genkernel, ma che non voleva saperne di fare il proprio mestiere e non ero assolutamente in grado di uscirne (ne sono appena uscito proprio grazie a questo howto :D ).

Alla fine, ho sospeso la lotta e mi sono occupato di mettere ordine alle mie idee su questo argomento.
_________________
vu vu vu
gentù
mi piaci tu


Last edited by cloc3 on Wed May 07, 2008 8:15 am; edited 5 times in total
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4498
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Mon May 22, 2006 4:14 pm    Post subject: Trasformare un initrd in un initramfs. Reply with quote

2. Trasformare un initrd in un initramfs.

È l'operazione più semplice. Per farla, basta fissare un paio di cose.

La mia vecchia initrd è una immagine virtuale in formato ext2 e si chiama md.init.
Per accedere ai dati incorporati, bisogna passare attraverso un dispositivo di loop:
Code:

# mount -o loop /boot/initrd/md.init /mnt/initrd

Ciò fatto, la trasformazione si prepara in 2 passi (anzi, tre) ...
Code:

# info cpio
# cd /mnt/initrd
# mv linuxrc init


    Nota di copyright: chiunque fosse preso da incontenibile accesso di ilarità, con reazioni scomposte, pensando al tempo che mi è costata l'ultima istruzione, è sevaramente diffidato dal continuare la lettura, se non dopo avere espresso ossequioso atto di falsa costrizione.


... e si realizza in uno soltanto:
Code:

# find . -depth -print|cpio -o -H newc|gzip --best>/boot/cpio/init.gz

Finito. Testare immediatamente, magari facendo uso della modalità editor di grub (tasto e).

:)
_________________
vu vu vu
gentù
mi piaci tu
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4498
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Mon May 22, 2006 4:18 pm    Post subject: Estrarre risorse da una initramfs complessa. Reply with quote

3. Estrarre risorse da una initramfs complessa.

Copiare è l'Informatica, per noi neerd.
Ma stavolta non è facile come prima.
Una initramfs complessa non è archivio singolo, ma la concatenazione sequenziale di un pluralità di questi, accumulati su una catasta.
Il comando:
Code:

# cpio -t <initramfs_complessa

accede solo al primo archivio della sequenza, con grande delusione dell'hacker in erba.

Qui e qui sono proposti due script, un o in python e uno in bash, che realizzano un carotaggio completo di qualunque archivio initramfs. Riporto solo il secondo per comodità di lettura, perché, a mio parere, è più curato nell'output verso console:
Code:

#!/bin/bash
 
 if [[ $# -ne 2 ]]; then
     echo "Usage: $0 initramfs directory"
     exit 1
 fi
 
 mkdir -p "$2"
 
 if file "$1" | grep gzip > /dev/null 2>&1; then
     echo "Initramfs is gzip compressed, unpacking first"
     cp "$1" .temp.gz
     gunzip .temp.gz
 else
     cp "$1" .temp
 fi
 
 if file .temp | grep ext2 > /dev/null 2>&1; then
     echo
     echo "This is an initrd (ext2 filesystem), not an initramfs"
     echo
     echo "Those are ext2 filesystem images, that can be mounted on loopback:"
     echo
     echo "  # mount -o loop $1-unpacked $2"
     echo
     mv .temp $1-unpacked
     exit
 fi
 
 compno=1
 while [[ -s .temp ]]; do
     blocks=$(cpio -t -H newc < .temp 2>&1 > /dev/null | sed "s/[^0-9]*//g")
     dd if=.temp of=.$compno.cpio bs=512 count=$blocks 2> /dev/null
     dd if=.temp of=.scratch bs=512 skip=$blocks 2> /dev/null
     mv .scratch .temp
     echo "Extracting component #$compno ($blocks blocks)"
     pushd "$2" > /dev/null 2>&1
     cpio -i -m -H newc < ../.$compno.cpio > /dev/null 2>&1
     popd > /dev/null 2>&1
     rm .$compno.cpio
     compno=$((compno+1))
 done
 
 rm .temp
   

_________________
vu vu vu
gentù
mi piaci tu


Last edited by cloc3 on Tue May 23, 2006 3:36 pm; edited 1 time in total
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4498
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Mon May 22, 2006 4:20 pm    Post subject: Initramfs. Perché? I segreti di genkernel. Reply with quote

4. Initramfs. Perché? I segreti di genkernel.
Ma copiare, perché?

Come si capisce leggendo il punto 3, e come proverò a ribadire nell'esempio finale, la struttura architettonica delle initramfs permette di aggiungere elementi nuovi ad oggetti preesistenti con grande facilità. Da qui viene la preferenza netta accreditata ad essa da parte di tutti gli applicativi per la generazione automatica delle immagini iniziali. Naturalmente, accade anche che determinati pezzi, aggiunti dagli sviluppatori, aggiungano funzioni che, manualmente, è difficile ottenere. In tal caso, l'unica risorsa residua è: ... aprire e rubare.

Un esempio è fornito dall'uso delle klibc, da parte dei generatori professionali, come genkernel, per compilare in loco il chroot attivo in early userspace. In altre parole, le operazioni fondamentali, come `cd`, `mount` o `insmod` sono eseguite da un codice apposito per il kernel e non da programmi estratti dal sistema operativo corrente. Dalle versioni 2.7, è prevedibile che questa modalità di costruzione sarà integrata definitivamente nel kernel, ma per ora, le klibc sono distribuite separatamente e installabili con emerge in una versione asettica, senza script di configurazione, non utilizzabile da chi non sa programmare.
Genkernel, invece, adopera un tarball interno delle klibc, riccamente infarcito con gli script degli ottimi sviluppatori di gentoo, ed è in grado di sfornare prodotti di qualità superiore (a meno che non si pianti su udev, come capitava a me l'altro giorno :twisted: ).
_________________
vu vu vu
gentù
mi piaci tu


Last edited by cloc3 on Mon May 22, 2006 7:28 pm; edited 1 time in total
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4498
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Mon May 22, 2006 4:21 pm    Post subject: Howto. Costruire a mano una initramfs con raid e lvm2. Reply with quote

5. E finalmente, il come fare.

Ora, voglio produrre una initramfs professionale, partendo dal nulla e arricchendola progressivamente, pezzo per pezzo, a mano.

In tutto, sono sette passi:
Quote:

a. Il baselayout.
b. File di init.
c. Il chroot.
d. lvm2.
e. Raid + file di configurazione
f. I dispositivi.
g. Conclusione, con l'assemblaggio finale.

Ho testato la mia initramfs con un tradizionale gentoo-sources e con un kernel xen. Quest'ultimo ha manifestato la necessità di alcune regole restrittive addizionali, di cui ho tenuto conto nella stesura di quanto segue. Esse sono:

    1. L'initramfs deve essere costruito a cipolla. Queste rende obsolete le initrd vecchie maniera, che producono un laconico messaggio di /init o /linuxrc not found.
    2. Il primo strato deve essere sufficientemente leggero - in pratica, solo il baselayout.
    3. Il primo strato deve contenere il file di init.

a. Il baselayout.

Prima di tutto, serve uno spazio temporaneo per il lavoro sporco e di una struttura elementare di filesystem:
Code:

# mkdir -p /tmp/initramfs/base_dir /tmp/initramfs/cpio_data
# cd /tmp/initramfs/base_dir
# mkdir bin dev etc lib proc sys  sysroot  tmp
# ln -s bin sbin
# ln -s lib lib64 # solo se necessario

b. File di init.
Xen impone di aggiungere subito il fine init.
Si tratta di uno script di bash studiato per acquisire in input una cmdline come la seguente:
Code:

# cat /proc/cmdline
real_root=/dev/mapper/raid0-root root=/dev/ram0 rootdelay=5 rw init=/linuxrc splash=verbose,theme:emergence video=vesa:ywrap,mtrr,vga=0x31B

E questo è il taglia incolla del mio `cat init`:
Code:

#!/bin/bash
echo "lunga attesa"
sleep 3
echo "attesa finita"

echo "Caricamento del filesystem /proc"
mount -t proc none /proc
CMDLINE=`cat /proc/cmdline`

echo "Creazione dei dispositivi"
sed -e '1,2d;s/\(.*\) \(.*\) \(.*\) \(.*\)/mknod \/dev\/\4 b \2  \1/' /proc/partitions|bash

# attivazione delle partizioni raid. Utilizza le impostazioni di /etc/mdadm
mdadm --assemble /dev/md2 /dev/hda5 /dev/sda5

echo "attivazione delle partizioni lvm"
vgscan --mknodes --ignorelockingfailure
vgchange -a y
sleep 5

mount
echo "Caricamento della partizione di root"
sed 's/real_root[[:graph:]]*[[:blank:]]/&xxx/g' /proc/cmdline |sed 's/ xxx.*//'|sed 's/real_root=/mount -v -o noatime --rw /'|sed 's|.*|& /sysroot|'|bash
mount
#if [ ! -d /sysroot/dev/mapper ]; then cp -a /dev/mapper /sysroot/dev ;fi

echo "Pivot root e avvio del processo di init reale"
umount /proc

cd sysroot
pivot_root . initrd
exec chroot . /bin/sh <<- EOF >dev/console 2>&1
exec /sbin/init ${CMDLINE}
EOF

Il primo strato della cipolla è pronto:
Code:

# pwd
/tmp/initramfs/base_dir
# find . -depth -print|cpio -o -H newc>../cpio_data/base.cpio


c. Il chroot.

Qui scelgo di non usare le klibc (anche perché ho già disinstallato genkernel).
La procedura di costruzione manuale di un chroot è lunga e noiosa, descritta in cento salse su internet.
Tuttavia, qui, mi sento obbligato a mostrarla dettagliatamente lo stesso.
Code:

# cp -a ../base_dir ../chroot_dir
# cd ../chroot_dir/bin
# cp `which bash` `which cat` `which chroot` `which cp` `which echo` `which insmod` `which less` `which ls` `which mkdir` \
  `which mknod` `which mount` `which pivot_root` `which sed` `which sleep` `which umount` .

Qui per la verità ho aggiunto qualcosa di troppo, ma è meglio abbondare.
Come dicevo, poi, non sono le klibc. Per ogni programma servono le rispettive librerie.
Code:

# ldd bash
linux-gate.so.1 =>  (0xffffe000)
libdl.so.2 => /lib/libdl.so.2 (0x48ab9000)
libc.so.6 => /lib/libc.so.6 (0x48978000)
/lib/ld-linux.so.2 (0x4895f000)
# cp /lib/libdl.so.2 /lib/libc.so.6 ../lib

e iterativamente, con pazienza, per ogni programma. Queste sono le librerie che sono risultate necessarie nel mio caso:
Code:

# ls ../lib
ld-linux-x86-64.so.2  libblkid.so.1  libc.so.6  libdl.so.2  libncurses.so.5  libncursesw.so.5  libpthread.so.0  librt.so.1  libuuid.so.1  libz.so.1

Alla fine, testare il chroot:
Code:

# chroot ..
bash-3.1#
bash-3.1# # alleluia!
bash-3.1# exit
# cd ..
pwd
/tmp/initramfs/chroot_dir
# find -depth -print |cpio -o -H newc>../cpio_data/chroot.cpio


d. Terzo passo. Aggiungere lvm2.
Code:

# cp -a ../base_dir ../lvm_dir
# cd ../lvm_dir
# cp -a `equery f lvm2|grep bin/` bin
# cp -a /etc/lvm etc/ # mai dimenticare i file di configurazione essenziali.

Già fatto? Sì. lvm è un eseguibile statico. Nessuna libreria richiesta.
Code:

# pwd
/tmp/initramfs/lvm_dir
# find -depth -print |cpio -o -H newc>../cpio_data/lvm.cpio


e. Raid + file di configurazione

Per il raid, ho risolto usando le raidtools ed mdadm. Genkernel, invece, usa dmraid, del quale dispone attualemente di una versione più avanzata di quella distribuita in portage. Per sys-fs/mdadm, non utilizzare la use ssl senza la use static.

Code:

# cp -a ../base_dir ../raid_dir
# cd ../raid_dir
# cp `which mdadm` bin
# ldd bin/mdadm
  libc.so.6 => /lib/libc.so.6 (0x00002ad9b6cad000)
  /lib64/ld-linux-x86-64.so.2 (0x00002ad9b6b90000)
# #librerie già presenti. Non serve nulla di nuovo.
# >etc/fstab
# >etc/mtab
# cp /etc/mdadm.conf etc


f. I dispositivi.
Non dimenticare i dispositivi essenziali per l'avvio. Riporto quelli che uso io.
I numeri specifici possono variare a seconda delle necessità locali,a dattando di conseguenza il successivo file di init.
Code:

# mknod dev/console c 5 1
# mknod dev/loop0 c 7 0
# mknod dev/md0 b 9 0
# mknod dev/md1 b 9 1
# mknod dev/md2 b 9 2
# mknod dev/null c 1 3
# mknod dev/tty c 4 0


Conclusione.
Ci siamo. Adesso basta aggregare il tutto.
(rullo di tamburi :) )
Code:

# find -depth -print |cpio -o -H newc>../cpio_data/raid.cpio
# cd ../cpio_data
# cat base.cpio chroot.cpio lvm.cpio raid.cpio |gzip --best >/boot/cpio_data/init.gz

L'ultimo è certamente il passo più bello. Adesso si può aggiungere ancora udev, o configurare il caricamento di un modulo esterno o quant'altro piaccia.
Basta procedere a oltranza, modificando l'essenziale.
_________________
vu vu vu
gentù
mi piaci tu
Back to top
View user's profile Send private message
Dr.Dran
l33t
l33t


Joined: 08 Oct 2004
Posts: 766
Location: Imola - Italy

PostPosted: Thu Aug 10, 2006 7:13 pm    Post subject: Reply with quote

Very very very Cool!!!
Grazie mille Cloc3... questo è un bell'howto :D

Ma in soldoni, hai dovuto crearti la tua initramfs poichè genkernel non ti gestiva bene il supporto a Xen? Ma per un utilizzo su client genkernel non da problemi... te lo chiedo perchè ho utilizzato sempre e solo initrd (ricado nella prima fase dello sviluppatore del kernel)...
Comunque è una discreta menata farlo a mano,,, anche perchp devi cercare tutte le librerie linkate dagli eseguibili che ti servono... ma credo che in casi estremi sia la manna dal cielo :wink:

Cheers

Franco
_________________
:: [Dr.Dran] Details ::
- Linux User # 286282
- IT FreeLance Consultant
- President of ImoLUG [Imola & Faenza Linux User Group]
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4498
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Thu Aug 10, 2006 7:40 pm    Post subject: Reply with quote

Dr.Dran wrote:

Ma in soldoni, hai dovuto crearti la tua initramfs poichè genkernel non ti gestiva bene il supporto a Xen?

Ni.
Ovvero. Effettivamente Xen ha messo in evidenza un problema temporaneo (almeno credo) di genkernel e io ho colto l'occasione per mettere la parola fine a una serie di dubbi sulle funzioni dell'initramfs.
Dr.Dran wrote:

Comunque è una discreta menata farlo a mano,,, anche perchp devi cercare tutte le librerie linkate dagli eseguibili che ti servono... ma credo che in casi estremi sia la manna dal cielo :wink:

Sono perfettamente daccordo. (Sebbene le librerie non siano moltissime. Io ne ho lasciata qualcuna non indispensabile per eccesso di zelo.)
Anzi. Lo metto in evidenza io stesso quando spiego che, comunque, genkernel può utilizzare risorse come le klibc che sono attualmente incessibili ai comuni mortali, senza parlare della raffinatezza dei relativi script.

Il mio howto serve, appunto, in casi estremi o (spero) per ragioni didattiche.
Capire certi particolari fa sicuramente cultura.
_________________
vu vu vu
gentù
mi piaci tu
Back to top
View user's profile Send private message
Dr.Dran
l33t
l33t


Joined: 08 Oct 2004
Posts: 766
Location: Imola - Italy

PostPosted: Thu Aug 10, 2006 8:53 pm    Post subject: Reply with quote

Ottimo!!! Hai saziato i miei dubbi: risposta ineccepibile :D

Cheers

Franco
_________________
:: [Dr.Dran] Details ::
- Linux User # 286282
- IT FreeLance Consultant
- President of ImoLUG [Imola & Faenza Linux User Group]
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4498
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Mon Nov 06, 2006 12:25 am    Post subject: Reply with quote

Dr.Dran wrote:

Comunque è una discreta menata farlo a mano,,,

come dicevamo, hai ragione.
eppure ho incontrato un caso pratico in cui mi è stato utile questo lavoro: un diskless con unionfs.

per semplificare la menata, ho fatto uno script che fa tutto in automatico, scegliendo i moduli necessari a richiesta dell'utente.
un genkernel minore, insomma.

eccolo qui.
_________________
vu vu vu
gentù
mi piaci tu
Back to top
View user's profile Send private message
Dr.Dran
l33t
l33t


Joined: 08 Oct 2004
Posts: 766
Location: Imola - Italy

PostPosted: Mon Nov 06, 2006 7:18 pm    Post subject: Reply with quote

cloc3 wrote:
per semplificare la menata, ho fatto uno script che fa tutto in automatico...


Grandioso!!! Io personalmente genkernel non sono mai riuscito ad utilizzarlo per bene... causa poca e scarsa documentazione... ho dovuto leggermi gli script per poi fare tutto a manazza grazie alla tua guida... questo script giunge come una manna dal cielo (per quelli come me che hanno aperto una attività da poco e che hanno poco tempo in questo periodo a causa della promozione e delle varie consulenze) :D

Cheers

Franco
_________________
:: [Dr.Dran] Details ::
- Linux User # 286282
- IT FreeLance Consultant
- President of ImoLUG [Imola & Faenza Linux User Group]
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4498
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Tue Nov 07, 2006 5:36 am    Post subject: Reply with quote

Dr.Dran wrote:
questo script giunge come una manna dal cielo

grazie davvero.

studiaretestarecorreggerre.

credo che un diskless, piazzato sul laptop, sia una tecnica ottimale per installazioni facili e superpersonalizzate.
_________________
vu vu vu
gentù
mi piaci tu
Back to top
View user's profile Send private message
mouser
Veteran
Veteran


Joined: 10 Aug 2004
Posts: 1418
Location: Milano

PostPosted: Thu Nov 09, 2006 2:24 pm    Post subject: Reply with quote

Innanzi tutto complimentissimi per l'howto e per l'impostazione della guida: chiara e lollosa, come piace a me! :wink:

cloc3 wrote:
Come dicevo, poi, non sono le klibc. Per ogni programma servono le rispettive librerie.
Codice:

Code:
# ldd bash
linux-gate.so.1 =>  (0xffffe000)
libdl.so.2 => /lib/libdl.so.2 (0x48ab9000)
libc.so.6 => /lib/libc.so.6 (0x48978000)
/lib/ld-linux.so.2 (0x4895f000)
# cp /lib/libdl.so.2 /lib/libc.so.6 ../lib


e iterativamente, con pazienza, per ogni programma.


Un tippettino per questo passaggio:
Code:
# PROG=bash
# for FILE in `ldd $PROG | grep '=>' | awk '{print $3}' | grep -v '0x'`; do cp $FILE ../lib ; done
# echo "Mancanti:" ; ldd $PROG | grep -v '=>' | awk '{print $1}' ; ldd $PROG | grep '=>' | grep -v '/lib' | awk '{print $1}'


Basta sostituire alla variabile PROG il nome dell'eseguibile del programma che interessa e si avranno una buona parte delle librerie copiate automaticamente e la visualizzazione di quelle da copiare a mano :D

Ciriciao
mouser :wink:
_________________
Della serie: "Informatica for dummies":

Io: "Premi il tasto Invio" - Risp: "Ma il tasto Invio è quello con scritto Enter sopra?"
Io: "Scrivi T maiuscolo" - Risp: "Questa tastiera non ha le lettere maiuscole..."
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4498
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Thu Nov 09, 2006 4:50 pm    Post subject: Reply with quote

mouser wrote:

Un tippettino per questo passaggio:

:twisted: rabbia.
adesso devo studiare awk ...

:wink:
_________________
vu vu vu
gentù
mi piaci tu
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4498
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Sat Nov 25, 2006 10:21 pm    Post subject: Reply with quote

mouser wrote:

Un tippettino per questo passaggio:

grazie. ho studiato e ho aggiornato il wiki.

appena ho tempo di controllare meglio, modifico anche lo script automatico initramfs.sh, che ho messo qui.
_________________
vu vu vu
gentù
mi piaci tu
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) Risorse italiane (documentazione e tools) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum