Debian 10 lxc настройка сети

Обновлено: 07.07.2024

Пришло время научиться работать с Linux Containers, более известными под названием LXC. Далее мы будем рассматривать LXC в контексте Debian и Ubuntu, но написанное во многом будет применимо и для других дистрибутивов Linux. Мы коснемся не только основ использования LXC, но и узнаем, как настроить bridged сеть, ограничить количество ресурсов, используемых контейнером, и даже осилим unprivileged containers.

Коротко о главном

Control Groups, они же cgroups, позволяют организовывать процессы в группы и для каждой группы задавать лимиты. Например, лимиты на использование CPU, объем используемой памяти и дисковый ввод-вывод.

Примечание: Кстати, в заметке Начало работы с Vagrant и зачем он вообще нужен рассказывается, как работать с LXC через Vagrant. Использование LXC через Vagrant кому-то может показаться удобнее, чем работа с LXC напрямую.

Установка

Как было отмечено выше, все необходимое уже есть в ядре. Тем не менее, для хождения в ядро понадобятся некоторые дополнительные утилиты. Также не повредит обновить до последней версии кое-какие, казалось бы, не особо связанные с LXC пакеты.

sudo apt-get update
sudo apt-get install lxc lxc-templates systemd-services cgroup-bin \
bridge-utils debootstrap

Очень важно реально сделать update, чтобы поставились наиболее свежие версии указанных пакетов. И, не поверите, но реально лучше сразу сделать reboot . Иначе, работая с LXC, вы в какой-то момент можете получить странную ошибку вроде такой:

call to cgmanager_create_sync failed: invalid request

Свои данные LXC хранит в следующих местах:

Теперь рассмотрим команды для управления контейнерами.

Основные команды

Создание контейнера с именем test-container из шаблона Ubuntu:

Увидим что-то вроде:

Посмотреть список доступных шаблонов можно так:

Список скачанных шаблонов:

Удалить шаблон можно просто удалив соответствующий ему каталог.

Запуск контейнера в бэкграунде:

Подробная информация о контейнере:

Заходим в контейнер:

Создание клона контейнера (test-container должен быть остановлен):

sudo lxc-clone -o test-container -n test-container-clone sudo lxc-freeze -n test-container
sudo lxc-unfreeze -n test-container

Создать снапшот (контейнер должен быть остановлен):

Восстановление из снапшота:

Если нужно пошарить каталог, проще всего сделать это при помощи sshfs:

Пока ничего сложного.

Автозапуск

Чтобы контейнер запускался при старте системы, в конфиг контейнера (в нашем случае это файл /var/lib/lxc/test-container/config) дописываем:

Если все было сделано верно, команда sudo lxc-ls -f покажет YES в колонке autostart.

Ограничение на использование ресурсов

Попробуем ограничить количество памяти, которое может отъедать контейнер.

Затем правим /var/lib/lxc/test-container/config:

sudo lxc-start -d -n test-container -l debug -o test.log
cat test.log | grep -i memory

Должны увидеть что-то вроде:

lxc-start 1449237148.829 DEBUG lxc_cgmanager - cgmanager.c:
cgm_setup_limits:1385 - cgroup 'memory.limit_in_bytes' set to '256M'

Проверяем, что настройки применились:

sudo lxc-cgroup -n test-container memory.limit_in_bytes

Можно менять лимиты на лету, но они потеряются с рестартом:

sudo lxc-cgroup -n test-container memory.limit_in_bytes 100M

Также можно следить, сколько ресурвов потребляет контейнер прямо сейчас:

Вот еще интересные параметры:

Ограничение на использование дискового пространства

Эту задачу можно решить несколькими способами. Например, многие советуют использовать LVM. И хотя LVM, бесспорно, крутая штука, использовать его для решения такой простой задачи мне лично кажется оверкилом. Предлагаю пойти более простым путем.

Допустим, мы хотим создать контейнер с именем new-container, который будет занимать на диске не более 10 Гб.

sudo truncate -s 10G / var / lib / lxc / new-container.img
sudo mkfs.ext4 -F / var / lib / lxc / new-container.img
sudo mkdir / var / lib / lxc / new-container
sudo mount -t ext4 -o loop / var / lib / lxc / new-container.img \
/ var / lib / lxc / new-container

Теперь создаем контейнер, как обычно:

Заходим внутрь контейнера, и через df видим, что отъесть от диска он может только 10 Гб.

Чтобы не приходилось каждый раз монтировать раздел руками, в /etc/fstab дописываем:

/var/lib/lxc/new-container.img /var/lib/lxc/new-container ext4 loop 0 0

Вы можете заметить, что количество loop-устройств в системе ограничено. В Ubuntu, например, их по умолчанию только 8. Если попытаться создать много контейнеров описанным выше образом, вы получите ошибку:

Эту проблему можно решить следующим скриптом:

Чтобы loop-устройства создавались при загрузке системы, создаем файл /etc/init.d/more-loop-devices следующего содержания:

