Skip to content

Instantly share code, notes, and snippets.

@tavinus
Last active December 17, 2019 11:18
Show Gist options
  • Save tavinus/559c6fef56a757e524c86deffdfb9dc0 to your computer and use it in GitHub Desktop.
Save tavinus/559c6fef56a757e524c86deffdfb9dc0 to your computer and use it in GitHub Desktop.
Rodar Autosystem em AMD64 e ARM

Para rodar o Autosystem em sistemas não suportados.
Exemplos: Linux 64 bits, Raspberry Pi.

debootstrap em AMD64

Testado em

  • Linux Mint 18.3 x86_64

1 - Máquina Hospedeira 64 bits

Pegar pacotes

sudo apt update
sudo apt install debootstrap schroot

Criar config do schroot

sudo editor /etc/schroot/chroot.d/jessie_i386.conf

Exemplo (edite os dois campos de usuário onde tem tavinus)

[jessie_i386]
description=Debian Jessie for i386
directory=/srv/chroot/jessie_i386
personality=linux32
root-users=tavinus
#run-setup-scripts=true
#run-exec-scripts=true
type=directory
users=tavinus

Criar diretório do sistema auxiliar

sudo mkdir -p /srv/chroot/jessie_i386

Rodar debootstrap para Debian Jessie i386

sudo debootstrap --arch i386 jessie /srv/chroot/jessie_i386 http://ftp.br.debian.org/debian/

Listar ambientes schroot

schroot -l

Abrir um terminal no Debian i386

xhost +SI:localuser:root # preparar o X pra rodar o AS mais tarde
schroot -c jessie_i386 -u root

2 - Instalar AS no jessie_i386 do chroot

Configurar Locales

apt update
apt install locales
dpkg-reconfigure locales

Eu selecionei en_US e pt_BR, ambos com UTF-8 e ISO-8859-1 e depois pt_BR.UTF-8 como padrão.

Reconfigurar timezone

dpkg-reconfigure tzdata

Pacotes para preparar o environment

O cups pode pedir a senha do root neste passo, dê ENTER (vazio).

apt install rsync ssh openssh-client openssh-server git curl wget cups-common cups cups-bsd printer-driver-cups-pdf lsb-release libcanberra-gtk-module

Rodar o instalador as_deb_install.sh

export DISPLAY=:0     # Para mandar os programas do AS pro X Server
cd $HOME
wget -O as_deb_install.sh https://gist.githubusercontent.com/tavinus/146bdce3695cae9cfec02b534c2ff30f/raw/
chmod +x as_deb_install.sh
./as_deb_install.sh

Em teoria vai correr tudo normalmente até o final.

Configurar defaults da fstab do debootstrap

Com essa config o Autosystem imprime do ambiente chroot.
Provavelmente é melhor flexibilizar as pastas montadas no ambiente chroot depois de instalar o autosystem e fazer os updates do chroot pois ao montar as pastas adicionais o ambiente chroot acaba interferindo mais no ambiente host 64 bits.

Por exemplo, o autosystem pede o cups que vai instalar e modificar aquivos nas pastas montadas do sistema host. É preferível montar a pasta host por cima da original da instalação (de fato o comando mount exige que o destino exista de qualquer forma).

Editar o arquivo padrao

sudo nano /etc/schroot/default/fstab

Adicione ao final

/etc/printcap   /etc/printcap   none    rw,bind         0       0
/run/cups       /run/cups       none    rw,bind         0       0

Exemplo de uma config completa, com pastas adicionais também habilitadas

# fstab: static file system information for chroots.
# Note that the mount point will be prefixed by the chroot path
# (CHROOT_PATH)
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/proc           /proc           none    rw,bind         0       0
/sys            /sys            none    rw,bind         0       0
/dev            /dev            none    rw,bind         0       0
/dev/pts        /dev/pts        none    rw,bind         0       0
/home           /home           none    rw,bind         0       0
/tmp            /tmp            none    rw,bind         0       0

# It may be desirable to have access to /run, especially if you wish
# to run additional services in the chroot.  However, note that this
# may potentially cause undesirable behaviour on upgrades, such as
# killing services on the host.
/run           /run            none    rw,bind         0       0
/run/lock      /run/lock       none    rw,bind         0       0
/dev/shm       /dev/shm        none    rw,bind         0       0
/run/shm       /run/shm        none    rw,bind         0       0

# Extending cups support
# Agora imprime do autosystem
/etc/printcap   /etc/printcap   none    rw,bind         0       0
/run/cups       /run/cups       none    rw,bind         0       0

qemu-debootstrap em ARM

Raspberry Pi Raspbian

Testado em

  • Raspbian GNU/Linux 9 (stretch)

1 - Máquina Hospedeira ARM

Pegar pacotes

sudo apt update
sudo apt-get install binfmt-support qemu qemu-user-static debootstrap

Criar config do schroot

sudo editor /etc/schroot/chroot.d/jessie_i386.conf

Exemplo config

[jessie_i386]
description=Debian Jessie for i386
directory=/srv/chroot/jessie_i386
personality=linux32
root-users=pi
#run-setup-scripts=true
#run-exec-scripts=true
type=directory
users=pi

Criar diretório do sistema auxiliar

sudo mkdir -p /srv/chroot/jessie_i386

Rodar qemu-debootstrap para Debian Jessie i386

sudo qemu-debootstrap --arch i386 jessie /srv/chroot/jessie_i386 http://deb.debian.org/debian/

Listar schroot

schroot -l

Abrir um terminal no Debian i386

xhost +SI:localuser:root # preparar o X pra rodar o AS mais tarde
schroot -c jessie_i386 -u root

2 - Instalar AS no jessie_i386 do chroot

Configurar Locales

apt update
apt install locales
dpkg-reconfigure locales

Eu selecionei en_US e pt_BR, ambos com UTF-8 e ISO-8859-1 e depois pt_BR.UTF-8 como padrão.

Reconfigurar timezone

dpkg-reconfigure tzdata

Pacotes para preparar o environment

O cups vai pedir a senha do root neste passo, dê ENTER (vazio).

apt install rsync ssh openssh-client openssh-server git curl wget cups-common cups cups-bsd printer-driver-cups-pdf lsb-release libcanberra-gtk-module

Rodar o instalador as_deb_install.sh

export DISPLAY=:0     # Para mandar os programas do AS pro X Server
cd $HOME
wget -O as_deb_install.sh https://gist.githubusercontent.com/tavinus/146bdce3695cae9cfec02b534c2ff30f/raw/
chmod +x as_deb_install.sh
./as_deb_install.sh

Em teoria vai correr tudo normalmente até o final.

@tavinus
Copy link
Author

tavinus commented Mar 16, 2018

Gerando executáveis no sistema local

Para podermos rodar os programas mais naturalmente, precisamos gerar links locais que abrem os programas no ambiente chroot.
Vamos usar esse script para criar atalhos para todos os programas as_* na pasta /usr/local/bin/as_*.
Note que a pasta original do AS (no ambiente chroot) é /usr/bin/as_*.
O script também cria os lançadores de Desktop em /home/-USUARIO-/AutoSystemLinks e importa o ícone do Autosystem.

A partir da v0.0.3 o script cria os links asr_* pro usuário root e as_ para o usuário normal.
Os atalhos de Desktop usam o usuário normal, exceto para o as_config.

Pegar o script

wget -O make_as_links.sh https://gist.githubusercontent.com/tavinus/5b2135f4363198c7356139a2399fc1ba/raw/

Rodar

chmod +x make_as_links.sh
sudo ./make_as_links.sh

Se tudo deu certo, basta clicar nos ícones para rodar.

@tavinus
Copy link
Author

tavinus commented Mar 17, 2018

Permitindo a conexão do X-Server permanentemente

EDIT: Obsoleto

Atualmente a maioria dos programas rodam como usuário, não como root.
De qualquer forma geramos links para root que chamam xhost + para root automaticamente e também fecham o canal ao termino da execução. Ou seja, essa config é totalmente desnecessária e não recomendada atualmente (mantida para referências).


Além disso, essa configuração não funcionou corretamente em alguns sistemas!
Se você fizer a configuração global, remova a linha echo 'xhost +SI:localuser:root &>/dev/null' do script que gera os Links.

Usando a chamada xhost

Tem que chamar no final do boot, depois de o X Server ter sido carregado.
Precisa rever esta parte, por enquanto adicionando a call nos links as_*
Exemplo:

sudo nano /etc/X11/Xsession

Adicione no final do arquivo

/usr/bin/xhost +SI:localuser:root

Editando a config de /etc/X(n).hosts

