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


3.3 API pre vytváranie obrazov systému Guix

Z dejinného pohľadu je systém Guix sústredený okolo štruktúry operating-system. Táto štruktúra obsahuje rôzne polia počínajúc zadaním zavádzača a jadra až k službám, ktoré sa majú nainštalovať.

Požiadavky na obraz sa môžu značne líšiť v závislosti na cieľovom stroji, čo môže byť obvyklý x86_64 alebo malý jednodoskový počítač ako Pine64. Výrobcovia technického vybavenia presadzujú rôzne formáty obrazov s rôznymi veľkosťami a umiestneniami oddielov.

Na vytváranie obrazov vhodných pre všetky tieto stroje je nevyhnutné ďalšie zovšeobecnenie, čo je cieľom záznamu image. Tento záznam obsahuje všetky potrebné údaje k premene na samostatný obraz, ktorý je možno priamo zaviesť na hocijakom cieľovom stroji.

(define-record-type* <image>
  image make-image
  image?
  (name               image-name ;symbol
                      (default #f))
  (format             image-format) ;symbol
  (target             image-target
                      (default #f))
  (size               image-size  ;size in bytes as integer
                      (default 'guess))
  (operating-system   image-operating-system  ;<operating-system>
                      (default #f))
  (partitions         image-partitions ;list of <partition>
                      (default '()))
  (compression?       image-compression? ;boolean
                      (default #t))
  (volatile-root?     image-volatile-root? ;boolean
                      (default #t))
  (substitutable?     image-substitutable? ;boolean
                      (default #t)))

Tento záznam obsahuje operačný systém na zostavenie. Pole format určuje druh obrazu a medzi jeho platné hodnoty patria efi-raw, qcow2 alebo iso9660. V budúcnosti by sa mohli rozšíriť o docker a ďalšie druhy obrazov.

Na zadávanie obrazov bol spomedzi zdrojových súborov Guixu vyhradený nový priečinok. Zatiaľ sa v ňom nachádzajú štyri súbory:

Pozrime sa na pine64.scm. Obsahuje premennú pine64-barebones-os predstavujúcu najmenšie možné zadanie operačného systému určeného pre dosku Pine A64 LTS.

(define pine64-barebones-os
  (operating-system
   (host-name "vignemale")
   (timezone "Europe/Bratislava")
   (locale "sk_SK.utf8")
   (bootloader (bootloader-configuration
                (bootloader u-boot-pine64-lts-bootloader)
                (targets '("/dev/vda"))))
   (initrd-modules '())
   (kernel linux-libre-arm64-generic)
   (file-systems (cons (file-system
                        (device (file-system-label "moj-korenovy-system"))
                        (mount-point "/")
                        (type "ext4"))
                       %base-file-systems))
   (services (cons (service agetty-service-type
                            (agetty-configuration
                             (extra-options '("-L")) ; bez zisťovania nosného signálu
                             (baud-rate "115200")
                             (term "vt100")
                             (tty "ttyS0")))
                   %base-services))))

Polia kernel a bootloader odkazujú na balíky určené pre túto dosku.

Tesne pod nimi je zadaná aj premenná pine64-image-type.

(define pine64-image-type
  (image-type
   (name 'pine64-raw)
   (constructor (cut image-with-os arm64-disk-image <>))))

Využíva záznam, o ktorom sme ešte nehovorili, a teda image-type, zadaný nasledovne:

(define-record-type* <image-type>
  image-type make-image-type
  image-type?
  (name           image-type-name) ; znak
  (constructor    image-type-constructor)) ; <operating-system> -> <image>

Hlavným účelom tohto záznamu je priradiť názov funkcii pretvárajúcej operating-system na obraz. Aby sme pochopili, prečo je to dôležité, pozrime sa na príkaz vytvárajúci obraz zo súboru nastavení operating-system:

guix system image moj-os.scm

Tento príkaz očakáva nastavenie druhu operating-system, ale ako by sme mali určiť, že chceme obraz pre dosku Pine64? Musíme poskytnúť doplňujúci údaj, image-type, pomocou voľby --image-type alebo -t a to takto:

guix system image --image-type=pine64-raw moj-os.scm

This image-type parameter points to the pine64-image-type defined above. Hence, the operating-system declared in my-os.scm will be applied the (cut image-with-os arm64-disk-image <>) procedure to turn it into an image.

The resulting image looks like:

(image
 (format 'disk-image)
 (target "aarch64-linux-gnu")
 (operating-system my-os)
 (partitions
  (list (partition
         (inherit root-partition)
         (offset root-offset)))))

which is the aggregation of the operating-system defined in my-os.scm to the arm64-disk-image record.

But enough Scheme madness. What does this image API bring to the Guix user?

One can run:

mathieu@cervin:~$ guix system --list-image-types
The available image types are:

   - pinebook-pro-raw
   - pine64-raw
   - novena-raw
   - hurd-raw
   - hurd-qcow2
   - qcow2
   - uncompressed-iso9660
   - efi-raw
   - arm64-raw
   - arm32-raw
   - iso9660

and by writing an operating-system file based on pine64-barebones-os, you can customize your image to your preferences in a file (my-pine-os.scm) like this:

(use-modules (gnu services linux)
             (gnu system images pine64))

(let ((base-os pine64-barebones-os))
  (operating-system
    (inherit base-os)
    (timezone "America/Indiana/Indianapolis")
    (services
     (cons
      (service earlyoom-service-type
               (earlyoom-configuration
                (prefer-regexp "icecat|chromium")))
      (operating-system-user-services base-os)))))

run:

guix system image --image-type=pine64-raw my-pine-os.scm

or,

guix system image --image-type=hurd-raw my-hurd-os.scm

to get an image that can be written directly to a hard drive and booted from.

Without changing anything to my-hurd-os.scm, calling:

guix system image --image-type=hurd-qcow2 my-hurd-os.scm

will instead produce a Hurd QEMU image.


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