IncludeOS é um sistema operacional unikernel mínimo e incluível para serviços C++ executados na nuvem e em HW real. Iniciar um programa com #include <os>
incluirá literalmente um pequeno sistema operacional em seu serviço durante o link.
IncludeOS é um software livre, “sem garantias ou restrições de qualquer tipo”.
Nota: IncludeOS está em desenvolvimento ativo. A API pública não deve ser considerada estável.
Uma lista mais longa de recursos e limitações pode ser encontrada em nosso site de documentação.
Para construir e inicializar serviços IncludeOS você precisará de nix e Linux. Nix baixará e configurará automaticamente as versões corretas de todas as bibliotecas e compiladores necessários.
Para acelerar as compilações locais, também recomendamos configurar o nix com suporte ao ccache, mas isso não é um requisito. Para usar o ccache, --arg withCcache true
pode ser adicionado à maioria dos comandos nix-build
e nix-shell
mostrados abaixo.
Atualmente, IncludeOS não pode ser desenvolvido em macOS ou Windows.
Um "hello world" mínimo do IncludeOS se parece com um programa C++ normal:
# include < iostream >
int main (){
std::cout << " Hello world n " ;
}
Um serviço completo "Hello world" com um fluxo de trabalho nix funcional está disponível no repositório hello world. O repositório também pode ser usado como ponto de partida para desenvolver seu próprio serviço IncludeOS.
Para exemplos de serviços mais avançados, consulte os testes de integração (em ./IncludeOS/test/*/integration).
Para construir o IncludeOS, execute
$ nix-build
Isso construirá o conjunto de ferramentas e todas as bibliotecas do kernel IncludeOS.
Observe que a primeira compilação levará algum tempo para ser concluída, pois a cadeia de ferramentas IncludeOS é reconstruída a partir do código-fonte. Isso inclui clang, llvm, libcxx, musl e assim por diante. Não há cache binário nix disponível para esses arquivos no momento. As compilações subsequentes serão muito mais rápidas quando o conjunto de ferramentas for armazenado em cache no nix-store local.
Depois de fazer alterações no kernel, execute nix-build
novamente para obter novos binários. Se você estiver iterando alterações em uma seção do kernel, poderá acelerar significativamente a compilação usando o ccache. Todos os comandos nix-build
e nix-shell
nesta seção suportam o parâmetro opcional --arg withCcache true
.
Nem sempre é prático reconstruir todo o kernel durante o desenvolvimento. Você pode obter um shell de desenvolvimento com um ambiente pré-configurado usando shell.nix
:
$ nix-shell
Serão mostradas instruções adicionais para configurar opcionalmente a rede VM ou substituir o caminho de construção ao iniciar o shell.
Por padrão, o shell também construirá o unikernel a partir de example.nix
. O unikernel de exemplo pode ser inicializado de dentro do shell:
$ nix-shell
[...]
nix$ boot hello_includeos.elf.bin
Se você deseja construir um unikernel diferente do exemplo, isso pode ser especificado com o parâmetro --argstr unikernel [path]
. Isso é usado principalmente para testes de integração. Por exemplo, para criar e executar o stacktrace-test:
$ nix-shell --argstr unikernel ./test/kernel/integration/stacktrace
[...]
nix$ ls -l kernel *
kernel_stacktrace
nix$ boot kernel_stacktrace
[...]
Calling os::print_backtrace ()
symtab or strtab is empty, indicating image may be stripped
[0] 0x000000000025dcd2 + 0x000: 0x25dcd2
[1] 0x000000000021097d + 0x000: 0x21097d
[2] 0x00000000002b370a + 0x000: 0x2b370a
[3] 0x0000000000210eea + 0x000: 0x210eea
We reached the end.
Para criar e executar a VM de teste como um único comando:
$ nix-shell --argstr unikernel ./test/kernel/integration/stacktrace --run ./test.py
Você pode executar todos os testes de integração usando o script ./test.sh
. Os testes serão executados localmente no ambiente nix. Recomendamos verificar manualmente se todos os testes foram aprovados localmente antes de enviar um novo PR ao IncludeOS para economizar tempo de revisão.
Testes individuais podem ser executados diretamente com nix-shell
. Consulte test.sh
para obter mais detalhes.
IncluirOS está sendo desenvolvido no GitHub. Crie seu próprio fork e envie-nos uma solicitação pull. Por favor, leia as Diretrizes para Contribuir para IncluirOS.
Queremos aderir tanto quanto possível às Diretrizes Básicas ISO C++. Quando você encontrar um código no IncludeOS que não esteja em conformidade, informe-nos no rastreador de problemas - ou melhor ainda, corrija-o em seu próprio fork e envie-nos uma solicitação pull.
Se você descobrir um problema de segurança no IncludeOS, evite o rastreador de problemas público. Em vez disso, envie um email para [email protected]. Para obter mais informações e criptografia, consulte a documentação.