Zelf een real-time kernel bouwen voor Ubuntu 12.04

De real-time kernel uit de PPA van Alessio Bogani liep bij mij nog wel eens vast dus heb ik er zelf een gebouwd met de meest recente 3.2 kernel en bijbehorende RT patchset. En dit draait een stuk stabieler, nog geen lockups gehad.

Een eigen kernel bouwen is gelukkig nog steeds niet zo heel moeilijk, met Ubuntu kun je zelfs heel gemakkelijk pakketten maken met behulp van de make-kpkg utility. Na wat googlen kwam ik onderstaande handleiding tegen en simpeler kan het bijna niet.

Installeer de benodigde pakketten:

sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev

Download de kernel sources en de RT patchset:

mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget -c http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.2.28.tar.bz2
wget -c
http://www.kernel.org/pub/linux/kernel/projects/rt/3.2/patch-3.2.28-rt42.patch.bz2

Pak de kernel sources uit en patch deze met de RT patchset:

tar xjvf linux-3.2.28.tar.bz2
cd linux-3.2.28
patch -p1 < <(bunzip2 -c ../patch-3.2.28-rt42.patch.bz2)

Nu moet je de kernel nog configureren. De gemakkelijkste manier is om een bestaande kernel config te nemen, deze staan in de /boot directory van je systeem. Kopieer een config naar je werkdirectory en gebruik deze als uitgangspunt:

cp /boot/config-$(uname -r) .config

Dit commando kopieert de kernel config van de kernel die je op dat moment gebruikt. Je kunt ook de config van een andere kernel gebruiken, bijv. die van de Ubuntu lowlatency kernel aangezien deze al geoptimaliseerd is voor Linux audio toepassingen. De volgende stap is om een kernel config aan te maken met full preemption ingeschakeld aan de hand van de gekopieerde kernel config:

make oldconfig

Je kunt alle prompts wegklikken met Enter, behalve de prompt welk Preemption Model je wilt gebruiken. Selecteer daar 5 (Fully Preemtible Kernel):

Preemption Model
> 1. No Forced Preemption (Server) (PREEMPT_NONE)
  2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
  3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT__LL) (NEW)
  4. Preemptible Kernel (Basic RT) (PREEMPT_RTB) (NEW)
  5. Fully Preemptible Kernel (RT) (PREEMPT_RT_FULL) (NEW)
choice[1-5]: 5 <Enter>

Workaround voor https://bugs.launchpad.net/ubuntu/+source/kernel-package/+bug/602405:

sed -rie 's/echo "+"/#echo "+"/' scripts/setlocalversion

Nu kun je de kernel gaan bouwen:

make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg
--initrd --revision=0 kernel_image kernel_headers

Als het bouwen klaar is (kan een tijd duren) kun je de kernel pakketjes installeren:

cd ..
sudo dpkg -i linux-{headers,image}-3.2.28-rt42_0_*.deb

Rebooten, nieuwe real-time kernel selecteren in je bootloader (GRUB) en je systeem zou nu moeten booten met de net gebouwde real-time kernel.

Zelf een real-time kernel bouwen voor Ubuntu 12.04

5 thoughts on “Zelf een real-time kernel bouwen voor Ubuntu 12.04

  1. Back in the days kernel 2.0.x compileren op je 486 nadat je er een halve dag over had gedaan om de tarball te downloaden, dat was pas stoer 😉

  2. Ewout says:

    Hai,

    Ik heb ook geprobeerd zelf een real-time kernel te bouwen. Ik volg de stappen zoals hierboven en dat loopt gesmeerd totdat ik de kernel wil bouwen.
    Na “CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg
    –initrd –revision=0 kernel_image kernel_headers”

    Krijg ik:
    “getopt: onbekende optie ‘–initrd’
    getopt: onbekende optie ‘–revision=0’
    fakeroot, create a fake root environment.
    usage: fakeroot [-l|–lib fakerootlib] [-f|–faked fakedbin]
    [-i file] [-s file] [-u|–unknown-is-real]
    [-b|–fd-base fd] [-h|–help] [-v|–version]
    [–] [command]”

    Met mijn kennis stopt het hier en heb ik geen idee wat fout loopt en wat ik kan doen. Ik gebruik overigens Xubuntu 12.04.

    Btw, Jeremy, hulde voor je blog. Je gedeelde kennis wordt door mij erg gewaardeerd!

    Alvast dank voor enige hulp.

  3. Ewout says:

    Een wat late reactie ivm vakantie.
    Ik heb het nogmaals geprobeerd, nu helemaal vanaf het begin. Nu ook gelet op dat ik de streepjes voor “initrd” en “revision=0” goed kopieer en plak. Maar het werkt nog steeds niet. Het lijkt naar mijn idee dat de commando’s @–initrd@ en @–revision=0@ niet worden herkend, of zoiets.
    Tenzij je direct de oorzaak ziet, laat ik het even rusten. Ik heb nu niet direct een real-time kernel nodig en heb ook niet zoveel tijd om hiermee bezig te zijn.
    I.e.g. bedankt voor je hulp.

Leave a Reply

Your email address will not be published.