Parace que não funciona em algumas distros. Nesse caso tem que rodar o comando xhost mesmo.
Para saber o valor do seu $DISPLAY (n)

echo $DISPLAY

Exemplo

sudo nano /etc/X0.hosts

Conteúdo

si:localuser:root

@tavinus
Copy link
Author

tavinus commented Mar 31, 2018

Imprimindo do ambiente chroot

EDIT: Obsoleto

Funciona muito melhor editando a config do debootstrap em /etc/schroot/default/fstab,
conforme mencionado na instalação do sistema 64 bits.

Além disso, o autosystem usa o arquivo /etc/printcap pra listar as impressoras,
então precisa ao menos replicar este arquivo no ambiente chroot.

Essa config é mantida somente para referências.


Para poder imprimir de dentro do ambiente chroot, precisamos redirecionar o socket do CUPS do ambiente Host/Principal para o ambiente chroot. A solução é montar algumas pastas locais do sistema dentro do ambiente chroot. Essa solução pode ser aplicada para outras funcionalidades além do cups.

Config em HOST / Hospedeiro

Essas configurações devem ser feitas no ambiente Hospedeiro, não no chroot.
(ainda não testado)

Algo assim deve funcionar para montar a pasta do Cups no chroot

mount -o bind /var/run/cups /path/to/my/chroot/var/run/cups

No nosso caso deve ser algo como

mount -o bind /var/run/cups /srv/chroot/jessie_i386/var/run/cups

Para consolidar a mudança entre reboots, adicione à /etc/fstab

Antes de adicionar a fstab deve-se testar a config somente montando com os comandos acima.

sudo editor /etc/fstab
# Adicione ao final da fstab
/var/run/cups /srv/chroot/jessie_i386/var/run/cups auto -o,bind 0 1

PS: Depois de testar eu vou editar aqui confirmando se essas opções funcionam como deveriam sem problemas.

@tavinus
Copy link
Author

tavinus commented Apr 7, 2018

Default Apps config xdg-utils

Para que o AS tenha programas para abrir arquivos PDF, TXT, etc

Abrir ambiente chroot

schroot -c jessie_i386 -u "$user"

Adicionar programas desejados

Exemplo (precisa das fontes extras no sources.list)

sudo apt-get update
sudo apt-get install xdg-utils evince xpdf leafpad

Editar

sudo nano /usr/share/applications/defaults.list

Conteúdo

application/pdf=evince.desktop;xpdf.desktop
text/plain=leafpad.desktop
application/csv=leafpad.desktop
text/csv=leafpad.desktop

Nota: Usando leafpad pra abrir planilhas CSV para poder salvar e depois abrir no LibreOffice Calc do sistema nativo

@tavinus
Copy link
Author

tavinus commented Apr 8, 2018

UZBL browser pra abrir URLs

Browser leve e funcional, mas apresentou problemas pra lidar com o certificado SSL da linx

Entrar no ambiente chroot

schroot -c jessie_i386 -u "$USER" # abrir chroot

Instalar

sudo apt-get update                    # update
sudo apt-get install uzbl              # install

Patch /usr/lib/python2.2/webbrowser.py

Infelizmente não parace ter escapatória, precisamos modificar o core do python2.2 pra poder usar o uzbl.
A mudança é simples, vamos adicionar o uzbl-browser como opção.

sudo cp /usr/lib/python2.2/webbrowser.py /usr/lib/python2.2/webbrowser.py-backup
sudo nano /usr/lib/python2.2/webbrowser.py

Primeiro adicionamos "uzbl-browser" como primeira opção

if os.environ.get("TERM") or os.environ.get("DISPLAY"):
    _tryorder = ["uzbl-browser","mozilla","netscape","kfm","grail","links","lynx","w3m"]

Depois criamos o bloco register( )

    # X browsers have more in the way of options
    if os.environ.get("DISPLAY"):
        # UZBL patch
        if _iscommand("uzbl-browser"):
            register("uzbl-browser", None, GenericBrowser(
                "uzbl-browser '%s' >/dev/null &"))

Aqui o bloco todo modificado

#
# Platform support for Unix
#