PATH = / sbin: / usr / sbin: / bin: / usr / bin

sudo chmod a+x / etc / init.d / more-loop-devices
sudo update-rc.d more-loop-devices defaults

В этот же скрипт при необхожимости можно прописать и монтирование. Честно говоря, мне пока не нужно было так много контейнеров. Поэтому я не проверял, действительно ли в этом есть необходимость, или же достаточно записи в fstab.

Настройка bridged сети

Ранее в заметке Контейнерная виртуализация при помощи OpenVZ мы научились настраивать bridged сеть под CentOS. Настало время узнать, как то же самое делается в Debian и Ubuntu.

Далее, если у вас DHCP:

auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

Если же у вас используются статические адреса:

auto br0
iface br0 inet static
address 192.168.0.123
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

Далее останавливаем контейнер и правим /var/lib/lxc/(container)/config:

Если хотим присвоить контейнеру статический IP, также дописываем:

Запускаем контейнер. Если все было сделано правильно, в контейнер можно будет ходить из локалки и sudo lxc-ls -f покажет у него соответствующий IP.

Резервное копирование и восстановление

Как уже отмечалось, все лежит в /var/lib/lxc. Поэтому просто нужно аккуратно заархивировать все данные оттуда. Тут каждый использует, что ему больше нравится. Для примера рассмотрим решение задачи при помощи tar.

Останавливаем контейнер, под рутом делаем:

cd / var / lib / lxc / test-container
tar -cvzf backup.tgz . /

Резервная копия готова! Для восстановления же говорим:

Теперь контейнер виден в lxc-ls и может быть запущен через lxc-start .

Если же вы ограничиваете место на диске, которое может занимать контейнер, как это было описано выше, то резервное копирование и восстановление делается еще проще.

Непривилегированные контейнеры

Оказывается, что контейнерами можно управлать и под самыми обыкновенными пользователями, не под рутом. Как минимум, это намного безопаснее.

При этом каталоги немного меняются:

Первым делом говорим:

sudo usermod --add-subuids 100000 - 165536 eax
sudo usermod --add-subgids 100000 - 165536 eax
sudo chmod +x / home / eax

Копируем /etc/lxc/default.conf в

/.config/lxc/default.conf и дописываем в конце:

lxc.id_map = u 0 100000 65536
lxc.id_map = g 0 100000 65536

В файл /etc/lxc/lxc-usernet пишем:

Создаем контейнер (как видите, без sudo):

lxc-create -t download -n test-container -- -d ubuntu \
-r trusty -a amd64

Заметьте, как это работает. Мы указали тип контейнера download, которому передали в качестве аргумента название дистрибутива, релиза и архитектуры CPU. Все эти три параметра обязательны при создании непривилегированных контейнеров.

Теперь запускаем контейнер, как обычно:

В случае возникновения проблем:

lxc-start -d -n test-container --logfile t.log --logpriority debug

Дополнение: Чтобы непривилегированные контейнеры заработали, может потребоваться перезагрузка. Если вы используете encfs, команды sudo и ping могут не работать. Это баг. Здесь рассказывается, как примерно можно его обойти. Идея в том, чтобы при помощи симлинков положить контейнеры и конфиги за пределы encfs.

Ну вот, а в остальном все как обычно.

Заключение

Не могу не отметить ряд косяков в LXC:

Расскажу о том что такое Linux контейнеры (LXC) и где они применяются, как быстро установить поддержку этого механизма в Debian GNU/Linux.

Опишу важные настройки в конфигурационном файле контейнеров. Приведу список часто используемых команд (шпаргалку) - LXC cheat sheet. Кратко и по сути.

LXC контейнеры на борту

Что такое LXC и для чего это нужно

LXC - сокращение от LinuXContainers, мощная система управления контейнерами, использующая общее ядро Linux и механизмы разделения/ограничения пользовательского пространства (имен, ресурсов) для запуска служб и программ. Является свободным программным обеспечением.

Механизм LXC контейнеров построен на основе системы CGroups (Control Groups), которая содержится в ядре Linux и позволяет выделять для работы изолированные пространства имен, ограничивать ресурсы процессов и т.п.

По своей сути LXC - это набор программных средств и утилит, которые позволяют управлять встроенными возможностями ядра Linux по созданию и управлению изолированных окружений. Нечто похожее к LXC есть также в ОС FreeBSD - это называется Jails (клетки, изолированные комнаты для процессов).

Исходя из вышесказанного следует ограничение - запуск LXC возможен только на операционных системах класса GNU/Linux.

В отличии от популярного Docker, который является системой контейнеризации ориентированной на изоляцию отдельных служб и приложений (микросервисы, microservices), LXC - это контейнеризация окружения полноценной ОС, базирующейся на Linux ядре хоста, в которой может работать вся инфраструктура ОС с множеством запущенных программ и служб.

LXC контейнер содержит миниатюрную копию файловой системы ОС с базовым набором программ и скриптов, поэтому в некоторых случаях такие образы могут занимать не мало места.

