Moderatore: Staff

#!/bin/sh
# esempio per ricerca dipendenze di un modulo
# modprobe --set-version 2.6.17.13 --show-depends ext3
# uscita:
# insmod /lib/modules/2.6.17.13/kernel/fs/jbd/jbd.ko
# insmod /lib/modules/2.6.17.13/kernel/fs/ext3/ext3.ko
# part of code is than mkinitrd
# Copyright (C) 2001-2003 Herbert Xu <herbert@debian.org>
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
get_modules_most() {
if [ -d "/lib/modules/$KERNELVERSION/kernel" ]; then
set "/lib/modules/$KERNELVERSION"/kernel/drivers/video/fb*.$EXT
[ -e "$1" ] && printf '%s\n' "$@"
set "/lib/modules/$KERNELVERSION/"kernel/drivers/video/cfb*.$EXT
[ -e "$1" ] && printf '%s\n' "$@"
set "/lib/modules/$KERNELVERSION/"kernel/drivers/video/console/f*.$EXT
[ -e "$1" ] && printf '%s\n' "$@"
for i in \
"/lib/modules/$KERNELVERSION/kernel/drivers/block" \
"/lib/modules/$KERNELVERSION/kernel/drivers/ide" \
"/lib/modules/$KERNELVERSION/kernel/drivers/md" \
"/lib/modules/$KERNELVERSION/kernel/drivers/scsi" \
"/lib/modules/$KERNELVERSION/kernel/fs" \
"/lib/modules/$KERNELVERSION/kernel/net/unix"
do
[ -d "$i/" ] || continue
find "$i/" -type f
done > /tmp/tmp1
< /tmp/tmp1 awk "
!/fs\/binfmt_[^\/]*\$/ &&
!/fs\/autofs.*\/[^\/]*\$/ &&
!/fs\/coda\/[^\/]*\$/ &&
!/fs\/intermezzo\/[^\/]*\$/ &&
!/fs\/lockd\/[^\/]*\$/ &&
!/fs\/ncpfs.*\/[^\/]*\$/ &&
!/fs\/nfs.*\/[^\/]*\$/ &&
!/fs\/nls\/[^\/]*\$/ &&
!/fs\/ramfs\/[^\/]*\$/ &&
!/fs\/smbfs\/[^\/]*\$/ &&
!/drivers\/block\/loop\.$EXT\$/ &&
!/drivers\/block\/nbd\.$EXT\$/ &&
!/drivers\/block\/paride\/[^\/]*\$/ &&
!/drivers\/ide\/ide-cs\.$EXT\$/ &&
!/drivers\/ide\/ide-tape\.$EXT\$/ &&
!/drivers\/scsi\/ide-scsi\.$EXT\$/ &&
!/drivers\/scsi\/osst\.$EXT\$/ &&
!/drivers\/scsi\/pcmcia\/[^\/]*\$/ &&
!/drivers\/scsi\/ppa\.$EXT\$/ &&
!/drivers\/scsi\/scsi_debug\.$EXT\$/ &&
!/drivers\/scsi\/s[gt]\.$EXT\$/ {
print
}
"
for i in \
"/lib/modules/$KERNELVERSION/kernel/drivers/message/fusion/mptbase".* \
"/lib/modules/$KERNELVERSION/kernel/drivers/message/fusion/mptscsih".*
do
[ -f "$i" ] || continue
echo "$i"
done
else
for i in \
"/usr/src/linux/block" \
"/usr/src/linux/fs" \
"/usr/src/linux/scsi"
do
[ -d "$i/" ] || continue
find "$i/" -type f
done
if [ -f "/usr/src/linux/misc/unix.$EXT" ]; then
echo "/lib/modules/$KERNELVERSION/misc/unix.$EXT"
fi
fi | while read SRCMOD; do
MODULE=$(basename $SRCMOD .$EXT)
echo -n "$MODULE:"
done | sed "s/:$/\n/"
}
build_initrd_auto()
{
EXT_K24="o"
EXT_K26="ko"
if [ $(echo $KERNELVERSION | cut -c -3) = "2.4" ]; then
EXT=$EXT_K24
elif [ $(echo $KERNELVERSION | cut -c -3) = "2.6" ]; then
EXT=$EXT_K26
fi
echo
echo "--- new debian mode ---"
get_modules_most
mkinitrd -c -k $KERNELVERSION -m $(get_modules_most) -f ext3 -r /dev/hda1 -o /boot/initrd-$KERNELVERSION-test.gz
}
KERNELVERSION=""
if [ ! -z "$1" ]; then
KERNELVERSION=$1
else
KERNELVERSION=$(uname -r)
fi
build_initrd_auto

