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