Например чистый контейнер с Debian Stretch (9) для архитектуры amd64 будет занимать примерно 370 МБ. Образ Alpine GNU/Linux amd64 - примерно 44 МБ.

Как видим, размеры готовых контейнеров не такие уж и большие, тем не менее после установки какого-то необходимого ПО они могут быть значительно выше, что справедливо для любой системы контейнеризации.

LXC контейнеры отлично подойдут если вы собираетесь запустить несколько изолированных друг от друга виртуальных серверов для сетевых многопользовательских игр, систем распределения трафика, socks5-серверов и т.п.

Также это хороший выбор при тестировании и разработке программного обеспечения, обеспечивающий минимальные затраты по ресурсам и времени для поднятия необходимого изолированного окружения.

При необходимости в контейнер можно пробросить одну или несколько директорий и даже отдельных файлов, также можно выполнить проброс устройств с хоста внутрь контейнера (например сделать доступной в контейнере USB-вебкамеру, подключенную к хосту и т.п.).

Хочу отметить удобство клонирования и резервирования контейнеров, доступны снепшоты (snapshots). Например, чтобы сделать резервную копию контейнера достаточно его остановить и упаковать директорию с файлами (rootfs, config) в архив.

Все контейнеры можно держать вместе как на одной машине, так и на отдельных связанных сетью хостах. Конфигурация и управление ими - очень простые.

А еще эта технология поддерживает возможность создания вложенных изолированных контейнеров, то есть в одном из готовых контейнеров вы можете установить LXC и создать внутри еще несколько вложенных изолированных друг от друга контейнеров.

LXC - отличный инструмент!

Быстрая установка LXC в Debian GNU/Linux

Установка среды изоляции и управления LXC очень проста, все необходимое для работы уже содержится в официальных пакетах для GNU/Linux, поэтому нужно выполнить лишь несколько команд и провести простую настройку.

Установка свежего пакета lxc:

Установка пройдет быстро, размер закачиваемых пакетов составит всего лишь несколько мегабайт.

Проверка конфигурации и доступных возможностей:

Теперь, если с конфигурацией все хорошо, осталось настроить и включить постоянный сетевой мост для контейнеров. Сперва откроем в редакторе файл 'lxc-net':

Добавим в этот файл строчку:

Сохраним файл и выйдем из редактора (CTRL+X, Y).

Изменим шаблон с опциями настройки по умолчанию для контейнеров, отредактируем файл default.conf:

Добавляем строчки конфигурирования сети и безопасности:

В LXC 3.0 (для Debian 10)

В LXC 2.x (для Debian 9)

Сохраняем файл и выходим.

Перезапустим сетевую службу для LXC:

Проверим создан ли интерфейс виртуального сетевого моста - lxcbr0:

Если интерфейс присутствует в списке - значит сетевой мост настроен, можно приступать к работе с LXC контейнерами!

IP-адрес и маска сети хостовой машины по умолчанию - 10.0.3.1/24, контейнеры будут получать IP-адреса из подсети 10.0.3.0/24.

Хочу обратить внимание на то, что данной конфигурации вполне достаточно для работы из под привилегированного пользователя (root), но не достаточно для выполнения команд от имени обычного пользователя.

При запуске lxc-команд от пользователя root и от обычного пользователя - размещение контейнеров и файлов с настройками LXC будут отличаться!

О настройке и запуске контейнеров от имени непривилегированного пользователя можно узнать на страничке [2].

Список директорий, используемых механизмом LXC

Для привилегированного пользователя (root):

  • /var/lib/lxc - директория где хранятся контейнеры и их настройки;
  • /etc/lxc - настройки LXC;
  • /etc/default/lxc-net - настройки сетевой подсистемы;
  • /var/cache/lxc - скачиваемые образы файловых систем ОС;
  • /var/lib/lxcsnaps - тут хранятся снепшоты;
  • /var/log/lxc - логи;
  • /usr/share/lxc/templates/ - шаблоны.

Для НЕ привилегированного пользователя:

Конфигурационный файл контейнера и его опции

Конфигурационные файлы контейнеров носят имя 'config' и хранятся в директориях соответствующих контейнеров. Например, путь к конфигурационному файлу контейнера 'container1' для привилегированного пользователя - '/var/lib/lxc/container1/config'.

Конфигурационный файл любого из созданных контейнеров можно открыть для редактирования в любом удобном вам текстовом редакторе.

Пример загрузки конфигурационного файла для контейнера 'container1' в консольном редакторе 'nano':

Опция для ограничения доступно контейнеру памяти:

Опция для ограничения количества ядер CPU:

Монтируем файл /etc/rinetd.conf из хостовой машины в контейнер:

Примечание: путь назначения (в контейнере) не должен начинаться с бек-слеша, это путь относительно корня контейнера.

Монтируем файл блочного устройства /dev/sde внутри контейнера, создаем файл если он не существует в точке назначения:

Монтируем директорию /media/zzz на хосте в директорию /var/lib/mysql/zzz внутри контейнера:

