Este artigo descreve como implantar rapidamente um sistema incorporado baseado no Windows 10 e Debian Linux. Exemplos de construção de uma interface segura são dados.
1. Introdução
No processo de desenvolvimento de dispositivos que possuem uma interface gráfica homem-máquina, mais cedo ou mais tarde surge a tarefa não apenas de criar a interface em si, mas também de escolher a plataforma na qual ela deve trabalhar. Essa plataforma pode ser um computador de placa única com um sistema operacional ou um microcontrolador com uma tela e um conjunto de bibliotecas relevantes, ou alguma outra solução original.
Muitas vezes acontece que, no nível superior do sistema de controle em que a interface está sendo executada, também são executadas tarefas de comunicação com o mundo externo e a interação com uma ampla gama de dispositivos periféricos. Além disso, a própria interface pode ser bastante exigente em recursos gráficos. Diante disso, e para economizar custos de mão-de-obra, é possível usar um computador de placa única como base e instalar nele um sistema operacional pronto. O desenvolvimento de software nesse caso pode ser bastante simplificado usando estruturas modernas com boa documentação e um conjunto de exemplos.
Requisitos de interface
Do ponto de vista do usuário, a interface deve atender aos seguintes requisitos:
- Ao carregar em tela cheia, um aplicativo deve aparecer, é a mesma interface, é o mesmo shell gráfico;
- Além deste aplicativo, nada mais deve estar disponível para o usuário;
- O aplicativo deve funcionar o tempo todo, o sistema não deve adormecer, a tela não deve desligar;
- Todos os atalhos de teclado, auxiliares, recursos de acessibilidade e outras funções similares devem ser desativados;
- Em caso de falha do aplicativo - ele deve ser reiniciado automaticamente pelo sistema;
- O sistema não possui requisitos especiais para velocidade ou modos em tempo real; no entanto, é necessário que a interface responda aos comandos do usuário sem atrasos visíveis;
- O sistema deve ser resistente a reinicializações duras repetidas; não há necessidade de executar um script especial para concluir o trabalho;
- Deverá ser possível clonar rapidamente o conjunto concluído em uma série de dispositivos com todas as configurações necessárias feitas no modo automático.
Em outras palavras, uma completa limitação das ações do usuário, estabilidade e escalabilidade.
Quanto ao sistema operacional de um computador de placa única, consideraremos imediatamente duas opções, uma baseada no Windows e a outra no Linux, e as compararemos.
Por exemplo, vamos criar uma interface de quiosque com tela de toque. E como aplicativo, vamos pegar um dos exemplos de treinamento do Qt Quick e implementá-lo com algumas alterações. A estrutura Qt está disponível para ambos os sistemas operacionais.
Para não se aprofundar nas nuances da instalação do Windows e Linux em uma plataforma ARM, o sistema pode ser facilmente montado com base em algum processador compatível com x86. Nesse caso, uma das muitas placas disponíveis na plataforma Intel Bay Trail foi usada para experimentos.
Um pacote de todos os programas e scripts está disponível no GitHub .
Caminho do Windows
Ao mesmo tempo, o Windows Embedded da Microsoft foi introduzido para criar sistemas incorporados. Mesmo na versão inicial do Windows Embedded XP, os desenvolvedores recebiam um conjunto de ferramentas para montar os mais truncados, mas equipados com os drivers de imagem necessários. Esses conjuntos exigiam um mínimo de RAM e funcionavam bem, mesmo em processadores fracos. A tecnologia foi desenvolvida na versão do Windows Embedded Standard 7, onde o processo de criação de seus próprios assemblies foi lembrado. O Windows Embedded usava a ideologia de um catálogo aberto de módulos, e qualquer um podia equipar seu sistema apenas com o conjunto necessário de componentes. A versão mais recente em que essa abordagem estava disponível, embora de forma truncada, é o Windows Embedded Standard 8.1.
A IoT moderna do Windows 10 está posicionada como uma alternativa ao Windows Embedded, mas é muito diferente de seus antecessores. Um catálogo de componentes abertos não está mais disponível. A capacidade de coletar imagens de luz do designer e criar seus próprios discos de instalação desapareceu. Opções especiais de um sistema incorporado, como um filtro de gravação, marca do carregador de inicialização, um filtro de teclado etc., agora estão configuradas em um sistema pré-instalado. Além disso, o suporte para essas funções está disponível apenas como parte da versão pesada do Windows 10 Enterprise.
No entanto, apesar dos altos requisitos do sistema, especialmente a quantidade de RAM, o uso de versões pesadas em soluções incorporadas não causa problemas especiais, principalmente devido à disponibilidade de componentes de hardware. Além disso, não esqueça que, nos últimos anos, tornou-se mais difícil comprar uma licença da Microsoft para produtos antigos.
Solução rápida
Após o primeiro exame, verifica-se que, mesmo no Windows 10 comum, já existe uma função interna de "Acesso atribuído" (Fig. 1), que parece uma solução pronta para a tarefa.
Fig. 1. Função de acesso atribuído
Um programa que pode ser usado como interface nesse caso deve ser desenvolvido inicialmente como um aplicativo da Plataforma Universal do Windows. Esses aplicativos appx são instalados, por exemplo, em um Windows Phone. Um aplicativo simples em tela cheia, é claro, pode ser convertido em appx e assinado com os certificados necessários e, em seguida, instalado. Pode funcionar como uma interface, mas sem a proteção adequada. Infelizmente, no modo "Acesso atribuído" normal, o usuário ainda tem acesso aberto a algumas configurações do sistema e teclas de atalho. Como resultado, uma interface que atenda a todos os requisitos acima não pode ser obtida usando essa abordagem. O sistema deve ser configurado manualmente, de uma maneira diferente.
Decisão correta
1. Instalação inicial
Então, primeiro de tudo, precisamos da distribuição Windows 10 Enterprise LTSB . Você pode capturar a imagem original da Microsoft, usar uma leve ou criar sua própria usando ferramentas de terceiros. Para a prancha experimental, um dos conjuntos prontos foi selecionado (versão leve de 32 bits).
Instalamos o sistema a partir do kit de distribuição no quadro de destino. Ao instalar, dividimos o disco em duas seções, C: - para o sistema, D: - para o aplicativo principal, utilitários e logs. Esse detalhamento é útil no futuro para o filtro de gravação. Após a instalação, esperamos até que o menu de configurações seja exibido ou não continuamos o menu com as configurações de rede.
Nós reiniciamos no modo de serviço via Ctrl + Shift + F3.
Se não houver erros durante o processo de instalação, após a reinicialização, o próprio sistema entrará na conta de serviço do administrador e a janela SysPrep aparecerá na tela (Fig. 2). Ele deve ser fechado, iniciaremos o SysPrep de maneira diferente, usando um arquivo de resposta especial que ainda não foi criado.
Fig. 2. modo de serviço.
2. Configuração do sistema
Para outras ações, você precisará das Ferramentas de Implantação do Kit de Avaliação e Implantação do Windows 10 .
No disco com a distribuição do Windows instalada no quadro, é necessário extrair o arquivo de imagem install.wim . Acontece que em algumas montagens esse arquivo pode ser armazenado em formato compactado com a extensão esd . Nesse caso, você deve primeiro descompactá-lo. O utilitário dism é usado para isso.
Descubra o número de série da versão desejada dentro do contêiner (SourceIndex).
dism /Get-WimInfo /WimFile:install.esd
Em seguida, extraia o arquivo de imagem (nesse caso, o primeiro no contêiner).
dism /export-image /SourceImageFile:install.esd /SourceIndex:1 /DestinationImageFile:install.wim /Compress:max /CheckIntegrity
Agora você precisa abrir a imagem no Windows System Image Manager (nas Ferramentas de Implantação) e gerar um diretório.
Note-se que trabalhar com imagens no Windows System Image Manager só é possível se a profundidade de bits da imagem corresponder à profundidade de bits do host. Ou seja, é impossível editar a imagem da versão de 32 bits em um sistema de 64 bits. Aqui, como se costuma dizer, sem comentários.
Quando o diretório for criado, edite o arquivo de resposta para o utilitário SysPrep . Digite as informações do proprietário, adicione os usuários necessários e configure o primeiro login automático (Fig. 3).
Fig. 3. Criando um arquivo de resposta.
Não faz sentido listar todos os parâmetros, o conteúdo do arquivo de resposta pode ser encontrado no repositório. O principal é não esquecer de definir os parâmetros CopyProfile como true , SkipReam como 1 e ativar o logon automático do administrador. Você pode inserir a chave do produto na seção 4 especializar - Microsoft-Windows-Shell-Setup - ProductKey .
3. Instalando Programas
Em seguida, é necessário o arquivo de imagem install.wim real, portanto, você deve colocá-lo ao lado do arquivo de resposta customize.xml , no qual, após salvar, você deverá substituir manualmente o caminho da imagem. No final do arquivo, a linha deve ficar assim:
<cpi:offlineImage cpi:source="wim:d:/service/install.wim#Windows 10 Enterprise LTSB" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
Para obter a interface de demonstração do KioskShell, você precisa criar uma versão para Windows a partir da fonte. As dicas de montagem estão no repositório.
Copiamos os arquivos para o quadro e obtemos a seguinte estrutura de arquivos e diretórios:
C:\ └── Design\ ├── backgroundDefault.jpg - ( ) └── oemlogo.bmp - , D:\ ├── Logs\ - ├── Service\ │ ├── AfterSetup.bat - , SysPrep │ ├── FirstLogon.bat - │ ├── customize.xml - │ ├── install.wim - │ ├── CustomShellSetup.ps1 - PowerShell │ ├── EnableRules.ps1 - PowerShell │ ├── DisableAllRules.ps1 - ( ) │ └── UserLogon.bat - ( ) └── Shell\ - "KioskShell.exe"
4. Configuração manual do sistema
Quando o sistema está no modo de serviço, você pode reiniciar quantas vezes quiser, o sistema retornará automaticamente a ele. No entanto, com um longo tempo de inatividade antes de configurar a energia, a tela pode travar e não voltará, apenas uma reinicialização ajudará. Como cada projeto específico pode ter seus próprios recursos de configuração, é melhor fazê-lo manualmente, mas você também pode usar scripts de automação.
Instalamos os componentes necessários do sistema incorporado e desabilitamos o controle de conta de usuário (consulte AfterSetup.bat no repositório)
Instale todos os drivers, configure o hardware (placa de rede IP, resolução e orientação da tela, portas de dispositivos externos, etc.), desative as teclas de atalho e todos os recursos especiais.
Como no futuro eu gostaria de poder administrar remotamente, habilitaremos o acesso via RDP. A senha do administrador expirará no estágio de configuração automática.
Em seguida, você precisa desativar a atualização do sistema no Editor de Diretiva de Grupo Local (na seção Configuração do Computador - Modelos Administrativos - Componentes do Windows - Windows Update , é necessário definir Atualizações Automáticas Configuradas como Desativadas ). Além disso, você também precisa desativar a verificação automática do Windows Update (no agendador de tarefas na seção Microsoft - Windows - UpdateOrchestrator, é necessário desativar todas as tarefas); caso contrário, uma janela preta será exibida toda vez que você inicializar e, quando você se conectar à Internet, o Windows poderá iniciar a atualização subitamente.
Em seguida, defina as configurações de energia. Para fazer isso, você deve primeiro tornar todas as configurações de energia visíveis na seção Configurações avançadas de energia (para isso, no registro em cada subchave em HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Power \ PowerSettings \ 238C9FA8-0AAD-41ED-83F4-97BE242C8F20, se você precisar do parâmetro Atributos , valor para ele 2 ). Agora que todas as configurações estão disponíveis, desative o modo de suspensão, o modo de ausência, remova a ação no botão liga / desliga (a menos que, é claro, você precise de outro modo) e desligue o timer de autorização quando estiver ocioso. Em seguida, removemos o modo de espera com a conexão (na seção HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Power , é necessário definir o parâmetro CsEnabled como 0 ). Se necessário, desligue o controle de brilho adaptável da tela.
Quando todas as configurações do sistema estiverem concluídas, temos a última oportunidade de fazer alterações, pois a segunda execução do script AfterSetup.bat iniciará o mecanismo de configuração automática usando o SysPrep , que não pode ser parado. Você ainda precisa se lembrar de ativar o sistema (propõe-se familiarizar-se com as opções para ativar as versões corporativas do Windows). Mesmo nesse estágio, você pode fazer uma cópia de backup de todo o disco e corrigir o estado preliminar da imagem em caso de alterações no futuro.
No final do trabalho, o SysPrep não será reiniciado, mas desligará o computador - neste momento, você já pode criar uma imagem de trabalho, pronta para ser transportada para uma série.
5. Configuração final automática do sistema
Após o primeiro carregamento da imagem de trabalho (consulte FirstLogon.bat no repositório), a interface segura será configurada, o logon automático será reconfigurado para a conta de Usuário e os atalhos de teclado que podem interromper o sistema serão desativados. Em seguida, o filtro de gravação unificado será configurado e ativado. Nesse caso, o filtro está configurado para proteger todas as partições, exceto as pastas Serviço e Logs , e usa uma troca de 256 MB. O sistema será reiniciado várias vezes e, se tudo for feito corretamente, na próxima inicialização, uma interface segura aparecerá, iniciada em nome da conta do usuário .
Para fazer a manutenção do sistema no local, é possível acessar a tela de login e, por exemplo, fazer login na conta de administrador. No Windows 10, é fornecido um método padrão para isso, você precisa pressionar a tecla “Ganhar” 5 vezes seguidas.
Caminho do Linux
Não existe uma maneira padrão única de criar sistemas incorporados com uma interface gráfica baseada no Linux. Como não existe uma distribuição comum única, é uma família de sistemas criada com princípios completamente diferentes. O mais próximo no assunto pode parecer o projeto Yocto Linux. No entanto, é bastante difícil coletar imagens cheias de aplicativos, drivers e bibliotecas de terceiros. Para resolver esse problema, é mais fácil pegar uma distribuição pronta e bem suportada e configurá-la manualmente.
Solução simples
1. Instalação inicial
Então, primeiro de tudo, precisamos da distribuição em si, por exemplo Debian . Você pode pegar outro, você pode fazer o seu. O principal é que a distribuição não possui um sistema de atualização automática. Para a placa experimental, o Debian Linux 9 (versão de 64 bits, kernel 4.9) foi escolhido.
Instalamos o sistema da maneira tradicional. Ao instalar, dividimos o disco em duas seções, sda1 - / para o sistema, sda2 - / var / log para logs de sistema e software. Esse detalhamento é útil no futuro para o filtro de gravação. Instale a GUI padrão do xfce e o servidor ssh . Adicionamos administrador durante a instalação do usuário e definimos a senha.
Após a instalação, a primeira coisa da conta raiz é adicionar o usuário administrador ao grupo sudo .
apt install sudo adduser administrator sudo
Entramos no sistema sob o administrador do nome de usuário e adicionamos um novo usuário .
sudo useradd -m user
Por conveniência, você pode remover completamente a senha, pois o acesso a essa conta ainda será fechado em todos os lugares.
sudo passwd -d user
2. Configuração do sistema
Instalamos drivers, pacotes de firmware e programas adicionais, conforme desejado.
Para habilitar a administração remota no futuro, se necessário, você pode instalar e configurar o servidor vnc . No entanto, neste caso, isso não faz sentido, pois todas as tarefas administrativas podem ser executadas facilmente através do console e, para isso, apenas o acesso via ssh é suficiente.
O Linux tem a capacidade de usar gerenciadores de janelas diferentes para usuários diferentes. Para que a interface do usuário funcione, instale um gerenciador minimalista com a capacidade de ajustar. E para a configuração, você precisará de mais alguns aplicativos.
sudo apt install fluxbox arandr plymouth
Usando o arandr, você pode alterar a resolução e a orientação da tela, se necessário, e salvar a configuração como um script (Fig. 4).

