Se sua organização implanta soluções de IoT, você sabe que o desenvolvimento de sistemas embarcados é um pouco diferente do desenvolvimento padrão para computadores de mesa. O baixo custo do Linux é atraente para desenvolvedores de IoT, por isso ele costuma ser a escolha preferida para o desenvolvimento embarcado, em vez de kernels proprietários caros. Não é incomum que os desenvolvedores trabalhem em um ambiente semelhante ao do dispositivo de destino usando uma máquina virtual, mas o desenvolvimento em uma VM pode ser complicado. Em vez disso, os desenvolvedores podem trabalhar com distribuições projetadas especificamente para sistemas embarcados.
Em comparação com os sistemas operacionais embarcados proprietários, o Linux tem baixo custo; permite a participação de vários fornecedores de software, desenvolvimento e suporte; possui um kernel estável; e facilita a leitura, a modificação e a redistribuição do código-fonte. Por essas e outras razões, o Linux tornou-se a opção preferida para sistemas embarcados.
Mas, quando se trata de implantar o Linux em um dispositivo, há inúmeras opções. Ao desenvolver para dispositivos de desktop e de nível empresarial, os desenvolvedores geralmente optam por uma distribuição como o Ubuntu para reproduzir da melhor forma o ambiente de implantação, com a ajuda adicional de ferramentas como o VirtualBox e o Docker. Essa configuração, porém, não se adapta bem à programação de sistemas embarcados. O ambiente de desenvolvimento é muito diferente, e o resultado da compilação precisa incluir uma imagem de software completa para o dispositivo de destino: o kernel, os drivers de dispositivo, as bibliotecas, o software aplicativo e, talvez, até mesmo o bootloader.
Ao se aproximarem de uma distribuição Linux para desenvolvimento embarcado, muitas pessoas começam com uma distribuição para desktop, como o Debian ou o Red Hat, e removem componentes desnecessários até que a imagem instalada seja adequada para o dispositivo de destino. Essa é uma abordagem natural, já que muitos desenvolvedores de Linux são usuários de Linux para desktop e têm acesso ao conjunto habitual de pacotes de tempo de execução. Uma opção é, na verdade, conectar um monitor e um teclado ao dispositivo de destino e desenvolver diretamente dessa forma. No entanto, essa abordagem pode ser complicada. As distribuições para desktop não são projetadas para sistemas com poucos recursos, e adicionar e excluir pacotes manualmente pode ser uma tarefa difícil e propensa a erros.
O que é o Linux embarcado?
A computação automotiva, os dispositivos médicos, a Internet das Coisas (IoT) e a automação industrial são apenas alguns exemplos de sistemas embarcados que rodam no Linux embarcado. Sabemos que os computadores funcionam com hardware específico (por exemplo, CPU, memória, placa-mãe), e os dispositivos de sistemas embarcados também funcionam com microprocessadores e controladores, mas em menor escala. Esses dispositivos precisam de um sistema operacional que consuma menos recursos, e os desenvolvedores devem poder fazer a implantação no sistema operacional a partir de seus computadores.
O Linuxembarcado é ideal paradesenvolvedores de IoTdevido ao seu baixo custo, código-fonte aberto, requisitos de armazenamento reduzidos e capacidade de funcionar com poucos recursos. É uma opção estável, o que é fundamental para organizações que implantam sistemas utilizados por diversos consumidores. Não há motivo para preocupação com falhas no sistema operacional. Por exemplo, o sistema operacional Android é baseado no Linux e detém 87% da participação no mercado global, sendo um sistema operacional muito confiável.
O Linux embarcado é um sistema operacional em tempo real (RTOS)?
Um sistema operacional em tempo real (RTOS) proprietário pode ser uma alternativa atraente ao Linux embarcado, mas apresenta suas próprias dificuldades. Quando os desenvolvedores buscam plataformas e métodos de desenvolvimento para a IoT, eles se deparam com as opções do Linux embarcado ou de um RTOS. Existem diferenças distintas entre os dois, portanto, é preciso escolher com cuidado antes de se comprometer com um ou com o outro.
Os RTOS podem ser mais fáceis de usar para os desenvolvedores, mas, para aplicativos corporativos em que se deseja oferecer suporte a personalizações ou integrar-se a outros projetos de desenvolvimento, o Linux embarcado oferece um ambiente de integração mais intuitivo. Um RTOS é projetado para aplicativos em que o tempo é um fator crítico. A menos que você tenha um sistema com eventos críticos sensíveis ao tempo, o Linux embarcado oferece mais flexibilidade para os desenvolvedores.
Qual é a diferença entre o Linux e o Linux embarcado?
A maioria dos desenvolvedores sabe que é necessário compilar o código-fonte para o sistema de destino. Ao desenvolver para sistemas embarcados, os desenvolvedores escrevem o código em um computador desktop, mas fazem a implantação em outro ambiente usando cadeias de ferramentas multiplataforma. As implantações em sistemas embarcados são bem diferentes das realizadas em computadores desktop. Os computadores desktop são voltados para arquiteturas de microprocessadores 8086, mas os sistemas embarcados podem ser voltados para diversos microprocessadores, geralmente ARM, 8051, PIC e AVR.
Algumas outras diferenças entre o Linux para desktop e o Linux embarcado incluem:
- Os sistemas embarcados consomem menos energia e geralmente funcionam com baterias.
- Os sistemas embarcados são muito mais compactos.
- Muitos sistemas embarcados controlam dispositivos essenciais, como sistemas de alerta de saúde, equipamentos médicos, maquinário nuclear e sistemas de segurança residencial.
- Um sistema Linux embarcado contém apenas os componentes necessários para funcionar no processador de destino, em vez de todos os drivers e bibliotecas possíveis para rodar em uma infinidade de componentes instalados em um computador de mesa.
Sugestões de especialistas: o que ler a seguir
- A segurança da IoT começa no nível do sistema operacional – conheça as principais opções de código aberto que impulsionam projetos de IoT no Linux para IoT
- Está usando um sistema operacional em fim de vida útil (EOL)? Saiba mais sobre os riscos de conformidade, custo e segurança que você não pode ignorar com a detecção de EOL do sistema operacional
- As 5 principais ferramentas de administração do Linux: veja quais utilitários de código aberto otimizam a automação, o monitoramento e a aplicação de patches em nosso guia selecionado de ferramentas de código aberto
- Análise aprofundada dos sensores de IoT: Veja como os dispositivos de IoT e a computação de ponta atuam em conjunto com a inferência para otimizar a produção e a qualidade.
Qual é um exemplo de sistema operacional Linux embarcado?
O kernel do Linux é de código aberto e permite que qualquer pessoa o modifique e distribua em sua forma alterada. Existem várias versões do Linux para computadores de mesa no mercado, assim como estão disponíveis várias versões do Linux embarcado. Os desenvolvedores têm liberdade para trabalhar com sua própria versão personalizada do Linux, mas é muito mais prático trabalhar com uma versão já existente e estável.
Já mencionamos o sistema operacional Android. O Android é um sistema Linux embarcado desenvolvido pelo Google e lançado sob licença de código aberto, o que permite que outros desenvolvedores o modifiquem e distribuam. O Debian é um exemplo de distribuição Linux para computadores de mesa que também possui uma versão embarcada nos dispositivos Raspberry Pi. O Raspberry é o sistema operacional baseado no Debian utilizado para operar o dispositivo computacional compacto Raspberry Pi.
Por que o Linux é utilizado em um sistema embarcado?
Os desenvolvedores escolhem o Linux como sistema operacional de destino para seus sistemas embarcados por diversos motivos. O primeiro deles é que o Linux é totalmente personalizável. Os desenvolvedores podem utilizar livremente o kernel do Linux para criar sua própria distribuição do sistema operacional ou pegar uma distribuição já existente e fazer pequenas alterações para criar sua própria versão.
O Linux é gratuito, por isso tem um baixo custo inicial para novos desenvolvedores que querem apenas explorar e dar os primeiros passos. Quanto mais desenvolvedores trabalharem com o Linux, maior será a probabilidade de ele ser incorporado aos sistemas.
Por fim, ele é amplamente utilizado, o que faz com que tenha um suporte melhor por parte de desenvolvedores independentes. Se o objetivo for criar um sistema que outros desenvolvedores possam integrar aos seus próprios projetos, o Linux será mais intuitivo.
Como escolher um sistema operacional Linux embarcado?
A escolha de um sistema operacional Linux embarcado depende muito dos seus objetivos, das operações do dispositivo de destino, do tempo de lançamento no mercado e da capacidade de resposta exigida. Muitos desenvolvedores simplesmente optam pelo Android, pois ele é amplamente utilizado e conhecido, mas aqui estão algumas questões a serem consideradas para ajudá-lo a escolher o sistema operacional certo:
- O tempo é um fator crítico? Se você tem um aplicativo que exige precisão temporal, deve-se utilizar um sistema operacional em tempo real. O Linux não é um RTOS, mas extensões como o RTLinux podem ser consideradas.
- O tamanho da memória e a capacidade da CPU são limitados? Um kernel Linux típico tem 1,5 MB, o que pode ser grande demais para alguns sistemas. É possível utilizar um kernel Linux personalizado, contendo apenas os componentes necessários para o funcionamento do aplicativo.
- O desempenho de rede é importante? Os aplicativos móveis que utilizam o Android possuem recursos de rede, mas o Android não é necessário se o foco principal for a rede. Uma alternativa desenvolvida especificamente para o desempenho de rede é o OpenWRT/LEDE.
- Haverá uma interface gráfica de usuário? A interface gráfica pré-instalada do Android pode ser uma boa opção para sistemas que dependem fortemente da interface de usuário.
- O prazo de lançamento no mercado é curto? Compreender a história do Linux e escolher uma versão bem consolidada pode ajudar a reduzir o tempo de desenvolvimento. O Ubuntu é comumente utilizado para lançamentos mais rápidos.
Mantenha os dispositivos de IoT seguros (sem interrupções)
O KernelCare IoT envia patches de segurança automatizados, sem necessidade de reinicialização, para dispositivos conectados, sem precisar desconectá-los da rede – assim, seu ecossistema de IoT permanece seguro e sem interrupções.
Qual distribuição Linux é a melhor para desenvolvimento embarcado?
Os desenvolvedores precisam de um ambiente que facilite a escrita de código e a compilação para o sistema operacional de destino. Eles poderiam usar uma máquina virtual e configurar a distribuição de destino, mas é muito mais prático e confortável trabalhar com ferramentas que sejam instaladas na máquina local e ofereçam suporte multiplataforma. Aqui estão algumas excelentes distribuições Linux para desenvolvimento embarcado:
Yocto

Uma opção muito popular de distribuição Linux para sistemas embarcados, que não se destina a computadores de mesa, é o Yocto, também conhecido como Openembedded. O Yocto conta com o apoio de um grande número de entusiastas do código aberto, de alguns defensores de renome do setor de tecnologia e de diversos fabricantes de semicondutores e placas. Uma compilação do projeto Yocto reúne os binários de tempo de execução do destino, o repositório de pacotes e o SDK do destino. Ela é facilmente expandida por meio de camadas, que adicionam funcionalidades e recursos. A arquitetura modular do Yocto o torna muito flexível e oferece uma prioridade de camadas bem definida, além de capacidade de substituição. Novas versões são lançadas a cada seis meses e a documentação é sempre completa.* Talvez a única desvantagem do Yocto seja que ele pode ser um pouco complicado de entender para quem está começando.
Buildroot

O Buildroot tem como objetivo ser uma versão mais leve do Yocto. O Buildroot não oferece suporte ao gerenciamento de pacotes no próprio sistema-alvo e desativa todas as configurações opcionais em tempo de compilação para todos os pacotes. Não é possível instalar novos pacotes em um sistema em execução. Isso resulta em um sistema pequeno; tão pequeno que muitas pessoas chamam o Buildroot simplesmente de gerador de firmware (já que as imagens são, em sua maioria, fixadas no momento da compilação). A compilação de um projeto Buildroot agrupa a imagem do sistema de arquivos raiz e quaisquer outros arquivos auxiliares necessários para implantar o Linux; o kernel, o carregador de inicialização e os módulos do kernel; e a cadeia de ferramentas usada para compilar todos os binários de destino. A principal vantagem do Buildroot é que ele é bastante fácil de aprender, especialmente porque utiliza Makefiles comuns e a linguagem Kconfig. A principal desvantagem é que a natureza minimalista do Buildroot dificulta a personalização.
OpenWRT/LEDE

