Pra poder falar um pouco mais sobre Virtualizacao em SO, penso ser importante ressaltar como processos são projetados para compartilhar informações e, no entanto, serem isolados uns dos outros. Ou vice-versa.
Geralmente, diferentes processos executam diferentes programas. O modo POSIX de fazer as coisas, muito criticado por alguns, é fazer uma cópia do processo original e, então, substituir este novo processo pelo programa a ser executado. Basicamente, corresponde a sequência de chamadas de sistema fork/execve. Uma das críticas é ter de efetuar uma cópia de um processo para, logo em seguida, substituí-la, gastando recursos de processamento e memória desnecessariamente.
Esse processo de cópia faz com que muitas coisas sejam compartilhadas entre dois processos ou mesmo entre vários processos no sistema. Entre elas, podemos destacar o diretório raiz do sistema, a partir do qual os mesmos arquivos podem ser acessados. Se não fosse por esse compartilhamento, não seria possível abrir um arquivo que acabou de ser criado por um processo em um novo processo. Imagine nunca poder abrir um arquivo porque um processo foi isolado de qualquer outro processo futuro.
E é justamente esse o propósito da chamada chroot. Esta chamada permite alterar o diretório raiz do processo que realiza a chamada, permitindo que código executado a partir de então não possa acessar arquivos sob a raiz original do sistema. Com exceção, é claro, daqueles sob a nova raiz. A partir desse processo cujo diretório raiz foi alterado, novos processos iniciados por ele ou por aqueles iniciados por ele (formando assim uma hierarquia de processos) estarão limitados aos arquivos sob aquela raiz. Essa nova hierarquia de processos enxergará, portanto, um novo ambiente, em que a hierarquia de arquivos visíveis, o espaço de nomes limitado por barras ("/") é diferente daquela que outras hierarquias de processos enxergam.
Criamos, então, uma separação, um isolamento, entre diferentes grupos de processos. Outros recursos ainda são compartilhados, mas outros isolamentos são possíveis, como veremos futuramente, criando, assim, conteineres de processos, incapazes de afetar uns aos outros (ou assim devem ser).
Por outro lado, processos podem compartilhar mais do que é normalmente compartilhado em uma chamada padrão à chamada de sistema fork. A chamada de sistema clone2, que aceita diferentes opções de compartilhamento, permite a criação de novos isolamentos ou compartilhamentos. Entre essas opções, temos CLONE_THREAD e CLONE_VM, capazes de criar uma nova thread, com acesso ao mesmo espaço de endereçamento, ou seja, compartilhando a memória e com o mesmo número de processo (PID).
E é essa chamada e uma chamada irmã, unshare, um dos dois pilares de Linux Containers a que daremos atenção nesta série de posts. Veremos mais sobre várias das opções de clone2 e unshare em posts que seguirão.