nuitari ha scritto:Che cosa ti serve sull'initrd?
* 0.7.0
- correzioni inglese in progress, report e slack-desc vari grazie a danix85
- aggiunto supporto a elilo
- aggiunto file kernelpkg.conf in cui si possono settare i valori di default delle opzioni di kernelpkg
- aggiunto controllo della versione del kernel presente nell'header del config (deve coincidere con la versione del kernel che si stà per compilare)
- piccole aggiunte man
- modifiche nella creazione di kernel-source
- stampa del bootloader rilevato nello slack-desc del pacchetto kernel-image e eliminazione della riga quando è disabilitato (opzione -d)
- stampa errore quando non viene rilevato il bootloader in fase di installazione kernel-image
- prima della compilazione controllo che gli headers del kernel corrente siano presenti nel sistema
- piccoli ritocchi grafici
- aggiornamento licenza a GPL v3
- aggiunta creazione file .md5 + .txt con desc, per ogni pacchetto creato
- aggiunta sistemazione permessi, proprietario, gruppo
- modifica tracciamento rc.modules in fase di installazione kernel-image
BUON ANNO!



Beh sicuramente quantomeno dovresti trovare un modo migliore per rilevare filesystem e volume di root, come ad esempio fare un semplice grep/sed/awk di fstab, o ancora meglio dell'output di mount.
una cosa alla volta! ... se poi qualcuno mi vuole dare una mano... visto che per ora non ho idea di come fareInoltre, non hai considerato LVM (opzione -L di mkinitrd).

I messaggi dovresti vederli con dmesg, difficilmente visualizza altri messaggi che non siano relativi al kernel, l'initrd.
Nella peggiore delle ipotesi, assicurati che lo scrollback sia nella system ram (opzione relativa del kernel) ed aumenta la dimensione del buffer, così li puoi vedere con PGUP/PGDOWN.
Od anche modifica temporaneamente lo script init dentro l'initrd e logga i mex da qualche parte (in genere si fa su un tmpfs ad hoc che devi solo avere l'accortezza di non smontare).
Posta pure la tua procedura, quantomeno gli diamo un occhiata ^^
#!/bin/sh
# esempio per ricerca dipendenze di un modulo
# modprobe --set-version 2.6.17.13 --show-depends ext3
# uscita:
# insmod /lib/modules/2.6.17.13/kernel/fs/jbd/jbd.ko
# insmod /lib/modules/2.6.17.13/kernel/fs/ext3/ext3.ko
build_initrd_auto()
{
EXT_K24="o"
EXT_K26="ko"
if [ $(echo $KERNELVERSION | cut -c -3) = "2.4" ]; then
EXT=$EXT_K24
elif [ $(echo $KERNELVERSION | cut -c -3) = "2.6" ]; then
EXT=$EXT_K26
fi
#ALL_MOD=$(find /lib/modules/$KERNELVERSION/kernel -name "*.$EXT" -type f -printf "%f:" | sed "s/:$//" | sed "s/\.$EXT//g")
#MODULES="$ALL_MOD"
ALL_MOD_FS=$(find /lib/modules/$KERNELVERSION/kernel/fs/ -name "*.$EXT" -type f -printf "%f:" | sed "s/:$//" | sed "s/\.$EXT//g")
ALL_MOD_SCSI=$(find /lib/modules/$KERNELVERSION/kernel/drivers/scsi/ -name "*.$EXT" -type f -printf "%f:" | sed "s/:$//" | sed "s/\.$EXT//g")
ALL_MOD_IDE=$(find /lib/modules/$KERNELVERSION/kernel/drivers/ide/ -name "*.$EXT" -type f -printf "%f:" | sed "s/:$//" | sed "s/\.$EXT//g")
MODULES="$ALL_MOD_IDE:$ALL_MOD_SCSI:$ALL_MOD_FS"
MODULES_BLACKLIST=""
MODULES="$(echo $MODULES | sed "s/$MODULES_BLACKLIST//g")"
# dep for linux 2.6
for MODULE in $(echo $MODULES | tr : \ ); do
/sbin/modprobe -q --set-version $KERNELVERSION --show-depends $MODULE
done | cut -f 2 -d ' ' | while read SRCMOD; do
DEPMOD=$(basename $SRCMOD .$EXT)
MODULES="$MODULES:$DEPMOD"
done
# dep for linux 2.4 ?
echo $MODULES
#cp /lib/modules/$KERNELVERSION/modules.* /boot/initrd-tree/lib/modules/$KERNELVERSION/
# -f ext3 -r /dev/hda1 saranno puoi passati dalla procedura di rilevamento
mkinitrd -c -k $KERNELVERSION -m $MODULES -f ext3 -r /dev/hda1 -o /boot/initrd-$KERNELVERSION-test.gz
}
KERNELVERSION=""
if [ ! -z "$1" ]; then
KERNELVERSION=$1
else
KERNELVERSION=$(uname -r)
fi
build_initrd_auto

