Другое

Как запустить две копии программы в Linux

Полное руководство по запуску двух независимых копии программы в Linux с использованием namespaces, Docker, cgroups и других методов изоляции процессов.

Как запустить две независимые копии программы в Linux?

Запустить две независимые копии программы в Linux можно с помощью нескольких методов: через пространства имён (namespaces) и контрольные группы (cgroups), используя утилиту unshare, через контейнеризацию с Docker/LXC или создавая отдельные пользовательские аккаунты. Каждый метод обеспечивает разную степень изоляции процессов между копиями программы.

Содержание

Основные методы изоляции процессов

В Linux существует несколько подходов для запуска независимых копий одной и той же программы с полной изоляцией процессов:

Пространства имён (Namespaces) предоставляют ядро механизмов изоляции в Linux. Они позволяют процессам видеть разные представления системных ресурсов. Основные типы пространств имён:

  • PID namespace - изоляция идентификаторов процессов, каждая копия программы будет иметь собственное дерево процессов
  • User namespace - изоляция пользователей и групп, позволяющая процессам иметь root-права в своём пространстве
  • Mount namespace - изоляция точек монтирования файловых систем
  • Network namespace - изоляция сетевых интерфейсов и настроек
  • IPC namespace - изоляция межпроцессного взаимодействия
  • UTS namespace - изоляция имени хоста и домена

Как объясняет Red Hat, пространства имён позволяют “запускать идентичные копии программ с изоляцией PID, чтобы они не были осведомлены о происходящем за пределами своих собственных процессов”.


Использование утилиты unshare

Утилита unshare - это мощный инструмент для создания изолированных сред без полноценных контейнеров. Она позволяет запускать программы с определёнными пространствами имён, не присоединёнными к основному пространству системы.

Базовый синтаксис

bash
unshare [опции] программа [аргументы...]

Пример запуска двух независимых копий

Для запуска двух полностью изолированных копий программы можно использовать следующую команду:

bash
# Первая копия с изолированными 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 предоставляет высокоуровневый интерфейс для управления контейнерами:

bash
# Запуск двух независимых контейнеров с одной программой
docker run -d --name instance1 my-image
docker run -d --name instance2 my-image

Как объясняет NGINX Community Blog, “если разработчик запускает два контейнера, это означает, что на сервере где-то запущены два процесса, но они изолированы друг от друга”.

LXC (Linux Containers)

LXC предлагает более низкоуровневый подход к контейнеризации:

bash
# Создание двух контейнеров
lxc-create -n container1 -t ubuntu
lxc-create -n container2 -t ubuntu

# Запуск программ в каждом контейнере
lxc-start -n container1
lxc-start -n container2

Изоляция через контрольные группы (cgroups)

Контрольные группы (cgroups) позволяют управлять ресурсами, выделяемыми процессам: CPU, память, ввод-вывод и другие.

Создание изолированных cgroups

bash
# Создание двух контрольных групп
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 предоставляют “расход ресурсов, который измеряется и ограничивается … прямо в практическом примере пространств имён в действии”.


Изоляция через отдельные пользовательские аккаунты

Простой метод изоляции через разные пользовательские аккаунты:

bash
# Создание двух пользователей
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

bash
# Создание двух виртуальных частных серверов (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. Вы можете создать экземпляр гостевых операционных систем”.


Практические примеры и рекомендации

Пример: Запуск двух изолированных веб-серверов

bash
# Метод 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 Очень высокий Высокая Средняя Полная изоляция

Рекомендации по выбору метода

  1. Для тестирования и разработки: Используйте unshare для быстрой изоляции без создания полноценных контейнеров
  2. Для производственных приложений: Выбирайте Docker или LXC для лучшей безопасности и управляемости
  3. Для управления ресурсами: Используйте cgroups для ограничения CPU и памяти
  4. Для максимальной безопасности: Применяйте виртуализацию (OpenVZ, KVM)
  5. Для простоты: Создайте отдельные пользовательские аккаунты

Как отмечает FOSDEM в их докладе о пространствах адресной изоляции в ядре Linux, “безопасность - это большая проблема, особенно при запуске нескольких экземпляров одного приложения”.

Заключение

  1. Основные методы изоляции: В Linux можно использовать пространства имён, контрольные группы, контейнеризацию и виртуализацию для запуска независимых копий программ.

  2. Выбор метода зависит от требований: Для быстрой разработки подойдёт unshare, для производственных систем - Docker или LXC, для максимальной изоляции - виртуализация.

  3. Комбинирование подходов: На практике часто комбинируют несколько методов, например, пространства имён + cgroups для достижения оптимального баланса между изоляцией и производительностью.

  4. Безопасность: При запуске нескольких экземпляров одного приложения важно учитывать аспекты безопасности и потенциальные конфликты ресурсов.

  5. Дополнительные ресурсы: Для углубленного изучения рекомендуется изучить документацию по Linux namespaces и cgroups, а также практиковаться с утилитой unshare для понимания основ изоляции процессов.

Источники

  1. Linux - Isolate process without containers - Unix & Linux Stack Exchange
  2. What Are Namespaces and cgroups, and How Do They Work? – NGINX Community Blog
  3. Linux unshare Command - Create Isolated Namespace Environments
  4. A Journey into Process Isolation: kernel namespaces, control groups | Medium
  5. The 7 most used Linux namespaces - Red Hat
  6. Address Space Isolation in the Linux Kernel - FOSDEM
  7. Multiple instances of the same OS - Server Fault
  8. Linux Namespaces - Chord Simple
  9. CGroup Namespace - HackTricks
  10. What even is a container: namespaces and cgroups - jvns.ca
Авторы
Проверено модерацией
Модерация