Come applicare una patch e ricompilare il kernel

Problemi e discussioni inerenti al kernel e al supporto hardware in ambiente Linux
Rispondi
Avatar utente
stele
Arciere
Messaggi: 310
Iscritto il: 25 novembre 2007, 16:12
Località: Firenze

Messaggio da stele » 3 dicembre 2010, 20:40

A volte puo' capitare di dover applicare una patch e ricompilare il kernel. A me e' capitato di farlo per il ricevitore IR del mio sintonizzatore TV in modo da far funzionare il telecomando.
Ho seguito le ottime istruzioni di questo wiki che qui sintetizzo in italiano e integro con l'esempio della patch che ho salvato come ir.patch
Installiamo abs, aggiorniamo l'albero, creiamo una cartella di lavoro che chiamiamo 'abs' e copiamoci la cartella relativa al kernel persa dall'abero e la patch. Infine entriamoci e iniziamo ad editare il PKGBUILD che e' un po' come uno script che compilera' il kernel per noi:

Codice: Seleziona tutto

sudo pacman -S abs
sudo abs
mkdir abs
cp -r /var/abs/core/kernel26 abs/
cp ir.patch abs/kernel26/
cd abs/kernel26
nano PKGBUILD
Iniziamo a dare un nome diverso a quello che sara' il pacchetto generato alla fine del processo in modo da distinguere e tenere separato il kernel personalizzato con quello standard che vogliamo comunque tenere in parallelo. Il nome lo troviamo tra le prime righe:

Codice: Seleziona tutto

