Eu não entendo como entrar um namespace de montagem pode funcionar

1

ou se você bifurcar em um novo namespace de montagem ou inserir um já existente.

É possível manter descritores de arquivos de um namespace de montagem estrangeira. Você pode demonstrar isso com muita facilidade, localizando um processo em um namespace de montagem externo, como [kdevtmpfs] , e abrindo /proc/$PID/root . (Se eu mudar para este diretório e executar /bin/pwd , parece imprimir a incrível mensagem de erro /usr/bin/pwd: couldn't find directory entry in ‘..’ with matching i-node e strace mostra que getcwd() retornou (unreachable)/ ).

Por favor, defina o que acontece com as referências existentes que um processo mantém no namespace de montagem atual - o diretório atual e a raiz atual (chroot) - ao inserir um novo namespace de montagem.

Se nenhuma dessas referências foi modificada, não haveria muito sentido em inserir um novo namespace de montagem. Por exemplo. abrir um arquivo /path/to/file iria abri-lo a partir do namespace de montagem antigo, se a raiz do processo ainda estivesse apontada para o namespace de montagem antigo.

Mais uma vez, gostaria de entender o caso de clone () com CLONENEWNS (como o comando unshare ) e o caso de setns () (como o comando nsenter ).

    
por sourcejedi 28.06.2018 / 10:59

1 resposta

1

O diretório de trabalho atual e a raiz são redefinidos para o sistema de arquivos raiz do namespace de montagem inserido.

Por exemplo, testei que posso escapar de chroot executando nsenter -m --target $$ .

(Lembrete: chroot é fácil de escapar quando você ainda é root. man chroot documenta a maneira mais conhecida de fazer isso).

Fonte

link

static int mntns_install(struct nsproxy *nsproxy, struct ns_common *ns)
{
    struct fs_struct *fs = current->fs;

Nota: current significa a tarefa atual - o segmento / processo atual.

->fs serão os dados do sistema de arquivos dessa tarefa - isso é compartilhado entre tarefas que são encadeamentos dentro do mesmo processo. Por exemplo. você verá abaixo que mudar o diretório de trabalho é uma operação em ->fs .

Por exemplo Alterar o diretório de trabalho afeta todos os threads do mesmo processo. Threads compatíveis com POSIX como este são implementados usando o sinalizador CLONE_FS do clone ().

    struct mnt_namespace *mnt_ns = to_mnt_ns(ns), *old_mnt_ns;
    struct path root;
    int err;

...

    /* Find the root */
    err = vfs_path_lookup(mnt_ns->root->mnt.mnt_root, &mnt_ns->root->mnt,
                "/", LOOKUP_DOWN, &root);

aqui está a linha em questão:

    /* Update the pwd and root */
    set_fs_pwd(fs, &root);
    set_fs_root(fs, &root);

...

}

...

const struct proc_ns_operations mntns_operations = {
    .name       = "mnt",
    .type       = CLONE_NEWNS,
    .get        = mntns_get,
    .put        = mntns_put,
    .install    = mntns_install,
    .owner      = mntns_owner,
};
    
por 28.06.2018 / 11:05