Монтирование директории /dev/mapper/lvmfs-home из другой файловой системы в контейнер:

Настройки автозапуска контейнера (включение, задержка, порядок запуска):

Указываем группу для контейнера:

Перед стартом контейнера 'container1' выполнить 'хук' (hook) - запустить скрипт 'prepare-start.sh', который лежит в директории контейнера (рядом с конфигурационным файлом):

Список других полезных хуков для LXC:

Список сетевых настроек контейнера:

Примечание: опции формата "lxc.net.[i]." - для LXC версии 3.0. Где "[i]" - цифра, номер сетевого интерфейса. Например: "lxc.net.0.ipv4" - для первого сетевого интерфейса.

Более детальную информацию о конфигурационном файле для контейнера в LXC можно узнать из [3] или же используя встроенную в GNU/Linux справочную систему man:

DOWNLOAD IMAGES LIST

Как узнать список доступных к скачиванию образов в LXC? - достаточно запустить команду создания контейнера с опцией "-t download" без указания архтекутры, имени и версии образа. На экран будет выведен весь список хранящихся удаленно образов, программа попросит вас выбрать дистрибутив.

Вот часть из вывода команды:

Для создания контейнера на основе Debian - вводим слово 'debian', на запрос релиза - например, 'stretch', а на запрос архитектуры, например 'amd64'.

Если контейнер не нужно создавать, то для отмены можно нажать CTRL+C.

LIST & INFO

Узнаем версию установленной подсистемы LXC:

Список существующих (в директории хранения по умолчанию) контейнеров (только имена):

Список существующих контейнеров включая информацию (статус, автозапуск, группы, IPv4/6):

Список контейнеров, работающих из директории (тома) '/media/ssd1':

Информация о контейнере 'container1':

Пример вывода этой команды:

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

MONITOR

Мониторинг состояний контейнера 'container1':

Мониторинг нескольких указанных контейнеров:

Мониторинг по шаблону для имени (начинается со слова 'container' либо с буквы 'X'):

CREATE

Создать контейнер 'container1', предлагая перед этим выбрать дистрибутив:

Создать контейнер с образом ОС Debian и релизом Stretch:

Создать контейнер с ОС Debian, релизом Stretch и архитектурой amd64:

Создать контейнер с Debian Jessie (8) с ограниченной файловой системой размером 10ГБ:

Создать контейнер, разместив его содержимое в директории '/media/ssd1/container1':

START

Запуск контейнера 'container1'

Запуск контейнера, хранящегося в директории '/media/ssd1':

Запуск в фоновом режиме (daemon):

Запуск с записью лога в файл /var/log/lxc.log:

Запуск + запись лога в файл + установка приоритета логирования 'DEBUG':

Список значений для опции '-l': FATAL, CRIT, WARN, ERROR, NOTICE, INFO, DEBUG.

Запуск контейнера на переднем плане (автоматическое подключение к консоли):

AUTOSTART

Запуск контейнеров, у которых в конфигурационном файле установлена опция ' lxc.start.auto'.

Список контейнеров с опцией автозапуска:

Запуск всех контейнеров имеющих возможность автозапуска:

Вывести список контейнеров в группе 'socks5':

Запуск всех контейнеров в группе 'socks5':

Запуск групп контейнеров в порядке их указания:

Остановка контейнера 'container1':

Принудительно завершить работу контейнера (без корректной остановки, KILL):

Ожидаем пока контейнер 'container1' не окажется в статусе STOPPED:

Ждем когда контейнер получит любой из статусов - RUNNING или STARTING:

Список возможных статусов контейнера:

  • RUNNING;
  • STOPPED;
  • STARTING;
  • STOPPING;
  • ABORTING;
  • FREEZING;
  • FROZEN.

FREEZE / UNFREEZE

Заморозить процессы в контейнере 'container1':

Разморозить этот же контейнер:

Узнать статус заморозки у контейнера:

EXECUTE

Запуск приложения 'app1.bin' в контейнере 'container1':

CONSOLE

Подключение текущего терминала к консоли контейнера 'container1':

Для отключения используйте комбинацию клавиш CTRL+A, потом нажмите Q.

ATTACH

Запуск процесса 'passwd' в запущенном контейнере 'container1' для установки пароля суперпользователя:

Запуск командного интерпретатора BASH внутри контейнера и доступ к нему в текущем терминале:

Выйти из запущенного в контейнере интерпретатора команд можно введя команду 'exit' или же нажав комбинацию клавиш CTRL+D.

Запуск в контейнере команды 'df' с ключем '-h' (вывод статистики файловых систем контейнера):

Разделитель '--' указывает на то что следующие параметры не нужно интерпретировать как параметры команды 'lxc-atatch', а отнести их к команде для выполнения внутри указанного контейнера.

Копирование контейнера под именем 'container1' в новый контейнер под именем 'container1_COPY':

Копирование контейнера 'lamp-server', размещенного в директории /media/ssd1 в контейнер под названием 'lamp-srv-clone' (будет размещен в той же директории):

SNAPSHOT

Вывести список снепшотов для контейнера 'container1':

Создать снепшот для этого же контейнера:

Восстановить состояние контейнера 'container1' из снепшота 'snap0':

Создать (восстановить) контейнер 'container1-from-snap0' из снепшота 'snap0', созданного для контейнера 'container1':

CHECKPOINT

Сохранить состояние контейнера на диск (в директории '/media/checkpoint') с последующей возможностью восстановления этого состояния:

Восстановление состояния контейнера:

DESTROY

Уничтожить контейнер 'container1':

Примечание: перед уничтожением контейнер должен быть остановлен.

CGROUP

Получить значение лимита памяти в Байтах для контейнера 'container1':

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

Установка лимита памяти для контейнера - 256МБ:

Установка лимита памяти для контейнера - 512МБ:

Другие значения параметров для возможной установки:

  • cpu.shares - приоритет использования CPU, пример: A = 2000, B = 1000 - контейнер B будет иметь в 2 раза меньший приоритет по использованию ЦПУ чем контейнер A;
  • cpuset.cpus - количество и/или номера ядер CPU для использования в контейнере, примеры: 0,1,2 или 0-3;
  • memory.memsw.limit_in_bytes - суммарный лимит памяти (ОЗУ + файл подкачки);
  • blkio.weight - приоритет использования блочной системы ввода-вывода (IO).

Более подробную информацию по CGroups вы можете узнать по ссылке [3].

DEVICE

Подключение (проброс) устройства с файлом '/dev/video0' (напрмиер веб-камера) в контейнер 'container1':

Подключение сетевого адаптера с интерфейсом 'veth0' (на хост-машине) к контейнеру и назначение в ненм нового имени интерфейса eth1:

Диагностика и решение проблем

Может случиться так, что в какой-то момент (после высокой загруженности сервера, перевода лептопа в спящий режим и т.п.) созданный LXC контейнер потерял свой IP-адрес или же и вовсе создаваемые контейнеры перестали получать сетевые настройки.

В такой ситуации, первым делом нужно проверить работу сервисов на хост-машине. Смотрим присутствует ли в системе сетевой интерфейс (мост, bridge) для LXC-контейнеров и каковы его настройки:

Если с этим интерфейсом все хорошо, то в результате исполнения команды увидим IP-адрес моста и другие параметры:

Для получения контейнерами сетевых настроек от хостовой машины механизмом LXC используется служба "dnsmasque", проверяем запущена ли она:

Если служба работает и присутствует в процессах, то в выводе вышеуказанной команды мы увидим строку, где будет указан PID процесса и его параметры, например (для удобства чтения я перенес параметры в отдельные строчки):

Как видим, здесь указан интерфейс и IP-адрес сетевого моста, на котором работает служба, а также пул адресов, доступный для присваивания LXC-контейнерам (2-254).

Теперь переходим к диагностике сети внутри контейнера, приведенные ниже команды должны выполняться в консоли запущенного LXC-контейнера.

Смотрим список доступных и активных сетевых интерфейсов внутри контейнера:

При настройках по умолчанию, как правило, в списке должны присутствовать минимум 2 сетевых интерфейса:

  • lo - loopback (локальная петля), локальный сетевой интерфейс;
  • eth0 - сетевой интерфейс, связанный с хост-машиной.

Если у сетевого интерфейса eth0 нет IP-адреса, то возможно что причина таится где-то в самом контейнере и его службах.

Посмотрим получил ли контейнер список DNS-серверов от сервиса dnsmasq, запущенного на хост-машине, выполним команду внутри контейнера:

В случае если все сконфигурировано правильно, в выводе получим строчку:

Если же полученных настроек IP-адреса и DNS-сервера в контейнере нет, то можем заставить его сделать повторную попытку получения этих сетевых настроек по протоколу DHCP от хост-машины:

Теперь можем пропинговать какой-то сайт и проверить корректно получены ли сетевые настройки:

Исправность работы сетевого механизма LXC-системы проще всего проверить создав какой-нибудь новый контейнер. Если новосозданные контейнеры не получают сетевых натсроек - проблема, скорее всего, на стороне хост-машины, в каком-то звене сетевой подсистемы LXC.

Очень вероятно что проблему удастся решить перезапуском сетевой службы LXC на хост-машине:

Для перезапуска всего механизма LXC:

Если и это не помогло, то может быть что где-то сбились основные настройки сети LXC, стоит перепроверить все параметры, которые были задействованы на этапе установки и настройки механизма LXC.

Еще не помешает проверить правила файрвола IPTables, которые могут блокировать сетевые пакеты на пути от хост-машины к контейнерам.

В более сложных случаях возможна даже не работоспособность самой службы "dnsmasq", нужно изучить ее логи и на основе этих данных устранить проблему.

Еще одна проблема, которая может возникать - невозможность получения GPG ключей от доверенных серверов по причине их перегрузки или неработоспособности.