submax82 ha scritto:già kernelpkg lo fà ... la procedura sopra mi serve solo come prova! ... cioè è solo uno script di test...
submax82 ha scritto:una cosa alla volta! ... se poi qualcuno mi vuole dare una mano... visto che per ora non ho idea di come fare
submax82 ha scritto:ma dmesg non visualizza solo i messaggi del kernel ? anche quelli dell'initrd? devo ancora capire bene bene come funziona...
Nella peggiore delle ipotesi, assicurati che lo scrollback sia nella system ram (opzione relativa del kernel) ed aumenta la dimensione del buffer, così li puoi vedere con PGUP/PGDOWN.
Od anche modifica temporaneamente lo script init dentro l'initrd e logga i mex da qualche parte (in genere si fa su un tmpfs ad hoc che devi solo avere l'accortezza di non smontare).
submax82 ha scritto:quella derivata da debian è sopra... la mia fà un pò pietà...![]()

Using /lib/modules/2.6.21.5-smp/kernel/drivers/block/DAC960.ko
insmod: cannot insert '/lib/modules/2.6.21.5-smp/kernel/drivers/scsi/psi240i.ko': No such device (-1): No such device

sarebbe interessante fare procedure alternative e poi valutare tutti i vantaggi/svantaggi di ogniuna e decidere... quale inserire in kernelpkg 0.8.0mettere in initrd tutti i possibili fs e tutti i possibili chipset/supporti hw non ha molto senso, visto che con lspci e con fstab e rdev tiri fuori quasi tutte le info strettamente necessarie per un initrd su misura!
) 

submax82 ha scritto:PERO' c'è da dire che il problema è che lspci non ti dà il modulo che serve per ogni tipo di device... quindi come fai a creare la corrispondenza tra l'uscita di lspci e il modulo/i da passare a mkinitrd... anche se uno lo fà la cosa diventa difficilmente gestibile all'uscita di hardware o moduli nuovi... per questo ho preferito una cosa generica che carica tutto...
non a caso debian funziona così di default... almeno credo... e il fatto che lo faccia una distro del genere fà capire che forse è l'unica soluzione per uno sviluppo gestibile di kernelpkg... fstab ti può dire il tipo di filesystem ma anche qui è lo stesso discorso... devi creare una corrispondenza con i moduli da caricare... e se esce un nuovo fs ... se kernelpkg non viene aggiornato l'initrd che crea il suo wrapper non funzionerebbe perchè gli mancano i moduli da passare a mkinitrd per quell'fs in particolare... per questo è meglio includere tutti i moduli per filesystem esistenti per quel kernel.

Per rdev scusami ma non sò bene a cosa serva...![]()

DOMANDA1: ma il fatto di far caricare tutti quei moduli a initrd.... tali moduli non vengono caricati quando il kernel viene avviato perchè sono solo temporanei, giusto? cioè poi carica SOLO quelli specificati in /etc/rc.d/rc.modules-2.6.23.12 ... per esempio ... esatto??? avevo fatto dei test in passato e sembravano confermarlo... tu confermi questo funzionamento???
DOMANDA2: qualcuno capisce come adattare la procedura debian per calcolare anche le dipendenze di ogni modulo sia per 2.6 che per 2.4... i sorgenti dell'mkinitrd di debian da cui estrapolare le porzioni è qui http://ftp.de.debian.org/debian/pool/ma ... 4.2.tar.gz ... non capisco bene come funziona... questo perchè nell'mkinitrd di slack11 che voglio supportare non c'è il calcolo automatico delle dipendenze... quindi il wrapper di kernelpkg deve essere in grado di farlo.
modprobe --set-version $KERNEL_VERSION --show-depends $MODULE_NAME

