Next: API pre vytváranie obrazov systému Guix, Previous: Automatické pripojenie k určitému TTY, Up: Nastavenie systému [Contents][Index]
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 version)))
...)
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 version) `(;; 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) version))) (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))
In the above example %file-systems
is a collection of flags enabling
different file system support, %efi-support
enables EFI support and
%emulation
enables a x86_64-linux machine to act in 32-bit mode
also. The default-extra-linux-options
procedure is the one defined
above, which had to be used to avoid loosing the default configuration
options of the extra-options
keyword.
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]