Результатом станет то, что скачать шаблон и создать из него контейнер не получится, будет выдана следующая ошибка:

Решить эту проблему можно экспортировав в окружение специальную переменную, в которой указать адрес сервера с которого должны браться ключи.

Список некоторых доверенных серверов, для пробы:

Также при запуске команды 'lxc-create' можно отключить проверку цифровой подписи для скачиваемого шаблона, для этого достаточно добавить опцию '--no-validate'. Но я так делать не рекомендую!

В завершение

В дополнение к приведенной выше шпаргалке по командам могу сказать что документация по ним всегда есть под рукой - это система man pages. Пример вызова справки по команде lxc-snapshot:

LXC - очень мощный и относительно не сложный в использовании инструмент, позволяющий запускать в изолированной среде исполнения как отдельные приложения, так и целые связки из приложений. При этом каждое приложение будет работать в полноценной среде выбранной операционной системы Debian, Ubuntu, CentOS, Alpine и т.п.

Открытый исходный код, свобода распространения и простая установка из репозитория GNU/Linux делают эти контейнеры очень привлекательными для использования в тестировании и разработке программ и информационных систем.

Используя вышеприведенные команды можно построить небольшой менеджер для удобного управления Linux-контейнерами на одном из популярных языков программирования или и вовсе на SH/Bash-скриптах.

Если вы обычный пользователь Linux или системный администратор, вам может потребоваться настроить сеть в вашей системе. В отличие от настольных систем, где вы можете использовать динамические конфигурации, вам придется выполнять определенные конфигурации на серверах в зависимости от вашей сетевой среды. Динамические конфигурации постоянно меняются после перезагрузки сервера, поэтому в некоторых случаях возникает необходимость иметь статические конфигурации, например, когда требуется удаленное администрирование сервера или когда на сервере запущено приложение или служба, требующая постоянного доступа. Итак, в этой статье мы объясним, как вы можете настроить базовую сеть в ОС Linux на основе Debian. Базовая настройка включает в себя настройку статического IP, шлюза, DNS и имени хоста.

Мы использовали ОС Debian 10 для описания процедуры, упомянутой в этой статье.

Просмотр текущей конфигурации сети

Чтобы просмотреть текущие настройки сети, выполните следующую команду в Терминале. Он покажет выходные данные для каждого интерфейса в отдельном разделе.


Вы также можете запустить команду ifconfig для просмотра IP-адреса.


Запустите приведенную ниже команду в Терминале, чтобы найти IP-адрес DNS-сервера:

Изменение конфигурации сети

Базовая конфигурация сети включает в себя настройку статического или динамического IP-адреса, добавление шлюза, информацию о DNS-сервере. Существуют разные способы настройки сети в ОС Debian.

Метод 1: Используйте команду ifconfig и route

В этом методе мы увидим, как настроить параметры сети. Однако помните, что эти настройки не будут постоянными. После перезагрузки системы настройки будут удалены.

1. Назначьте IP-адрес интерфейсу

Мы будем использовать ifconfig для назначения IP-адреса нашему сетевому интерфейсу. Ниже приведен синтаксис команды:

В следующем примере команда назначает IP-адрес 192.168.72.165 сетевому интерфейсу eth0. Маска сети составляет 24 (255.255.255.0) бит.


2. Установите шлюз по умолчанию

Шлюз по умолчанию - это адрес, используемый для связи с внешней сетью. Чтобы настроить шлюз по умолчанию, используйте следующий синтаксис команды:

В следующем примере я использую 192.68.72.2 в качестве адреса моего шлюза по умолчанию.


3. Настройте DNS-сервер

DNS-сервер разрешает доменное имя в IP-адрес, чтобы браузер мог загружать интернет-ресурсы. Чтобы настроить адрес сервера имен DNS, используйте следующий синтаксис команды:

В следующем примере я устанавливаю общедоступный IP-адрес DNS от Google в качестве адреса моих серверов имен, который равен 8.8.8.8.



После этого вы можете проверить свою конфигурацию, выполнив команду ifconfig следующим образом:

Удалить IP-адрес из сетевого интерфейса

Чтобы удалить IP-адрес из сетевого интерфейса, выполните следующую команду в терминале:

Метод 2: Измените настройки сети с помощью файла интерфейсов

В этом методе мы настроим постоянные параметры сети, которые ваша система запомнит даже после перезагрузки.Для этого нам нужно отредактировать файл / etc / network / interfaces с помощью любого текстового редактора. Для этого выполните в терминале следующую команду:

Затем добавьте в нее следующие строки:

Теперь нажмите Ctrl + O , а затем Ctrl + X , чтобы сохранить и выйдите из файла.


Обратите внимание, что адрес, маска сети и строка шлюза должны начинаться с пробела! В случае, если вы хотите динамически назначить адрес, используйте следующие строки:

Определение (DNS) серверов имен

Чтобы добавить информацию о DNS-сервере, нам нужно отредактировать /etc/resolv.conf. файл. Для этого выполните следующую команду:

