[Настройка Linux, *nix] Краткое руководство по LXC в ОС Эльбрус
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Не так давно Ростелеком объявил о создании центра компетенций по разработке программных решений под отечественные процессоры. Первая задача, которую нам пришлось решать как нам разграничить серверные ресурсы между сотрудниками занимающимися портированием и разработкой, организовать демонстрационные стенды, а, в перспективе, при росте нагрузок, ещё и управлять такими ресурсами как память и процессорное время.Традиционно эту задачу решают средствами виртуализации, но, к сожалению, наши процессоры еще не поддерживают её. Альтернативным решением является контейнеризация. Изучив доступные варианты, которые можно реализовать на ОС Эльбрус, мы остановились на LXC как стабильном решении. В данной статье я хочу рассказать как пользоваться LXC в ОС Эльбрус.Что мы еще рассматривали
- chroot - имеет право на жизнь, но хочется аналог виртуальных машин, что даст нам больше гибкости.
- docker - есть только в экспериментальной версии, возможно вернемся к нему, но хочется сосредоточиться на работе, а не выяснении почему все упало.
- В ОС Эльбрус есть собранный Bochs, но он не умеет эмулировать e2k архитектуру разработка под которую является целевой для нас.
- QEMU - в версии ядра 2.6 для ОС Эльбрус работал QEMU в режиме паравиртуализации, потом его убирали на доработку. В пакетах ОС Эльбрус он есть, но его работоспособность мной не проверялась (как проверим, обязательно расскажем).
Исходные данныеИтак, для начала у нас имеется:
- сервер на базе процессоров Эльбрус-8С;
- на сервер установлена ОС Эльбрус версии 6.0.1
- LXC версии 2.0.8
- в качестве rootfs бэкенда в LXC мы будем использовать каталог (опция lxc.rootfs.backend = dir), это даст нам дополнительные возможности, о которых я расскажу ниже.
Подготовка и настройка сервераУстанавливаем пакеты lxc и lxcfs командой:
sudo apt install lxc lxcfs
Настраиваем сеть для контейнеров, для этого создаем файл /etc/default/lxc-net следующего содержания:
USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxcbr0"
LXC_ADDR="192.168.103.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="192.168.103.0/24"
LXC_DHCP_RANGE="192.168.103.2,192.168.103.254"
LXC_DHCP_MAX="253"
#LXC_DHCP_CONFILE=""
LXC_DOMAIN=""
Для применения сетевых настроек ко вновь создаваемым контейнерам вносим изменения в файл /etc/lxc/default.conf:
lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx
Для создания сетевого моста нужно запустить службу lxc-net:
sudo service lxc start
Ну и включаем необходимые службы для автоматического запуска при старте операционной системы:
sudo chkconfig lxc-net on
sudo chkconfig lxc on
Создание первого контейнераС ОС Эльбрус идет шаблон osl для создания контейнера из образа установочного диска. Для создания нашего первого контейнера копируем на сервер iso-образ (в моем случае я его залил в /opt/iso) и монтируем его:
sudo mkdir -p /mnt/cdrom
sudo mount -t iso9660 -o loop /opt/iso/el-6.0.1-e8c-boot.iso /mnt/cdrom
Следует заметить, что монтировать нужно строго в /mnt/cdrom так как этот путь зашит в скрипте шаблона.Создаем контейнер командой:
sudo lxc-create -t osl -n osl-test
Ждем окончания развертывания, запускаем контейнер и подключаемся к нему:
sudo lxc-start -n osl-test
sudo lxc-attach -n osl-test
У нас есть работающий контейнер, который уже можно использовать как замену виртуальной машины. В нем потребуется еще произвести настройку и установку необходимых для работы пакетов.Если в ваших планах не входит частое развертывание новых контейнеров, то можете пользоваться этим способом, но у нас грандиозные планы и поэтому было принято решение сделать шаблон который бы позволил нам развертывать новые контейнеры из нескольких заранее настроенных тарболов.Шаблон для создания контейнера из тарболаКак я уже писал ранее, в качестве rootfs бэкенда мы используем каталог, значит мы можем создать контейнер по первому способу, провести в нем необходимые нам настройки и упаковать его в тарбол. При создании нового контейнера нам достаточно всего лишь распаковать содержимое контейнера в каталог rootfs нового контейнера и дописать необходимые параметры в файл config.За основу нового шаблона был взят аналогичный шаблон из SaltStack с небольшими доработками под специфику ОС Эльбрус.Первая правка которую нам нужно внести касается задания hostname, в ОС Эльбрус имя хоста задается в файле /etc/sysconfig/network для этого в файл шаблона в конец функции deploy_tar() дописываем:
if [ -f "${rootfs_path}/etc/sysconfig/network" ]; then
OLD_HOSTNAME=$(grep HOSTNAME ${rootfs_path}/etc/sysconfig/network)
sed -i "s/$OLD_HOSTNAME/HOSTNAME=$name/" ${rootfs_path}/etc/sysconfig/network
fi
Мы не планируем настраивать сеть из шаблона, для этого убираем строки, отвечающие за настройки настройки сети:
lxc_network_type="veth"
lxc_network_link="br0"
...
-t|--network_type) lxc_network_type=${2}; shift 2;;
-l|--network_link) lxc_network_link=${2}; shift 2;;
-r|--root_passwd) root_passwd=${2}; shift 2;;
...
if [ ! -e /sys/class/net/${lxc_network_link} ]; then
echo "network link interface does not exist"
exit 1
fi
Задаем новое имя нашему файлу, в LXC имена шаблонов имеют вид lxc-<имя шаблона>, где часть <имя шаблона> потом используется в команде lxc-create, для файла выставляем права на запуск и копируем его в /usr/share/lxc/templates/. Свой шаблон я назвал osl-img:
mv salt_tarball lxc-osl-img
chmod +x lxc-osl-img
TODO: уточнить права на шаблонах
chown root:root lxc-osl-img
sudo mv lxc-osl-img /usr/share/lxc/templates/
Создаем шаблонный образ rootfsПрежде всего создаем контейнер по первой части нашей инструкции и проводим настройку контейнера.Исправление ошибок при выполнении команды chkconfigДанные действия можно произвести без запуска контейнера, напрямую отредактировав файлы. По умолчанию LXC создает новые контейнеры в /var/lib/lxc/<имя вашего контейнера> (далее пути будут указаны относительно этого пути).Нам нужно отредактировать файл rootfs/etc/init.d/sysklogd вписав после строки
### BEGIN INIT INFO
строку:
# Provides: sysklogd
Удаляем файл rootfs/etc/rcsysinit.d/S05mknod и создаем файл rootfs/etc/init.d/mknod со следующим содержимым:
#!/bin/sh
### BEGIN INIT INFO
# Provides: mknod
# Required-Start: mountkernfs
# Required-Stop: mountkernfs
# Default-Start: S
# Default-Stop: 0 6
# Short-Description:
# Description:
### END INIT INFO
. /etc/sysconfig/rc
. ${rc_functions}
case "${1}" in
start)
mknod -m 660 /dev/loop0 b 7 0
mknod -m 660 /dev/loop1 b 7 1
mknod -m 660 /dev/loop2 b 7 2
mknod -m 660 /dev/loop3 b 7 3
(exit ${failed})
evaluate_retval
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
Настройка сетиВ своих тарболах я использую назначение адресов по DHCP, если требуются другие настройки, то это уже конфигурируется для конкретных контейнеров. Настройки сетевых интерфейсов в ОС Эльбрус располагаются в /etc/sysconfig/network-devices/ifconfig.<имя интерфейса>/ipv4, для интерфейса eth0 создаем файл rootfs/etc/sysconfig/network-devices/ifconfig.eth0/ipv4 следующего содержания:
BOOTPROTO=dhcp
ONBOOT=yes
SERVICE=dhclient
Создаем служебного пользователяЯ являюсь противником работы от пользователя root, поэтому создадим служебного пользователя под которым можно будет производить дальнейшие настройки.Стартуем наш контейнер lxc-start -n <имя контейнера>, и подключаемся к нему lxc-attach -n <имя контейнера>. Создаем пользователя admin:
useradd -m admin
passwd admin
usermod -a -G wheel admin
Редактируем файл /etc/sudoers разрешая членам группы wheel выполнять команды через sudo. Для этого раскомментируем строку:
%wheel ALL=(ALL) ALL
Не лишним будем установить новый пароль пользователю root:
passwd root
Автозапуск службДля корректной работы контейнера нам требуется выставить автозагрузку некоторых служб, для этого выполним внутри контейнера следующие команды:
chkconfig devpts on
chkconfig network on
chkconfig mknod on
Упаковка rootfs в тарболОстанавливаем контейнер командой lxc-stop -n <имя контейнера>. И выполняем команду:
tar -cvzf osl-template.tar.gz -C /var/lib/lxc/<имя контейнера>/rootfs/ .
Получившийся архив перемещаем в удобное для хранения место.Как пользоваться?Свой шаблон я назвал osl-img, поэтому в примерах он будет фигурировать с таким именем. Что-бы развернуть новый контейнер нам потребуется выполнить команду:
sudo lxc-create -t osl-img -n tarball-test -- --imgtar /path/to/osl-template.tar.gz
Если все сделали правильно, то мы получим новый контейнер, который даже работает.Доступ в контейнеры по SSHПодключаться к контейнеру через lxc-attach конечно хорошо, но не очень удобно, тем более некоторые IDE позволяют производить компиляцию на удаленном хосте через SSH, что было бы очень удобно при портировании и разработке под Эльбрус.Мною опробованы два способа. Первый способ, работает при использовании моста на сетевой интерфейс, в этом случае хостовую систему можно использовать как jump host и настроить ssh клиента для работы через него. Для этого нужно внести в файл ~/.ssh/config следующие строки:
Host e2k-proxy
HostName <доменное имя или ip вашего хоста>
ForwardAgent yes
Host 192.168.103.*
ProxyCommand ssh e2k-proxy -W [%h]:%p
После этих настроек все соединения на хосты с адресами 192.168.103.1/24 (сеть которую мы настраивали ранее в файле /etc/default/lxc-net) будут осуществляться через хостовую систему.Второй вариант, выставить контейнер наружу сетевым интерфейсом. Такое возможно, если вместо veth мы будем использовать macvlan, для этого в конфигурацию контейнера (/var/lib/lxc/<имя контейнера>/config) нужно внести следующие изменения:
lxc.network.type = macvlan
lxc.network.macvlan.mode = bridge
lxc.network.link = eth0
Если ваш контейнер был запущен, то перезапускаем его. Подключаемся к нему и настраиваем сетевой интерфейс. Пример файла ipv4 для статического адреса выглядит так:
IP=192.168.103.2
GATEWAY=192.168.103.1
PREFIX=24
CHECK_LINK=yes
ONBOOT=yes
TYPE=Ethernet
SERVICE=ipv4-static
Вместо заключенияВ статье не затронуто много аспектов работы с LXC, я постарался сделать больше упор на специфику ОС Эльбрус. Как вы уже поняли, работа с LXC на Эльбрусе не отличается от таковой в других дистрибутивах Linux и на других архитектурах процессоров.По первым результатам работы коллег, у нас уже появились планы по улучшению текущей системы:
- запустить альтернативные операционные системы в контейнерах (под Эльбрус есть как минимум еще Альт и Astra Linux)
- создать контейнеры с GUI для случаев когда требуется посмотреть как это будет работать у пользователя
- ну и мы уже начали работу по автоматизации, там тоже поле не паханое и очень интересное.
===========
Источник:
habr.com
===========
Похожие новости:
- [Настройка Linux, *nix, Разработка под Linux, Учебный процесс в IT, DevOps] Зачем уметь работать в командной строке?
- [Разработка под Linux] Архитектура контейнеров, часть 1. Почему важно понимать разницу между пространством пользователя и пространством ядра
- [Настройка Linux, Звук] Заметка: Контроль звуковых выходов для программ
- [Системное администрирование, Серверное администрирование, DevOps, Микросервисы] АМА-сессия Слёрма по service mesh. Часть 2
- [Настройка Linux, Open source, Виртуализация, Kubernetes] 13 инструментов для разработчиков, шпаргалка по Linux команде apt, вводный курс по Kubernetes Operators и многое другое
- [IT-инфраструктура] Крупнейшую в России сеть дата-центров будет развивать новая сервисная компания
- [Настройка Linux] Как анализировать вывод /proc/meminfo в Linux (перевод)
- [Информационная безопасность, Разработка для интернета вещей] Приглашаем на летнюю конференцию KasperskyOS Night
- [Системное администрирование, *nix, Оболочки] Для программиста shell так же необходим, как умение читать (перевод)
- [Системное администрирование, *nix] Сбой в работе крупнейшего доменного провайдера России REG.RU
Теги для поиска: #_nastrojka_linux (Настройка Linux), #_*nix, #_elbrus (Эльбрус), #_lxc, #_kontejnery (контейнеры), #_kontejnerizatsija (контейнеризация), #_kontejnernaja_virtualizatsija (контейнерная виртуализация), #_blog_kompanii_rostelekom (
Блог компании Ростелеком
), #_nastrojka_linux (
Настройка Linux
), #_*nix
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 08:58
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Не так давно Ростелеком объявил о создании центра компетенций по разработке программных решений под отечественные процессоры. Первая задача, которую нам пришлось решать как нам разграничить серверные ресурсы между сотрудниками занимающимися портированием и разработкой, организовать демонстрационные стенды, а, в перспективе, при росте нагрузок, ещё и управлять такими ресурсами как память и процессорное время.Традиционно эту задачу решают средствами виртуализации, но, к сожалению, наши процессоры еще не поддерживают её. Альтернативным решением является контейнеризация. Изучив доступные варианты, которые можно реализовать на ОС Эльбрус, мы остановились на LXC как стабильном решении. В данной статье я хочу рассказать как пользоваться LXC в ОС Эльбрус.Что мы еще рассматривали
sudo apt install lxc lxcfs
USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxcbr0" LXC_ADDR="192.168.103.1" LXC_NETMASK="255.255.255.0" LXC_NETWORK="192.168.103.0/24" LXC_DHCP_RANGE="192.168.103.2,192.168.103.254" LXC_DHCP_MAX="253" #LXC_DHCP_CONFILE="" LXC_DOMAIN="" lxc.network.type = veth
lxc.network.link = lxcbr0 lxc.network.flags = up lxc.network.hwaddr = 00:16:3e:xx:xx:xx sudo service lxc start
sudo chkconfig lxc-net on
sudo chkconfig lxc on sudo mkdir -p /mnt/cdrom
sudo mount -t iso9660 -o loop /opt/iso/el-6.0.1-e8c-boot.iso /mnt/cdrom sudo lxc-create -t osl -n osl-test
sudo lxc-start -n osl-test
sudo lxc-attach -n osl-test if [ -f "${rootfs_path}/etc/sysconfig/network" ]; then
OLD_HOSTNAME=$(grep HOSTNAME ${rootfs_path}/etc/sysconfig/network) sed -i "s/$OLD_HOSTNAME/HOSTNAME=$name/" ${rootfs_path}/etc/sysconfig/network fi lxc_network_type="veth"
lxc_network_link="br0" ... -t|--network_type) lxc_network_type=${2}; shift 2;; -l|--network_link) lxc_network_link=${2}; shift 2;; -r|--root_passwd) root_passwd=${2}; shift 2;; ... if [ ! -e /sys/class/net/${lxc_network_link} ]; then echo "network link interface does not exist" exit 1 fi mv salt_tarball lxc-osl-img
chmod +x lxc-osl-img TODO: уточнить права на шаблонах chown root:root lxc-osl-img sudo mv lxc-osl-img /usr/share/lxc/templates/ ### BEGIN INIT INFO
# Provides: sysklogd
#!/bin/sh
### BEGIN INIT INFO # Provides: mknod # Required-Start: mountkernfs # Required-Stop: mountkernfs # Default-Start: S # Default-Stop: 0 6 # Short-Description: # Description: ### END INIT INFO . /etc/sysconfig/rc . ${rc_functions} case "${1}" in start) mknod -m 660 /dev/loop0 b 7 0 mknod -m 660 /dev/loop1 b 7 1 mknod -m 660 /dev/loop2 b 7 2 mknod -m 660 /dev/loop3 b 7 3 (exit ${failed}) evaluate_retval ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac BOOTPROTO=dhcp
ONBOOT=yes SERVICE=dhclient useradd -m admin
passwd admin usermod -a -G wheel admin %wheel ALL=(ALL) ALL
passwd root
chkconfig devpts on
chkconfig network on chkconfig mknod on tar -cvzf osl-template.tar.gz -C /var/lib/lxc/<имя контейнера>/rootfs/ .
sudo lxc-create -t osl-img -n tarball-test -- --imgtar /path/to/osl-template.tar.gz
Host e2k-proxy
HostName <доменное имя или ip вашего хоста> ForwardAgent yes Host 192.168.103.* ProxyCommand ssh e2k-proxy -W [%h]:%p lxc.network.type = macvlan
lxc.network.macvlan.mode = bridge lxc.network.link = eth0 IP=192.168.103.2
GATEWAY=192.168.103.1 PREFIX=24 CHECK_LINK=yes ONBOOT=yes TYPE=Ethernet SERVICE=ipv4-static
=========== Источник: habr.com =========== Похожие новости:
Блог компании Ростелеком ), #_nastrojka_linux ( Настройка Linux ), #_*nix |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 08:58
Часовой пояс: UTC + 5