Próximo: Usando chaves de segurança, Anterior: Customizando o Kernel, Acima: Configuração do sistema [Conteúdo][Índice]
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")) ; sem detecção de portadora
(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 Scheme. O que essa API de imagem traz para o usuário do Guix?
Pode-se executar:
mathieu@cervin:~$ guix system --list-image-types Os tipos de imagem disponíveis são: - 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]