Próximo: , Anterior: , Acima: Configuração do sistema   [Conteúdo][Índice]


3.3 API de imagem do sistema Guix

Historicamente, o Sistema Guix é centrado em uma estrutura operating-system. Esta estrutura contém vários campos que vão desde o gerenciador de boot e a declaração do kernel até os serviços a serem instalados.

Dependendo da máquina de destino, que pode ir de uma máquina x86_64 padrão a um pequeno computador de placa única ARM, como o Pine64, as restrições de imagem podem variar muito. Os fabricantes de hardware imporão diferentes formatos de imagem com vários tamanhos de partição e deslocamentos.

Para criar imagens adequadas para todas essas máquinas, é necessária uma nova abstração: esse é o objetivo do registro image. Este registro contém todas as informações necessárias para ser transformada em uma imagem autônoma, que pode ser inicializada diretamente em qualquer máquina de destino.

(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)))

Este registro contém o sistema operacional a ser instanciado. O campo format define o tipo de imagem e pode ser efi-raw, qcow2 ou iso9660 por exemplo. No futuro, poderá ser estendido para docker ou outros tipos de imagem.

Um novo diretório nas fontes do Guix é dedicado à definição de imagens. Por enquanto existem quatro arquivos:

Vamos dar uma olhada em pine64.scm. Ele contém a variável pine64-barebones-os que é uma definição mínima de um sistema operacional dedicado à placa Pine A64 LTS.

(define pine64-barebones-os
  (operating-system
   (host-name "vignemale")
   (timezone "Europe/Paris")
   (locale "en_US.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 "my-root"))
                        (mount-point "/")
                        (type "ext4"))
                       %base-file-systems))
   (services (cons (service agetty-service-type
                            (agetty-configuration
                             (extra-options '("-L")) ; no carrier detect
                             (baud-rate "115200")
                             (term "vt100")
                             (tty "ttyS0")))
                   %base-services))))

Os campos kernel e bootloader apontam para pacotes dedicados a esta placa.

Logo abaixo, a variável pine64-image-type também está definida.

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

Ele está usando um registro do qual ainda não falamos, o registro image-type, definido desta forma:

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

O objetivo principal deste registro é associar um nome a um procedimento que transforma um isso é necessário, vamos dar uma olhada no comando que produz uma imagem de um arquivo de configuração operating-system:

guix system image my-os.scm

Este comando espera uma configuração operating-system mas como devemos indicar que queremos uma imagem direcionada a uma placa Pine64? Precisamos fornecer uma informação extra, o image-type, passando o sinalizador --image-type ou -t, desta forma:

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

Este parâmetro image-type aponta para o pine64-image-type definido acima. Portanto, ao operating-system declarado em my-os.scm será aplicado o procedimento (cut image-with-os arm64-disk-image <>) para transformá-lo em um imagem.

A imagem resultante se parece com:

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

que é a agregação do operating-system definido em my-os.scm ao registro arm64-disk-image.

Mas chega de loucura do esquema. O que essa API de imagem traz para o usuário do Guix?

Pode-se executar:

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

   - unmatched-raw
   - rock64-raw
   - pinebook-pro-raw
   - pine64-raw
   - novena-raw
   - hurd-raw
   - hurd-qcow2
   - qcow2
   - iso9660
   - uncompressed-iso9660
   - tarball
   - efi-raw
   - mbr-raw
   - docker
   - wsl2
   - raw-with-offset
   - efi32-raw

e escrevendo um arquivo operating-system baseado em pine64-barebones-os, você pode personalizar sua imagem de acordo com suas preferências em um arquivo (my-pine-os.scm) como este :

(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)))))

execute:

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

ou,

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

para obter uma imagem que pode ser gravada diretamente em um disco rígido e inicializada.

Sem alterar nada em my-hurd-os.scm, chamando:

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

em vez disso, produzirá uma imagem Hurd QEMU.


Próximo: Usando chaves de segurança, Anterior: Customizando o Kernel, Acima: Configuração do sistema   [Conteúdo][Índice]