### Namespace vs CGroups Namespace - механизм изоляции и группировки структур данных ядра. Control groups - механизм изоляции ресурсов ядра. ### Представление процесса в Linux include/linux/sched.h ``` struct task_struct { void *stack; refcount_t usage; /* Per task flags (PF_*), defined further below: */ unsigned int flags; unsigned int ptrace; ``` include/linux/nsproxy.h ``` /* * A structure to contain pointers to all per-process * namespaces - fs (mount), uts, network, sysvipc, etc. * * The pid namespace is an exception -- it's accessed using * task_active_pid_ns. The pid namespace here is the * namespace that children will use. * * 'count' is the number of tasks holding a reference. * The count for each namespace, then, will be the number * of nsproxies pointing to it, not the number of tasks. * * The nsproxy is shared by tasks which share all namespaces. * As soon as a single namespace is cloned or unshared, the * nsproxy is copied. */ struct nsproxy { atomic_t count; struct uts_namespace *uts_ns; struct ipc_namespace *ipc_ns; struct mnt_namespace *mnt_ns; struct pid_namespace *pid_ns_for_children; struct net *net_ns; struct time_namespace *time_ns; struct time_namespace *time_ns_for_children; struct cgroup_namespace *cgroup_ns; }; ``` ### Namespace API - clone(). низкоуровневый программный интерфейс для создания потоков выполнения в Linux. От fork() и vfork() он отличается тем, что позволяет более точно контролировать этапы создания процесса. Как и в случае с fork(), новый процесс, создаваемый вызовом clone(), является почти полной копией своего родителя. Отличие от fork() состоит в том, что клонированный потомок не продолжает работу с момента вызова, а сначала вызывает функцию, указанную в аргументе func ``` int clone(int (*func) (void *), void *child_stack, int flags, void *func_arg, ... /* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ ); ``` - unshare(). позволяет процессу (или потоку) отделить части своего контекста выполнения, которые используются совместно с другими процессами (или потоками). Часть контекста выполнения, например пространство имён монтирования, неявно делается общей при создании нового процесса с помощью fork() или vfork(), в то время как другие части, такие как виртуальная память, могут стать общими по явному запросу при создании процесса или потока с помощью clone(). Основное предназначение unshare() - позволить процессу контролировать свой общий контекст выполнения без создания нового процесса. - setns(). С его помощью можно поместить вызывающий процесс или тред в нужное пространство имён. Для этого требуется файловый дескриптор, который на это пространство имён ссылается. ### Namespaces * Mount. Копия дерева файловой системы, ассоциированная с процессом. Создание `clone(,,,,CLONE_NEWNS)` * UTS. Изоляция имени хоста и доменного имени. Создание `clone(,,,,CLONE_NEWUTS)` * IPC * PID. Изоляция индентификаторов процессов. * user