Fig. 4. Configurações da tela.
Em seguida, é necessário efetuar login no sistema uma vez na conta do usuário, depois de selecionar o fluxbox instalado anteriormente como gerenciador de janelas e, em seguida, sair novamente. Isso é necessário para que o fluxbox, na primeira inicialização, crie todos os arquivos de configurações e seja selecionado como o gerente padrão da conta do usuário (consulte o arquivo .dmrc no diretório inicial do usuário ).
Agora você precisa configurar o fluxbox para atender aos requisitos de interface descritos acima. Para fazer isso, desative o painel session.screen0.toolbar.visible em /home/user/.fluxbox/init : false , comente todos os atalhos de teclado, exceto os botões de volume em /home/user/.fluxbox/keys e em / home / user /. O fluxbox / startup adiciona o lançamento do script de configuração da tela, desativando as funções de economia de energia do monitor e a execução automática do aplicativo em tela cheia. O script reiniciará o aplicativo em caso de falha inesperada.
set_resolution.sh xset -dmps s off /home/user/autostart.sh &
Agora você precisa acelerar o processo de inicialização do sistema e ocultá-lo do usuário. Para fazer isso, configure GRUB_TIMEOUT = 0 em / etc / default / grub e defina quiet_boot = "1" em /etc/grub.d/10_linux . Para exibir a animação ao carregar nos parâmetros do kernel GRUB_CMDLINE_LINUX, você precisa adicionar a opção inicial , e se a orientação da tela mudar, a opção fbcon = rotate: 1 ou fbcon = rotate: 3 , dependendo da direção. Se necessário, você pode alterar a resolução e a orientação na tela de login. Para isso, display-setup-script = set_resolution.sh deve ser especificado em /etc/lightdm/lightdm.conf . E se você precisar ocultar o cursor, adicione xserver-command = X -core -nocursor .
Escolheremos um estilo de animação de carregamento.
sudo plymouth-set-default-theme -R text
E finalmente conserte todas as alterações.
sudo update-grub2
3. Instalando Programas
Para obter a interface de demonstração do KioskShell, você precisa criar uma versão do Linux a partir da fonte. As dicas de montagem estão no repositório.
Copiamos os arquivos para o quadro e obtemos a seguinte estrutura de arquivos e diretórios:
/ ├── usr/ - "KioskShell" ├── local/ │ └── bin/ │ └── set_resolution.sh └── home/ ├── administrator/ │ └── relogin.sh - └── user/ └── autostart.sh -
4. Configuração final do sistema
Nesse estágio, você pode fazer uma cópia de backup de todo o disco e corrigir o estado preliminar da imagem em caso de alterações no futuro.
Configure o login automático na conta do usuário, para isso, defina autologin-user = user em /etc/lightdm/lightdm.conf .
Agora defina a proteção contra gravação.
sudo apt install bilibop
Ao instalar, selecione o mapa dinâmico de dispositivo falso .
Edite o arquivo de configurações /etc/bilibop/bilibop.conf . Ativamos o módulo com o parâmetro BILIBOP_LOCKFS = “true” e adicionamos uma seção com logs às exceções BILIBOP_LOCKFS_WHITELIST = "/ var / log" . Vamos ativar a capacidade de desativar temporariamente a proteção, se necessário BILIBOP_LOCKFS_POLICY = "soft" . E como não há criptografia no sistema, você precisa definir BILIBOP_LOCKFS_SWAP_POLICY = "soft" .
Reinicializamos o sistema e, se tudo for feito corretamente, uma interface segura será exibida, lançada em nome da conta do usuário.
A última etapa pode ser facilmente automatizada para obter um sistema com configuração automática na primeira inicialização. Isso criará uma distribuição para dimensionar para vários dispositivos (este mecanismo é proposto para ser implementado independentemente).
Para fazer a manutenção do sistema, é possível acessar a tela de login e fazer login na conta de administrador. No Linux, você primeiro precisa acessar o console através de Ctrl + Alt + F1. Após fazer login na conta do administrador, force o usuário a sair do sistema.
sudo skill -KILL -u user
Em seguida, retorne ao modo gráfico via Ctrl + Alt + F7 e efetue login como administrador novamente.
Conclusões
Independentemente do caminho escolhido, o resultado final é o mesmo. Com a configuração adequada, a interface do usuário atenderá a todos os requisitos descritos acima. Somente diferenças visuais são possíveis, associadas, em regra, aos recursos de renderização de elementos gráficos usando a aceleração de hardware em diferentes plataformas.
Fig. 5. A interface está em operação.
Como a base do sistema é um computador de placa única, não será um problema instalar qualquer tela de toque ou outros controles. Se você tiver o aplicativo apropriado, nessa base, poderá criar não apenas o console de controle ou o painel interativo do dispositivo, mas também outros dispositivos, por exemplo, terminais de informações ou de negociação.
Problema de escolha
Há uma opinião de que o Linux é muito difícil de configurar e manter, mas ao mesmo tempo é gratuito e o Windows é simples e conveniente, mas custa dinheiro. Talvez isso seja verdade, mas apenas no nível familiar. Quando se trata de criar sistemas embarcados, outras circunstâncias devem ser consideradas. Por exemplo, o ajuste fino do Windows, especialmente em termos de gerenciamento de energia e outros elementos de baixo nível, não parece mais simples e conveniente. Além disso, não esqueça que o Windows 10 é bastante exigente em recursos. Neste exemplo, foi possível medir o consumo de memória de um sistema limpo várias vezes, e havia cerca de 400 MB no estado inativo. Para comparação, o Linux Debian com todos os seus complementos ocupava cerca de 200 MB de memória. Obviamente, se você possui vários gigabytes de RAM, isso não é um problema, mas ainda assim, ao usar o Windows e aplicativos clientes altamente carregados, é necessário ter computadores de placa única mais poderosos. O Linux é menos exigente em recursos, mas é realmente difícil de configurar e requer uma abordagem elegante, especialmente ao trabalhar com o carregador de inicialização. Além disso, durante o desenvolvimento e a implementação de alguns elementos no sistema, às vezes é necessário montar seu próprio kernel com parâmetros especiais. É eficaz, mas requer um nível apropriado de habilidade.
É difícil fazer uma escolha inequívoca como parte da criação de uma interface segura. A complexidade da implantação de sistemas é aproximadamente a mesma. O custo de aquisição de licenças do Windows para uma série de instrumentos pode ser igual ao custo de manutenção de sistemas no Linux. Qual sistema escolher, você decide.
Várias interfaces homem-máquina baseadas nos exemplos descritos foram introduzidas pelo autor em dispositivos eletrônicos para uma ampla variedade de aplicações e provaram sua operabilidade no mundo real.