Запускаем виртуализацию LXC на Ubuntu
LXC (англ. Linux Containers) — система виртуализации на уровне операционной системы, которая позволяет запустить множество изолированных пользовательских окружений в рамках одного гипервизора. Мы ранее писали о разнице в технологиях виртуализации в заметке Чем отличаются хостинг, VPS, VDS и выделенный сервер?. LXC является сравнительно молодым представителем систем «частичной» виртуализации, позволяя запускать на одном выделенном сервере или даже SSD VDS несколько гостевых контейнеров. Так как речь идет о частичной виртуализации, в качестве гостевых систем можно использовать только различные дистрибутивы Linux — как и в популярном продукте OpenVZ.
Для чего можно использовать LXC? По сравнению с доживающим свой век «традиционным» OpenVZ, решение LXC считается более простым — работает «из коробки» и не требует установки специального ядра, управляется очень просто. При этом возможности ограничения ресурсов у LXC несколько меньше, поэтому в первую очередь эту технологию стоит рассматривать не как продукт для предоставления услуг VPS, а как внутреннее решение для изоляции различных служб и легкого дальнейшего масштабирования. Конечно, немаловажным является возможность использовать в рамках одного сервера несколько диалектов Linux — наверняка многие системные администраторы сталкивались с разными продуктами, ориентированными под конкретные дистрибутивы, что усложняло инсталляцию в рамках другой версии операционной системы.
Давайте попробуем основные возможности LXC — скажем, на сервере под управлением Ubuntu 16. Вначале — переключим работу физического интерфейса в режим «моста» (bridge) — это самый простой вариант обеспечить доступ гостевым системам к сети.
В /etc/network/interfaces создаем интерфейс br0, переносим в его свойства настройки IP-адреса и подключаем этот интерфейс к сетевому адаптеру (enp2s0):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback ##Bridge Name ### auto br0 ### Bridge Information iface br0 inet static address www.yyy.xxx.zzz netmask www.yyy.xxx.zzz network www.yyy.xxx.0 broadcast www.yyy.xxx.255 gateway www.yyy.xxx.1 dns-nameservers 8.8.8.8 bridge_ports enp2s0 bridge_stp off bridge_fd 9 iface enp2s0 inet manual |
После изменений — перезагрузимся или переконфигурируем сеть с помощью /etc/init.d/networking restart
Инсталлируем подсистему LXC и необходимые утилиты:
1 |
apt-get install lxc lxc-templates wget bridge-utils cgroup-lite |
Запустим lxc-checkconfig чтобы проверить, успешно ли установлена поддержка LXC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
Kernel configuration not found at /proc/config.gz; searching... Kernel configuration found at /boot/config-4.4.0-34-generic --- Namespaces --- Namespaces: enabled Utsname namespace: enabled Ipc namespace: enabled Pid namespace: enabled User namespace: enabled Network namespace: enabled Multiple /dev/pts instances: enabled --- Control groups --- Cgroup: enabled Cgroup clone_children flag: enabled Cgroup device: enabled Cgroup sched: enabled Cgroup cpu account: enabled Cgroup memory controller: enabled Cgroup cpuset: enabled --- Misc --- Veth pair device: enabled Macvlan: enabled Vlan: enabled Bridges: enabled Advanced netfilter: enabled CONFIG_NF_NAT_IPV4: enabled CONFIG_NF_NAT_IPV6: enabled CONFIG_IP_NF_TARGET_MASQUERADE: enabled CONFIG_IP6_NF_TARGET_MASQUERADE: enabled CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled FUSE (for use with lxcfs): enabled --- Checkpoint/Restore --- checkpoint restore: enabled CONFIG_FHANDLE: enabled CONFIG_EVENTFD: enabled CONFIG_EPOLL: enabled CONFIG_UNIX_DIAG: enabled CONFIG_INET_DIAG: enabled CONFIG_PACKET_DIAG: enabled CONFIG_NETLINK_DIAG: enabled File capabilities: enabled Note : Before booting a new kernel, you can check its configuration usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig |
Теперь настроим сеть для контейнеров LXC — отключим интерфейс bridge по умолчанию lxcbr0, который был создан во время установки LXC. Для этого в файле /etc/default/lxc-net установим значение “false” в переменной USE_LXC_BRIDGE.
Когда USE_LXC_BRIDGE установлена в true, мост с именем lxcbr0 создается в процессе запуска и может быть использован для создания приватной сети, однако мы в данном примере будем использовать стандартный мост — это позволит использовать контейнеры более универсально.
Далее в файле /etc/lxc/default.conf укажем использовать созданный ранее интерфейс br0:
1 2 3 4 |
lxc.network.type = veth lxc.network.link = br0 lxc.network.flags = up lxc.network.hwaddr = 00:16:3e:xx:xx:xx |
На этом базовая настройка завершена и можно создавать контейнеры LXC. По-умолчанию инсталлируются наиболее популярные шаблоны, список которых можно получить с помощью команды ls /usr/share/lxc/templates/:
1 2 |
lxc-alpine lxc-archlinux lxc-centos lxc-debian lxc-fedora lxc-openmandriva lxc-oracle lxc-slackware lxc-sshd lxc-ubuntu-cloud lxc-altlinux lxc-busybox lxc-cirros lxc-download lxc-gentoo lxc-opensuse lxc-plamo lxc-sparclinux lxc-ubuntu |
Начнем с самого простого — с виртуальной машины под управлением Ubuntu. Выполним команду lxc-create -n ubuntu_lxc -t ubuntu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
root@lxc:~# lxc-create -n ubuntu_lxc -t ubuntu Checking cache download in /var/cache/lxc/xenial/rootfs-amd64 ... Copy /var/cache/lxc/xenial/rootfs-amd64 to /var/lib/lxc/ubuntu_lxc/rootfs ... Copying rootfs to /var/lib/lxc/ubuntu_lxc/rootfs ... Generating locales (this might take a while)... en_US.ISO-8859-1... done Generation complete. Creating SSH2 RSA key; this may take some time ... 2048 SHA256:I6kcUu1e8gm4LFyitJ1b/vrxF1tF1izhNLNWUpIZ7yQ root@lxc (RSA) Creating SSH2 DSA key; this may take some time ... 1024 SHA256:v85zUbwYi1zB6/Sn6RHAXvFOlra9o9v09L+2bpB6L1o root@lxc (DSA) Creating SSH2 ECDSA key; this may take some time ... 256 SHA256:ozhZhiRfRludJo1pLAvea1FzocBX5s2ObpO/8cuI1AY root@lxc (ECDSA) Creating SSH2 ED25519 key; this may take some time ... 256 SHA256:qeIRecmihv18OaC4iwsje/b90EXf9S9z4cedqtpSDmE root@lxc (ED25519) invoke-rc.d: could not determine current runlevel invoke-rc.d: policy-rc.d denied execution of start. Current default time zone: 'Etc/UTC' Local time is now: Tue Aug 16 15:40:57 UTC 2016. Universal Time is now: Tue Aug 16 15:40:57 UTC 2016. ## # The default user is 'ubuntu' with password 'ubuntu'! # Use the 'sudo' command to run tasks as root in the container. ## |
С помощью дополнительных параметров можно выбрать другой релиз Ubuntu или, допустим, другую архитектуру. Например, команда lxc-create -t ubuntu -n lxc_trusty — -r trusty -a amd64 может быть использована для подготовки контейнера Ubuntu 14 (Trusty) архитектуры amd64.
Итак, наша виртуальная машина создана. Теперь запустим ее с помощью lxc-start -n ubuntu_lxc -d, а затем подключимся к созданному контейнеру:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
root@lxc:~# lxc-console -n ubuntu_lxc Connected to tty 1 Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself Ubuntu 16.04.1 LTS ubuntu_lxc pts/0 ubuntu1_lxc login: ubuntu Password: Last login: Tue Aug 16 15:57:15 UTC 2016 on pts/0 Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-34-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details. ubuntu@ubuntu_lxc:~$ uname -a Linux ubuntu_lxc 4.4.0-34-generic #53-Ubuntu SMP Wed Jul 27 16:06:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux ubuntu@ubuntu_lxc:~$ |
При необходимости, в настройках сети операционной системы можно указать сетевые настройки, активировать необходимые сервисы, установить требующиеся пакеты.
Если требуется создать виртуальную машину с Centos7, вначале необходимо инсталлировать традиционный для систем RedHat менеджер пакетов, это легко сделать всего одной командой apt-get install yum. После этого запускаем lxc-create:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
root@lxc:~# lxc-create -n centos7_lxc -t centos -- -R 7 -a x86_64 Host CPE ID from /etc/os-release: Checking cache download in /var/cache/lxc/centos/x86_64/7/rootfs ... Cache found. Updating... Loaded plugins: fastestmirror base | 3.6 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 (1/4): base/7/x86_64/group_gz | 155 kB 00:00:00 (2/4): extras/7/x86_64/primary_db | 160 kB 00:00:00 (3/4): base/7/x86_64/primary_db | 5.3 MB 00:00:01 (4/4): updates/7/x86_64/primary_db | 6.5 MB 00:00:06 ... Copy /var/cache/lxc/centos/x86_64/7/rootfs to /var/lib/lxc/centos7_lxc/rootfs ... Copying rootfs to /var/lib/lxc/centos7_lxc/rootfs ... Storing root password in '/var/lib/lxc/centos7_lxc/tmp_root_pass' Expiring password for user root. passwd: Success Container rootfs and config have been created. Edit the config file to check/enable networking setup. The temporary root password is stored in: '/var/lib/lxc/centos7_lxc/tmp_root_pass' The root password is set up as expired and will require it to be changed at first login, which you should do as soon as possible. If you lose the root password or wish to change it without starting the container, you can change it from the host by running the following command (which will also reset the expired flag): chroot /var/lib/lxc/centos7_lxc/rootfs passwd |
Временный пароль расположен в файле /var/lib/lxc/centos7_lxc/tmp_root_pass, скопируем его в буфер обмена, затем запустим контейнер и подключимся к нему. Обратите внимание — сразу же потребуется указать новый пароль root:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
root@lxc:~# lxc-start -n centos7_lxc -d root@lxc:~# lxc-console -n centos7_lxc Connected to tty 1 Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself CentOS Linux 7 (Core) Kernel 4.4.0-34-generic on an x86_64 centos7_lxc login: root Password: You are required to change your password immediately (root enforced) Changing password for root. (current) UNIX password: New password: Retype new password: [root@centos7_lxc ~]# uname -a Linux centos7_lxc.layer6.net 4.4.0-34-generic #53-Ubuntu SMP Wed Jul 27 16:06:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux [root@centos7_lxc ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) |
Контейнеры LXC — отличное простое решение для создания собственных приватных виртуальных Linux-машин, не требующее каких-либо специальных условий для работы. Конечно, в случае с LXC нет такой гибкости и возможностей, которые дают технологии KVM/QEMU — однако для многих задач использование LXC оправдано.
Хотите начать использовать LXC прямо сейчас?
Подробнее о LXC, утилитах и рекомендациях: