Info
Content

Namespaces

Пространство имён Что изолирует
PID PID процессов
NETWORK Сетевые устройства, стеки, порты и т.п.
USER ID пользователей и групп
MOUNT Точки монтирования
IPC SystemV IPC, очереди сообщений POSIX
UTS Имя хоста и доменное имя NIS

Например, Network namespace включает в себя системные ресурсы, связанные с сетью, такие как сетевые интерфейсы (например, wlan0, eth0), таблицы маршрутизации и т.д., Mount namespace включает файлы и каталоги в системе, PID содержит ID процессов и так далее

Нэймспейсы нужны для изоляции процессов друг от друга, например если один процесс "сошел с ума" и выполнил 'rm -rf /', то это на зааффектит другие процессы, потому что он изолирован и сломает только свое окружение

По умолчанию ядро создает процессы в "нэймспейсах по умолчанию"
Это видно ниже

root@three:~# ls -l /proc/1/ns/*t*
lrwxrwxrwx 1 root root 0 Apr  2 06:34 /proc/1/ns/mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0 Apr  2 06:34 /proc/1/ns/net -> 'net:[4026531992]'
lrwxrwxrwx 1 root root 0 Apr  2 06:34 /proc/1/ns/uts -> 'uts:[4026531838]'
root@three:~# ls -l /proc/$$/ns/*t*
lrwxrwxrwx 1 root root 0 Apr  2 06:35 /proc/1169/ns/mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0 Apr  2 06:35 /proc/1169/ns/net -> 'net:[4026531992]'
lrwxrwxrwx 1 root root 0 Apr  2 06:35 /proc/1169/ns/uts -> 'uts:[4026531838]'

Команда unshare позволяет запустить процесс в новом нэймспейсе

root@three:~# unshare -u bash ### -u значит uts
root@three:~# ls -l /proc/$$/ns/*t*
lrwxrwxrwx 1 root root 0 Apr  2 06:49 /proc/1331/ns/mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0 Apr  2 06:49 /proc/1331/ns/net -> 'net:[4026531992]'
lrwxrwxrwx 1 root root 0 Apr  2 06:49 /proc/1331/ns/uts -> 'uts:[4026532179]' # этот отличается от тех что мы видели выше

Еще пример

root@three:~# hostname # проверяем хостнэйм в текущей оболочке
three
root@three:~# bash # заходим в подоболочку
root@three:~# hostname test # меняем хостнэйм
root@three:~# hostname # проверяем что поменялся
test
root@three:~# exit # выходим из подоболочки в которой поменян хостнэйм
root@three:~# hostname # проверяем 
test # видим что он поменялся и в продительской оболочке

А теперь используем unshare

root@three:~# hostname
three
root@three:~# unshare -u bash
root@three:~# hostname test
root@three:~# hostname
test
root@three:~# exit
root@three:~# hostname
three # все то же самое что и выше, но в родительской оболочке хостнэйм не изменился

Еще пример
Смотрим сколько интерфейсов и процессов видит наша оболочка

root@two:~# ip a | wc -l
24
root@two:~# ps aux | wc -l
73

Запускаем баш в новых неймспейсах

root@two:~# unshare --pid --net --fork --mount-proc /bin/bash

Смотрим снова и видим что теперь баш видит совсем чуть-чуть

root@two:~# ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
root@two:~# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   6996  3556 pts/0    S    05:49   0:00 /bin/bash
root         3  0.0  0.1  10636  3068 pts/0    R+   05:49   0:00 ps aux

Docker делает то же самое
Вот например контейнер который что-то пингует

root@two:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fe6374a8f57b        test                "ping 8.8.8.8"      56 seconds ago      Up 55 seconds                           test
root@two:~# lsns
        NS TYPE   NPROCS   PID USER COMMAND
4026531835 cgroup     75     1 root /sbin/init
4026531836 pid        74     1 root /sbin/init
4026531837 user       75     1 root /sbin/init
4026531838 uts        74     1 root /sbin/init
4026531839 ipc        74     1 root /sbin/init
4026531840 mnt        71     1 root /sbin/init
4026531860 mnt         1    20 root kdevtmpfs
4026531992 net        74     1 root /sbin/init
4026532172 mnt         1   186 root /lib/systemd/systemd-udevd
4026532179 mnt         1   261 ntp  /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 105:112
4026532187 mnt         1   989 root ping 8.8.8.8
4026532188 uts         1   989 root ping 8.8.8.8
4026532189 ipc         1   989 root ping 8.8.8.8
4026532190 pid         1   989 root ping 8.8.8.8
4026532192 net         1   989 root ping 8.8.8.8

Как видно он находится в 5 нэймспейсах


lsns позволяет посмотреть нэймспейсы
А nsenter позволяет запустить какую-нибудь программу внутри какого-нибудь нэймспейса

root@two:~# lsns
        NS TYPE   NPROCS   PID USER COMMAND
4026531835 cgroup     73     1 root /sbin/init
4026531836 pid        72     1 root /sbin/init
4026531837 user       73     1 root /sbin/init
4026531838 uts        72     1 root /sbin/init
4026531839 ipc        72     1 root /sbin/init
4026531840 mnt        69     1 root /sbin/init
4026531860 mnt         1    20 root kdevtmpfs
4026531992 net        72     1 root /sbin/init
4026532172 mnt         1   186 root /lib/systemd/systemd-udevd
4026532179 mnt         1   261 ntp  /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 105:112
4026532187 mnt         1  2779 root ping 8.8.8.8
4026532188 uts         1  2779 root ping 8.8.8.8
4026532189 ipc         1  2779 root ping 8.8.8.8
4026532190 pid         1  2779 root ping 8.8.8.8
4026532192 net         1  2779 root ping 8.8.8.8
root@two:~# nsenter -a -t 2779 /bin/sh
/ # ps aux
PID   USER     TIME  COMMAND
    1 root      0:00 ping 8.8.8.8
   17 root      0:00 /bin/sh
   18 root      0:00 ps aux
/ #

То есть эта программа позволяет зайти внутрь какого-нибудь контейнера без использования docker exec -it name bash


В /sys/fs... есть место где можно смотреть и править параметры cgroups

root@two:/sys/fs/cgroup/memory/docker/dba66fa2b64f380f6643d35e81c765e4f4254c45ffc9bd8864b502ab8814e506# cat tasks
2936
root@two:/sys/fs/cgroup/memory/docker/dba66fa2b64f380f6643d35e81c765e4f4254c45ffc9bd8864b502ab8814e506# ps aux | grep 2936 | grep -v grep
root      2936  0.0  0.0   1580     4 ?        Ss   06:14   0:00 sleep 3700

Хэш связан с конкретным контейнером

Внутри файлики с различными ограничениями сигруппы

No Comments
Back to top