Иногда можно не возиться с полной или пара-виртуализацией с помощью qemu, а запустить lxc-контейнер с userspace-окружением RHEL/CentOS 6/7 или Fedora 19-23-…-rawhide, чтобы быстро что-нибудь сделать, не относящееся к ядру. Преимущество lxc-контейнера над qemu-виртуализацией в том, что не надо возится с файлами образов дисков и установкой системы с инсталляционного диска или по сети. Наоборот, можно просто установить несколько необходимых «bootstrap» пакетов в обычную директорию на хост-системе и на этом всё. Ну и lxc-контейнеры исключительно быстро стартуют и завершаются, потому что по факту это просто набор процессов. RHEL/CentOS 6 для хост-системы не подойдёт, так как у них в репозиториях нет необходимых пакетов libvirt-*-lxc
.
Несколько общих слов про lxc-контейнеры в RHEL/CentOS 6/7 и Fedora 19+. Есть минимум 3 их реализации. Первая — это как бы «голый» lxc, описанный у меня в статье «Установка и использование контейнеров LXC 1.0 в RHEL/CentOS 6.5». Почти все настройки для него нужно делать ручками, что удобно, только если вы понимаете что делаете, прям как я. Иначе — неудобно. Вторая реализация — это docker
(а так же rocket/rkt
и подобные), который сейчас дофига модный и делает (почти) всё за вас. Проблема с docker
-ом в том, что надо возиться с установкой и настройкой самого docker
-а. Третья реализация — вируальная машина (точнее, lxc-контейнер) внутри libvirt
-а, но с backend-ом виртуализации не qemu, а lxc. Именно её мы рассмотрим в этой статье.
Ахтунг: технология libvirt + lxc объявлена устаревшей, начиная с RHEL/CentOS 7.1 и может быть выпилена из оных в любом релизе. Вы строите свою продакшн-инфраструктуру на этой технологии на свой страх и риск. Больше подробностей в статье Linux Containers with libvirt-lxc (deprecated).
Ниже предполагается, что у нас есть установленный хост RHEL или CentOS 7 или Fedora 19+ с минимальным набором пакетов, но с графикой (вариант установки «Server with GUI»), для virt-manager
-a и virt-viewer
-a. Без графики тоже можно, тогда доступ в консоль lxc-контейнера будет в текстовом режиме с помощью virsh console
.
- Установка необходимых пакетов или группы пакетов с виртуализацией
Можно поставить целиком группу пакетов относящихся к виртуализации. Ранее в RHEL/CentOS была одна группа Virtualization
, потом её разбили на несколько меньших (прочесть о спрятанных группах можно здесь), в Fedora так и оставили одну, поэтому посмотреть что у вас на конкренто вашей системе можно так:
[root@centos7 ~]# yum group list -v hidden | grep -i virt Virtualization Host (virtualization-host-environment) Virtualization Client (virtualization-client) Virtualization Hypervisor (virtualization-hypervisor) Virtualization Platform (virtualization-platform) Virtualization Tools (virtualization-tools)
В Fedora как была одна группа пакетов, так и осталась. Заметьте, в Fedora с версии 23 используется пакетный менеджер dnf
вместо yum
:
[root@fed23 ~]# dnf group list -v hidden | grep -i virt Virtualization (virtualization)
Посмотреть состав группы, например Virtualization Client
можно так:
[root@centos7 ~]# yum group info 'Virtualization Client' Group: Virtualization Client Group-Id: virtualization-client Description: Clients for installing and managing virtualization instances. Mandatory Packages: gnome-boxes +virt-install +virt-manager +virt-viewer Default Packages: +virt-top Optional Packages: libguestfs-tools libguestfs-tools-c
Нам нужны группы Virtualization Client
, Virtualization Platform
и пакеты libvirt-daemon-driver-lxc
и libvirt-daemon-lxc
:
[root@centos7 ~]# yum group install 'Virtualization Client' 'Virtualization Platform' [root@centos7 ~]# yum install libvirt-daemon-driver-lxc libvirt-daemon-lxc
Но для совсем минимальной инсталляции (чтобы не тащить, например, qemu
) достаточно установить следующие пакеты (плюс, естественно, зависимсости):
[root@centos7 ~]# yum install libvirt-daemon-driver-lxc libvirt-daemon-lxc libvirt-daemon-config-network virt-install virt-manager virt-viewer
- Запуск демона libvirtd и подключение к нему virt-manager-ом
После этого надо стартовать демон libvirtd
(или перезагрузиться, он должен быть настроен стартовать при загрузке):
[root@centos7 ~]# systemctl start libvirtd [root@centos7 ~]# systemctl status libvirtd libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled) Active: active (running) since Sat 2066-66-66 66:66:66 UTC; 66min ago
Если не запустить демон libvirt
, virt-manager
не сможет к нему подключится. Чтобы подключится к бегущему демону, запускаем virt-manager
, идём в File -> Add Connection… и выбираем тип локального гипервизора «LXC (Linux Containers)»:
Подключение «localhost (LXC)» должно появиться в окне virt-manager
-а.
- Ошибка «libvirtd: internal error: Network is already in use by interface» при старте libvirtd
Иногда внезапно вы можете получить эту ошибку при старте libvirtd
, особенно если вы запускаете его в виртуальной машине qemu
:
[root@centos7 ~]# systemctl status libvirtd -l
...
Nov 66 66:66:66 centos7 systemd[1]: Started Virtualization daemon.
Nov 66 66:66:66 centos7 libvirtd[860]: libvirt version: 1.2.8, package: 16.el7_1.5 (CentOS BuildSystem <http://bugs.centos.org>)
Nov 66 66:66:66 centos7 libvirtd[860]: internal error: Network is already in use by interface eth0
Сообщение не очень понятное, но оно значит вот что. libvirtd
хочет создать бридж с дефолтным диапазоном IP-адресов 192.168.122.0/24 на одном из интерфейсов хоста. Но может оказаться, что этот диапазон уже используется на каком-то из интерфейсов, eth0
в данном случае. Тогда бридж создать невозможно, о чём libvirtd
и уведомляет. Решение — пересоздать сеть default
изменив дефолтный диапазон 192.168.122.0/24 на что-то другое (например, на 10.0.0.0/16) в Virtual Machine Manager -> Edit -> Connection Details -> Virtual Networks -> IPv4 configuration:
Или остановить демон libvirtd
, отредактировать диапазон IP-адресов сети default
в файле /etc/libvirt/qemu/networks/default.xml
и запустить демон заново:
[root@centos7 ~]# systemctl stop libvirtd [root@centos7 ~]# cat /etc/libvirt/qemu/networks/default.xml <network> <name>default</name> <uuid>f50db5d8-8e83-451f-9f37-0ec5d7c1959a</uuid> <forward mode='nat'/> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:66:66:66'/> <ip address='10.0.0.1' netmask='255.255.0.0'> <dhcp> <range start='10.0.0.2' end='10.0.255.254'/> </dhcp> </ip> </network> [root@centos7 ~]# systemctl start libvirtd
После этого libvirtd
должен успешно создать бридж virbr0
с назначенным диапазоном IP-адресов:
[root@centos7 ~]# ip a s virbr0 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 52:54:00:66:66:66 brd ff:ff:ff:ff:ff:ff inet 10.0.0.1/16 brd 10.0.255.255 scope global virbr0 valid_lft forever preferred_lft forever [root@centos7 ~]# systemctl status libvirtd -l Nov 66 66:66:66 centos7 systemd[1]: Started Virtualization daemon. Nov 66 66:66:66 centos7 dnsmasq-dhcp[3024]: DHCP, IP range 10.0.0.2 -- 10.0.255.254, lease time 1h
- Запуск virt-manager от обычного пользователя без пароля
В Fedora 20+ virt-manager
запросит рутовый пароль если его запускать от обычного пользователя в графической оболочке. В RHEL/CentOS 7 — нет, так как они построены на кодовой базе Fedora 19, а virt-manager
начал уметь в PolicyKit
(который и заставляет спрашивать рутовый пароль) только с Fedora 20. Больше деталей про это здесь.
Чтобы убрать этот запрос надо добавить вашего обычного пользователя в группу wheel
(или любую другую) и создать файл /etc/polkit-1/rules.d/80-libvirt.rules
со следующим кодом:
[root@rules ~]# usermod -G wheel someuser [root@rules ~]# cat /etc/polkit-1/rules.d/80-libvirt.rules polkit.addRule(function(action, subject) { if (action.id == "org.libvirt.unix.manage" && subject.local && subject.active && subject.isInGroup("wheel")) { return polkit.Result.YES; } });
- Создание lxc-контейнера CentOS 7
Несколько общих слов про «bootstrapping» lxc-контейнера. Чтобы контейнер заработал, надо установить в него некий минимальный набор пакетов, которых достаточно для функционирования минимальной системы. Скорее всего это будут пакеты инициализации (systemd
или upstart
или Sys V init-скрипты) и пакетный менеджер (и, естественно, их зависимости). Этот начальный набор пакетов надо установить в директорию lxc-контейнера из хост-системы, так как самого контейнера пока нет. Для этого у yum
(и dnf
) есть волшебный ключ --installroot
. Но чтобы yum
знал откуда брать пакеты для операционной системы контейнера, ему это надо сказать файлами <корень-контейнера>/etc/yum.repos.d/*.repo
. В частном случае, когда ОС хоста и контейнера одинакова (например мы создаём контейнер с CentOS 7 на хосте CentOS 7) это можно не делать.
Посмотреть, какие версии CentOS доступны для установки по сети можно на странице http://mirror.centos.org/centos/. .repo
-файлы нужные нам для седьмой версии на момент написания статьи лежат в пакете centos-release-7-1.1503.el7.centos.2.8.x86_64.rpm. Использование таких пакетов будет описано во второй части статьи, пока для простоты создадим .repo
-файлы руками.
Итак, предположим, мы создаём lxc-контейнер с CentOS 7 в директории /srv/centos7
. Создадим нужные каталоги и .repo
-файлы. Репозитории [base]
и [updates]
будут брать пакеты из сети с ближайшего зеркала. Если у вас нет сети, но есть установочный диск CentOS 7, смонтированный в директорию (например) /run/media/root/CentOS_7_x86_64/
, можно ставить пакеты с него, для этого описан пока выключенный репозиторий [media]
. Чтобы устанавливать пакеты с установочного диска, а не из сети, установите enabled=1
для репозитория [media]
, а enabled=0
для остальных репозиториев:
[root@centos7 ~]# mkdir -p /srv/centos7/etc/yum.repos.d/ [root@centos7 ~]# cat /srv/centos7/etc/yum.repos.d/bootstrap.repo [base] name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ enabled=1 [updates] name=CentOS-$releasever - Updates mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/ enabled=1 [media] name=CentOS-$releasever - Media baseurl=file:///run/media/root/CentOS_7_x86_64/ enabled=0
Собственно, всё готово к установке bootstrap-пакетов. После установки можно удалить файл /srv/centos7/etc/yum.repos.d/bootstrap.repo
, он больше не нужен. Заметьте, всё это мы пока делаем из хост-системы. Волшебная команда, которая делает магическую магию, такова:
[root@centos7 ~]# yum -y --installroot=/srv/centos7/ --releasever=7 --nogpg install systemd passwd yum centos-release vim-minimal openssh-server procps-ng iproute net-tools dhclient sudo rootfiles [root@centos7 ~]# rm -f /srv/centos7/etc/yum.repos.d/bootstrap.repo
Далее, ещё из хост-системы надо провести некоторую первоначальную настройку lxc-контейнера с CentOS 7 ещё до его первого запуска. Сначало надо установить рутовый пароль (например, «rootpw») с помощью магии chroot
:
[root@centos7 ~]# chroot /srv/centos7/ /bin/bash -c "/bin/echo rootpw | /usr/bin/passwd --stdin root" Changing password for user root. passwd: all authentication tokens updated successfully.
Или убрать рутовый пароль вообще и не забыть разрешить демону sshd
пускать с пустым паролем:
[root@centos7 ~]# sed -i -e '/^root:/croot::16666:0:99999:7:::' /srv/centos7/etc/shadow [root@centos7 ~]# sed -i -e '/PermitEmptyPasswords/cPermitEmptyPasswords yes' /srv/centos7/etc/ssh/sshd_config
Далее нужно добавить консоль контейнера как «доверенный» терминал, без этого система не пустит рута с консоли:
[root@centos7 ~]# echo pts/0 >> /srv/centos7/etc/securetty
Далее нужно сделать демон sshd
запускаемым при старте контейнера (эта линка может уже существовать, тогда команда пофэйлится, но это нормально):
[root@centos7 ~]# ln -s /usr/lib/systemd/system/sshd.service /srv/centos7/etc/systemd/system/multi-user.target.wants/
Зададим имя хоста внутри контейнера:
[root@centos7 ~]# echo centos7-lxc.localdomain > /srv/centos7/etc/hostname
Теперь, шаг с которым наиболее вероянто могут возникнуть проблемы — кофигурация сети внутри контейнера. Мы хотим, чтобы интерфейс eth0
получал настройки по DHCP, поэтому создаём файлы с таким содержанием:
[root@centos7 ~]# touch /srv/centos7/etc/sysconfig/network [root@centos7 ~]# cat /srv/centos7/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp
И, наконец, создаём и запускаем контейнер с помощью virt-install
(больше деталей про опцию --os-variant
упомянуто ниже):
[root@centos7 ~]# virt-install --connect lxc:// --name centos7 --ram 512 --os-variant=centos7.0 --filesystem /srv/centos7/,/ Starting install... Creating domain... Connected to domain centos7 Escape character is ^] systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ) Detected virtualization 'lxc-libvirt'. Welcome to CentOS Linux 7 (Core)! Set hostname to <centos7-lxc.localdomain>. Initializing machine ID from container UUID. ... CentOS Linux 7 (Core) Kernel 3.10.0-229.el7.x86_64 on an x86_64 centos7-lxc login:
Позднее запустить остановленный контейнер и войти в него можно из графического интерфейса virt-manager
-а или из текстового терминала с помощью virsh start
и virsh console
. Внимание: чтобы войти в контейнер из текстовой консоли virt-manager
не должен быть запущен! Отсоединиться от консоли контейнера можно нажав Ctrl-]
:
[root@centos7 ~]# virsh --connect lxc:// start centos7 Domain centos7 started [root@centos7 ~]# virsh --connect lxc:// console centos7 Connected to domain centos7 Escape character is ^] systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ) Detected virtualization 'lxc-libvirt'. ... CentOS Linux 7 (Core) Kernel 3.10.0-229.el7.x86_64 on an x86_64 centos7-lxc login:
Итак, зайдём в контейнер и осмотримся, проверим, что всё как надо, памяти столько, скольно назначено, стоит правильное имя хоста и есть сеть:
[root@centos7 ~]# virsh --connect lxc:// console centos7 CentOS Linux 7 (Core) Kernel 3.10.0-229.el7.x86_64 on an x86_64 centos7-lxc login: root [root@centos7-lxc ~]# uname -a Linux centos7-lxc.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux [root@centos7-lxc ~]# grep ^MemTotal /proc/meminfo MemTotal: 524288 kB [root@centos7-lxc ~]# ip a s eth0 5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 66:66:66:66:66:66 brd ff:ff:ff:ff:ff:ff inet 10.0.207.19/16 brd 10.0.255.255 scope global dynamic eth0 valid_lft 2909sec preferred_lft 2909sec inet6 fe80::6666:66ff:fe66:6666/64 scope link valid_lft forever preferred_lft forever [root@centos7-lxc ~]# ping google.com PING google.com (666.666.666.666) 56(84) bytes of data. 64 bytes from icmp.google.com (666.666.666.666): icmp_seq=1 ttl=52 time=1.1 ns 64 bytes from icmp.google.com (666.666.666.666): icmp_seq=2 ttl=52 time=1.7 ns [root@centos7-lxc ~]# yum repolist Loaded plugins: fastestmirror repo id repo name status base/7/x86_64 CentOS-7 - Base 8652 extras/7/x86_64 CentOS-7 - Extras 277 updates/7/x86_64 CentOS-7 - Updates 1707
Как бы, каза лось бы, ура.
- Создание lxc-контейнера RHEL 7
Почти ничем не отличается от создания lxc-контейнера CentOS 7. Проблема в установке bootstrap-пакетов. Так как доступ к пакетам RHEL требует регистрации, нельзя просто так взять и описать RHEL-репозитории в .repo
-файлах, <картинка-с-боромиром.jpg>, нужна ещё регистрация, чтобы скачать пакеты RHEL 7 из сети из Red Hat Network. Поэтому нужно либо иметь установочный диск RHEL 7 и использовать репозиторий [media]
. Либо устанавливать lxc-контейнер RHEL 7 из зарегистрированной хост-системы RHEL 7, тогда yum
использует регистрацию хост-системы для скачивания пакетов.
Значение --releasever
должно быть не 7
, а 7Server
. Набор bootstrap-пакетов также немного другой. То есть, магически волшебные команды такие:
[root@rhel7 ~]# yum -y --installroot=/srv/rhel7/ --releasever=7Server --nogpg install systemd passwd yum redhat-release vim-minimal openssh-server procps-ng iproute net-tools dhclient sudo rootfiles [root@rhel7 ~]# virt-install --connect lxc:// --name rhel7 --ram 512 --os-variant=rhel7 --filesystem /srv/rhel7/,/
В virt-install
надо использовать --os-variant=rhel7
. Также, чтобы устанавливать софт и получать обновления, надо зарегистрировать контейнер в Red Hat Network как отдельную систему. Или устанавливать пакеты в контейнер из зарегистрированной хост системы. В остальном всё так же.
- Создание lxc-контейнеров в хост-системе Fedora 22+
В Fedora начиная с версии 22 и дальше пакетный мереджер yum
был заменён на dnf
и, внезапно, поведение опции --installroot
измени лось. Теперь dnf
не использует репозитории заданные в директории <корень-контейнера>/etc/yum.repos.d/
, но использует не нужные в нашем случае репозитории из хост-системы. К счастью, эта функциональность была возложена на настройку reposdir
, которая позволяет отдельно указать директорию с репозиториями. Что интересно, на момент написания этой статьи это отличие от yum
не указано здесь, где, по-идее, должно бы.
Соответственно, очень волшебная и не менее магическая команда по установке bootstrap-пакетов в контейнер /srv/centos7
с помощью dnf
на Fedora 22+ (после создания файла /srv/centos7/etc/yum.repos.d/bootstrap.repo
с репозиториями) будет:
[root@fedora23 ~]# dnf --setopt=reposdir=/srv/centos7/etc/yum.repos.d/ --installroot=/srv/centos7/ --releasever=7 --nogpg install systemd passwd yum centos-release vim-minimal openssh-server procps-ng iproute net-tools dhclient sudo rootfiles
- Создание lxc-контейнера из готового образа от linuxcontainers.org
Внезапно, никто не запрещает особенно ленивым задницам вроде вас использовать уже готовые рутовые файловые системы с images.linuxcontainers.org. Достаточно взять готовый образ rootfs.tar.xz, распаковать его и создать контейнер с помощью virt-install
. Образы пересоздаются каждый день, поэтому ссылка, скорее всего, уже не рабочая. Возьмите сами файл rootfs.tar.xz
из каталога доступных образов CentOS 7.
Дальше, по-идее, всё просто: распаковать, задать имя системы, задать или сбросить рутовый пароль (на момент написания статьи по-умолчанию задан пароль «root» и требуется создание нового пароля при первом логине) и создать контейнер. На сейчас сеть в контейнере конфигуряется legacy-сервисом network
, поэтому настройки сети можно менять в файле /etc/sysconfig/network-scripts/ifcfg-eth0
.
[root@centos7 /]# wget http://images.linuxcontainers.org/images/centos/7/amd64/default/20151201_02:16/rootfs.tar.xz [root@centos7 /]# mkdir -p /srv/centos7/ && tar -C /srv/centos7/ -xf rootfs.tar.xz [root@centos7 ~]# echo centos7-lxc.localdomain > /srv/centos7/etc/hostname [root@centos7 ~]# sed -i -e '/^root:/croot::16666:0:99999:7:::' /srv/centos7/etc/shadow [root@centos7 /]# virt-install --connect lxc:// --name centos7 --ram 512 --os-variant=centos7.0 --filesystem /srv/centos7/,/ Starting install... Creating domain... ... CentOS Linux 7 (Core) Kernel 3.10.0-229.el7.x86_64 on an x86_64 centos7-lxc login: root [root@centos7-lxc ~]# ip a s eth0 7: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 66:66:66:66:66:66 brd ff:ff:ff:ff:ff:ff inet 10.0.0.39/16 brd 10.0.255.255 scope global dynamic eth0 valid_lft 3558sec preferred_lft 3558sec inet6 fe80::6666:66ff:fe66:6666/64 scope link valid_lft forever preferred_lft forever
Наслаждайтесь.
- Замечания об опции —os-variant команды virt-install
Внезапно может возникнуть вопрос, какие ещё значения можно использовать в опции --os-variant
команды virt-install
, кроме centos7.0
или rhel7
. К сожелению, команда virt-install
, поставляемая с RHEL/CentOS 7 на момент написания статьи не поддерживает вывод допустимых значений этой опции с помощью --os-variant list
--os-variant help
или --os-variant=?
. Если надо, можно использовать быстрый и грязный хак файла /usr/share/virt-manager/virtinst/guest.py
, который выведет список допустимых вариантов, если еспользован неправильный:
(патч к файлу guest.py) --- /usr/share/virt-manager/virtinst/guest.py +++ /usr/share/virt-manager/virtinst/guest.py.new @@ -215,6 +215,8 @@ if val: val = val.lower() if osdict.lookup_os(val) is None: + for osname in osdict._allvariants: + print osname raise ValueError( _("Distro '%s' does not exist in our dictionary") % val)
Теперь, запустив virt-install
с какой-нибудь чушью в --os-variant
, получим список допустимых значений этой опции:
[root@centos7 /]# virt-install --connect lxc:// --name ololo --ram 128 --os-variant=ololo openbsd5.1 freebsd5.5 solaris ubuntu11.10 ... win2k generic ubuntu13.10 openbsd4.9 ERROR Error validating install location: Distro 'ololo' does not exist in our dictionary
- Создание lxc-контейнеров Fedora 23 и Rawhide
Вторая часть: Контейнерная виртуализация LXC в libvirt на RHEL/CentOS 7 и Fedora 19+. Часть 2. Контейнеризуем Fedora 23 и Rawhide.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ.
Иногда можно не возиться с полной или пара-виртуализацией с помощью qemu, а запустить lxc-контейнер с userspace-окружением RHEL/CentOS 6/7 или Fedora 19-23-…-rawhide, чтобы быстро что-нибудь сделать, не относящееся к ядру. Преимущество lxc-контейнера над qemu-виртуализацией в том, что не надо возится с файлами образов дисков и установкой системы с инсталляционного диска или по сети. Наоборот, можно просто установить несколько необходимых «bootstrap» пакетов в обычную директорию на хост-системе и на этом всё. Ну и lxc-контейнеры исключительно быстро стартуют и завершаются, потому что по факту это просто набор процессов. RHEL/CentOS 6 для хост-системы не подойдёт, так как у них в репозиториях нет необходимых пакетов libvirt-*-lxc
.
Несколько общих слов про lxc-контейнеры в RHEL/CentOS 6/7 и Fedora 19+. Есть минимум 3 их реализации. Первая — это как бы «голый» lxc, описанный у меня в статье «Установка и использование контейнеров LXC 1.0 в RHEL/CentOS 6.5». Почти все настройки для него нужно делать ручками, что удобно, только если вы понимаете что делаете, прям как я. Иначе — неудобно. Вторая реализация — это docker
(а так же rocket/rkt
и подобные), который сейчас дофига модный и делает (почти) всё за вас. Проблема с docker
-ом в том, что надо возиться с установкой и настройкой самого docker
-а. Третья реализация — вируальная машина (точнее, lxc-контейнер) внутри libvirt
-а, но с backend-ом виртуализации не qemu, а lxc. Именно её мы рассмотрим в этой статье.
Ахтунг: технология libvirt + lxc объявлена устаревшей, начиная с RHEL/CentOS 7.1 и может быть выпилена из оных в любом релизе. Вы строите свою продакшн-инфраструктуру на этой технологии на свой страх и риск. Больше подробностей в статье Linux Containers with libvirt-lxc (deprecated).
Ниже предполагается, что у нас есть установленный хост RHEL или CentOS 7 или Fedora 19+ с минимальным набором пакетов, но с графикой (вариант установки «Server with GUI»), для virt-manager
-a и virt-viewer
-a. Без графики тоже можно, тогда доступ в консоль lxc-контейнера будет в текстовом режиме с помощью virsh console
.
- Установка необходимых пакетов или группы пакетов с виртуализацией
Можно поставить целиком группу пакетов относящихся к виртуализации. Ранее в RHEL/CentOS была одна группа Virtualization
, потом её разбили на несколько меньших (прочесть о спрятанных группах можно здесь), в Fedora так и оставили одну, поэтому посмотреть что у вас на конкренто вашей системе можно так:
[root@centos7 ~]# yum group list -v hidden | grep -i virt Virtualization Host (virtualization-host-environment) Virtualization Client (virtualization-client) Virtualization Hypervisor (virtualization-hypervisor) Virtualization Platform (virtualization-platform) Virtualization Tools (virtualization-tools)
В Fedora как была одна группа пакетов, так и осталась. Заметьте, в Fedora с версии 23 используется пакетный менеджер dnf
вместо yum
:
[root@fed23 ~]# dnf group list -v hidden | grep -i virt Virtualization (virtualization)
Посмотреть состав группы, например Virtualization Client
можно так:
[root@centos7 ~]# yum group info 'Virtualization Client' Group: Virtualization Client Group-Id: virtualization-client Description: Clients for installing and managing virtualization instances. Mandatory Packages: gnome-boxes +virt-install +virt-manager +virt-viewer Default Packages: +virt-top Optional Packages: libguestfs-tools libguestfs-tools-c
Нам нужны группы Virtualization Client
, Virtualization Platform
и пакеты libvirt-daemon-driver-lxc
и libvirt-daemon-lxc
:
[root@centos7 ~]# yum group install 'Virtualization Client' 'Virtualization Platform' [root@centos7 ~]# yum install libvirt-daemon-driver-lxc libvirt-daemon-lxc
Но для совсем минимальной инсталляции (чтобы не тащить, например, qemu
) достаточно установить следующие пакеты (плюс, естественно, зависимсости):
[root@centos7 ~]# yum install libvirt-daemon-driver-lxc libvirt-daemon-lxc libvirt-daemon-config-network virt-install virt-manager virt-viewer
- Запуск демона libvirtd и подключение к нему virt-manager-ом
После этого надо стартовать демон libvirtd
(или перезагрузиться, он должен быть настроен стартовать при загрузке):
[root@centos7 ~]# systemctl start libvirtd [root@centos7 ~]# systemctl status libvirtd libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled) Active: active (running) since Sat 2066-66-66 66:66:66 UTC; 66min ago
Если не запустить демон libvirt
, virt-manager
не сможет к нему подключится. Чтобы подключится к бегущему демону, запускаем virt-manager
, идём в File -> Add Connection… и выбираем тип локального гипервизора «LXC (Linux Containers)»:
Подключение «localhost (LXC)» должно появиться в окне virt-manager
-а.
- Ошибка «libvirtd: internal error: Network is already in use by interface» при старте libvirtd
Иногда внезапно вы можете получить эту ошибку при старте libvirtd
, особенно если вы запускаете его в виртуальной машине qemu
:
[root@centos7 ~]# systemctl status libvirtd -l
...
Nov 66 66:66:66 centos7 systemd[1]: Started Virtualization daemon.
Nov 66 66:66:66 centos7 libvirtd[860]: libvirt version: 1.2.8, package: 16.el7_1.5 (CentOS BuildSystem <http://bugs.centos.org>)
Nov 66 66:66:66 centos7 libvirtd[860]: internal error: Network is already in use by interface eth0
Сообщение не очень понятное, но оно значит вот что. libvirtd
хочет создать бридж с дефолтным диапазоном IP-адресов 192.168.122.0/24 на одном из интерфейсов хоста. Но может оказаться, что этот диапазон уже используется на каком-то из интерфейсов, eth0
в данном случае. Тогда бридж создать невозможно, о чём libvirtd
и уведомляет. Решение — пересоздать сеть default
изменив дефолтный диапазон 192.168.122.0/24 на что-то другое (например, на 10.0.0.0/16) в Virtual Machine Manager -> Edit -> Connection Details -> Virtual Networks -> IPv4 configuration:
Или остановить демон libvirtd
, отредактировать диапазон IP-адресов сети default
в файле /etc/libvirt/qemu/networks/default.xml
и запустить демон заново:
[root@centos7 ~]# systemctl stop libvirtd [root@centos7 ~]# cat /etc/libvirt/qemu/networks/default.xml <network> <name>default</name> <uuid>f50db5d8-8e83-451f-9f37-0ec5d7c1959a</uuid> <forward mode='nat'/> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:66:66:66'/> <ip address='10.0.0.1' netmask='255.255.0.0'> <dhcp> <range start='10.0.0.2' end='10.0.255.254'/> </dhcp> </ip> </network> [root@centos7 ~]# systemctl start libvirtd
После этого libvirtd
должен успешно создать бридж virbr0
с назначенным диапазоном IP-адресов:
[root@centos7 ~]# ip a s virbr0 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 52:54:00:66:66:66 brd ff:ff:ff:ff:ff:ff inet 10.0.0.1/16 brd 10.0.255.255 scope global virbr0 valid_lft forever preferred_lft forever [root@centos7 ~]# systemctl status libvirtd -l Nov 66 66:66:66 centos7 systemd[1]: Started Virtualization daemon. Nov 66 66:66:66 centos7 dnsmasq-dhcp[3024]: DHCP, IP range 10.0.0.2 -- 10.0.255.254, lease time 1h
- Запуск virt-manager от обычного пользователя без пароля
В Fedora 20+ virt-manager
запросит рутовый пароль если его запускать от обычного пользователя в графической оболочке. В RHEL/CentOS 7 — нет, так как они построены на кодовой базе Fedora 19, а virt-manager
начал уметь в PolicyKit
(который и заставляет спрашивать рутовый пароль) только с Fedora 20. Больше деталей про это здесь.
Чтобы убрать этот запрос надо добавить вашего обычного пользователя в группу wheel
(или любую другую) и создать файл /etc/polkit-1/rules.d/80-libvirt.rules
со следующим кодом:
[root@rules ~]# usermod -G wheel someuser [root@rules ~]# cat /etc/polkit-1/rules.d/80-libvirt.rules polkit.addRule(function(action, subject) { if (action.id == "org.libvirt.unix.manage" && subject.local && subject.active && subject.isInGroup("wheel")) { return polkit.Result.YES; } });
- Создание lxc-контейнера CentOS 7
Несколько общих слов про «bootstrapping» lxc-контейнера. Чтобы контейнер заработал, надо установить в него некий минимальный набор пакетов, которых достаточно для функционирования минимальной системы. Скорее всего это будут пакеты инициализации (systemd
или upstart
или Sys V init-скрипты) и пакетный менеджер (и, естественно, их зависимости). Этот начальный набор пакетов надо установить в директорию lxc-контейнера из хост-системы, так как самого контейнера пока нет. Для этого у yum
(и dnf
) есть волшебный ключ --installroot
. Но чтобы yum
знал откуда брать пакеты для операционной системы контейнера, ему это надо сказать файлами <корень-контейнера>/etc/yum.repos.d/*.repo
. В частном случае, когда ОС хоста и контейнера одинакова (например мы создаём контейнер с CentOS 7 на хосте CentOS 7) это можно не делать.
Посмотреть, какие версии CentOS доступны для установки по сети можно на странице http://mirror.centos.org/centos/. .repo
-файлы нужные нам для седьмой версии на момент написания статьи лежат в пакете centos-release-7-1.1503.el7.centos.2.8.x86_64.rpm. Использование таких пакетов будет описано во второй части статьи, пока для простоты создадим .repo
-файлы руками.
Итак, предположим, мы создаём lxc-контейнер с CentOS 7 в директории /srv/centos7
. Создадим нужные каталоги и .repo
-файлы. Репозитории [base]
и [updates]
будут брать пакеты из сети с ближайшего зеркала. Если у вас нет сети, но есть установочный диск CentOS 7, смонтированный в директорию (например) /run/media/root/CentOS_7_x86_64/
, можно ставить пакеты с него, для этого описан пока выключенный репозиторий [media]
. Чтобы устанавливать пакеты с установочного диска, а не из сети, установите enabled=1
для репозитория [media]
, а enabled=0
для остальных репозиториев:
[root@centos7 ~]# mkdir -p /srv/centos7/etc/yum.repos.d/ [root@centos7 ~]# cat /srv/centos7/etc/yum.repos.d/bootstrap.repo [base] name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ enabled=1 [updates] name=CentOS-$releasever - Updates mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/ enabled=1 [media] name=CentOS-$releasever - Media baseurl=file:///run/media/root/CentOS_7_x86_64/ enabled=0
Собственно, всё готово к установке bootstrap-пакетов. После установки можно удалить файл /srv/centos7/etc/yum.repos.d/bootstrap.repo
, он больше не нужен. Заметьте, всё это мы пока делаем из хост-системы. Волшебная команда, которая делает магическую магию, такова:
[root@centos7 ~]# yum -y --installroot=/srv/centos7/ --releasever=7 --nogpg install systemd passwd yum centos-release vim-minimal openssh-server procps-ng iproute net-tools dhclient sudo rootfiles [root@centos7 ~]# rm -f /srv/centos7/etc/yum.repos.d/bootstrap.repo
Далее, ещё из хост-системы надо провести некоторую первоначальную настройку lxc-контейнера с CentOS 7 ещё до его первого запуска. Сначало надо установить рутовый пароль (например, «rootpw») с помощью магии chroot
:
[root@centos7 ~]# chroot /srv/centos7/ /bin/bash -c "/bin/echo rootpw | /usr/bin/passwd --stdin root" Changing password for user root. passwd: all authentication tokens updated successfully.
Или убрать рутовый пароль вообще и не забыть разрешить демону sshd
пускать с пустым паролем:
[root@centos7 ~]# sed -i -e '/^root:/croot::16666:0:99999:7:::' /srv/centos7/etc/shadow [root@centos7 ~]# sed -i -e '/PermitEmptyPasswords/cPermitEmptyPasswords yes' /srv/centos7/etc/ssh/sshd_config
Далее нужно добавить консоль контейнера как «доверенный» терминал, без этого система не пустит рута с консоли:
[root@centos7 ~]# echo pts/0 >> /srv/centos7/etc/securetty
Далее нужно сделать демон sshd
запускаемым при старте контейнера (эта линка может уже существовать, тогда команда пофэйлится, но это нормально):
[root@centos7 ~]# ln -s /usr/lib/systemd/system/sshd.service /srv/centos7/etc/systemd/system/multi-user.target.wants/
Зададим имя хоста внутри контейнера:
[root@centos7 ~]# echo centos7-lxc.localdomain > /srv/centos7/etc/hostname
Теперь, шаг с которым наиболее вероянто могут возникнуть проблемы — кофигурация сети внутри контейнера. Мы хотим, чтобы интерфейс eth0
получал настройки по DHCP, поэтому создаём файлы с таким содержанием:
[root@centos7 ~]# touch /srv/centos7/etc/sysconfig/network [root@centos7 ~]# cat /srv/centos7/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp
И, наконец, создаём и запускаем контейнер с помощью virt-install
(больше деталей про опцию --os-variant
упомянуто ниже):
[root@centos7 ~]# virt-install --connect lxc:// --name centos7 --ram 512 --os-variant=centos7.0 --filesystem /srv/centos7/,/ Starting install... Creating domain... Connected to domain centos7 Escape character is ^] systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ) Detected virtualization 'lxc-libvirt'. Welcome to CentOS Linux 7 (Core)! Set hostname to <centos7-lxc.localdomain>. Initializing machine ID from container UUID. ... CentOS Linux 7 (Core) Kernel 3.10.0-229.el7.x86_64 on an x86_64 centos7-lxc login:
Позднее запустить остановленный контейнер и войти в него можно из графического интерфейса virt-manager
-а или из текстового терминала с помощью virsh start
и virsh console
. Внимание: чтобы войти в контейнер из текстовой консоли virt-manager
не должен быть запущен! Отсоединиться от консоли контейнера можно нажав Ctrl-]
:
[root@centos7 ~]# virsh --connect lxc:// start centos7 Domain centos7 started [root@centos7 ~]# virsh --connect lxc:// console centos7 Connected to domain centos7 Escape character is ^] systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ) Detected virtualization 'lxc-libvirt'. ... CentOS Linux 7 (Core) Kernel 3.10.0-229.el7.x86_64 on an x86_64 centos7-lxc login:
Итак, зайдём в контейнер и осмотримся, проверим, что всё как надо, памяти столько, скольно назначено, стоит правильное имя хоста и есть сеть:
[root@centos7 ~]# virsh --connect lxc:// console centos7 CentOS Linux 7 (Core) Kernel 3.10.0-229.el7.x86_64 on an x86_64 centos7-lxc login: root [root@centos7-lxc ~]# uname -a Linux centos7-lxc.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux [root@centos7-lxc ~]# grep ^MemTotal /proc/meminfo MemTotal: 524288 kB [root@centos7-lxc ~]# ip a s eth0 5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 66:66:66:66:66:66 brd ff:ff:ff:ff:ff:ff inet 10.0.207.19/16 brd 10.0.255.255 scope global dynamic eth0 valid_lft 2909sec preferred_lft 2909sec inet6 fe80::6666:66ff:fe66:6666/64 scope link valid_lft forever preferred_lft forever [root@centos7-lxc ~]# ping google.com PING google.com (666.666.666.666) 56(84) bytes of data. 64 bytes from icmp.google.com (666.666.666.666): icmp_seq=1 ttl=52 time=1.1 ns 64 bytes from icmp.google.com (666.666.666.666): icmp_seq=2 ttl=52 time=1.7 ns [root@centos7-lxc ~]# yum repolist Loaded plugins: fastestmirror repo id repo name status base/7/x86_64 CentOS-7 - Base 8652 extras/7/x86_64 CentOS-7 - Extras 277 updates/7/x86_64 CentOS-7 - Updates 1707
Как бы, каза лось бы, ура.
- Создание lxc-контейнера RHEL 7
Почти ничем не отличается от создания lxc-контейнера CentOS 7. Проблема в установке bootstrap-пакетов. Так как доступ к пакетам RHEL требует регистрации, нельзя просто так взять и описать RHEL-репозитории в .repo
-файлах, <картинка-с-боромиром.jpg>, нужна ещё регистрация, чтобы скачать пакеты RHEL 7 из сети из Red Hat Network. Поэтому нужно либо иметь установочный диск RHEL 7 и использовать репозиторий [media]
. Либо устанавливать lxc-контейнер RHEL 7 из зарегистрированной хост-системы RHEL 7, тогда yum
использует регистрацию хост-системы для скачивания пакетов.
Значение --releasever
должно быть не 7
, а 7Server
. Набор bootstrap-пакетов также немного другой. То есть, магически волшебные команды такие:
[root@rhel7 ~]# yum -y --installroot=/srv/rhel7/ --releasever=7Server --nogpg install systemd passwd yum redhat-release vim-minimal openssh-server procps-ng iproute net-tools dhclient sudo rootfiles [root@rhel7 ~]# virt-install --connect lxc:// --name rhel7 --ram 512 --os-variant=rhel7 --filesystem /srv/rhel7/,/
В virt-install
надо использовать --os-variant=rhel7
. Также, чтобы устанавливать софт и получать обновления, надо зарегистрировать контейнер в Red Hat Network как отдельную систему. Или устанавливать пакеты в контейнер из зарегистрированной хост системы. В остальном всё так же.
- Создание lxc-контейнеров в хост-системе Fedora 22+
В Fedora начиная с версии 22 и дальше пакетный мереджер yum
был заменён на dnf
и, внезапно, поведение опции --installroot
измени лось. Теперь dnf
не использует репозитории заданные в директории <корень-контейнера>/etc/yum.repos.d/
, но использует не нужные в нашем случае репозитории из хост-системы. К счастью, эта функциональность была возложена на настройку reposdir
, которая позволяет отдельно указать директорию с репозиториями. Что интересно, на момент написания этой статьи это отличие от yum
не указано здесь, где, по-идее, должно бы.
Соответственно, очень волшебная и не менее магическая команда по установке bootstrap-пакетов в контейнер /srv/centos7
с помощью dnf
на Fedora 22+ (после создания файла /srv/centos7/etc/yum.repos.d/bootstrap.repo
с репозиториями) будет:
[root@fedora23 ~]# dnf --setopt=reposdir=/srv/centos7/etc/yum.repos.d/ --installroot=/srv/centos7/ --releasever=7 --nogpg install systemd passwd yum centos-release vim-minimal openssh-server procps-ng iproute net-tools dhclient sudo rootfiles
- Создание lxc-контейнера из готового образа от linuxcontainers.org
Внезапно, никто не запрещает особенно ленивым задницам вроде вас использовать уже готовые рутовые файловые системы с images.linuxcontainers.org. Достаточно взять готовый образ rootfs.tar.xz, распаковать его и создать контейнер с помощью virt-install
. Образы пересоздаются каждый день, поэтому ссылка, скорее всего, уже не рабочая. Возьмите сами файл rootfs.tar.xz
из каталога доступных образов CentOS 7.
Дальше, по-идее, всё просто: распаковать, задать имя системы, задать или сбросить рутовый пароль (на момент написания статьи по-умолчанию задан пароль «root» и требуется создание нового пароля при первом логине) и создать контейнер. На сейчас сеть в контейнере конфигуряется legacy-сервисом network
, поэтому настройки сети можно менять в файле /etc/sysconfig/network-scripts/ifcfg-eth0
.
[root@centos7 /]# wget http://images.linuxcontainers.org/images/centos/7/amd64/default/20151201_02:16/rootfs.tar.xz [root@centos7 /]# mkdir -p /srv/centos7/ && tar -C /srv/centos7/ -xf rootfs.tar.xz [root@centos7 ~]# echo centos7-lxc.localdomain > /srv/centos7/etc/hostname [root@centos7 ~]# sed -i -e '/^root:/croot::16666:0:99999:7:::' /srv/centos7/etc/shadow [root@centos7 /]# virt-install --connect lxc:// --name centos7 --ram 512 --os-variant=centos7.0 --filesystem /srv/centos7/,/ Starting install... Creating domain... ... CentOS Linux 7 (Core) Kernel 3.10.0-229.el7.x86_64 on an x86_64 centos7-lxc login: root [root@centos7-lxc ~]# ip a s eth0 7: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 66:66:66:66:66:66 brd ff:ff:ff:ff:ff:ff inet 10.0.0.39/16 brd 10.0.255.255 scope global dynamic eth0 valid_lft 3558sec preferred_lft 3558sec inet6 fe80::6666:66ff:fe66:6666/64 scope link valid_lft forever preferred_lft forever
Наслаждайтесь.
- Замечания об опции —os-variant команды virt-install
Внезапно может возникнуть вопрос, какие ещё значения можно использовать в опции --os-variant
команды virt-install
, кроме centos7.0
или rhel7
. К сожелению, команда virt-install
, поставляемая с RHEL/CentOS 7 на момент написания статьи не поддерживает вывод допустимых значений этой опции с помощью --os-variant list
--os-variant help
или --os-variant=?
. Если надо, можно использовать быстрый и грязный хак файла /usr/share/virt-manager/virtinst/guest.py
, который выведет список допустимых вариантов, если еспользован неправильный:
(патч к файлу guest.py) --- /usr/share/virt-manager/virtinst/guest.py +++ /usr/share/virt-manager/virtinst/guest.py.new @@ -215,6 +215,8 @@ if val: val = val.lower() if osdict.lookup_os(val) is None: + for osname in osdict._allvariants: + print osname raise ValueError( _("Distro '%s' does not exist in our dictionary") % val)
Теперь, запустив virt-install
с какой-нибудь чушью в --os-variant
, получим список допустимых значений этой опции:
[root@centos7 /]# virt-install --connect lxc:// --name ololo --ram 128 --os-variant=ololo openbsd5.1 freebsd5.5 solaris ubuntu11.10 ... win2k generic ubuntu13.10 openbsd4.9 ERROR Error validating install location: Distro 'ololo' does not exist in our dictionary
- Создание lxc-контейнеров Fedora 23 и Rawhide
Вторая часть: Контейнерная виртуализация LXC в libvirt на RHEL/CentOS 7 и Fedora 19+. Часть 2. Контейнеризуем Fedora 23 и Rawhide.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ.
- Forum
- The Ubuntu Forum Community
- Ubuntu Specialised Support
- Ubuntu Servers, Cloud and Juju
- Server Platforms
- [SOLVED] Ubuntu server hosting virtual machines (dhcp range problem)
-
Ubuntu server hosting virtual machines (dhcp range problem)
Hello all,
I am configuring a network that consists of a physical machine and 10 virtual machines. The physical machine is running ubuntu server (11.04) and I am using qemu/kvm/virt-manager to run the virtual machines.
Here is my problem. I need the physical host to assign IP addresses in a very specific range, using DHCP, to the virtual machines. I don’t want the range it defaults to. However, when I set this in virt-manager (under connection settings, and then I create a new virtual network with the desired IP range) I get an error that says I can�t start the network I configured because the interface eth0 is already in use.
What gives!?
I tried changing the settings on the default connection using �virsh net-edit default� and I got the same error. The exact error message in virt-manager is �Error starting network: Internal error Network is already in use by interface eth0�. Any advice at all on how to fix this, or any workarounds would be very helpful.
Thank you!
-
Re: Ubuntu server hosting virtual machines (dhcp range problem)
So, it turns out that if I set up a bridge in the /etc/network/interfaces file then I don’t get this error any more. However, I can’t connect to the internet now either. Lol. Any thoughts?
The bridge is set up like this btw:
auto lo
iface lo inet loopbackauto eth0
iface eth0 inet manualauto br0
iface br0 inet static
address 192.168.0.10
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(except with my IPs)
-
Re: Ubuntu server hosting virtual machines (dhcp range problem)
Ok, nevermind. Bridging it only helped that one time. I tried to do that again and it didn’t change anything. I still don’t know why.
Does anyone know what the error «Error starting network: Internal error Network is already in use by interface eth0» means? and if I can do anything to get around this? Any help would be greatly appreciated.
-
Re: Ubuntu server hosting virtual machines (dhcp range problem)
What are you using for the VM’s? Virtual box VMware or ?
-
Re: Ubuntu server hosting virtual machines (dhcp range problem)
You might want to try restart the dnsmasq service when you change your IP range. I am not sure if that will work for you but I had a similar issue once that it resolved.
-
Re: Ubuntu server hosting virtual machines (dhcp range problem)
Why not use static IPs for the VMs rather than DHCP? Then you get to specify the precise address each machine will be using.
-
Re: Ubuntu server hosting virtual machines (dhcp range problem)
Thanks for the responses. So, I tried restarting dnsmasq (I had to install it first!) by typing «/etc/init.d/dnsmasq restart» and it gave the following output: «* Restarting DNS forwarder and DHCP server dnsmasq dnsmasq: failed to create listening socket for port 53: Address already in use [fail]»
-I’m not using VMware or virtualbox. I’m using qemu/kvm and I’m using the virt-manager GUI.
-Here’s why I’m not using static IPs. I actually have more than 10 VMs on my server but I will only be running 10 at once. So, I just want the first 10 VMs that are running to be assigned an IP within a specific range of 10 addreses. I might end up using static IPs, but that just wouldn’t be the ideal situation.
Thanks.
Last edited by YouBuntToo?; June 29th, 2011 at 04:47 PM.
-
Re: Ubuntu server hosting virtual machines (dhcp range problem)
Thanks for the replies. I finally figured it out. The solution was actually quite simple. In virt-manager when you setup a connection it asks for the network address. The address I had previously setup for eth0 was xxx.xxx.xxx.64/26. I used this same one for the virt-manager connection. Obviously, this is why I was getting the error «Error starting network: Internal error Network is already in use by interface eth0».
To fix it, in virt-manager i just used xxx.xxx.xxx.64/27, giving the connection a different block of addresses. This solved the problem entirely. I can’t believe it was that simple.
Bookmarks
Bookmarks

Posting Permissions
0 / 0 / 0 Регистрация: 02.02.2016 Сообщений: 26 |
|
1 |
|
06.09.2022, 06:49. Показов 816. Ответов 3
Доброго времени суток, друзья! Пожалуйста выручите горемыку -подскажите пожалуйста по такому вопросу:
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
06.09.2022, 06:49 |
3 |
_sg2 631 / 234 / 50 Регистрация: 30.08.2017 Сообщений: 1,493 |
||||||||||||
06.09.2022, 08:46 |
2 |
|||||||||||
Нужно сделать сетевой мост. Для этого в /etc/network/interfaces добавьте настрой настройки моста (настройки loopback/lo не трогайте) . Например для статической настройки:
Отключите все строки в разделе интерфейса eth0, чтобы они выглядели примерно так:
Перезапустите сетевую службу.
Я, слава Богу, уже несколько лет уже не использую Астру, могу подзабыть как там в Дебьянах, поэтому не забывайте сохранять резервную копию конфигурационных файлов. Потом в VMM у Вас появится этот самый мост для выбора и ВМ сможет работать в сети хоста безо всяких NAT.
1 |
0 / 0 / 0 Регистрация: 02.02.2016 Сообщений: 26 |
|
07.09.2022, 06:01 [ТС] |
3 |
Добрый день. Создал сетевой интерфейс br, как и описали. С хостовой системы на виртуалку пинг идет, но к расшареной папке на виртуалку не могу подключиться. Ошибок никаких не выдает, просто пустое поле. На виртуалке отключил брандмаувер и доступ общий настроил. Так же на хост системе пропал доступ в интернет. Есть еще какие-то варианты настройки?
0 |
2925 / 816 / 184 Регистрация: 14.01.2013 Сообщений: 3,785 |
|
07.09.2022, 07:40 |
4 |
Есть еще какие-то варианты настройки? Можно ходить через SFTP.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
07.09.2022, 07:40 |
4 |
Nested virtualization [1] is a nice feature where it’s able to run a virtual machine within another. KVM [2] has support to nested virtualization [3] since 2010 (if I’m not wrong) and you can use it to test virtualization features and/or aspects in a different Linux distribution, or even Windows system. I use this sometimes when I need test some Kimchi [4] patch I’m working in different distros to make sure the solution will work.
However, when you start up a VM using NAT configuration on top of the main hosts system (let’s call them VM-master and host-master) the network interface of the VM will get an IP in the range of 192.168.122.2 and 192.168.254. This is the default configuration of libvirt+qemu on the most of the distros and when you start up a nested VM (let’s call VM-guest) it will start with the same configuration (because of the default configuration on VM-master) and you will not able to connect getting this error:
libvirt: error : internal error: Network is already in use by interface eth0
The solution is quite simple. You only need edit the /etc/libvirt/qemu/networks/default.xml file on the VM-master and change the IP configuration that the VM-guest will work on:
$ sudo vi/etc/libvirt/qemu/networks/default.xml %s/192.168.122/10.0.0/g :wq $ sudo systemctl restart libvirtd.service
After this, start up your VM-guest and you will be able to connect now.
References:
- https://en.wikipedia.org/wiki/Virtualization#Nested_virtualization
- http://www.linux-kvm.org/
- http://www.linux-kvm.org/images/3/33/02×03-NestedVirtualization.pdf
- http://kimchi-project.github.io/kimchi/