Я добавляю сюда два сервера имен. Одним из них является адрес общедоступного DNS-сервера Google, а другим - IP-адрес моего маршрутизатора.

Теперь нажмите Ctrl + O , а затем Ctrl + X , чтобы сохранить и выйти из файла.


После этого вы можете проверить IP-адрес с помощью команды ip a или ifconfig .


Метод 3: Изменение конфигурации сети с помощью графического интерфейса Debian

В этом методе мы будем использовать графический способ настройки основных параметров сети.

Для этого нажмите кнопку Windows на клавиатуре, затем в строке поиска введите settings . Из появившихся результатов откройте Settings . Затем на левой боковой панели щелкните вкладку Network . После этого нажмите на значок шестеренки интерфейса, который вы хотите настроить.


Перейдите на вкладку IPv4 . Выберите Manual и введите IP-адрес, маску сети, шлюз и DNS.


Если вы хотите динамически назначить IP-адрес, выберите опцию Автоматически (DHCP) и введите информацию DNS.


Сделав это, нажмите Apply , чтобы сохранить изменения.

Настройка имени хоста

Как и IP-адрес, уникальное имя хоста также используется для распознавания системы в сети. Чтобы найти текущее имя хоста вашей системы, выполните следующую команду в Терминале:


Чтобы изменить имя хоста системы, вы можете запустить следующую команду. Но как только вы перезагрузите систему, ваше первоначальное имя хоста будет восстановлено.

Здесь я меняю имя хоста с Debian на Debian10.


Чтобы навсегда изменить имя хоста, вам нужно будет отредактировать файл имени хоста, расположенный по адресу / etc / hostname . Для этого введите приведенную ниже команду:


Этот файл содержит только имя хоста файла, измените старое имя на нужное имя, а затем нажмите Ctrl + O и Ctrl + X чтобы сохранить и выйти.

Некоторые другие полезные команды, которые могут вам понадобиться при настройке сети в ОС Debian:

С ее помощью можно проверить соединение между двумя системами в локальной или глобальной сети. Чтобы проверить подключение к устройству, введите ping, а затем IP-адрес или имя хоста этого устройства:

Arp используется для преобразования IP-адресов в адреса Ethernet. Чтобы напечатать таблицу arp, введите:

Route

Она используется для отображения таблицы маршрутизации системы Linux.

Преобразует имена хостов в IP-адреса и наоборот.

Чтобы найти IP для указанного домена:

Чтобы найти имя домена для указанного IP-адреса.

Включение и отключение интерфейса

Чтобы включить интерфейс, используйте:

Чтобы отключить интерфейс, используйте:

Вот и все! В этой статье мы объяснили, как настроить базовую сеть в ОС Debian. Мы обсудили различные методы, включая графический и командной строки. Вы можете выбрать тот, который вы найдете более простым и удобным.


При упоминании словосочетания «контейнерная виртуализация», многим на ум сразу же приходят Virtuozzo и OpenVZ, а также Docker. Ассоциируется же это все, в первую очередь, с хостингом, VPS и другими подобными вещами.

Дома, на личных компьютерах многие используют виртуальные машины: в основном, пожалуй, Virtualbox. Как правило, для того, чтобы работая под Linux, иметь под рукой Windows или наоборот. Однако, при наличии множества родственных Linux-операционок, я стал замечать, что использование виртуальных машин — это, мягко говоря, нерационально.

В первую очередь, очень быстро расходуется дисковое пространство. Каждой виртуальной машине нужно место, даже если несколько из них отличаются только конфигами. Особенно критично это на невеликих размеров SSD лаптопа. В принципе, Virtualbox умеет работать с raw-девайсами и, теоретически, машинам можно назначать rw LVM-снапшот, но тут опять же встают вопросы с изменением размера файловой системы в дальнейшем, автоматизацией клонирования, переноса, удаления и тому подобное.

Во вторую — это больший расход оперативной памяти. В третью — не самые удобные инструменты взаимодействия…

Потому, возникла идея опробовать в домашних условиях контейнерную виртуализацию. OpenVZ отмел сразу, по причине необходимости возиться с кастомным ядром. Выбор же пал на LXC, поставляющийся в репозитарии стабильного Debian'a.

Что такое контейнеры и чем это все отличается от виртуализации? В случае контейнеров, не создается виртуальное аппаратное окружение, а используется изолированное пространство процессов и сетевого стека. Скажем так, получается chroot с расширенными возможностями.

Зачем это нужно:

— Для сборки ПО при нежелании захламлять разномастными *-dev пакетами основную рабочую систему.
— Потребность в другом дистрибутиве для запуска каких-либо специфических программ и, опять же, сборки.
— Изоляция потенциально небезопасного софта, вроде того же скайпа совершающего разные непонятные действия в домашнем каталоге пользователя и всяких сомнительных веб-технологий: уязвимость во флеше, в java, в обработчике pdf — это только то, что плавает на поверхности.
— Анонимность. Эдак можно банально остаться залогиненым в своей любимой социалочке, забыть подчистить куки или оказаться незнакомым с очередной новой веб-технологией вроде этой webrtc. Можно, конечно, держать несколько профилей браузера, но от перечисленных выше дыр и технологий это не защитит.

Итак, рассмотрим плюсы и минусы LXC:

+ Работает на ванильном ядре
+ Простота проброса устройств и каталогов хоста, так как работает это все через cgroups
+ Очень нетребовательно к ресурсам, в отличии от виртуальных машин типа Virtualbox или qemu

— Контейнеры будут работать на том же ядре, что и хост, хотя — это скорей особенность контейнерной виртуализации в целом.
— Некоторая недоделанность идущих в комплекте утилит.

Развертывание и настройка контейнера

В первую очередь, ставим пакет lxc и все необходимые утилиты:


Смотрим доступные группы томов LVM:


Указываем использовать LVM в качестве системы хранения, Volume Group ( в моем случае — nethack-vg) и размер 2 гигабайта, иначе по умолчанию будет создан одногиговый том. Хотя, если вдруг стало тесновато, можно будет сделать lvresize.


Видим, что у нас появился том deb_test.

Типовой конфиг, созданный скриптом:




Залогинимся с указанным паролем. Для запуска в headless-режиме используется ключ -d, а рутовую консоль можно получить с помощью команды

Пока у нас ни сети, ни нужных для работы программ. Для этого на хосте поднимаем мост, задаем IP, заворачиваем трафик из подсети виртуалки, при отключении интерфейса разрушаем мост.

На хосте прописываем в /etc/network/interfaces


В конфиг контейнера дописываем:


Понятно, что mac-адрес произвольный, на любой вкус.
Чтобы сразу получить рабочую сеть и возможность установки пакетов apt'ом, допишем

Понятно, что 192.168.18.1 — IP моего DNS.

Установим нужные пакеты:


Дальше либо на хосте, либо на другой рабочей виртуалке можно получить список установленных пакетов и установить их все в нашем новом контейнере:


Теперь можно по-человечески настроить сетевой интерфейс в контейнере, использовав любимый текстовый редактор:


Впрочем, это можно было сделать с хост-системы, например, смонтировав логический том. Способов много.

В принципе, в качестве DNS можно указать любой публичный, если не опасаетесь за свою приватность. Например, гугловские 8.8.8.8 и 8.8.4.4.

По доступу к устройствам хост-системы, я придерживаюсь политики «все, что не разрешено, запрещено». Добавим для этого следующую строчку в конфиг:

Попробуем подключиться через OpenVPN. Сразу же получаем ошибку:



Система пишет, что интерфейсы TUN/TAP недоступны по причине их отсутствия. Очевидно, что нужно разрешить гостевой системе использовать устройства хоста. Открываем конфигурационный файл контейнера, /var/lib/lxc/deb_test/config и добавляем туда строчку:


В контейнере выполняем:


Обратим внимание на 10:200 — это идентификатор типа устройств. Если выполним на хосте:


То увидим идентификаторы 10, 200. По ним и будем ориентироваться, разрешая доступ к устройства, например камере — video0.

Точно также добавляем остальные нужные устройства:

Для функционирования иксов и возможности их проброса через ssh, нужно добавить точку монтирования:


По аналогии можно примонтировать и другие, нужные каталоги и файлы:


Для воспроизведения звука, можно разрешить доступ к звуковому устройству, если карта многопоточная (с однопоточной при использовании dmix возникают проблемы с блокировкой):


А можно настроить pulseaudio на воспроизведение звука по сети, как это описано здесь. Кратко:

Отредактировать на хосте /etc/pulse/default.pa, дописав туда:


В итоге у нас получается вот такой конфиг:

Контейнер готов к использованию.

Использование

Доустановим, например, i2p с Tor'ом, если не сделали этого ранее, и сходу настроим privoxy:

Запускать графические приложения вроде браузера удобнее всего через ssh:


Также, разумеется, LXC предоставляет средства для клонирования контейнеров и снятия снапшотов.

Так, например, склонировать контейнер, файловая система которого будет являться LVM-снапшотом можно командой:



Будет создан контейнер deb_test2 с файловой системой, размещенной на LVM-снапшоте размером 200MB (под хранение diff'ов). Это будет точная копия deb_test, над которой можно провести пару экспериментов и, например, безболезненно удалить.

А вот lxc-snapshot с LVM в качестве хранилища, на версии lxc-1.0.6 почему-то не работает:


Проблема описывается и обсуждается здесь. Потому, снимки придется делать по старинке:


В данном случае создали read-only снапшот с именем deb_test_before_rm_rf размером 100MB. Что с ним делать дальше? Например, его можно сдампить посредством dd, перенести на другую машину вместе с конфигами контейнера, создать там том нужного размера и пролить тем же dd (cp, cat, итд) — эдакая «живая миграция».

Как писалось выше, областей применения контейнерам можно найти массу. Но главной, при домашнем использовании, на мой взгляд, является изоляция приложений.

Читайте также: