Next: , Previous: , Up: Nastavenie systému   [Contents][Index]


3.2 Prispôsobenie jadra

Guix je, vo svojom jadre, distribúcia založená na zdrojových súboroch a náhradách (see Substitutes in GNU Guix Reference Manual). Zostavovanie balíkov z ich zdrojových súborov je teda prirodzenou súčasťou inštalácie a aktualizácie balíkov. Vzhľadom na túto skutočnosť dáva zmysel snaha o zníženie množstva času potrebného na zostavenie balíkov a nedávne zmeny v zostavovaní a šírení náhrad sú aj naďalej súčasťou rozhovorov vrámci projektu Guix.

Aj keď nevyžaduje veľké množstvo pamäte RAM, zostavenie jadra na priemerných počítačoch môže trvať veľmi dlho. Oficiálne nastavenie jadra, tak ako je to v prípade mnohých iných distribúcií GNU/Linuxu, sa prikláňa k širšej ponuke súčastí a to je to, čo spôsobuje, že zostavenie jadra zo zdrojových súborov trvá tak dlho.

Avšak, aj samotné jadro Linuxu možno opísať ako balík a teda prispôsobiť ho rovnako ako hociktorý iný balík. Postup je mierne odlišný, aj keď hlavne kvôli tomu ako je zadanie balíka napísané.

Balík jadra linux-libre je vlastne funkcia tvoriaca balík.

(define* (make-linux-libre* version gnu-revision source supported-systems
                            #:key
                            (extra-version #f)
                            ;; Funkcia vyžadujúca označenie a druh architektúry.
                            ;; Viď príklad v kernel-config.
                            (configuration-file #f)
                            (defconfig "defconfig")
                            (extra-options %default-extra-linux-options))
  ...)

Terajší balík linux-libre pre vydania 5.15.x je zadaný nasledovne:

(define-public linux-libre-5.15
  (make-linux-libre* linux-libre-5.15-version
                     linux-libre-5.15-gnu-revision
                     linux-libre-5.15-source
                     '("x86_64-linux" "i686-linux" "armhf-linux" "aarch64-linux" "riscv64-linux")
                     #:configuration-file kernel-config))

Kľúče, ktoré nemajú pridelenú hodnotu dedia ich predvolenú hodnotu zo zadania make-linux-libre. Pri porovnávaní vyššie uvedených úryvkov zdrojového kódu si všimnite komentár odvolávajúci sa na #:configuration-file. Kvôli tomu vlastne nie je jednoduché zahrnúť do zadania svoje vlastné nastavenie jadra, ale nezúfajte, pretože jestvujú ďalšie spôsoby ako pracovať s tým čo máme.

Jestvujú dva spôsoby ako vytvoriť jadro s vlastným nastavením. Prvý je poskytnúť zvyčajný súbor .config počas zostavenia zahrnutím tohto súboru do pôvodných vstupov nášho vlastného jadra. Nižšie je uvedený úryvok kódu vlastného 'configure kroku zo zadania balíka make-linux-libre:

(let ((build  (assoc-ref %standard-phases 'build))
      (config (assoc-ref (or native-inputs inputs) "kconfig")))

  ;; Použiť vlastný alebo predvolený súbor
  ;; nastavenia jadra.
  (if config
      (begin
        (copy-file config ".config")
        (chmod ".config" #o666))
      (invoke "make" ,defconfig)))

Tu je príklad balíka jadra. Balík linux-libre nie je ničím výnimočný, môžeme ho zdediť a nahradiť jeho pôvodné polia ako pri hociktorom inom balíku:

(define-public linux-libre/E2140
  (package
    (inherit linux-libre)
    (native-inputs
     `(("kconfig" ,(local-file "E2140.config"))
      ,@(alist-delete "kconfig"
                      (package-native-inputs linux-libre))))))

V rovnakom priečinku, kde je súbor zadávajúci linux-libre-E2140 je aj súbor s názvom E2140.config, ktorý predstavuje súbor nastavenia jadra. Kľúčové slovo defconfig funkcie make-linux-libre je tu ponechané prázdne, takže jediné nastavenie jadra v balíku je to, ktoré bolo zahrnuté do poľa native-inputs.

Druhý spôsob ako vytvoriť vlastné jadro je dať novú hodnotu kľúčovému slovu extra-options funkcie make-linux-libre. Kľúčové slovo extra-options funguje s inou funkciou zadanou nižšie:

(define %default-extra-linux-options
  `(;; https://lists.gnu.org/archive/html/guix-devel/2014-04/msg00039.html
   ("CONFIG_DEVPTS_MULTIPLE_INSTANCES" . #true)
   ;; Moduly potrebné pre initrd:
   ("CONFIG_NET_9P" . m)
   ("CONFIG_NET_9P_VIRTIO" . m)
   ("CONFIG_VIRTIO_BLK" . m)
   ("CONFIG_VIRTIO_NET" . m)
   ("CONFIG_VIRTIO_PCI" . m)
   ("CONFIG_VIRTIO_BALLOON" . m)
   ("CONFIG_VIRTIO_MMIO" . m)
   ("CONFIG_FUSE_FS" . m)
   ("CONFIG_CIFS" . m)
   ("CONFIG_9P_FS" . m)))

(define (config->string options)
  (string-join (map (match-lambda
                      ((option . 'm)
                       (string-append option "=m"))
                      ((option . #true)
                       (string-append option "=y"))
                      ((option . #false)
                       (string-append option "=n")))
                    options)
               "\n"))

A vo vlastnom „configure“ skripte balíka „make-linux-libre“:

;; Vkladanie na koniec funguje aj keď voľba v súbore nebola.
;; Pri viacnásobnom uvedení prevažuje to posledné.
(let ((port (open-file ".config" "a"))
      (extra-configuration ,(config->string extra-options)))
  (display extra-configuration port)
  (close-port port))

(invoke "make" "oldconfig")

Takže, neposkytnutie súboru nastavenia spôsobí, že je súbor .config spočiatku prázdny. Potom doň zapíšeme voľby, ktoré chceme. Viď ďalšie vlastné zadanie jadra:

(define %macbook41-full-config
  (append %macbook41-config-options
          %file-systems
          %efi-support
          %emulation
          (@@ (gnu packages linux) %default-extra-linux-options)))

(define-public linux-libre-macbook41
  ;; XXX: Prístup k funkcii „make-linux-libre*“, ktorá je súkromná,
  ;; neexportuje sa a v budúcnosti by sa mohla zmeniť.
  ((@@ (gnu packages linux) make-linux-libre*)
   (@@ (gnu packages linux) linux-libre-version)
   (@@ (gnu packages linux) linux-libre-gnu-revision)
   (@@ (gnu packages linux) linux-libre-source)
   '("x86_64-linux")
   #:extra-version "macbook41"
   #:extra-options %macbook41-config-options))

V hore uvedenom príklade je %file-systems zbierkou volieb povoľujúcich podporu rôznych systémov súborov, %efi-support povoľuje podporu EFI a %emulation povoľuje strojom x86_64-linux pracovať v 32-bitovom režime. Voľby %default-extra-linux-options sú tie citované vyššie, ktoré bolo treba pridať, keďže boli prepísané v kľúčovom slove extra-options.

Všetko toto znie veľmi dobre, ale ako zistiť, ktoré moduly vyžaduje určitý systém? Na túto otázku nám môžu pomôcť odpovedať dva zdroje: Príručka Gentoo a dokumentácia samotného jadra. Podľa dokumentácie jadra sa zdá, že make localmodconfig je príkaz, ktorý hľadáme.

Skôr ako budeme môcť spustiť make localmodconfig, musíme stiahnuť a rozbaliť zdrojové súbory jadra:

tar xf $(guix build linux-libre --source)

V priečinku obsahujúcom zdrojové súbory spustite touch .config pre vytvorenie počiatočného prázdneho .config súboru. make localmodconfig funguje tak, že zistí, čo ste už zadali do .config a povie vám, čo vám ešte chýba. Ak je súbor prázdny, tak vám chýba všetko. Ďalším krokom je spustiť:

guix shell -D linux-libre -- make localmodconfig

a pozrite si výstup. Všimnite si, že súbor .config je stále prázdny. Výstup obvykle obsahuje dva druhy varovných správ. Prvá začína slovom „WARNING“ a v našom prípade si ju nemusíme všímať. Druhá správa nám hovorí, že:

module pcspkr did not have configs CONFIG_INPUT_PCSPKR

Pre každý z týchto riadkov skopírujte časť CONFIG_XXXX_XXXX do .config súboru priečinka a pridajte =m tak, aby nakoniec vyzeral takto:

CONFIG_INPUT_PCSPKR=m
CONFIG_VIRTIO=m

Po skopírovaní všetkých volieb nastavenia znova spustite make localmodconfig, aby ste sa uistili, že výstup už neobsahuje žiadne správy začínajúce slovom „module“. Okrem všetkých týchto modulov vzťahujúcich sa k stroju nám ostáva ešte niekoľko ďalších dôležitých modulov. CONFIG_MODULES umožňuje zostavovať a načítavať moduly oddelene, aby nemuseli byť zabudované do jadra. CONFIG_BLK_DEV_SD umožňuje čítať pevné disky. Je tiež možné, že budete potrebovať aj iné moduly.

Tento príspevok nemá za úlohu vás previesť nastavením vášho vlastného jadra. Ak sa rozhodnete zostaviť si vlastné jadro, budete si musieť nájsť iné návody na vytvorenie jadra, ktoré vám bude vyhovovať.

Druhý spôsob nastavenia jadra využíva funkcie Guixu vo väčšej miere a umožňuje vám zdieľať časti nastavenia medzi rôznymi jadrami. Napríklad, všetky stroje používajúce na zavádzanie EFI vyžadujú určitý počet volieb nastavenia EFI. Je tiež pravdepodobné, že viaceré jadrá budú zdieľať podporu niekoľkých súborových systémov. Použitím premenných je jednoduchšie spozorovať, ktoré súčasti sú povolené a uistiť sa, či nie sú niektoré z nich prítomné v jednom jadre ale v druhom chýbajú.

Nepozreli sme sa však na initrd a jeho prispôsobenie. Je pravdepodobné, že budete potrebovať prispôsobiť initrd na stroji s vlastným jadrom, keďže niektoré moduly nemusia byť dostupné pre zahrnutie do initrd.


Next: API pre vytváranie obrazov systému Guix, Previous: Automatické pripojenie k určitému TTY, Up: Nastavenie systému   [Contents][Index]