Mudanças entre as edições de "Laboratório de Baixo Custo com Contêineres"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(48 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
=Estrutura=
+
=Objetivo=
*'''Máquina física (Dell Optiplex 755):'''
+
 
**'''Memória RAM:''' 8 GB;
+
O objetivo é prover uma estrutura que fornece um ambiente de trabalho remoto completo afim de permitir a utilização de dispositivos de baixo custo na ponta, diminuindo os custos com equipamentos, no caso, computadores, além de flexibilizar a gerência de toda a estrutura tirando vantagem do uso de contêineres. Dessa forma, tendo o Docker como gestor, permite-se a replicação dos ambientes de trabalho para cada dispositivo, além de cada cliente ter um ambiente isolado.<br />
**'''CPU:''' Intel Dual Core, 2,66 GHz, 2 núcleos;
+
Este projeto visa eliminar algumas limitações do [https://wiki.sj.ifsc.edu.br/index.php/Uso_de_thin_clients_e_LTSP_como_solu%C3%A7%C3%A3o_para_economia_de_recursos_e_reutiliza%C3%A7%C3%A3o_de_hardwares_obsoletos modelo anterior] cuja impelementação foi o ponta pé inicial para o desenvolvimento dessa segunda versão. Uma das limitações a serem diminuídas é o uso de dispositivos USB, como SDR, FPGAs, Arduíno, Pen Drives, etc. <br />
**'''Armazenamento:''' Disco rígido Samsung de 7200 RPM com capacidade para 250 GB;
+
Este projeto é um segmento do projeto [https://wiki.sj.ifsc.edu.br/index.php/Nuvem_Computacional_para_a_%C3%81rea_de_Telecomunica%C3%A7%C3%B5es Nuvem Computacional para a Área de Telecomunicações], o qual foi utilizada a estrutura em contêineres para gestão dos ambientes acessados pelos alunos. Neste segmento de projeto, está sendo utilizando como sistema operacional de gerência o [http://rancher.com/rancher-os/ RancherOS], que é um sistema operacional extremamente leve e toda sua estrutura é feita em contêineres, o que o torna muito modular e de tamanho diminuto, pois possui apenas Docker como o gestor do sistema operacional.
*'''Sistema Operacional de gerência (instalado em baremetal):''' RancherOS v1.1.1;
+
 
**'''Versão da distribuição:''' v1.1.1;
+
=Servidores=
 +
[[File:IMG 20190215 111651038.jpg|200px|thumb|Servidor físico]]
 +
*'''Local:''' CTIC (Coordenadoria de Tecnologia da Informação e Comunicação);
 +
*'''Atende:''' Laboratório de Alunos, Monitoria de Alunos, Laboratório Interativo;
 +
*'''Máquina física (HP Z220 Workstation):'''
 +
**'''Memória RAM:''' 32 GB;
 +
**'''Área de troca:''' 0 B;
 +
**'''CPU:''' Intel(R) Xeon(R) CPU E3-1225 V2 @ 3.20GHz, 4 núcleos;
 +
**'''Armazenamento:''' Disco rígido Samsung de 7200 RPM com capacidade para 320 GB;
 +
*'''Sistema Operacional de gerência (instalado em baremetal):''' RancherOS v1.5.1;
 +
**'''Versão da distribuição:''' v1.5.1;
 
**'''Nome da distribuição:''' RancherOS;
 
**'''Nome da distribuição:''' RancherOS;
**'''Versão do kernel Linux:''' 4.9.67-rancher
+
**'''Versão do kernel Linux:''' 4.14.85-rancher
 
*Contêineres Docker virtualizando as seguintes aplicações:
 
*Contêineres Docker virtualizando as seguintes aplicações:
**[http://191.36.9.253:5000 Interface web de gerência Rancher Server]
+
**Contêiner ''labalu-cli0-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
**[http://191.36.9.253:9000 Interface web de gerência para o Docker]
+
**Contêiner ''labalu-cli1-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
**Contêiner baseado em Debian Stretch que provê uma interface de área de trabalho completa a fim de promover a criação de um laboratório de informática de baixo custo com o auxílio de contêineres.  
+
**Contêiner ''labalu-cli2-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
**Contêineres relacionados ao Rancher Server;
+
**Contêiner ''labalu-cli3-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labalu-cli4-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labalu-cli5-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 6.5 GB de memória RAM.'''
 +
**Contêiner ''labalu-cli6-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 6.5 GB de memória RAM.'''
 +
**Contêiner ''labint-cli0-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli1-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli2-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli3-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli4-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli5-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli6-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli7-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli8-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli9-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli10-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli11-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 +
**Contêiner ''labint-cli12-aluno'' baseado em Debian Stretch que provê a interface de área de trabalho. '''Este contêiner pode alocar até 3 GB de memória RAM.'''
 
*Contêineres do System-Docker executando os seguintes serviços:
 
*Contêineres do System-Docker executando os seguintes serviços:
**Console Debian do RancherOS;
+
**Console Debian do RancherOS → Imagem jpmsb/os-debian-extrasconsole:v1.5.1;
 
**Crontab do RancherOS;
 
**Crontab do RancherOS;
 
**Configuração de rede do RancherOS;
 
**Configuração de rede do RancherOS;
Linha 21: Linha 47:
 
**Contêiner contendo o Docker a nível de usuário;
 
**Contêiner contendo o Docker a nível de usuário;
  
 +
= Preparação do servidor=
 
== O RancherOS ==
 
== O RancherOS ==
 
[[File:RancherOS.png|500px|thumb|Logomarca do RancherOS]]
 
[[File:RancherOS.png|500px|thumb|Logomarca do RancherOS]]
Para a execução deste projeto foi escolhido como sistema operacional de gerência o [http://rancher.com/rancher-os/ RancherOS], que possui foco na execução de contêineres. O sistema operacional é constituído basicamente do kernel Linux e o Docker, fazendo com que sua iso de instalação tenha cerca de 60 Mb. <br />
+
Para a execução deste projeto, foi escolhido como sistema operacional de gerência o [http://rancher.com/rancher-os/ RancherOS], que possui foco na execução de contêineres. O sistema operacional é constituído basicamente do kernel Linux e o Docker, fazendo com que sua ''iso'' de instalação tenha cerca de 60 Mb. <br />
 
O sistema conteineriza serviços do sistema, como configuração de rede, configuração de dispositivos, crontab, o console que o usuário interage, módulos extras para o kernel Linux, até mesmo o próprio sistema operacional que final em execução. Há apenas uma base bem mínima para o Docker funcionar. Há dois serviços do Docker em execução: um chamado de ''system-docker'' e o outro o Docker que usuário executa suas aplicações de forma tradicional. <br />
 
O sistema conteineriza serviços do sistema, como configuração de rede, configuração de dispositivos, crontab, o console que o usuário interage, módulos extras para o kernel Linux, até mesmo o próprio sistema operacional que final em execução. Há apenas uma base bem mínima para o Docker funcionar. Há dois serviços do Docker em execução: um chamado de ''system-docker'' e o outro o Docker que usuário executa suas aplicações de forma tradicional. <br />
 
Digitando ''system-docker ps'' no console é dada uma saída semelhante à abaixo:
 
Digitando ''system-docker ps'' no console é dada uma saída semelhante à abaixo:
Linha 61: Linha 88:
 
=== Instalação do RancherOS ===
 
=== Instalação do RancherOS ===
  
Para a instalação do RancherOS, baixe a ISO do sistema [https://releases.rancher.com/os/v1.1.1/rancheros.iso aqui]. Se a instalação for em máquina virtual, basta verificar como dar o ''boot'' a partir da ISO baixada. O RancherOS possui um detector de ''hypervisor'' para melhor desempenho em máquina virtual. Se a instalação for em uma máquina física, basta gravar a ISO em um ''pen drive'' e configurar a placa-mãe para dar o ''boot'' a partir do mesmo. Para a gravação, basta utlizar o comando ''dd'':
+
Para a instalação do RancherOS, baixe a ISO do sistema [https://releases.rancher.com/os/latest/rancheros.iso aqui]. Se a instalação for em máquina virtual, basta verificar como dar o ''boot'' a partir da ISO baixada. O RancherOS possui um detector de ''hypervisor'' para melhor desempenho em máquina virtual. Se a instalação for em uma máquina física, basta gravar a ISO em um ''pen drive'' e configurar a placa-mãe para dar o ''boot'' a partir do mesmo. Para a gravação, basta utlizar o comando ''dd'':
  
 
<syntaxhighlight lang=bash>
 
<syntaxhighlight lang=bash>
Linha 82: Linha 109:
 
[[File:Rancheros3-1.png|600px]]
 
[[File:Rancheros3-1.png|600px]]
  
Neste momento, o sistema é sendo executado em memória RAM, e tudo que for feito nele será perdido após o reinício da máquina. No entanto, é possível utilizar o sistema sempre a partir da ISO e ainda assim salvar os dados. Para que as alterações feitas não se percam, basta criar uma partição em um armazenamento local como o nome de '''RANCHER_STATE''', que salvará todas as modificações feitas no sistema. Isso pode ser interessante para salvar um pouco mais de espaço em disco e também útil em casos de atualizações. <br />
+
Neste momento, o sistema está sendo executado em memória RAM, e tudo que for feito nele será perdido após o reinício da máquina. No entanto, é possível utilizar o sistema sempre a partir da ISO e ainda assim salvar os dados. Para que as alterações feitas não se percam, basta criar uma partição em um armazenamento local com o rótulo '''RANCHER_STATE''', que salvará todas as modificações feitas no sistema. Isso pode ser interessante para salvar um pouco mais de espaço em disco e também útil em casos de atualizações. <br />
 
Digite ''sudo su'' para virar ''root'':
 
Digite ''sudo su'' para virar ''root'':
  
Linha 125: Linha 152:
 
[[File:Rancheros12.png|600px]]
 
[[File:Rancheros12.png|600px]]
  
Após o reinício do sistema, o menu LILO aparecerá, sendo este o mesmo presente na mídia de instalação.
+
Após o reinício do sistema, o menu SYSLINUX aparecerá, sendo este o mesmo presente na mídia de instalação.
  
 
[[File:Rancheros13.png|600px]]
 
[[File:Rancheros13.png|600px]]
Linha 143: Linha 170:
 
=== Configuração ===
 
=== Configuração ===
  
A configuração do sistema dá-se através de uma arquivo do tipo "yml". Neste tipo de arquivo, os espaços são importantes e definem blocos de configurações.
+
A configuração do sistema dá-se através de um arquivo do tipo "yml". Neste tipo de arquivo, os espaços são importantes e definem blocos de configurações.
  
=== Configuração da Rede ===
+
==== Configuração da Rede ====
  
 
A configuração da rede é feita via arquivo "cloud-config". O arquivo localiza-se em "/var/lib/rancher/conf". Para editar o arquivo "cloud-config.yml", basta usar o "vi":
 
A configuração da rede é feita via arquivo "cloud-config". O arquivo localiza-se em "/var/lib/rancher/conf". Para editar o arquivo "cloud-config.yml", basta usar o "vi":
Linha 155: Linha 182:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==== Configuração de interface de rede ====
+
===== Configuração de interface de rede =====
  
 
Abaixo, um exemplo de configuração de rede:
 
Abaixo, um exemplo de configuração de rede:
Linha 173: Linha 200:
 
O contéudo acima define o endereço IP "191.36.9.253" na interface "eth0". Define também o endereço IP do roteador, "191.36.9.254". O parâmetro "dhcp: false", desabilita o cliente DHCP.  
 
O contéudo acima define o endereço IP "191.36.9.253" na interface "eth0". Define também o endereço IP do roteador, "191.36.9.254". O parâmetro "dhcp: false", desabilita o cliente DHCP.  
  
==== Configuração de pontes ====
+
===== Configuração de pontes =====
  
 
É possível também configurar pontes, por exemplo:
 
É possível também configurar pontes, por exemplo:
Linha 193: Linha 220:
  
  
==== Configuração de servidores DNS ====
+
===== Configuração de servidores DNS =====
  
 
Para a configuração dos servidores de nomes, basta adicionar um conteúdo parecido com o exemplo abaixo:
 
Para a configuração dos servidores de nomes, basta adicionar um conteúdo parecido com o exemplo abaixo:
Linha 208: Linha 235:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=Objetivo=
+
===== Configuração de interface pelo endereço MAC do dispositivo =====
 +
 
 +
É possível configurar a interface de rede pelo endereço MAC da mesma, assim, caso haja mais de uma placa de rede, evita-se que uma eventual troca de nomes cause problemas. Abaixo um exemplo de configuração do dispositivo de rede através do endereço MAC da mesma:
 +
 
 +
<syntaxhighlight lang=bash>
 +
 
 +
rancher:
 +
  network:
 +
    interfaces:
 +
      "mac=ea:34:71:66:90:12:01":
 +
        dhcp: true
 +
 
 +
</syntaxhighlight>
 +
 
 +
===== Configuração de agregações de link =====
  
O objetivo é prover uma estrutura que fornece um ambiente de trabalho remoto completo afim de permitir a utilização de dispositivos de baixo custo na ponta, diminuindo os custos com equipamentos, no caso, computadores, além de flexibilizar a gerência de toda a estrutura tirando vantagem do uso de contêineres. Dessa forma, tendo o Docker como gestor ou o Kubernetes para o caso de estrutura em ''cluster'', permite a replicação dos ambientes de trabalho para dispositivo.<br />
+
É possível configurar agregações de link. O exemplo abaixo ilustra isso:
Este projeto é um segmento do projeto [https://wiki.sj.ifsc.edu.br/index.php/Nuvem_Computacional_para_a_%C3%81rea_de_Telecomunica%C3%A7%C3%B5es Nuvem Computacional para a Área de Telecomunicações], o qual foi utilizada a estrutura em contêineres para gestão dos ambientes acessados pelos alunos. Neste segmento de projeto, está sendo utilizando como sistema operacional de gerência o [http://rancher.com/rancher-os/ RancherOS], que é um sistema operacional extremamente leve e toda sua estrutura é feita em contêineres, o que o torna muito modular e de tamanho diminuto, pois possui apenas Docker como o gestor do sistema operacional.
 
  
=Script para o Cliente=
+
<syntaxhighlight lang=bash>
  
'''Atenção: O script abaixo está sujeito à mudanças.''' <br />
+
rancher:
Copie e cole o script abaixo em um arquivo. Devem ser providas 6 informações. A sintaxe de uso é:
+
  network:
 +
    interfaces:
 +
      bond0:
 +
        addresses:
 +
        - 191.36.9.253/24
 +
        - 172.18.19.20/24
 +
        gateway: 191.36.9.254
 +
        bond_opts:
 +
          downdelay: "200"
 +
          lacp_rate: "1"
 +
          miimon: "100"
 +
          mode: "4"
 +
          updelay: "200"
 +
          xmit_hash_policy: layer3+4
 +
        post_up:
 +
        - ip route add 10.0.0.0/8 via 10.88.23.128
 +
      mac=0c:c4:d7:b2:14:d2:
 +
        bond: bond0
 +
      mac=0c:c4:d7:b2:14:d3:
 +
        bond: bond0
  
<blockquote style="color: black; border: solid thin gray;">
+
</syntaxhighlight>
./script-cliente "nomedeusuario" "Nome Completo" "senhatemporária" "curso" "ip_do_servidor" "porta_do_contêiner"
 
</blockquote>
 
  
Por exemplo:
+
==== Habilitar módulos extras do kernel ====
  
<blockquote style="color: black; border: solid thin gray;">
+
Uma das vantagens do RancherOS é que o mesmo possui um vasto conjunto de drivers e módulos prontos para serem ativos. Todo este conjunto fica dentro de um contêiner. Para habilitar os módulos extras, basta digitar os comandos abaixo:
./script-cliente "jose.mf" "José Marfino Ferreira" "minhasenhatemporaria" "Engenharia de Telecomunicações" "191.36.9.253" "700"
 
</blockquote>
 
  
 
<syntaxhighlight lang=bash>
 
<syntaxhighlight lang=bash>
  
#!/bin/bash
+
# ros service enable kernel-extras
 +
 
 +
</syntaxhighlight>
  
nomedeusuario=$1
+
Notar-se-á que uma imagem de contêiner será baixada. Para pô-la em execução basta executar o seguinte comando:
nomecompleto=$2
 
senha=$3
 
curso=$4
 
servidor=$5
 
porta=$6
 
  
# Cria o usuário no arquivo passwd
+
<syntaxhighlight lang=bash>
echo "Criando usuario $nomedeusuario para o aluno $nomecompleto"
 
useradd -m -d /home/$nomedeusuario -s /bin/bash -c "$nomecompleto,$curso" $nomedeusuario
 
  
# Define a senha temporária
+
# ros service up kernel-extras
echo "Usando a matricula $matricula como senha do usuario $nomedeusuario."
 
echo "$nomedeusuario:$senha" |chpasswd
 
  
echo "Conta $nomedeusuario do usuario $nomecompleto criada"
+
</syntaxhighlight>
  
# Cria o arquivo .xinitrc com o seguinte conteúdo:
+
O serviço é ativo. Basta reiniciar o sistema que todos os módulos já estarão pronto para uso. É possível utilizar recursos como USBIP, por exemplo, além de outros dispositivos presentes na máquina que antes não funcionavam por causa da falta de ''drivers''.
echo "Criando arquvo .xinitrc..."
 
echo 'exec x2goclient --hide --sessionid=20170929183410524' > /home/$nomedeusuario/.xinitrc
 
  
# Muda a permissão do arquivo .xinitrc
+
===Instalação do GRUB 2===
echo "Mudando permissão do arquivo .xinitrc..."
 
chown root:root /home/$nomedeusuario/.xinitrc
 
chmod 444 /home/$nomedeusuario/.xinitrc
 
  
# Faz o ponto de montagem do diretório /media/nomedeusuario
+
Por padrão, o RancherOS utiliza o [http://www.syslinux.org/wiki/index.php?title=The_Syslinux_Project SYSLINUX] como gerenciador de inicilização. Optou-se por utilizar o [https://pt.wikipedia.org/wiki/GNU_GRUB GRUB 2] devido à sua flexibilidade e possibilidades de proteção com usuário e senha, impedindo, assim, vandalismos por parte dos usuários, bem como o acesso ao sistema através do ''autologin''. <br />
 +
A instalação do GRUB 2 é feita através da aplicação ''grub-install'', geralmente presente nos sistemas operacionais com o referido gerenciador de inicialização. <br />
 +
Para realizar a instalação a partir do próprio RancherOS, basta criar um contêiner usando o ''system-docker'':
  
# Adiciona o comando startx no arquivo .profile para que o comando que invoca
+
<syntaxhighlight lang=bash>
# o X2Go seja executado assim que o usuário fizer login
 
echo "Adicionando o comando startx ao arquivo .profile..."
 
echo "startx" >> /home/$nomedeusuario/.profile
 
  
# Cria a pasta .x2goclient
+
# system-docker run -it --name boot --privileged -v /boot:/boot -v /dev:/dev debian:stretch
mkdir /home/$nomedeusuario/.x2goclient
 
  
# Cria pasta .ssh
+
</syntaxhighlight>
mkdir /home/$nomedeusuario/.ssh
 
  
# Copia um arquivo modelo de sessão do X2Go para .x2goclient
+
Dentro do contêiner, basta instalar o pacote ''grub-pc'' e um editor de texto (nano, vim, pico):
cp -r /opt/sessions /home/$nomedeusuario/.x2goclient/
 
  
# Adiciona as informações faltantes ao arquivo sessions
+
<syntaxhighlight lang=bash>
echo "Adicionando o servidor..."
 
echo "host=$servidor" >> /home/$nomedeusuario/.x2goclient/sessions
 
echo "Adicionando usuário..."
 
echo "key=/home/$nomedeusuario/.ssh/$nomedeusuario" >> /home/$nomedeusuario/.x2goclient/sessions
 
echo "Adicionando a porta SSH..."
 
echo "sshport=$porta" >> /home/$nomedeusuario/.x2goclient/sessions
 
  
# Gera as chaves públicas e privadas
+
root@iddoconteiner# apt update && apt -y -q install grub-pc nano
echo "Gerando chaves SSH..."
 
ssh-keygen -t rsa -N "" -f /home/$nomedeusuario/.ssh/$nomedeusuario
 
echo "Chaves SSH geradas! Agora copie o conteúdo de $nomedeusuario.pub, EXPOSTO ABAIXO,  para a pasta .ssh dentro do contêiner do usuário, com o nome de authorized_keys!!!"
 
chave=$(cat /home/$nomedeusuario/.ssh/$nomedeusuario.pub)
 
echo ""
 
echo "$chave"
 
echo ""
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=Rpositório no Docker Hub=
+
=Preparação do cliente=
 +
 
 +
==O sistema operacional==
 +
O sistema operacional escolhido foi o Debian, sendo a versão atual usada a 9 (Stretch), que necessita ser atualizado para a versão mais recente, a 10 (Buster).
 +
 
 +
=Repositórios=
 +
 
 +
== Docker Hub ==
 +
 
 +
* [https://hub.docker.com/r/jpmsb/gui/ Aqui] encontra-se o repositório principal com a imagem para a criação do contêiner. A interface gráfica é o Mate.
 +
* [https://hub.docker.com/r/jpmsb/gui-lxde/ Aqui] encontra-se o repositório com a imagem de interface gráfica LXDE com o tema do Raspberry Pi.
 +
 
 +
== GitHub ==
 +
 
 +
* [https://github.com/jpmsb/gui Aqui] encontra-se o repositório principal com a maioria dos arquivos utilizados. A interface gráfica é o Mate.
 +
* [https://github.com/jpmsb/gui-lxde Aqui] encontra-se o repositório referente a imagem de interface gráfica LXDE com o tema do Raspberry Pi.
 +
 
 +
=Últimas atualizações=
 +
 
 +
* 29/11/2018 → Geração e início dos testes da imagem que usa o LibreOffice do repositório "backports" do Debian. Foi instalado também o KColor Chooser que permite selecionar cores e verificar suas combinações de vermelho, verde e azul. Além disso, foi adicionada a fonte "Open Sans".
 +
* 27/11/2018 → Melhoramento no ''script'' "rede", adicionando "-oStrictHostKeyChecking=no" para facilitar a troca de imagens uma vez que não é mais necessário confirmar que a chave mudou.
 +
* 23/10/2018 → Adição de terminal remoto no TTY 6, o que pode facilitar o encerramento de processos que travem a interface gráfica.
 +
* 05/10/2018 → Navegação e respostas à nomes extremamente lenta.
 +
** A solução foi remover um dos endereços DNS, que havia sido desativado.
 +
* 03/10/2018 → Interrupção inesperada do sistema, todos os contêineres foram afetados.
 +
** Um erro na leitura do arquivo cloud-config.yml fez com o que o sistema ficasse desconfigurado.
 +
** RancherOS passou a armazenar os dados do Docker do usuário em ''/var/lib/user-docker'' ao invés de ''/var/lib/docker'', resultando na perda aparente do todos os contêineres.
 +
** A ação tomada foi copiar o conteúdo remanescente em ''/var/lib/docker'' para ''/var/lib/user-docker''. Em princípio foi bem sucedido, no entanto, houve problemas no permissionamento, já que ''cp -ra'' não foi usado.
 +
** A ação tomada foi apagar todo o conteúdo copiado para ''/var/lib/user-docker'' e recriar todas as pastas mantendo-as vazias. Após a recriação dos contêineres, o problema foi resolvido.
 +
** Período fora do ar: das 7:00 às 19:47.
 +
** Versão do RancherOS atualizada, de 1.4.0 para 1.4.1, com Docker 18.03.1-ce e System-docker 17.06-ros4.
 +
* Habilitação da extensão BIG-REQUESTS que resolveu o erro (imagem jpmsb/gui:2018.8.31 e jpmsb/gui-lxde:2018.8.31):
 +
** Gdk-Message: vlc: Fatal IO error 2 (No such file or directory) on X server :X
 +
** Gdk-Message: python: Fatal IO error 2 (No such file or directory) on X server :X
 +
 
 +
=Melhorias Desejadas=
  
[https://hub.docker.com/r/jpmsb/gui/ Aqui] encontra-se o repositório com a imagem para a criação do contêiner.
+
* Boot pela rede (via PXE) para não necessitar de um disco rígido. A execução é em modo ''fat client''. No entanto tal mudança pode implicar na limitação de algumas implementações, como aviso de conexões de rede e outras possíveis orientações ao usuário.

Edição atual tal como às 10h29min de 5 de agosto de 2019

Objetivo

O objetivo é prover uma estrutura que fornece um ambiente de trabalho remoto completo afim de permitir a utilização de dispositivos de baixo custo na ponta, diminuindo os custos com equipamentos, no caso, computadores, além de flexibilizar a gerência de toda a estrutura tirando vantagem do uso de contêineres. Dessa forma, tendo o Docker como gestor, permite-se a replicação dos ambientes de trabalho para cada dispositivo, além de cada cliente ter um ambiente isolado.
Este projeto visa eliminar algumas limitações do modelo anterior cuja impelementação foi o ponta pé inicial para o desenvolvimento dessa segunda versão. Uma das limitações a serem diminuídas é o uso de dispositivos USB, como SDR, FPGAs, Arduíno, Pen Drives, etc.
Este projeto é um segmento do projeto Nuvem Computacional para a Área de Telecomunicações, o qual foi utilizada a estrutura em contêineres para gestão dos ambientes acessados pelos alunos. Neste segmento de projeto, está sendo utilizando como sistema operacional de gerência o RancherOS, que é um sistema operacional extremamente leve e toda sua estrutura é feita em contêineres, o que o torna muito modular e de tamanho diminuto, pois possui apenas Docker como o gestor do sistema operacional.

Servidores

Servidor físico
  • Local: CTIC (Coordenadoria de Tecnologia da Informação e Comunicação);
  • Atende: Laboratório de Alunos, Monitoria de Alunos, Laboratório Interativo;
  • Máquina física (HP Z220 Workstation):
    • Memória RAM: 32 GB;
    • Área de troca: 0 B;
    • CPU: Intel(R) Xeon(R) CPU E3-1225 V2 @ 3.20GHz, 4 núcleos;
    • Armazenamento: Disco rígido Samsung de 7200 RPM com capacidade para 320 GB;
  • Sistema Operacional de gerência (instalado em baremetal): RancherOS v1.5.1;
    • Versão da distribuição: v1.5.1;
    • Nome da distribuição: RancherOS;
    • Versão do kernel Linux: 4.14.85-rancher
  • Contêineres Docker virtualizando as seguintes aplicações:
    • Contêiner labalu-cli0-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labalu-cli1-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labalu-cli2-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labalu-cli3-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labalu-cli4-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labalu-cli5-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 6.5 GB de memória RAM.
    • Contêiner labalu-cli6-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 6.5 GB de memória RAM.
    • Contêiner labint-cli0-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli1-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli2-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli3-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli4-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli5-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli6-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli7-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli8-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli9-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli10-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli11-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
    • Contêiner labint-cli12-aluno baseado em Debian Stretch que provê a interface de área de trabalho. Este contêiner pode alocar até 3 GB de memória RAM.
  • Contêineres do System-Docker executando os seguintes serviços:
    • Console Debian do RancherOS → Imagem jpmsb/os-debian-extrasconsole:v1.5.1;
    • Crontab do RancherOS;
    • Configuração de rede do RancherOS;
    • Configuração de dispositivos do RancherOS;
    • Configuração de horário do RancherOS;
    • Contêiner contendo o Docker a nível de usuário;

Preparação do servidor

O RancherOS

Logomarca do RancherOS

Para a execução deste projeto, foi escolhido como sistema operacional de gerência o RancherOS, que possui foco na execução de contêineres. O sistema operacional é constituído basicamente do kernel Linux e o Docker, fazendo com que sua iso de instalação tenha cerca de 60 Mb.
O sistema conteineriza serviços do sistema, como configuração de rede, configuração de dispositivos, crontab, o console que o usuário interage, módulos extras para o kernel Linux, até mesmo o próprio sistema operacional que final em execução. Há apenas uma base bem mínima para o Docker funcionar. Há dois serviços do Docker em execução: um chamado de system-docker e o outro o Docker que usuário executa suas aplicações de forma tradicional.
Digitando system-docker ps no console é dada uma saída semelhante à abaixo:

root@JPMSB:~# system-docker ps
CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS                         PORTS               NAMES
100081d26178        rancher/os-base:v1.1.1                "/usr/bin/ros entrypo"   21 minutes ago      Up 9 minutes                                       ntp
a770926deb8c        rancher/os-base:v1.1.1                "/usr/bin/ros entrypo"   21 minutes ago      Up 9 minutes                                       network
556d5ccd846e        rancher/os-base:v1.1.1                "/usr/bin/ros entrypo"   21 minutes ago      Up 9 minutes                                       udev
d1d76fe3a1d0        rancher/os-acpid:v1.1.1               "/usr/bin/ros entrypo"   21 minutes ago      Up 9 minutes                                       acpid
0f2f113fc887        rancher/os-syslog:v1.1.1              "/usr/bin/entrypoint."   21 minutes ago      Up 8 minutes                                       syslog
921b11ef5571        rancher/container-crontab:v0.1.0      "container-crontab"      11 days ago         Restarting (1) 9 minutes ago                       container-cron
7125a15e074d        rancher/os-debianconsole:v1.1.0-rc3   "/usr/bin/ros entrypo"   11 days ago         Up 9 minutes                                       console
27849052b566        rancher/os-docker:17.03.2             "ros user-docker"        11 days ago         Up 9 minutes                                       docker
ee264f634dbe        rancher/container-crontab:v0.1.0      "container-crontab"      11 days ago         Up 9 minutes                                       system-cron

Há os seguintes contêineres listados acima:

  • ntp → cuida da sincronização do relógio;
  • network → faz a configuração de rede;
  • udev → faz a gerência dos dispositivos;
  • acpid → controla os recursos de energia da máquina;
  • syslog → cuida dos logs do sistema;
  • container-cron → é o temporizador dos contêineres;
  • console → console o qual o usuário interage, tanto diretamente quanto via SSH;
  • docker → contém o Docker que é utilizado a nível de usuário;
  • system-cron → é o temporizador do sistema operacional.

O comando de gerência do sistema é o ros. Com ele, é possível configurar o sistema operacional. É o responsável por validar o arquivo cloud-config.yml, localizado em /var/lib/rancher/conf, que contém as configurações do sistema. A utilização de um único arquivo para a configuração torna o uso deste sistema operacional mais eficiente em ambientes de produção. O Container Linux também pode ser configurado desta maneira, no entanto, no RancherOS, este é o método de configuração padrão, enquanto que no CoreOS, não.
Devido à sua estrutura, é possível escolher tanto a versão do Docker, quanto a versão do sistema operacional que se deseja utilizar, sendo possíveis realizar atualizações e desatualizações.


Instalação do RancherOS

Para a instalação do RancherOS, baixe a ISO do sistema aqui. Se a instalação for em máquina virtual, basta verificar como dar o boot a partir da ISO baixada. O RancherOS possui um detector de hypervisor para melhor desempenho em máquina virtual. Se a instalação for em uma máquina física, basta gravar a ISO em um pen drive e configurar a placa-mãe para dar o boot a partir do mesmo. Para a gravação, basta utlizar o comando dd:

dd if=rancheros.iso of=/dev/sdX

Neste caso, sdX é o dispositivo alvo e X é a letra que identifica o mesmo. Para achar a identificação do dispositivo, basta utilizar o comando fdisk -l.
Após o boot, chegar-se-á uma tela semelhante à imagem abaixo:

Rancheros1-1.png

Selecione a segunda opção para, ao completar o boot, o sistema já vir com um login pronto para uso. O sistema começará a ser carregado, como mostrado na imagem abaixo:

Rancheros2.png

O sistema completará o boot em uma tela semelhante à imagem abaixo:

Rancheros3-1.png

Neste momento, o sistema está sendo executado em memória RAM, e tudo que for feito nele será perdido após o reinício da máquina. No entanto, é possível utilizar o sistema sempre a partir da ISO e ainda assim salvar os dados. Para que as alterações feitas não se percam, basta criar uma partição em um armazenamento local com o rótulo RANCHER_STATE, que salvará todas as modificações feitas no sistema. Isso pode ser interessante para salvar um pouco mais de espaço em disco e também útil em casos de atualizações.
Digite sudo su para virar root:

Rancheros4-1.png

No caso de se desejar instalar o sistema no armazenamento local, basta utilizar o seguinte comando:

ros install -d /dev/sdX

Para localizar a identificação do dispositivo, basta utilizar o comando fdisk -l, como mostrado na imagem abaixo:

Rancheros5-1.png

Rancheros6.png

No caso da imagem acima, o dispositivo é /dev/sda. Digite ros install -d /dev/sda:

Rancheros7.png

O instalador perguntará se o usuário deseja prosseguir com a instalação:

Rancheros8.png

Digite "y" para prosseguir com a instalação:

Rancheros9.png

Após cerca de 30 segundos, a instalação está concluída e o instalador perguntará se o usuário deseja continuar com o reinício da máquina:

Rancheros10.png

Digite "y" para continuar com o reinício da máquina:

Rancheros11.png

Os serviços e contêineres do sistema começarão a ser parados e, por fim, o RancherOS é reiniciado:

Rancheros12.png

Após o reinício do sistema, o menu SYSLINUX aparecerá, sendo este o mesmo presente na mídia de instalação.

Rancheros13.png

Como não há nada configurado ainda, deve-se selecionar a segunda para ter o autologin com o usuário rancher. O sistema operacional começará a ser iniciado:

Rancheros14.png

Após o término da inicialização do sistema, deve aparecer uma tela semelhante à imagem abaixo:

Rancheros15.png

Neste momento, o sistema está completamente pronto para uso. Ao usar o comando "fdisk -l", é possível verificar que o armazenamento o qual o RancherOS foi instalado foi modificado.

Rancheros17.png

Configuração

A configuração do sistema dá-se através de um arquivo do tipo "yml". Neste tipo de arquivo, os espaços são importantes e definem blocos de configurações.

Configuração da Rede

A configuração da rede é feita via arquivo "cloud-config". O arquivo localiza-se em "/var/lib/rancher/conf". Para editar o arquivo "cloud-config.yml", basta usar o "vi":

vi /var/lib/rancher/conf/cloud-config.yml
Configuração de interface de rede

Abaixo, um exemplo de configuração de rede:

rancher:
  network:
    interfaces:
      eth0:
        address: 191.36.9.253/24
        gateway: 191.36.9.254
        dhcp: false

O contéudo acima define o endereço IP "191.36.9.253" na interface "eth0". Define também o endereço IP do roteador, "191.36.9.254". O parâmetro "dhcp: false", desabilita o cliente DHCP.

Configuração de pontes

É possível também configurar pontes, por exemplo:

rancher:
  network:
    interfaces:
      eth0:
        bridge: faixa191
      faixa191:
        address: 191.36.9.253/24
        bridge: true
        dhcp: false
        gateway: 191.36.9.254


Configuração de servidores DNS

Para a configuração dos servidores de nomes, basta adicionar um conteúdo parecido com o exemplo abaixo:

rancher
  network:
    dns:
      nameservers:
      - 8.8.8.8
      - 8.8.4.4
Configuração de interface pelo endereço MAC do dispositivo

É possível configurar a interface de rede pelo endereço MAC da mesma, assim, caso haja mais de uma placa de rede, evita-se que uma eventual troca de nomes cause problemas. Abaixo um exemplo de configuração do dispositivo de rede através do endereço MAC da mesma:

rancher:
  network:
    interfaces:
      "mac=ea:34:71:66:90:12:01":
         dhcp: true
Configuração de agregações de link

É possível configurar agregações de link. O exemplo abaixo ilustra isso:

rancher:
  network:
    interfaces:
      bond0:
        addresses:
        - 191.36.9.253/24
        - 172.18.19.20/24
        gateway: 191.36.9.254
        bond_opts:
          downdelay: "200"
          lacp_rate: "1"
          miimon: "100"
          mode: "4"
          updelay: "200"
          xmit_hash_policy: layer3+4
        post_up:
        - ip route add 10.0.0.0/8 via 10.88.23.128
      mac=0c:c4:d7:b2:14:d2:
        bond: bond0
      mac=0c:c4:d7:b2:14:d3:
        bond: bond0

Habilitar módulos extras do kernel

Uma das vantagens do RancherOS é que o mesmo possui um vasto conjunto de drivers e módulos prontos para serem ativos. Todo este conjunto fica dentro de um contêiner. Para habilitar os módulos extras, basta digitar os comandos abaixo:

# ros service enable kernel-extras

Notar-se-á que uma imagem de contêiner será baixada. Para pô-la em execução basta executar o seguinte comando:

# ros service up kernel-extras

O serviço é ativo. Basta reiniciar o sistema que todos os módulos já estarão pronto para uso. É possível utilizar recursos como USBIP, por exemplo, além de outros dispositivos presentes na máquina que antes não funcionavam por causa da falta de drivers.

Instalação do GRUB 2

Por padrão, o RancherOS utiliza o SYSLINUX como gerenciador de inicilização. Optou-se por utilizar o GRUB 2 devido à sua flexibilidade e possibilidades de proteção com usuário e senha, impedindo, assim, vandalismos por parte dos usuários, bem como o acesso ao sistema através do autologin.
A instalação do GRUB 2 é feita através da aplicação grub-install, geralmente presente nos sistemas operacionais com o referido gerenciador de inicialização.
Para realizar a instalação a partir do próprio RancherOS, basta criar um contêiner usando o system-docker:

# system-docker run -it --name boot --privileged -v /boot:/boot -v /dev:/dev debian:stretch

Dentro do contêiner, basta instalar o pacote grub-pc e um editor de texto (nano, vim, pico):

root@iddoconteiner# apt update && apt -y -q install grub-pc nano

Preparação do cliente

O sistema operacional

O sistema operacional escolhido foi o Debian, sendo a versão atual usada a 9 (Stretch), que necessita ser atualizado para a versão mais recente, a 10 (Buster).

Repositórios

Docker Hub

  • Aqui encontra-se o repositório principal com a imagem para a criação do contêiner. A interface gráfica é o Mate.
  • Aqui encontra-se o repositório com a imagem de interface gráfica LXDE com o tema do Raspberry Pi.

GitHub

  • Aqui encontra-se o repositório principal com a maioria dos arquivos utilizados. A interface gráfica é o Mate.
  • Aqui encontra-se o repositório referente a imagem de interface gráfica LXDE com o tema do Raspberry Pi.

Últimas atualizações

  • 29/11/2018 → Geração e início dos testes da imagem que usa o LibreOffice do repositório "backports" do Debian. Foi instalado também o KColor Chooser que permite selecionar cores e verificar suas combinações de vermelho, verde e azul. Além disso, foi adicionada a fonte "Open Sans".
  • 27/11/2018 → Melhoramento no script "rede", adicionando "-oStrictHostKeyChecking=no" para facilitar a troca de imagens uma vez que não é mais necessário confirmar que a chave mudou.
  • 23/10/2018 → Adição de terminal remoto no TTY 6, o que pode facilitar o encerramento de processos que travem a interface gráfica.
  • 05/10/2018 → Navegação e respostas à nomes extremamente lenta.
    • A solução foi remover um dos endereços DNS, que havia sido desativado.
  • 03/10/2018 → Interrupção inesperada do sistema, todos os contêineres foram afetados.
    • Um erro na leitura do arquivo cloud-config.yml fez com o que o sistema ficasse desconfigurado.
    • RancherOS passou a armazenar os dados do Docker do usuário em /var/lib/user-docker ao invés de /var/lib/docker, resultando na perda aparente do todos os contêineres.
    • A ação tomada foi copiar o conteúdo remanescente em /var/lib/docker para /var/lib/user-docker. Em princípio foi bem sucedido, no entanto, houve problemas no permissionamento, já que cp -ra não foi usado.
    • A ação tomada foi apagar todo o conteúdo copiado para /var/lib/user-docker e recriar todas as pastas mantendo-as vazias. Após a recriação dos contêineres, o problema foi resolvido.
    • Período fora do ar: das 7:00 às 19:47.
    • Versão do RancherOS atualizada, de 1.4.0 para 1.4.1, com Docker 18.03.1-ce e System-docker 17.06-ros4.
  • Habilitação da extensão BIG-REQUESTS que resolveu o erro (imagem jpmsb/gui:2018.8.31 e jpmsb/gui-lxde:2018.8.31):
    • Gdk-Message: vlc: Fatal IO error 2 (No such file or directory) on X server :X
    • Gdk-Message: python: Fatal IO error 2 (No such file or directory) on X server :X

Melhorias Desejadas

  • Boot pela rede (via PXE) para não necessitar de um disco rígido. A execução é em modo fat client. No entanto tal mudança pode implicar na limitação de algumas implementações, como aviso de conexões de rede e outras possíveis orientações ao usuário.