diciamo che lspci ti da informazioni almeno sulla famiglia di chipset. ad esempio con un lspci -vv un grep e un paio di cut io so esattamante quale famiglia di controlloer ho a bordo. non ho ancora capito se riesco ad ottenere il modello preciso, ma limito l'initrd a un paio di drivers!
no io prendo come riferimento l'mkinitrd di slackware 11.0 perchè è l'ultima release che supporta il kernel 2.4 quindi voglio che kernelpkg funzioni a partire dalla 11.0 in poi...no mkinitrd della 12.0 indovina da solo il filesystem della root corrente e risolve le dipendenze dei moduli (con modprobe) puoi emulare quel comportamento facendo una specie di backporting. basta che il tipo che si vuol fare l'initrd o non passi alcun dato al wrapper e quindi lasci che il wrapper prenda il filesystem e la root corrente, oppure il tipo passi il filesystem e la root del pc su cui vorrà installare il kernel e il wrapper risolve le dipendenze su misura.
modprobe --set-version $KERNEL_VERSION --show-depends $MODULE_NAME
non lo so... devo controllare. potrebbe non saprei ... ti faccio sapere! il fatto di fare su misura l'initrd è dovuto più che altro al fatto che se uno si deve caricare l'impossibile nell'initrd, allora tanto vale che si tenga un kernel con built in tutti sti aggeggi!

submax82 ha scritto:questo perchè i moduli caricati dall'initrd sono solo temporanei e servono solo per far bootare il pc ... ma poi vengono scaricati e caricati i moduli "veri" dall'rc.modules... quindi l'effetto sarebbe mooolto diverso.

nuitari ha scritto:submax82 ha scritto:questo perchè i moduli caricati dall'initrd sono solo temporanei e servono solo per far bootare il pc ... ma poi vengono scaricati e caricati i moduli "veri" dall'rc.modules... quindi l'effetto sarebbe mooolto diverso.
Ehhh???? Stai scherzando vero?
I moduli caricati nell'initrd non vengono più *scaricati*, dove l'hai letta questa cosa?
altrimenti non avrei aperto questa discussione 


submax82 ha scritto:diciamo che lspci ti da informazioni almeno sulla famiglia di chipset. ad esempio con un lspci -vv un grep e un paio di cut io so esattamante quale famiglia di controlloer ho a bordo. non ho ancora capito se riesco ad ottenere il modello preciso, ma limito l'initrd a un paio di drivers!
anche se ottieni la famiglia devi poi creare un "case" o un file dove c'è la corrispondenza famiglia - moduli da caricare. Inoltre se ci sono 10000 famiglie è ingestibile... ho intenzione di includere in kernelpkg procedure semplici e facilmente mantenibili... e soprattutto il più possibile "adattanti" in modo che non devo aggiornarlo a ogni uscita di una famiglia di chip o a ogni uscita di una nuova versione del kernel.
no io prendo come riferimento l'mkinitrd di slackware 11.0 perchè è l'ultima release che supporta il kernel 2.4 quindi voglio che kernelpkg funzioni a partire dalla 11.0 in poi...no mkinitrd della 12.0 indovina da solo il filesystem della root corrente e risolve le dipendenze dei moduli (con modprobe) puoi emulare quel comportamento facendo una specie di backporting. basta che il tipo che si vuol fare l'initrd o non passi alcun dato al wrapper e quindi lasci che il wrapper prenda il filesystem e la root corrente, oppure il tipo passi il filesystem e la root del pc su cui vorrà installare il kernel e il wrapper risolve le dipendenze su misura.
per il 2.4 funziona in modo diverso... infatti se vedi l'mkinitrd di debian c'è la procedura separata per il 2.4 ma non riesco a capirla.... per modificarla...
) do un occhio!

Visitano il forum: Nessuno e 2 ospiti