LAB4-C. Primjena Linuxa uz PREEMPT_RT postavku jezgre


Osnovni problem primjene jezgre Linuxa u sustavima za SRSV jest što je jezgra Linuxa monolitna, tj. operacije jezgre mogu obuhvaćati dosta posla pa time i duže trajati. Duže trajanje izvođenja jezgrine funkcije znači da (za jednoprocesorske sustave) on za to vrijeme neće prihvaćati prekide.

Već dvadesetak godina postoji dodatak zvan "PREEMPT_RT patch" koji kad se primjeni na izvorni kod jezgre Linuxa pokuša ispraviti neke od tih nedostataka dodavajući točke prekida u kod. Međutim, taj dodatak je do sada bio izvan strukture službenog koda jezgre, što znači da su osobe koje su taj dodatak održavale morale ažurirati taj kod pri svakoj promjeni koda jezgre Linuxa. Naravno da to nije rađeno baš za svaku inačicu jezgre već tek povremeno. Od inačice jezgre 6.12 taj dodatak je postao službenim dijelom izvorna koda jezgre Linuxa što će u budućnosti značiti da se ne treba zasebno održavati. Svaka promjena jezgre će sada uzimati u obzir i taj nadodani kod i po potrebi prilagođavati se njemu.


Zadatak ove vježbe je prevesti jezgru Linuxa dodavanjem potrebnih zastavica da se uključi nadodani kod uz PREEMPT_RT, pokrenuti sustav s tom novom jezgrom, te istražiti promjene koje su time uključene u kod. Izdvojiti nekoliko njih (3-4) i kratko ih opisati.

Minimalno što treba ostvariti:

  1. izgraditi jezgru korištenjem tog dodatka i pokazati da sustav radi
  2. istražiti promjene koje ta postavka mijenja u jezgri (tražiti CONFIG_PREEMPT_RT u kodu, npr. preko elixir.bootlin.com) - kratko opisati 3-4 (netrivijalne) promjene u kodu koje poboljšavaju svojstva jezgre (ili ispitati sustav kao u B.2.)

Kuharice kako izgraditi novu jezgru iz izvorna koda lako pronaći na webu. Neke od njih su navedene među linkovima ispod.

Ukratko, potrebno je nekoliko koraka

  1. Pripremiti Linux s dosta slobodna prostora na disku
    • Izvorni kod, prevođenje te instalacija nove jezgre zahtjeva dodatnih skoro 30 GB prostora na disku!
    • Već pripremljena slika (za ostale vježbe) nema dovoljno velik disk!
    • Ali se on može povećati. Postaviti na minimalno 50 GB (možda i 60 GB).
    • Upute za to ako se koristi VMware su ovdje. Ukratko: dok je virtualno računalo ugašeno, preko postaviki "Edit Virtual Machine Settings" odabrati "Hard Disk" te "Utilities > Expand.
    • Pokrenuti virtualno računalo.
    • U Linuxu povećati tu particiju (npr. "Pomagala->Diskovi->odabrati disk te postavke (gumb s okruglim znakom za postavke) i tamo "Promjena veličine" (slajder povući skroz desno).
    • Nakon promjene najbolje restartati virutalno računalo
  2. Instalirati sve potrebne alate
    sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
    
  3. Dohvatiti izvorni kod željene inačice jezgre (u prikazanom primjeru je to 6.12.8)
    wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.8.tar.xz
    tar xvf linux-6.12.8.tar.xz
    cd linux-6.12.8
    
  4. Postaviti željene postavke
    • za početak dohvatiti postojeće postavke
      cp -v /boot/config-$(uname -r)* .config
      
    • napraviti potrebne promjene (npr. uključiti CONFIG_PREEMPT_RT)
      scripts/config --disable DEBUG_INFO
      scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
      scripts/config --set-str SYSTEM_REVOCATION_KEYS ""
      
      scripts/config --enable CONFIG_PREEMPT_RT
      #ili preko "make menuconfig" te:
      # General Setup -> Preemption Model -> Fully Preemptible Kernel (Real-Time)
      
  5. Pokrenuti prevođenje
    make        (ili make -j4 ili make -j`nproc`, ali ne pretjerivati, treba i memorije!)
    
    • Prevođenje može potrajati!
    • Novije računalo to možda može obaviti za 15-30 min, ali starija će trebati možda i nekoliko sati!

  6. Primijeniti novo izgrađenu jezgru i module
    sudo make modules_install
    sudo make install
    
  7. Ponovno pokrenuti sustav i odabrati novu jezgru (tj. vjerojatno je već postavljena kao zadana)
  8. Provjeriti je li zaista pokrenuta inačica jezgre
    uname -a
    
    • U ispisu treba biti navedena inačica jezgre (broj 6.12.8 za ovaj primjer) te oznake jezgre (#1 SMP PREEMPT_RT)

  9. Nova jezgra nije brža! Ali bi trebala imati ima kraće vrijeme odziva, možda veću granulaciju sata za alarme, ...


Korisni linkovi: