Virtualização em nível de SO (contêineres) para OS X

31

Eu me pergunto por que, além do bom e velho chroot, não existe implementação de virtualização no nível do sistema operacional (ou contêineres, se você preferir) para o Mac OS X.

Poderia ser devido a limitações do kernel ou restrições de licença? Ou simplesmente ninguém ainda lançou um projeto semelhante?

Emyl
fonte

Respostas:

16

Um elemento chave necessário para a conteinerização é o isolamento da rede e de outros serviços, mas não apenas o isolamento, mas também a virtualização . O FreeBSD Jails, os "contêineres" do Linux (ou, mais corretamente, os "namespaces") e as zonas Solaris / illumos oferecem algum grau de "virtualização" desses serviços do sistema operacional.

Por virtualização, isso significa que esses servidores estão disponíveis (ou potencialmente disponíveis ) para itens dentro do "contêiner", mas de uma maneira que proteja os outros itens no mesmo host fora do contêiner. (Por exemplo, um contêiner pode ter sua própria pilha TCP / IP, com seu próprio endereço IP, cache ARP, etc.)

A virtualização de SO (sistema operacional) é como geralmente nos referimos a esse tipo de virtualização "leve", em que os processos pensam que veem um kernel virtual, mas todos compartilham o mesmo kernel real; esse kernel atua como uma espécie de hypervisor para garantir que os limites de contêiner / virtualização não sejam ultrapassados. (Dito de outra forma, os serviços do SO são virtualizados.) Compare isso à virtualização de hardware, onde o virtualizado é o hardware - por exemplo, os dispositivos são emulados no software e apresentados a um sistema operacional em execução no contêiner. Isso é muito poderoso, mas consome muitos recursos - cada máquina virtual deve ter sua própria cópia do sistema operacional.

O macOS recente possui suporte nativo ao hipervisor via Hypervisor.framework, que permite software como "XHyve" [uma porta do BHyve do FreeBSD] (a docker do macOS usa isso), mas não possui os serviços necessários para virtualizar totalmente os serviços do sistema operacional.

Na verdade, muito do que é necessário provavelmente já está presente, pois o trabalho para fornecer caixas de proteção significa que já existem pontos lógicos em que as chamadas do sistema são interceptadas e manipuladas de maneira diferente para diferentes aplicativos. No entanto, isso está longe de ser a história completa - implementar uma verdadeira rede separada, IPC e outros namespaces é bastante trabalhoso.

O melhor motivo pelo qual a Apple não fez isso é provavelmente o mesmo motivo pelo qual a Apple não lança uma plataforma adequada para executar o macOS no data center há muitos anos - falta de demanda do mercado ou falta de demanda percebida pela liderança da Apple. O foco em computadores e dispositivos móveis, onde eles concentraram sua atenção, simplesmente não precisa tanto de instâncias virtuais do macOS. (Isso é triste, porque eu adoraria ter suporte virtual ao macOS - por exemplo, executar o macOS em VMs no Travis CI é realmente demorado em comparação aos contêineres do Linux).

Garrett D'Amore
fonte
1
boa resposta ... meu palpite é a Apple evita apoiar OSX no servidor porque ele entraria em colapso seu mercado MBP se os desenvolvedores iOS poderia executar um poderoso laptop linux barato e compilar seu apk em um provedor de hospedagem VPS
Scott Stensland
6

Você ficaria surpreso - os contêineres são realmente suportados - o Sandbox do OS X (e iOS) evoluiu para usá-los. Eles foram introduzidos no 10.7 e agora são de fato padrão no 10.10 e no iOS 8. No último, são mais rigorosamente aplicados (principalmente devido ao motivo da segurança do aplicativo), ao ponto em que um aplicativo só pode se ver e anterior Os métodos de enumeração de processos ou recursos agora retornam resultados baseados em contêiner - semelhantes ao namespace Linux ipc - mas mais poderosos.

Technologeeks
fonte
2
Essas são sandboxes, não a virtualização do sistema operacional (por exemplo, contêineres, zonas, cadeias), certo?
21815 smdvlpr
1
O Docker também não é virtualização. Containers! = VMs. O Docker basicamente reúne vários recursos diferentes do kernel, cgroups, chroot, sistemas de arquivos em camadas, roteamento de tabelas de ip e assim por diante, para isolar um grupo de processos, de modo que o aplicativo se veja como tendo o sistema, enquanto isola esses ambientes para melhorar a segurança e minimizar a capacidade dos contêineres de interferir entre si e com o sistema. Os contêineres OSX atingem parte dessa funcionalidade, mas não todas. Provavelmente é algo que poderia ser implementado por um codificador astuto o suficiente.
21716 Shayne
3
@Technologeeks, você pode apontar para qualquer material de referência em contêineres / caixas de areia no OS X?
Ken Williams
3

Eu imaginaria a resposta a ser que ninguém realmente quer. Parece ser factível. Essas coisas são feitas principalmente para uma finalidade, preservando o desempenho dos fornecedores de VPS. E, na verdade, ninguém quer que uma instância do VPS seja baseada no OS X.

Shane Hsu
fonte
5
Obrigado pelo seu ponto. IMHO há pelo menos outro caso de uso de contêineres, que é criar ambientes de desenvolvimento. BTW, eu encontrei também essa chama antiga: groups.google.com/forum/#!topic/darwin-dev/6-FP9GCsBG4
Emyl
O aumento da densidade é um bom efeito colateral do isolamento de processos em seus próprios namespaces. Os contêineres permitem executar vários aplicativos com mais segurança e ter maior controle sobre o que eles podem fazer na máquina. Esses benefícios são usados ​​pelo iOS para aprimorar a segurança e impedir que os aplicativos interajam, por exemplo, que tem pouco a ver com a densidade de VPS. Até máquinas de serviço único podem se beneficiar da segurança. Não há melhoria de densidade lá, mas os contêineres ainda podem ser úteis.
precisa
2

Enquanto ele usa o "bom e velho chroot (8)", iniciei um projeto que costuma imitar o comportamento do docker no OS X e no NetBSD. É Free-in-speech e está disponível no GitHub . Como o README diz, este projeto não trata de segurança nem produção, mas ajudará a testar pilhas completas nativamente em sua estação de trabalho.

iMil
fonte
0

O docker (como eu o entendo) está apenas "virtualizando" (em camadas) o sistema de arquivos e a rede (cpu / mem são limitados apenas), portanto, todos os mesmos recursos devem estar lá, mas não comercializados da mesma maneira.

moe
fonte