spacer

Sysresccd-manual-it Build a SystemRescueCd with your own kernel

History


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:

 [email protected] /root % cat /root/version
 1.1.0
 
 [email protected] /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:

 [email protected] /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:

 [email protected] /root % cd /usr/src/linux-2.6.25
 [email protected] /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:

 [email protected] /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
spacer