Sysresccd-manual-it Build a SystemRescueCd with your own kernel |
History |
Contents |
Introduzione
SystemRescueCd viene fornito con quattro kernels. Tuttavia, è possibile compilare un proprio kernel di linux se si ha bisogno di un altro driver, o se si vogliono altre sorgente recenti, o solo altre opzioni di compilazioni.
Il tutorial spiega come è possibile compilare il proprio kernel da SystemRescueCd stesso, quindi non bisogna possedere un altro sistema linux installato sul proprio hard disk. E’ possibile anche fare tutte le compilazioni da qualsiasi sistema linux installato sull’hard disk, basta che si sa cosa bisogna fare. Questo tutorial è basato su SystemRescueCd-1.1.0 perché questa è la prima versione che è stata distribuita con le applicazioni di sviluppo (gcc, make, …) che necessitano di compilare il kernel. Quindi non si dovrebbe tentare di seguire queste istruzioni con una versione precedente.
Dopo che le sorgenti del nuovo kernel sono compilate, sarà necessario fare un SystemRescueCd personalizzato che usa l’immagine e i moduli del kernel compilato.
Preparare il proprio sistema
Questo tutorial spiega come compilare il kernel da SystemRescueCd. Quindi si dovrebbe avviare SystemRescueCd-1.1.0 o una versione più recente.
Controllare le impostazioni
Bisognerebbe prima controllare che si stia usando la giusta versione di SystemRescueCd e che il compiler gcc sia installato:
root@sysresccd /root % cat /root/version 1.1.0 root@sysresccd /root % gcc --version gcc (GCC) 4.2.4 (Gentoo 4.2.4 p1.0) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Preparare una partizione con un pò di spazio libero
Si ha bisogno di un pò di spazio sul proprio hard disk per compilare le sorgenti per fare un sysresccd personalizzato. E’ possibile usare delle partizioni del proprio hard disk formattate con un file system linux ( ext3, reiserfs, reiser4, jfs, xfs, …) con almeno 2 GB di spazio libero. Questa partizione non ha bisogno di essere vuota. Viene considerata una partizione /dev/sda6. Viene montata su /mnt/custom:
mount /dev/sda6 /mnt/custom
Si lavorerà in /usr/src. Quindi verrà fatta una directory in quella partizione, e verrà montata su /usr/src:
mkdir /mnt/custom/sources mount -o bind /mnt/custom/sources /usr/src
In questo modo SystemRecueCd creerà due directory sulla radice della propria partizione:
- /mnt/custom/sources: il posto dove si compilerà il kernel
- /mnt/custom/customcd: il posto dove si farà il sysresccd personalizzato
Scaricare e preparare le sorgenti e le patches
Per prima cosa bisogna scaricare le sorgenti vaniglia del kernel (linux-w.x.y.z.tar.bz2 where z=0)
cd /usr/src wget ftp://ftp.proxad.net/mirrors/ftp.kernel.org/linux/kernel/v2.6/linux-2.6.25.tar.bz2
Ora si ha bisogno delle patches di sysresccd. Ci sono due sets di patches:
- std-sources sono le patches usate per compilare i kernels standard (rescuecd e rescue64)
- alt-sources sono le patches usate per compilare i kernels alternativi (altker32 e altker64)
Bisogna decidere che tipo di sorgenti kernel si vogliono usare: o il kernel standard o il kernel alternativo. Qui è riportato come scaricare le patches. Non bisogna dimenticare di sostituire il numero della versione nell’URL con l’ultimo:
cd /usr/src wget -r http://kernel.sysresccd.org/sysresccd-1.1.0 -l1 -A bz2 --no-directories
Successivamente, si deve estrarre le sorgenti principali:
tar xfjp linux-2.6.25.tar.bz2
E applicare le patches di SystemRescueCd nell’ordine:
cd /usr/src/linux-2.6.25 bzcat ../std-sources-2.6.25.16_01-r16.patch.bz2 | patch -p1 bzcat ../std-sources-2.6.25.xx_02-nosquashfs.patch.bz2 | patch -p1 bzcat ../std-sources-2.6.25.xx_03-sqlzma-3.3.patch.bz2 | patch -p1 bzcat ../std-sources-2.6.25.xx_04-reiser4.patch.bz2 | patch -p1 bzcat ../std-sources-2.6.25.xx_05-aufs.patch.bz2 | patch -p1 bzcat ../std-sources-2.6.25.xx_06-loopaes.patch.bz2 | patch -p1 bzcat ../std-sources-2.6.25.xx_07-speakup.patch.bz2 | patch -p1 bzcat ../std-sources-2.6.25.xx_08-rtl8168.patch.bz2 | patch -p1 bzcat ../std-sources-2.6.25.xx_09-netdev-atl2.patch.bz2 | patch -p1
Le sorgenti del kernel di sysresccd sono fatte da più patches. Alcune patches sono necessarie al sistema per lavorare, altre patches non sono importanti. Qui sono riportate le patches che bisogna conservare se si vuole che il sistema lavori:
- sqlzma: supporto per il filesystem squashfs con la compressione lzma
- aufs: supporto per il filesystem aufs (un altro unionfs)
Si è liberi di applicare altre patches sempre che non entrino in conflitto con altre o che danneggino le fonti.
Configurare il proprio kernel
Personalizzare la EXTRAVERSION
Quando viene battuto con la tastiera uname –r, le informazioni della versione extra vengono visualizzate sul display:
root@sysresccd /root % uname -r 2.6.25.16-std110
Si potrebbe voler cambiare il valore di default dell’EXTRAVERSION, è possibile fare ciò compilando il principale Makefile:
root@sysresccd /root % cd /usr/src/linux-2.6.25 root@sysresccd /usr/src/linux-2.6.25 % vi Makefile
Qui c’è un esempio di /usr/src/linux-2.6.25/Makefile
VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 25 EXTRAVERSION = .16-custom
Usare la giusta architettura
Si potrebbe voler compilare un kernel a 32bit se si sta lavorando con uno a 64bit, o si potrebbe voler compilare un kernel a 64bit se si sta lavorando con uno a 32bit. In quel caso, è importante specificare il giusto valore per ARCH prima di far girare qualsiasi comando make riferito al kernel. Per esempio, qui è riportato cosa bisogna fare se sta girando un kernel a 64bit (uname -m returns x86_64) e si vuole compilare un kernel a 32bit:
cd /usr/src/linux-2.6.25 export ARCH=x86_64 sed -i -e '1i\ARCH=x86_64' Makefile
Dopo ciò, la giusta architettura sarà usata quando vengono selezionate le opzioni e quando viene compilato il kernel.
Scegliere le opzioni di compilazione del kernel
Se non si vogliono controllare tutte le opzioni di configurazione del kernel, è possibile usare le opzioni ufficiali di sysresccd come punto di partenza. Le opzioni del kernel che sta girando sono disponibili in /proc/config.gz, quindi è possibile trovare la configurazione del file in questo modo:
cd /usr/src/linux-2.6.25 cat /proc/config.gz | gzip -d > myconfig
Se si sta lavorando in modo grafico, è possibile selezionare le opzioni usando il programma grafico basato su GTK. Il comando make xconfig non può essere usato finchè il sistema non ha le librerie Qt. Quindi bisogna solo scrivere quanto segue:
cd /usr/src/linux-2.6.25 make gconfig
Se si sta lavorando in modalità console, è possibile invece usare make menuconfig
cd /usr/src/linux-2.6.25 make menuconfig
Quando si selezionano le opzioni del kernel, è molto importante che vengano abilitati i seguenti moduli, essi devono essere costruiti nell’immagine del kernel non come un modulo:
CONFIG_AUFS=y CONFIG_AUFS_FAKE_DM=y CONFIG_AUFS_BRANCH_MAX_127=y CONFIG_AUFS_RR_SQUASHFS=y CONFIG_AUFS_BR_XFS=y CONFIG_AUFS_WORKAROUND_FUSE=y CONFIG_AUFS_DEBUG=y CONFIG_AUFS_COMPAT=y CONFIG_SQUASHFS=y
Se si vuole compilare un kernel a 64bit (ARCH=x86_64), non si deve dimenticare di abilitare il supporto IA32 (CONFIG_IA32_EMULATION=y), inoltre il proprio kernel non eseguirà i binari a 32bit. E il sistema sysresccd è fatto di binari a 32bit.
Compilare e installare il kernel
Dopo che le opzioni sono state selezionate e salvate in /usr/src/linux-2.6.25/.config, è possibile compilare le sorgenti:
make && make modules && make modules_install
Se il kernel compila senza errori, dovrebbe essere disponibile un immagine compressa del kernel:
root@sysresccd /root % find /usr/src -type f -name bzImage /usr/src/linux-2.6.25/arch/x86/boot/bzImage
Si dovrebbero anche trovare nuovi moduli anche in /lib/modules o /lib64/modules/.
Bisogna fare un backup di queste due cose (bzImage file, e i nuovi moduli) che serviranno nei prossimi passi.
Ricreare gli initramfs
Cos'è un initramfs
Un initramfs (anche conosciuto come init-ramdisk) è un archivio cpio compresso che contiene files usati per inizializzare il sistema al momento dell’avvio. I files sono usati dal kernel per inizializzare il sistema. Fondamentalmente esso fa cose come montare il principale file system root. Non è richiesto per tutti i sistemi linux, ma è necessario per quelli complessi, ad esempio quando il file system root è su un volume logico LVM. In precedenti versioni del kernel, i ramdisk erano loopback filesystems compressi.
SystemRescueCd ha bisogno di un initramfs per partire, è localizzato in isolinux sul cdrom. Tutti i kernels usano lo stesso initramfs per salvare spazio. Questo file contiene i moduli del kernel che si fa avviare, quindi è necessario per copiare i nuovi moduli in questo initramfs.
Estrarre gli initramfs correnti
Qui è riportato come estrarre i contenuti dei vecchi initramfs usando cpio. Se si sta caricando dalla rete, bisogna scaricare initramfs.igz a mano.
mkdir /usr/src/initramfs cd /usr/src/initramfs zcat /mnt/cdrom/isolinux/initramfs.igz | cpio -id
Copiare i nuovi moduli negli initramfs
Ora, bisogna copiare la directory dove i propri moduli nuovi vengono conservati ai contenuti intramfs. L'allocazione dei moduli può anche essere /lib/modules o /lib64/modules:
cp -a /lib/modules/your-kernel-modules /usr/src/initramfs/lib/modules/
Ricreare gli initramfs
Qui è riportato come ricreare i nuovi initramfs:
rm -f /usr/src/initramfs.igz cd /usr/src/initramfs find . | cpio -H newc -o | gzip -9 > /usr/src/initramfs.igz
Creare un disco personalizzato con il nuovo kernel
Ora quello che bisogna fare è creare un SystemrescueCd personalizzato nel quale verranno copiati i nuovi initramfs.igz e i nuovi moduli del kernel. Bisogna seguire le istruzioni dettagliate su SystemRescueCd personalizzati senza dimenticare di copiare i nuovi files. Qui di seguito è riportata una procedura sommaria (bisogna aggiornare il percorso dei files e i loro nomi in modo che si accordino con la propria configurazione):
- Non bisogna creare di nuovo una partizione su /mnt/custom se è già stata creata
- Estrarre il file dal filesystem squashfs:
/usr/sbin/sysresccd-custom extract
- Copiare i nuovi moduli del kernel in /mnt/custom/customcd/files/lib/modules o /mnt/custom/customcd/files/lib64/modules:
cp -a /lib/modules/your-kernel-modules /mnt/custom/customcd/files/lib/modules
o
cp -a /lib64/modules/your-kernel-modules /mnt/custom/customcd/files/lib64/modules
- Creare i nuovi fliesystem squashfs compressi:
/usr/sbin/sysresccd-custom squashfs
- Copiare il nuovo initram.igz:
cp /usr/src/initramfs.igz /mnt/custom/customcd/isoroot/isolinux/initram.igz
- Copiare il nuovo kernel in /mnt/custom/customcd/isoroot/isolinux/. Bigona scegliere un nome per l'mmagine del kernel. Ad esempio può essere vmlinuz che è un nome comune per le immagini dei kernel, o è possibile rimpiazzare il kernel ufficiale e dargli lo stesso nome: rescuecd.
cp /usr/src/linux-2.6.25/arch/x86/boot/bzImage /mnt/custom/customcd/isoroot/isolinux/vmlinuz
o
cp /usr/src/linux-2.6.25/arch/x86/boot/bzImage /mnt/custom/customcd/isoroot/isolinux/rescuecd
Se si decide di dare all'immagine del kernel un nuovo nome, bisognerà aggiornare isolinux.cfg e syslinux.cfg in modo che vengano inzializzate le entrate che usa il nuovo kernel. Qui è riportato come compilarlo:
vim /mnt/custom/customcd/isoroot/isolinux/isolinux.cfg
Qui è riportato un esempio delle due nuove entrate che è possibile aggiungere isolinux.cfg. Il primo non ha opzioni per l'inizializzazione, e il secondo ha un opzione per settare la mappatura della tastiera:
label mykernel kernel vmlinuz append initrd=initram.igz label mykernelfr kernel vmlinuz append initrd=initram.igz setkmap=fr
In altre parole, bisognerà scrivere con la tastiera mykernel o mykernelfr al primo vero boot prompt in modo da avviare il nuovo SystemRescueCd personalizzato.
- Ora bisogna compilare il nuovo filesystem ISO:
/usr/sbin/sysresccd-custom isogen my_srcd
- L'immagine ISO finale deve essere scritta in /mnt/custom/customcd/isofile/sysresccd-new.iso. Copiare questo file ovunque si voglia, o masterizzarlo direttamente dal SystemRescueCd se il proprio driver non è occupato.
- E successivamente, lasciare la partizione in modo impeccabile:
cd / ; umount /mnt/custom ; sync