# $Id: PKGBUILD 88213 2010-08-21 07:36:11Z tpowa $
# Maintainer: Tobias Powalowski <tpowa@archlinux.org>
# Maintainer: Thomas Baechler <thomas@archlinux.org>
pkgbase="kernel26"
pkgname=('kernel26' 'kernel26-headers' 'kernel26-manpages' 'kernel26-docs') # Build stock -ARCH kernel
# pkgname=kernel26-custom       # Build kernel with a different name
_kernelname=${pkgname#kernel26}
Cambiamo il nome sia al pacchetto del kernel (che normalmente si chiama 'kernel26') che a quello che contiene i sorgenti che sono spesso utili (che si chiama kernel26-headers). Aggungiamo ad entrambi il '-pippo' per distinguerli. Le prime righe cambiate appariranno quindi:

Codice: Seleziona tutto

# $Id: PKGBUILD 88213 2010-08-21 07:36:11Z tpowa $
# Maintainer: Tobias Powalowski <tpowa@archlinux.org>
# Maintainer: Thomas Baechler <thomas@archlinux.org>
pkgbase="kernel26"
#pkgname=('kernel26' 'kernel26-headers' 'kernel26-manpages' 'kernel26-docs') # Build stock -ARCH kernel
pkgname=('kernel26-pippo' 'kernel26-headers-pippo')       # Build kernel with a different name
_kernelname=${pkgname#kernel26}
non dimentichiamo di cercare e cambiare anche queste due stringhe

Codice: Seleziona tutto

package_kernel26() {

(...)

package_kernel26-headers() {
Sempre aggiungendo il nostro pippo

Codice: Seleziona tutto

package_kernel26-pippo() {

(...)

package_kernel26-headers-pippo() {
A meno che non siamo cosi' bravi da voler personalizzare le configurazioni del kernel (io non lo sono), lasciamole stare. Noi vogliamo il kernel che ci ha funzionato bene fin'ora, senza rischiare, e limitarci ad applicare la patch. Per fare questo bisogna aggiungere ai sorgenti la patch che vogliamo applicare. Quindi queste righe del PKBUILD

Codice: Seleziona tutto

source=(ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-$_basekernel.tar.bz2
        [url]ftp://ftp.archlinux.org/other/kernel26/${_patchname}.bz2[/url]
        # the main kernel config files
        config config.x86_64
        # standard config files for mkinitcpio ramdisk
        kernel26.preset)
aggiungendo ir.patch in fondo diventano così:

Codice: Seleziona tutto

source=(ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-$_basekernel.tar.bz2
        [url]ftp://ftp.archlinux.org/other/kernel26/${_patchname}.bz2[/url]
        # the main kernel config files
        config config.x86_64
        # standard config files for mkinitcpio ramdisk
        kernel26.preset
        ir.patch)
Ok, a questo punto dobbiamo definire il comando per applicare anche la nostra patch oltre a quelle normali di arch. cerchiamo queste righe sempre nel PKGBUILD:

Codice: Seleziona tutto

  # Add -ARCH patches
  # See [url]http://projects.archlinux.org/linux-2.6-ARCH.git/[/url]
  patch -Np1 -i ${srcdir}/${_patchname}
a ci aggiungiamo il comando per applicare la nostra patch personalizzata:

Codice: Seleziona tutto

  # Add -ARCH patches
  # See [url]http://projects.archlinux.org/linux-2.6-ARCH.git/[/url]
  patch -Np1 -i ${srcdir}/${_patchname}
  patch -Np1 -i ../ir.patch # riga aggiunta
Saremmo gia' pronti per partire con la compilazione ma giustamente il PKGBUILD prima di questo fa un controllo sull'integrita' dei file per verificare che durante lo scaricamento (anche se in questo caso non serve perchè il file è locala) non si siano corrotti e quindi bisogna generare e aggiungere nel PKGBUILD la stringa di verifica. Chiudiamo il nostro PKGBUILD quasi pronto e facciamo generare le stringhe di verifica:

Codice: Seleziona tutto

$makepkg -g
md5sums=('61f3739a73afb6914cb007f37fb09b62'
         '6f13e6e06453f58ab1272cf2beb1877d'
         '1ed53b9b64b8889563502177b0b428b5'
         '89ba24b9c346a930378ca22cf377c75f'
         '25584700a0a679542929c4bed31433b6'
         'aae30c8859ccc7cd890fbcbddac8e48f')
se riapriamo il nostro PKGBUILD notiamo che le ci sono solo 5 stringhe md5sums. La sesta e' stata generata perche' noi in precedenza abbiamo aggiunto nei file sorgenti la nostra patch personalizzata. Riapriamo e aggiungiamo la stringa di verifica del nostro file.

Codice: Seleziona tutto

$nano PKGBUILD
md5sums=('61f3739a73afb6914cb007f37fb09b62'
         '6f13e6e06453f58ab1272cf2beb1877d'
         '1ed53b9b64b8889563502177b0b428b5'
         '89ba24b9c346a930378ca22cf377c75f'
         '25584700a0a679542929c4bed31433b6'
         'aae30c8859ccc7cd890fbcbddac8e48f') #stringa da aggiungere (attenzione alle parentesi)
Bene, siamo pronti per partire:

Codice: Seleziona tutto

makepkg
Andate a fervi una passeggiata perche' se va tutto bene non e' cosa breve. Alla fine della compilazione il PKGBUILD ha appunto costruite il pacchetto binario pronto per essere installato con il nostro amato pacman:

Codice: Seleziona tutto

sudo pacman -U kernel26-pippo-2.6.36.1-3-x86_64.pkg.tar.xz
anzi, gli abbiamo detto di crearne due, anche quello per i sorgenti:

Codice: Seleziona tutto

sudo pacman -U kernel26-headers-pippo-2.6.36.1-3-x86_64.pkg.tar.xz
Per usufruire del nostro nuovo fiammante kernel patchato basta editare il file di configurazione di grub in modo da rendere possibile e facile la scelta di quale kernel caricare all'avvio

Codice: Seleziona tutto

sudo nano /boot/grub/menu.lst
Poniamo che attualmente ci siano 3 possibilita':

Codice: Seleziona tutto

# (0) Arch Linux
title  Arch Linux
root   (hd0,1)
kernel /boot/vmlinuz26 root=/dev/disk/by-label/linux ro i915.modeset=1
initrd /boot/kernel26.img

# (1) Arch Linux
title  Arch Linux Fallback
root   (hd0,1)
kernel /boot/vmlinuz26 root=/dev/disk/by-label/linux ro
initrd /boot/kernel26-fallback.img

# (2) Windows
title Windows
rootnoverify (hd0,0)
makeactive
chainloader +1
Noi dobbiamo aggiungerne 2 copiando e incollando (per fare questo e' forse piu' comodo gedit o simili) e cambiando solo piccoli dettagli come i nomi con cui compaiono (opzionale ma suggerito) nel menu e sopratutto i percorsi dei file a cui puntano. Alla fine diventa una cose del genere:

Codice: Seleziona tutto

# (0) Arch Linux
title  Arch Linux
root   (hd0,1)
kernel /boot/vmlinuz26 root=/dev/disk/by-label/linux ro i915.modeset=1
initrd /boot/kernel26.img

# (1) Arch Linux
title  Arch Linux Fallback
root   (hd0,1)
kernel /boot/vmlinuz26 root=/dev/disk/by-label/linux ro
initrd /boot/kernel26-fallback.img

# (2) Windows
title Windows
rootnoverify (hd0,0)
makeactive
chainloader +1

# (3) kernel patchato
title  Arch Linux patchato
root   (hd0,1)
kernel /boot/vmlinuz26-pippo root=/dev/disk/by-label/linux ro i915.modeset=1
initrd /boot/kernel26-pippo.img

# (4) kernel patchato di fallback
title  Arch Linux Fallback patchato
root   (hd0,1)
kernel /boot/vmlinuz26-pippo root=/dev/disk/by-label/linux ro
initrd /boot/kernel26-fallback-pippo.img
Se vogliamo possiamo darci piu' tempo per scegliere all'avvio e cambiare il kernel predefinito cambiando nello stesso file /boot/grub/menu.lst queste righe:

Codice: Seleziona tutto

# general configuration:
timeout   5
default   0
con queste

Codice: Seleziona tutto

# general configuration:
timeout   10
default   3
In questo modo se entro 10 secondi non viene scelto diversamente grub carica il kernel patchato che e' l'item n.3 della lista (partendo da 0)

La cosa bella e' che il kernel patchato e' perfettamente gestito dai nostri strumenti di gestione dei pacchetti

Codice: Seleziona tutto

$yaourt -Qma
local/kernel26-headers-ir2 2.6.36.1-3
local/kernel26-ir2 2.6.36.1-3
Il sistema e' consapevole di avere questi pacchetti che sono evidenziati come locali perche' li abbiamo fatti noi e non vengono gestiti dai repository online.
In qualsiasi momento a da qualsiasi posto li possiamo disinstallare entrambi con un bel

Codice: Seleziona tutto

sudo pacman -R kernel26-pippo kernel26-headers-pippo
e a questo punto rimane solo da ripulire /boot/grub/menu.lst dalle entrate in piu' che dopo la disinstallazione darebbero errore perche i file mancano.

Pulito, semplice, facile, kiss... the arch way!
Ultima modifica di stele il 3 dicembre 2010, 22:06, modificato 1 volta in totale.
penryn - linux - arch - gnome
arm - linux - arch - lxde

Avatar utente
Berseker
Amministratore
Messaggi: 4432
Iscritto il: 27 settembre 2007, 10:18
Architettura: x86_64 (64bit)
Località: Lecco (provincia)

Messaggio da Berseker » 3 dicembre 2010, 20:44

bravo, lo metto in evidenza perlomeno per un po' ;)
Leggete il Regolamento e cercate sempre su googleforumwiki prima di chiedere.
Tag x thread risolti: [Risolto] + Spazio messo all'inizio del titolo. Grazie

ArchWiki / Board Internazionale / Blog

Trust
Newbie
Messaggi: 22
Iscritto il: 29 novembre 2011, 13:28

Messaggio da Trust » 1 dicembre 2011, 9:18

stele ha scritto: A meno che non siamo cosi' bravi da voler personalizzare le configurazioni del kernel (io non lo sono), lasciamole stare.
E se invece volessimo mettere mano alle configurazioni del kernel? Esiste una qualche guida da seguire?
Mi piacerebbe imparare a compilarmi il kernel in modo da ottimizzarlo per il mio pc :)

Avatar utente
4javier
Moderatore
Messaggi: 9541
Iscritto il: 5 ottobre 2008, 17:19
Architettura: x86_64 (64bit)

Messaggio da 4javier » 1 dicembre 2011, 12:53

Offertissima: Mi Vendo!!! Cercasi lavoro o corso di formazione finanziato in tutta italia da Roma in su, oppure in provincia di Catanzaro.
In particolare sono interessato ad opportunità su Roma.

Trust
Newbie
Messaggi: 22
Iscritto il: 29 novembre 2011, 13:28

Messaggio da Trust » 1 dicembre 2011, 13:29

Ho già letto la guida sul wiki. In particolare mi interesserebbe capire come creare il .config menzionato proprio nel wiki.
Dovrebbe essere il file che passa i vari parametri per la configurazione del kernel, giusto?

Avatar utente
4javier
Moderatore
Messaggi: 9541
Iscritto il: 5 ottobre 2008, 17:19
Architettura: x86_64 (64bit)

Messaggio da 4javier » 1 dicembre 2011, 13:52

leggi bene il paragrafo che ti ho linkato.
Offertissima: Mi Vendo!!! Cercasi lavoro o corso di formazione finanziato in tutta italia da Roma in su, oppure in provincia di Catanzaro.
In particolare sono interessato ad opportunità su Roma.

Trust
Newbie
Messaggi: 22
Iscritto il: 29 novembre 2011, 13:28

Messaggio da Trust » 1 dicembre 2011, 13:57

Codice: Seleziona tutto

PKGBUILD
...
  # load configuration
  # Configure the kernel. Replace the line below with one of your choice.
  #make menuconfig # CLI menu for configuration
  make nconfig # new CLI menu for configuration
  #make xconfig # X-based configuration
  #make oldconfig # using old config from previous kernel version
  # ... or manually edit .config
...
Fin qui ci siamo. E dopo?
Parte un tool per configurare il kernel dopo che lancio makepkg? Se è così, esiste una guida che spieghi come impostare le opzioni proposte?

Avatar utente
4javier
Moderatore
Messaggi: 9541
Iscritto il: 5 ottobre 2008, 17:19
Architettura: x86_64 (64bit)

Messaggio da 4javier » 1 dicembre 2011, 14:57

Si, parte il tool che hai scelto nel pkgbuild. Le opzioni proposte sono una infinità, dubito ci sia qualcuno che le conosca tutte :/
Fondamentalmente ti chiede di specificare quale funzioni del kernel vuoi abilitare, e se vuoi che siano compilate staticamente o come modulo.
Offertissima: Mi Vendo!!! Cercasi lavoro o corso di formazione finanziato in tutta italia da Roma in su, oppure in provincia di Catanzaro.
In particolare sono interessato ad opportunità su Roma.

Trust
Newbie
Messaggi: 22
Iscritto il: 29 novembre 2011, 13:28

Messaggio da Trust » 1 dicembre 2011, 15:02

4javier ha scritto:Si, parte il tool che hai scelto nel pkgbuild. Le opzioni proposte sono una infinità, dubito ci sia qualcuno che le conosca tutte :/
Fondamentalmente ti chiede di specificare quale funzioni del kernel vuoi abilitare, e se vuoi che siano compilate staticamente o come modulo.
Quali sono le opzioni principali?
E cosa conviene compilare staticamente e cosa come modulo? Parto proprio da zero :P

Ecco mi piacerebbe una guida del genere. Stasera comunque magari faccio una prova, così testo con mano ;)

Avatar utente
ambro
Robin Hood
Messaggi: 1933
Iscritto il: 27 agosto 2009, 21:37
Località: Verona

Messaggio da ambro » 2 dicembre 2011, 0:42

Guarda qui, può darti qualche idea http://www.edmondweblog.com/index.php/2 ... o-hardware
PC: Amd FX-6100-Nvidia GT630-SSD- 64bit - kernel 4.3-ck - KDE Plasma 5
Mediacenter: Asrock Q2900 Itx - VGA Intel - 64bit - kernel 4.3-ck - lxde - Kodi - isengard
Netbook: Asus eeepc1001 - i686 - kernel 4.3 - lxde

Trust
Newbie
Messaggi: 22
Iscritto il: 29 novembre 2011, 13:28

Messaggio da Trust » 2 dicembre 2011, 8:47

ambro ha scritto:Guarda qui, può darti qualche idea http://www.edmondweblog.com/index.php/2 ... o-hardware
Grazie, ci darò un' occhiata ;)

Rispondi