Как запустить две копии программы в Linux
Полное руководство по запуску двух независимых копии программы в Linux с использованием namespaces, Docker, cgroups и других методов изоляции процессов.
Как запустить две независимые копии программы в Linux?
Запустить две независимые копии программы в Linux можно с помощью нескольких методов: через пространства имён (namespaces) и контрольные группы (cgroups), используя утилиту unshare, через контейнеризацию с Docker/LXC или создавая отдельные пользовательские аккаунты. Каждый метод обеспечивает разную степень изоляции процессов между копиями программы.
Содержание
- Основные методы изоляции процессов
- Использование утилиты unshare
- Контейнеризация с Docker и LXC
- Изоляция через контрольные группы (cgroups)
- Изоляция через отдельные пользовательские аккаунты
- Виртуализация и OpenVZ
- Практические примеры и рекомендации
Основные методы изоляции процессов
В Linux существует несколько подходов для запуска независимых копий одной и той же программы с полной изоляцией процессов:
Пространства имён (Namespaces) предоставляют ядро механизмов изоляции в Linux. Они позволяют процессам видеть разные представления системных ресурсов. Основные типы пространств имён:
- PID namespace - изоляция идентификаторов процессов, каждая копия программы будет иметь собственное дерево процессов
- User namespace - изоляция пользователей и групп, позволяющая процессам иметь root-права в своём пространстве
- Mount namespace - изоляция точек монтирования файловых систем
- Network namespace - изоляция сетевых интерфейсов и настроек
- IPC namespace - изоляция межпроцессного взаимодействия
- UTS namespace - изоляция имени хоста и домена
Как объясняет Red Hat, пространства имён позволяют “запускать идентичные копии программ с изоляцией PID, чтобы они не были осведомлены о происходящем за пределами своих собственных процессов”.
Использование утилиты unshare
Утилита unshare - это мощный инструмент для создания изолированных сред без полноценных контейнеров. Она позволяет запускать программы с определёнными пространствами имён, не присоединёнными к основному пространству системы.
Базовый синтаксис
unshare [опции] программа [аргументы...]
Пример запуска двух независимых копий
Для запуска двух полностью изолированных копий программы можно использовать следующую команду:
# Первая копия с изолированными PID, user и network пространствами
unshare --pid --user --net --mount --fork --root /tmp/isolated1 myprogram
# Вторая копия в другом изолированном пространстве
unshare --pid --user --net --mount --fork --root /tmp/isolated2 myprogram
Как описано в статье LinuxConcepts, unshare поддерживает различные типы пространств:
-C, --cgroup- изоляция иерархии контрольных групп-T, --time- изоляция системных часов-m, --mount- изоляция точек монтирования-u, --user- изоляция пользователей и групп-i, --ipc- изоляция межпроцессного взаимодействия-n, --net- изоляция сетевых интерфейсов-p, --pid- изоляция идентификаторов процессов-U, --uts- изоляция имени хоста
Контейнеризация с Docker и LXC
Контейнеризация - это наиболее распространённый способ запуска изолированных копий программ в современной Linux-среде.
Docker
Docker предоставляет высокоуровневый интерфейс для управления контейнерами:
# Запуск двух независимых контейнеров с одной программой
docker run -d --name instance1 my-image
docker run -d --name instance2 my-image
Как объясняет NGINX Community Blog, “если разработчик запускает два контейнера, это означает, что на сервере где-то запущены два процесса, но они изолированы друг от друга”.
LXC (Linux Containers)
LXC предлагает более низкоуровневый подход к контейнеризации:
# Создание двух контейнеров
lxc-create -n container1 -t ubuntu
lxc-create -n container2 -t ubuntu
# Запуск программ в каждом контейнере
lxc-start -n container1
lxc-start -n container2
Изоляция через контрольные группы (cgroups)
Контрольные группы (cgroups) позволяют управлять ресурсами, выделяемыми процессам: CPU, память, ввод-вывод и другие.
Создание изолированных cgroups
# Создание двух контрольных групп
sudo cgcreate -g cpu,memory:/instance1
sudo cgcreate -g cpu,memory:/instance2
# Запуск программ в изолированных cgroups
sudo cgexec -g cpu,memory:instance1 myprogram
sudo cgexec -g cpu,memory:instance2 myprogram
Как описано в статье Medium, cgroups предоставляют “расход ресурсов, который измеряется и ограничивается … прямо в практическом примере пространств имён в действии”.
Изоляция через отдельные пользовательские аккаунты
Простой метод изоляции через разные пользовательские аккаунты:
# Создание двух пользователей
sudo useradd -m -s /bin/bash user1
sudo useradd -m -s /bin/bash user2
# Настройка прав доступа к данным
sudo chown user1 /var/lib/myapp/instance1
sudo chmod 700 /var/lib/myapp/instance1
sudo chown user2 /var/lib/myapp/instance2
sudo chmod 700 /var/lib/myapp/instance2
# Запуск программ от разных пользователей
sudo -u user1 /var/lib/myapp/instance1/run.sh
sudo -u user2 /var/lib/myapp/instance2/run.sh
Этот метод, как упоминается на Unix & Linux Stack Exchange, “позволяет изолироватьmere приложение без необходимости загрузки полной системы”.
Виртуализация и OpenVZ
Для полной изоляции можно использовать виртуализацию:
OpenVZ
# Создание двух виртуальных частных серверов (VPS)
vzctl create 101 --ostemplate ubuntu-20.04
vzctl create 102 --ostemplate ubuntu-20.04
# Запуск программ в каждом VPS
vzctl exec 101 myprogram
vzctl exec 102 myprogram
Как отмечено на ServerFault, “OpenVZ доступен только на Linux (проверено мной на CentOS 6.X хосте) и используется по всему миру при работе с VPS. Вы можете создать экземпляр гостевых операционных систем”.
Практические примеры и рекомендации
Пример: Запуск двух изолированных веб-серверов
# Метод 1: через unshare
unshare --net --pid --fork --mount-proc nginx -g daemon -c "daemon off; master_process off;"
unshare --net --pid --fork --mount-proc --root /tmp/nginx2 nginx -g daemon -c "daemon off; master_process off;"
# Метод 2: через Docker
docker run -d --name web1 -p 8080:80 nginx
docker run -d --name web2 -p 8081:80 nginx
Сравнение методов
| Метод | Уровень изоляции | Сложность настройки | Производительность | Рекомендуемые сценарии |
|---|---|---|---|---|
unshare |
Средний | Низкая | Высокая | Тестирование, разработка |
| Docker | Высокий | Средняя | Хорошая | Производственные приложения |
| LXC | Высокий | Средняя | Хорошая | Системные приложения |
| cgroups | Низкий | Высокая | Высокая | Управление ресурсами |
| Пользователи | Низкий | Низкая | Высокая | Простые сценарии |
| OpenVZ | Очень высокий | Высокая | Средняя | Полная изоляция |
Рекомендации по выбору метода
- Для тестирования и разработки: Используйте
unshareдля быстрой изоляции без создания полноценных контейнеров - Для производственных приложений: Выбирайте Docker или LXC для лучшей безопасности и управляемости
- Для управления ресурсами: Используйте cgroups для ограничения CPU и памяти
- Для максимальной безопасности: Применяйте виртуализацию (OpenVZ, KVM)
- Для простоты: Создайте отдельные пользовательские аккаунты
Как отмечает FOSDEM в их докладе о пространствах адресной изоляции в ядре Linux, “безопасность - это большая проблема, особенно при запуске нескольких экземпляров одного приложения”.
Заключение
-
Основные методы изоляции: В Linux можно использовать пространства имён, контрольные группы, контейнеризацию и виртуализацию для запуска независимых копий программ.
-
Выбор метода зависит от требований: Для быстрой разработки подойдёт
unshare, для производственных систем - Docker или LXC, для максимальной изоляции - виртуализация. -
Комбинирование подходов: На практике часто комбинируют несколько методов, например, пространства имён + cgroups для достижения оптимального баланса между изоляцией и производительностью.
-
Безопасность: При запуске нескольких экземпляров одного приложения важно учитывать аспекты безопасности и потенциальные конфликты ресурсов.
-
Дополнительные ресурсы: Для углубленного изучения рекомендуется изучить документацию по Linux namespaces и cgroups, а также практиковаться с утилитой
unshareдля понимания основ изоляции процессов.
Источники
- Linux - Isolate process without containers - Unix & Linux Stack Exchange
- What Are Namespaces and cgroups, and How Do They Work? – NGINX Community Blog
- Linux unshare Command - Create Isolated Namespace Environments
- A Journey into Process Isolation: kernel namespaces, control groups | Medium
- The 7 most used Linux namespaces - Red Hat
- Address Space Isolation in the Linux Kernel - FOSDEM
- Multiple instances of the same OS - Server Fault
- Linux Namespaces - Chord Simple
- CGroup Namespace - HackTricks
- What even is a container: namespaces and cgroups - jvns.ca