# This is the right test because all these Unix browsers require either
# a console terminal of an X display to run.  Note that we cannot split
# the TERM and DISPLAY cases, because we might be running Python from inside
# an xterm.
if os.environ.get("TERM") or os.environ.get("DISPLAY"):
    _tryorder = ["uzbl-browser","mozilla","netscape","kfm","grail","links","lynx","w3m"]

    # Easy cases first -- register console browsers if we have them.
    if os.environ.get("TERM"):
        # The Links browser <http://artax.karlin.mff.cuni.cz/~mikulas/links/>
        if _iscommand("links"):
            register("links", None, GenericBrowser("links '%s'"))
        # The Lynx browser <http://lynx.browser.org/>
        if _iscommand("lynx"):
            register("lynx", None, GenericBrowser("lynx '%s'"))
        # The w3m browser <http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/eng/>
        if _iscommand("w3m"):
            register("w3m", None, GenericBrowser("w3m '%s'"))

    # X browsers have more in the way of options
    if os.environ.get("DISPLAY"):
        # UZBL patch
        if _iscommand("uzbl-browser"):
            register("uzbl-browser", None, GenericBrowser(
                "uzbl-browser '%s' >/dev/null &"))

        # First, the Netscape series
        if _iscommand("mozilla"):
            register("mozilla", None, Netscape("mozilla"))
        if _iscommand("netscape"):
            register("netscape", None, Netscape("netscape"))

Config SSL

Infelizmente ele não gosta dos certificados da linx e dá erro de TLS ao acessar a área do cliente
Outros sites funcionam normalmente, quando chequei o cert da linx com gnutls, também deu erro

Workaround, desligar SSL

Longe de ser ideal, mas no momento a única forma de acessar área do cliente

nano "$HOME/.config/uzbl/config"

Modifique conforme texto abaixo

# === SSL related configuration ==============================================

# Set it to certificates store of your distribution, or your own CAfile.
set ssl_ca_file = /etc/ssl/certs/ca-certificates.crt
set ssl_verify = 0
set ssl_policy ignore

gnutls debug

Veja o Status: The certificate is NOT trusted. The certificate issuer is unknown.
No Chrome e Firefox o cadeadinho ficou verde, até tentei exportar o certificado (GoDaddy G2), mas continuou negando.

$ gnutls-cli cliente.linx.com.br </dev/null
Processed 148 CA certificate(s).
Resolving 'cliente.linx.com.br'...
Connecting to '187.92.243.28:443'...
- Certificate type: X.509
- Got a certificate list of 1 certificates.
- Certificate[0] info:
 - subject `OU=Domain Control Validated,CN=*.linx.com.br', issuer `C=US,ST=Arizona,L=Scottsdale,O=GoDaddy.com\, Inc.,OU=http://certs.godaddy.com/repository/,CN=Go Daddy Secure Certificate Authority - G2', RSA key 2048 bits, signed using RSA-SHA256, activated `2016-04-27 19:47:40 UTC', expires `2019-04-27 19:47:40 UTC', SHA-1 fingerprint `0b68d31c05c4bbebb9ac4cb54ec8973c610b5b27'
	Public Key ID:
		56b3636d9758c845638c8011633a125f08241b4d
	Public key's random art:
		+--[ RSA 2048]----+
		|  o+E. .*+.. +=  |
		|   +.o.+.. ..+.. |
		|  . . +   o o .  |
		|     . . . + o . |
		|        S + + o  |
		|       . . o .   |
		|                 |
		|                 |
		|                 |
		+-----------------+

- Status: The certificate is NOT trusted. The certificate issuer is unknown. 
*** PKI verification of server certificate failed...
*** Fatal error: Error in the certificate.
*** Handshake has failed
GnuTLS error: Error in the certificate.

Pegar launchers .desktop

O Autosystem ignora os launchers para browser, portanto a configuração abaixo é totalmente opcional para o Autosystem.
Ainda assim talvez seja interessante para deixar o uzbl como browser padrão do ambiente chroot.

cd /usr/share/applications
sudo wget -O 'uzbl-core.desktop' 'https://raw.githubusercontent.com/uzbl/uzbl/master/uzbl-core.desktop'
sudo wget -O 'uzbl-tabbed.desktop' 'https://raw.githubusercontent.com/uzbl/uzbl/master/uzbl-tabbed.desktop'

Definir padrão

sudo nano /usr/share/applications/defaults.list

Adicionar ao final

x-scheme-handler/http=uzbl-core.desktop;
x-scheme-handler/https=uzbl-core.desktop;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment