No post anterior, você conheceu o KIWI, a ferramenta desenvolvida pelo Projeto openSUSE para criar imagens de sistema no Linux. Você viu que essa imagem pode ser um ISO live para ser gravado em um CD/DVD/USB e usado em um PC, ou um disco virtual VDI para ser usado no VirtualBox, um arquivo .raw
que vai virar um cartão de memória em um Raspberry Pi, dentre outras possibilidades. Aprendeu conceitos básicos do KIWI, viu onde conseguir exemplos de imagens, instalou o KIWI no seu computador e criou sua primeira imagem.
Caso você tenha caído aqui de paraquedas, comece sua leitura pelo post anterior:
A imagem que criamos no post anterior disponibiliza para o usuário uma interface de linha de comando e alguns utilitários básicos. Embora seja um sistema Linux que funciona, não é um usual. Não é parecido com o que você baixa do site do Ubuntu, por exemplo, com interface gráfica e vários aplicativos.
Hoje, vamos ver quais arquivos compõem o código-fonte (a descrição) da imagem e modificá-la de modo que tenhamos ao final uma imagem com área de trabalho GNOME e vários aplicativos, semelhante à instalação padrão do openSUSE Leap.
Antes de continuar, copie a pasta test-image-live
para outro lugar, fora da pasta kiwi
. Renomeie para o nome que desejar (aqui, vou usar kiwi-tutorial
) e entre nessa pasta. A partir de agora, vamos trabalhar nela.
1
$ cd kiwi-tutorial
Estrutura da descrição da imagem
Uma aplicação do KIWI é estruturada em uma pasta contendo arquivos e pastas que definem a imagem do sistema. Vejamos os principais arquivos e pastas.
1
2
3
4
5
$ ls -1
appliance.kiwi
config.sh
root
O arquivo appliance.kiwi
é um arquivo XML que contém a descrição da imagem, que é uma coleção de configurações gerais, como metadados (nome, versão, descrição), quais pacotes e padrões devem ser instalados, formatos de imagem (ISO, disco virtual, contêiner, etc.), usuários e senhas, etc.
O arquivo de descrição da imagem não precisa obrigatoriamente se chamar appliance.kiwi
, ele pode se chamar config.xml
, ou pode ter um nome qualquer mais a extensão .kiwi
. O KIWI primeiro procura por um arquivo com o nome de config.xml
. Se não for encontrado, ele considera o primeiro arquivo .kiwi
.
Você pode encontrar informações detalhadas sobre os elementos que compõem esse arquivo XML na documentação do KIWI.
A pasta root
contém arquivos e pastas que serão copiados para o sistema durante a etapa de preparação, após todos os pacotes listados no appliance.kiwi
terem sido instalados. Quaisquer arquivos já presentes serão substituídos. Em vez de uma pasta chamada root
, também pode ser um arquivo compactado chamado root.tar.gz
.
O script config.sh
é executado no final da etapa de preparação, depois que os usuários foram configurados e o conteúdo da pasta root
foi aplicado. Geralmente é usado para ajustes adicionais, como permissões, configuração de serviços, etc.
A pasta da aplicação pode ter outros arquivos e scripts. Para mais informações, consulte a documentação do KIWI.
Configurando repositórios
O KIWI instala pacotes em uma aplicação a partir dos repositórios definidos na descrição da imagem (arquivo appliance.kiwi
). Pelo menos um repositório deve ser definido. Caso contrário, o KIWI não pode obter nenhum pacote.
Um repositório é adicionado à descrição por meio do elemento repository
. Esse elemento deve ser inserido como filho do elemento image
(o de mais alto nível).
No momento, nossa imagem está configurada para usar os repositórios do OBS:
1
2
3
<repository type="rpm-md">
<source path="obsrepositories:/"/>
</repository>
Essa é uma configuração especial disponível somente para uso com o OBS. Ela permite que você configure os repositórios da imagem no próprio OBS, sem precisar modificar a descrição da imagem. Falaremos sobre isso em outro post, quando veremos como usar o KIWI integrado com o OBS.
Vamos configurar a imagem para usar os repositórios do openSUSE Leap:
1
2
3
4
5
6
<repository alias="repo-update" imageinclude="true" priority="1" type="rpm-md">
<source path="obs://openSUSE:Leap:15.6:Update/standard"/>
</repository>
<repository alias="repo-oss" imageinclude="true" priority="2" type="rpm-md">
<source path="obs://openSUSE:Leap:15.6/standard"/>
</repository>
Adicionando pacotes
O KIWI nos permite personalizar a seleção de pacotes por meio do elemento packages
. Dentro desse elemento, cada pacote a ser instalado (ou removido) deve ser listado por meio de um elemento package
.
No momento, nossa imagem contém uma seleção mínima de pacotes para uma interface de linha de comando:
1
2
3
4
5
6
7
8
9
10
11
12
<packages type="image">
<package name="bind-utils"/>
<package name="patterns-openSUSE-base"/>
<package name="systemd"/>
<package name="plymouth-theme-bgrt"/>
<package name="grub2-branding-openSUSE"/>
<package name="iputils"/>
<package name="vim"/>
<package name="grub2"/>
<!-- ... -->
<package name="dracut-kiwi-live"/>
</packages>
Esse tipo de imagem é conhecido como JeOS (Just enough Operating System, tão somente o sistema operacional).
Vamos adicionar pacotes de modo que tenhamos uma área de trabalho GNOME e mais alguns aplicativos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<packages type="image">
<namedCollection name="enhanced_base"/>
<namedCollection name="x11_enhanced"/>
<namedCollection name="gnome_basis"/>
<namedCollection name="gnome_utilities"/>
<!-- X.Org drivers and fonts -->
<package name="xf86-video-fbdev"/>
<package name="xf86-video-vesa"/>
<package name="xorg-x11-driver-video"/>
<package name="xorg-x11-fonts"/>
<!-- VirtualBox and VMware support -->
<package name="virtualbox-kmp-default"/>
<package name="virtualbox-guest-tools"/>
<package name="xf86-video-vmware"/>
<package name="xf86-input-vmmouse"/>
<package name="open-vm-tools"/>
<package name="open-vm-tools-desktop"/>
<!-- Some GNOME apps -->
<package name="gnome-terminal"/>
<package name="nautilus"/>
<package name="gnome-calculator"/>
<package name="gedit"/>
<package name="file-roller"/>
<package name="gnome-system-monitor"/>
<package name="MozillaFirefox"/>
<package name="bind-utils"/>
<!-- ... -->
Os elementos namedCollection
especificam padrões a serem instalados.
Seu arquivo appliance.kiwi
agora deve estar assim.
Configurando usuários e login automático
Agora vamos fazer algumas configurações por meio do script config.sh
.
Como agora temos a área de trabalho GNOME, vamos começar mudando o nível de execução (runlevel) padrão de 3 (modo de texto, multi usuário, com rede) para 5 (modo gráfico, multi usuário, com rede):
1
2
3
4
#======================================
# Setup default target, multi-user GUI
#--------------------------------------
baseSetRunlevel 5
Adicione ao final do script config.sh
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Sysconfig update
baseUpdateSysConfig /etc/sysconfig/displaymanager DISPLAYMANAGER gdm
baseUpdateSysConfig /etc/sysconfig/windowmanager DEFAULT_WM gnome
# /etc/sudoers hack to fix #297695
# (Installation Live DVD: no need to ask for password of root)
# https://bugzilla.novell.com/show_bug.cgi?id=297695
sed -i -e "s/ALL ALL=(ALL) ALL/ALL ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers
chmod 0440 /etc/sudoers
# Create LiveDVD user linux
/usr/sbin/useradd -m -u 999 linux -c "Live User" -p ""
# delete passwords
passwd -d root
passwd -d linux
# empty password is ok
pam-config -a --nullok
# bug 544314, we only want to disable the bit in common-auth-pc
# https://bugzilla.novell.com/show_bug.cgi?id=544314
sed -i -e 's,^\(.*pam_gnome_keyring.so.*\),#\1,' /etc/pam.d/common-auth-pc
# Automatically log in user linux
baseUpdateSysConfig /etc/sysconfig/displaymanager DISPLAYMANAGER_AUTOLOGIN linux
Seu arquivo config.sh
agora deve estar assim.
O código é comentado e auto explicativo. Mas, em resumo, o que estamos fazendo é:
- definir o GDM como display manager e o GNOME como área de trabalho;
- configurar o sudo para não pedir senha (configuração interessante já que estamos fazendo uma imagem live);
- criar um usuário normal chamado
linux
(pode ser mais interessante criar usuários noconfig.sh
do que noappliance.kiwi
); - deixar os usuários
linux
eroot
sem senha (outra configuração que facilita o uso de imagens live); e - configurar o sistema para fazer login do usuário
linux
automaticamente (mais uma configuração pensada na imagem live).
baseSetRunlevel
e baseUpdateSysConfig
são funções prontas fornecidas pelo KIWI que permitem ajustar com facilidade diversas configurações do sistema.
Depois de feitas todas essas melhorias, vamos criar nossa imagem novamente.
Antes de repetir o processo do KIWI, devemos apagar manualmente a pasta /tmp/myimage
, porque o KIWI não faz isso ele mesmo e senão ele não prossegue alertando que há arquivos nessa pasta:
1
$ sudo rm -rf /tmp/myimage
Agora sim podemos rodar o KIWI:
1
$ sudo kiwi system build --description . --target-dir /tmp/myimage
O processo deve demorar mais porque agora temos mais pacotes para instalar.
Ao final, teste a nova imagem:
Note que, embora já consigamos usar a área de trabalho GNOME e alguns aplicativos básicos, ainda há muito o que fazer para tornar essa imagem realmente usável. Por exemplo, a rede não está funcionando.
Uma imagem mais completa
Quando baixamos a mídia de instalação do openSUSE Leap 15.6 de get.opensuse.org e escolhemos, dentre as opções de instalação, a área de trabalho GNOME, vários aplicativos são instalados junto com ela:
Antes de realizar a instalação propriamente dita, o instalador apresenta um resumo das configurações da instalação. Perceba, nesse resumo, que a seleção de software é descrita em termos de padrões.
Podemos usar essa mesma seleção de padrões na nossa imagem:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<packages type="image" patternType="plusRecommended">
<!-- GNOME Desktop Environment (Basic) -->
<namedCollection name="gnome_basic"/>
<!-- Help and Support Documentation -->
<namedCollection name="documentation"/>
<!-- GNOME Desktop Environment (Wayland) -->
<namedCollection name="gnome"/>
<!-- GNOME Desktop Environment (X11) -->
<namedCollection name="gnome_x11"/>
<!-- Minimal Base System -->
<namedCollection name="base"/>
<!-- Enhanced Base System -->
<namedCollection name="enhanced_base"/>
<!-- AppArmor -->
<namedCollection name="apparmor"/>
<!-- Mobile -->
<namedCollection name="laptop"/>
<!-- YaST Base Utilities -->
<namedCollection name="yast2_basis"/>
<!-- YaST Desktop Utilities -->
<namedCollection name="yast2_desktop"/>
<!-- YaST User Interfaces -->
<namedCollection name="x11_yast"/>
<!-- Software Management -->
<namedCollection name="sw_management"/>
<!-- Multimedia -->
<namedCollection name="multimedia"/>
<!-- Office Software -->
<namedCollection name="office"/>
<!-- Fonts -->
<namedCollection name="fonts"/>
<!-- X Window System -->
<namedCollection name="x11"/>
<!-- Graphics -->
<namedCollection name="imaging"/>
<!-- Minimal Appliance Base -->
<namedCollection name="minimal_base"/>
<!-- X.Org drivers and fonts -->
<!-- ... -->
Perceba que adicionamos o atributo patternType
ao elemento packages
.
Esse atributo opcional permite que você controle a instalação de pacotes dependentes. Você pode atribuir-lhe um dos seguintes valores:
-
onlyRequired
: apenas padrões e pacotes que são exigidos (Requires:
) pelos padrões e pacotes listados noappliance.kiwi
serão instalados. Assim, somente os pacotes realmente necessários serão instalados, e o tamanho final da imagem será menor; -
plusRecommended
: serão instalados os padrões e pacotes que são exigidos e também recomendados (Recommends:
) pelos padrões e pacotes especificados. Dessa forma, a imagem fica mais completa, mas pode terminar com um tamanho maior também.
Se o atributo patternType
não é especificado, onlyRequired
é assumido por padrão.
Seu arquivo appliance.kiwi
agora deve estar assim.
Vamos também fazer algumas modificações no script config.sh
para que a imagem use o NetworkManager no lugar do wicked e o firewalld no lugar do SuSEfirewall2:
1
2
3
4
5
6
7
8
9
10
11
12
#======================================
# Activate services
#--------------------------------------
suseInsertService sshd
suseRemoveService wicked
suseRemoveService SuSEfirewall2
suseInsertService NetworkManager
suseInsertService firewalld
#======================================
# Setup default target, multi-user GUI
# ...
Seu arquivo config.sh
agora deve estar assim.
Após essas alterações, apague a pasta /tmp/myimage
e rode o KIWI novamente:
1
2
$ sudo rm -rf /tmp/myimage
$ sudo kiwi system build --description . --target-dir /tmp/myimage
Ao final, teste a nova imagem, que agora deve estar bem mais interessante:
Outro teste que você pode fazer é formatar um pendrive com o Ventoy, copiar a imagem ISO para ele e testá-la no seu próprio computador (máquina real, em vez de máquina virtual):
Note que até Wi-Fi e Bluetooth funcionam nessa imagem!
Conclusão
Disponibilizei o código-fonte da imagem desse tutorial no repositório kiwi-tutorial
no GitLab do Linux Kamarada.
Com o que vimos até aqui, você já é capaz de usar o KIWI localmente no seu computador para criar imagens ISO baseadas no openSUSE Leap, assim como é o Linux Kamarada.
Por que eu disse “localmente”? Porque também é possível usar o KIWI integrado ao OBS, mas isso é assunto para outro post.
Não é meu objetivo aqui esgotar o assunto, que, aliás, “dá muito pano pra manga”. Talvez você queira continuar seus estudos sobre KIWI consultando as referências.
Ou talvez você queira ver como compilar o Linux Kamarada no seu próprio computador usando o KIWI.
Referências
O site oficial do KIWI é também a sua documentação e a fonte mais completa de informações sobre o KIWI:
Encontrei uma versão dessa mesma documentação em HTML único no site da SUSE:
(pode ser mais fácil encontrar o que procura dando um Ctrl + F nessa página)
Lembre-se que os exemplos de descrições de imagens também são boas referências do que dá pra fazer com o KIWI.
Caso queira contatar outras pessoas para trocar ideias sobre o KIWI, você pode usar:
-
o Grupo do Google
kiwi-images
(mesmo que você não tenha uma conta do Google, pode se inscrever como se fosse uma lista de discussão por e-mail); ou -
a sala
#kiwi:matrix.org
do Matrix.