В linux есть встроенный механизм изоляции системных ресурсов - namespaces. Именно на нем основаны контейнеры вроде docker и LXC. Но namespaces можно использовать и напрямую без всяких надстроек.
Namespace - это способ ядра linux изолировать разные части системы: процессы, сеть, точки монтирования, пользователей и т.д.
Каждое приложение может жить в своем отдельном пространстве, не видя другие процессы и ресурсы.
unshare --pid --mount --fork --mount-proc /bin/bash
ps aux
USER PID %CPU %MEM COMMAND
root 1 0.0 0.0 /bin/bash
root 18 0.0 0.0 ps aux
Здесь процесс bash получил PID 1 - он главный в своем изолированном пространстве. Теперь создадим изолированное монтирование:
mkdir /tmp/testdir /mnt/testdir
mount --bind /tmp/testdir /mnt/testdir
mount | grep testdir
/dev/sda3 on /mnt/testdir type ext4 (rw,relatime)
На хосте это монтирование вы не увидите, оно существует только внутри namespace.
lsns:
lsns
NS TYPE NPROCS PID USER COMMAND
4026532480 pid 3 123 root unshare --pid --mount --fork --mount-proc /bin/bash
4026532481 mnt 3 123 root └─/bin/bash
Тут видны PID и MOUNT пространства, созданные нашей командой
unshare. Если у вас работают контейнеры, их namespaces тоже будут отображены здесь.Предположим, у нас есть процесс bash с PID 123. Подключимся к нему и запустим команду top:
nsenter -t 123 -p -m top
Теперь top выполняется внутри того же PID и mount namespace, что и процесс bash.
unshare - создает новые namespaces.nsenter - позволяет войти в уже существующие.systemd-nspawn - мини-контейнерная система от systemd.Пример запуска простого контейнера через
systemd-nspawn:
systemd-nspawn -D /var/chroot/debian bash
#linux #namespaces
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11😁2