Tenho certeza que a maioria dos programadores já ouviu falar Node.js , mas e quanto NodeOS ? Sim, NodeOS, um sistema operacional escrito em Node.js. Bem, tipo isso. O NodeOS usa o kernel Linux para a maioria das coisas críticas de desempenho, como, por exemplo, interações de hardware, mas para todo o resto ele usa Node.js. O desenvolvimento do NodeOS começou há dois anos e foi criado por pessoas que compartilharam uma ideia simples, mas intrigante: “É possível criar um sistema operacional usando apenas Node.js?”
introdução ao big data com apache spark
Em primeiro lugar, pense sobre o progresso que o Node.js fez no curto período de tempo que existe. Agora, pense na mesma coisa que acontece com um sistema operacional. Então, vamos adicionar algumas coisas legais a ele.
O NodeOS introduziu um paradigma interessante: se todos os usuários têm um sistema de arquivos isolado, isso dá a eles uma hierarquia de sistema de arquivos simples para trabalhar. Visto que sua “pasta pessoal” é, na verdade, a raiz de sua própria hierarquia de sistema de arquivos, eles podem instalar pacotes globalmente sem exigir permissões especiais e não precisam configurar nada, já que são instalados em seu diretório pessoal por padrão. Além disso, oferece uma boa dose de segurança; se um hacker encontrar uma maneira de entrar em uma conta específica no sistema operacional, a única partição que ele pode acessar é a partição desse usuário. O resultado final é hacker não podes comprometer todo o sistema.
Se você pensar bem, um sistema operacional que usa Node.js significa que qualquer pacote disponível no NPM é, ao mesmo tempo, também um pacote NodeOS. No momento em que este artigo foi escrito, havia 210.735 pacotes; como o número de pacotes NPM cresce a cada minuto, não seria estranho se, em alguns anos, o NodeOS tivesse um milhão de aplicativos.
Isso pode não parecer grande coisa, mas o Linux é o sistema operacional de servidor mais usado. Como o NodeOS é baseado no kernel do Linux, você pode executar todos os aplicativos escritos para outras distribuições do Linux com mudanças mínimas.
Por mais que eu gostaria de um NodeOS acabado, ele ainda não está lá. Ainda faltam muitas funções importantes para um sistema operacional de servidor. Por exemplo, todo o conjunto de ferramentas BASH está faltando, incluindo ps, tail, nano e grep. Além disso, você não pode executá-lo como um sistema operacional de desktop, pois não tem GUI. Claro, você pode implementar alguns dos recursos ausentes com bastante facilidade usando um pouco de JavaScript, mas o fato de todos os recursos mencionados não estarem disponíveis por padrão não é bom.
A maneira mais fácil e rápida de experimentar o NodeOS é usando o seguinte:
Depois de instalar o Docker, é fácil executar uma instância do NodeOS. Tudo o que você precisa fazer é executar o seguinte comando, e o Docker fará toda a mágica:
sudo docker run -t -i nodeos/nodeos
Quando você executa o comando mencionado, o Docker baixa automaticamente a imagem do disco para o NodeOS de um repositório e executa a instalação do NodeOS dentro de uma máquina virtual. Assim que a instalação for concluída, ele abre uma sessão SSH para o shell do NodeOS.
Existem alguns motivos pelos quais você deseja evitar o uso do Docker, e um deles é a versão mais recente do NodeOS. No momento em que este artigo foi escrito, a última alteração na imagem Docker do NodeOS foi realizada há dois meses, enquanto a versão de desenvolvimento foi atualizada há seis dias. Então, se você quiser usar a versão mais recente, você definitivamente deve obter o código-fonte. Isso não é muito difícil, mas leva muito tempo. Você vai precisar de:
Depois de ter tudo, você pode prosseguir com a compilação do código-fonte:
bash git clone [email protected] :NodeOS/NodeOS.git
.cd NodeOS
e npm install
.bash npm start
para executar o NodeOS dentro do Qemu.Depois de concluída a instalação, podemos verificar se está funcionando executando dentro do shell do NodeOS o comando ls
. Uma saída como esta deve aparecer:
[ 'etc', 'lib', 'lib64', 'root', 'bin', 'sys', 'usr', 'share', 'proc' ]
Se isso acontecer, significa que alguns comandos básicos estão funcionando. Mas, e se quisermos exibir o endereço IP da placa de rede? No Linux, existe um comando chamado ifconfig
isso faz exatamente isso; vamos tentar:
command not found: ifconfig
Parece o comando ifconfig
está desaparecido. Isso ocorre porque o NodeOS não tem um padrão ifconfig
comando. O que agora? Bem, é simples; O NodeOS tem um gerenciador de pacotes integrado (como apt
ou yum
), chamado npkg
, que é baseado no NPM do Node e é fácil de usar. Instalando ifconfig
é tão simples quanto executar o seguinte comando:
npkg install bin-ifconfig
Se tudo correr bem, o comando ifconfig
agora deve estar disponível no shell. Se tentarmos executá-lo novamente, uma saída como esta aparecerá (coloquei um endereço MAC e um endereço IP aleatórios por motivos óbvios):
eth0: flags=8863 mtu 1500 ether 01:23:45:67:89:ab inet6 f0cd::ef01:0203:0405:181%en1 prefixlen 64 scopeid 0x5 inet 192.168.0.21 netmask 0xffffff00 broadcast 192.168.0.21 nd6 options=1 media: autoselect status: active
Se sua saída se parecer com isso, então está funcionando. Você instalou com sucesso seu primeiro aplicativo NodeOS: ifconfig
.
Qual é o ponto de ter um sistema operacional escrito em Node.js se você pode fazer as mesmas coisas (ou até menos coisas) que você pode fazer no Ubuntu ou qualquer outra distribuição Linux? Bem, a questão toda é que tudo é desenvolvido usando nada mais do que Node.js. Também significa que podemos desenvolve nossos aplicativos usando nada mais do que Node.js. Por exemplo, o NodeOS não tem uma implementação padrão para o comando man
, que é usado no Linux para exibir páginas de manual de outros comandos. Não tenha medo, implementá-lo é fácil. Como, eu ouço você perguntar? Simples.
Primeiro, vamos instalar um editor de texto chamado Hipster para que possamos criar e editar arquivos executando o seguinte comando: npm install -g [email protected]
. Este editor de arquivos é simples e definitivamente não algo que eu usaria como editor para qualquer outra coisa, mas é bom o suficiente neste caso. Criar arquivos com o Hipster é realmente simples, basta executar hip filename
, como hip package.json
; para salvar, pressione Ctrl + s
e para sair pressione Ctrl + q
. Para este exemplo, vou usar um código desenvolvido por um dos principais desenvolvedores do NodeOS, eu mesmo não o implementei. O código original para nosso exemplo pode ser encontrado em o repositório Git node-bin-man .
Vamos voltar à criação de nosso primeiro aplicativo NodeOS. Como acontece com todo aplicativo Node.js (ou pacote NPM), começamos criando um package.json
arquivo, como no exemplo a seguir:
{ 'name': 'bin-man', 'version': '0.0.1', 'description': 'Format and display manual pages', 'bin': { 'man': 'man.js' }, 'repository': 'https://github.com/groundwater/node-bin-man', 'author': 'groundwater', 'license': 'MIT', 'dependencies': { 'blessed': '~0.0.22' } }
Os parâmetros name
, version
, author
, repository
, license
e description
são autoexplicativos. O bin
coleção é um objeto de chave / valor JSON que contém o nome do comando e um arquivo JavaScript associado. Em nosso exemplo, o man
comando está associado ao arquivo man.js
. A coleção, dependencies
, contém uma lista de pacotes NPM necessários para usar este aplicativo. Em nosso exemplo, o autor do código incluiu Blessed, uma biblioteca semelhante a curses com uma API de interface de terminal de alto nível para Node.js.
problemas e soluções de segurança da web
Agora vamos para a parte principal, o código real.
#!/usr/bin/env node
Esta parte é chamada de “shebang”. Na verdade, não é exigido pelo NodeOS, mas informa ao sistema operacional como executar o código a seguir. No nosso caso, ele informa ao interpretador que tudo precisa ser executado com o comando /usr/bin/env node
.
var fs = require('fs'); var blessed = require('blessed');
Assim como no Node.js, a função require()
carrega o pacote selecionado na memória e o salva na variável especificada.
var arg = process.argv[2] || 'bin-man';
O comportamento padrão de um man
comando é para informar um manual sobre si mesmo se nenhum outro comando for especificado. Nosso exemplo de código está fazendo o mesmo: Se nenhum argumento for especificado para o segundo parâmetro (o primeiro sendo o próprio man), o padrão é bin-man.
var path = process.env.HOME + '/lib/node_modules/' + arg + '/README.md'; try{ var readme = fs.readFileSync(path, 'utf-8'); }catch(e){ console.log('No README.md for Package ',arg); process.exit(-1); }
Nesse ponto, o programa verifica se existe um arquivo leia-me para o aplicativo em questão. No NodeOS, o caminho de instalação de cada aplicativo é o diretório inicial (ou /
) seguido pelo diretório lib/node_modules
. Se o arquivo README.md
existe, ele salva seu conteúdo dentro da variável readme
. Caso contrário, ele mostra um erro e sai do processo.
// Create a screen object. var screen = blessed.screen(); var box = blessed.box({ content: readme, alwaysScroll:true, scrollable: true, }); // Append our box to the screen. screen.append(box);
Blessed tem uma API muito simples; mostrar o conteúdo de um arquivo é tão fácil quanto dizer a ele para criar um box
e carregando o conteúdo.
screen.key(['escape', 'q', 'C-c'], function(ch, key) { return process.exit(0); });
Agora, vamos criar uma maneira de sair do man
inscrição. Combinamos as teclas escape
, q
ou a combinação de estilo emacs C-c
para sair do processo.
screen.key(['space','f','j','n'], function(ch, key) { box.scroll(box.height); screen.render(); }); screen.key(['down'], function(ch, key) { box.scroll(1); screen.render(); }); screen.key(['up'], function(ch, key) { box.scroll(-1); screen.render(); }); screen.key(['b','k','p'], function(ch, key) { box.scroll(-box.height); screen.render(); });
Usamos as teclas direcionais para rolar para cima ou para baixo uma linha e as teclas space
, f
, j
ou n
para rolar uma página para baixo (tantas linhas quantas houver na tela). Use b
, k
ou p
para fazer o inverso.
box.focus(); screen.render();
Finalmente, dizemos ao aplicativo para se concentrar em box
nós criamos e renderizamos a coisa toda. Vamos colocar esses arquivos no diretório /lib/node_modules/bin-man
e vamos adicionar um simples README.md
, algo assim:
# Man Author: @groundwater ## Install npkg install bin-man ## Usage ``` Usage: man PKGNAME Display a packages README.md file ```
Estamos quase terminando nosso primeiro aplicativo personalizado para NodeOS. Resta apenas um último pequeno passo; precisamos criar um arquivo de configuração, pois é um requisito para aplicativos NodeOS. É tão simples quanto criar um arquivo no caminho /etc/bin-man/config.json
com o seguinte conteúdo: {}
, um objeto JSON vazio. Agora, podemos experimentar nosso novo aplicativo. Em execução man
dentro do shell do NodeOS deve mostrar o arquivo leia-me que criamos anteriormente.
Como você pode ver com nosso exemplo de código simples, implementar qualquer coisa no NodeOS é uma tarefa fácil, você só precisa conhecer o Node.js.
O NodeOS tem muito potencial e acho que pode se tornar um ótimo sistema operacional assim que recursos adicionais forem implementados. Ele ainda precisa ser melhorado, mas como resultado da popularidade de todo o ecossistema baseado em Node.js, eu não ficaria surpreso se ele rapidamente se tornasse um sistema operacional popular. O que você acha disso? Deixe-me saber nos comentários.