O OpenWRT/LEDE tem como objetivo gerar imagens binárias para repositórios de pacotes acessíveis pela rede. É utilizado principalmente para firmware personalizado em roteadores de consumo. Se você precisar de um firmware alternativo para um dispositivo comercial, especialmente se o seu projeto embarcado for voltado para redes, o OpenWRT/LEDE deve ser sua primeira opção. No entanto, ele impõe decisões de política significativas e inflexíveis ao seu projeto. Se você precisar de uma personalização significativa, recomendamos o Buildroot ou o Yocto.
* Mais informações sobre os benefícios: https://www.embitel.com/blog/embedded-blog/why-yocto-is-a-framework-of-choice-for-creation-of-embedded-linux-distributions
Como aplicar atualizações de segurança em sistemas embarcados (e por quê)?
Atualizar seus aplicativos em sistemas embarcados é complicado. Um cenário de patch incorreto pode fazer com que seus clientes tenham um dispositivo “inutilizado”. Atualizações inseguras podem comprometer a segurança do dispositivo. Você poderia contar com os usuários para aplicar manualmente os patches no firmware, mas eles raramente dedicam tempo a isso ou sequer sabem que as atualizações são importantes. Isso também resulta em um sistema comprometido. Por exemplo, dispositivos de IoT sem patches foram responsáveis por um dos maiores ataques distribuídos de negação de serviço (DDoS). Na verdade, os ataques à IoT aumentaram 300% em 2019. Fica claro que a aplicação de patches e as atualizações são essenciais para a segurança do dispositivo e de seus usuários.
A comunicação deve ser sempre criptografada na rede, e deve-se utilizar uma assinatura digital para garantir que um invasor não altere os arquivos de patch. As comunicações criptografadas e as assinaturas digitais impedem ataques do tipo “man-in-the-middle” e evitam a adulteração. O fluxo de trabalho geral para a implantação de atualizações de software é o seguinte:
- Por meio de um canal seguro, consulte um sistema central para verificar se há alguma atualização disponível.
- Verifique se a atualização atual é compatível com a versão instalada.
- Baixe o patch por meio de um canal seguro para evitar um ataque do tipo “man-in-the-middle”.
- Verifique se o arquivo não está corrompido por meio de uma verificação de integridade (por exemplo, soma de verificação).
- Verifique se a assinatura digital é válida.
- Descriptografe o arquivo.
- Extraia todos os arquivos compactados.
- Execute todas as ações pré-instalação, como a criação de backups para uma reversão.
- Instale o patch.
- Execute quaisquer ações pós-instalação, como a limpeza dos arquivos de instalação.
- Verifique se a instalação foi bem-sucedida e, caso contrário, execute uma reversão.
Como aplicar atualizações de segurança em sistemas embarcados sem reinicialização?
O fluxo de trabalho descrito acima é padrão para atualizações, mas a maioria dos patches exige a reinicialização do sistema. A reinicialização de um dispositivo interrompe o trabalho do usuário e pode interromper o funcionamento de sistemas essenciais. Por exemplo, a reinicialização de um roteador principal pode resultar em tempo de inatividade significativo e corrupção de dados em uma rede corporativa.
Em vez de forçar uma reinicialização, é possível realizar a aplicação de patches em tempo real. A aplicação de patches em tempo real resolve vários problemas relacionados às atualizações de sistemas embarcados. Ela elimina a necessidade de reinicializações e o risco de danificar irreparavelmente um dispositivo devido a falhas nas atualizações. Os desenvolvedores não precisam mais criar um serviço personalizado de aplicação de patches para o Linux embarcado, nem depender dos usuários para atualizar manualmente os aplicativos.
Existem três maneiras principais de atualizar o Linux sem reiniciar o sistema: usando a linha de comando, usando a ferramenta kexec ou usando uma solução de livepatch. Todas as três, incluindo soluções de terceiros e as etapas para aplicar as correções, são abordadas nesta postagem do blog.
Conclusão
Para qualquer desenvolvedor que busque um ambiente para sistemas embarcados, o Linux é uma opção popular, com diversas soluções, plataformas, distribuições e ferramentas disponíveis. O sistema operacional escolhido determinará muitas das opções do seu ambiente, mas uma coisa é certa: você sempre precisará de uma maneira de aplicar patches e atualizar seus dispositivos. Para evitar que os dispositivos dos clientes fiquem inutilizáveis, mas mantê-los atualizados, a aplicação de patches em tempo real é a melhor solução. A aplicação de patches em tempo real mantém os sistemas dos consumidores seguros, ao mesmo tempo em que lhes dá a flexibilidade de reiniciar quando acharem apropriado.
Comece um teste gratuito do KernelCare SimplePatch

