Ещё со времён Ubuntu 12.10 в экран приветствия Unity Greeter была добавлена возможность входить через Unity Greeter не только в локальную систему с локальной учётной записью, но и в удалённые облачные инстансы. С релизом LXC 1.0 захотелось попробовать реализовать задумку со входом в операционную систему, отличную от хостовой системы. LXC позволит не использовать облака и тем более платить за их использование, а задействовать локальную технологию контейнерной изоляции.
Чтобы понимать о чём идёт речь, стоит пробежаться по 10 статьям Стефана Грабера о технологии LXC. Напомню, что моя хостовая машина работает под управлением Ubuntu 14.04, которая ещё пока в разработке, но зато обладает с февраля 2014 года всем необходимым при использовании контейнеров LXC.
Давайте попробуем создать в хостовой (64 битной) Ubuntu 14.04 контейнер по имени p2 с гостевой (32 битной) Ubuntu 12.04 со средой рабочего стола Xfce. При входе в систему Ubuntu 14.04 у нас будет выбор:
Список готовых к установке операционных систем через шаблон download.
sudo lxc-create -t download -n p2 -- --list
Шаблон download очень помогает при работе с непривилегированными контейнерами, но никто не мешает использовать его и при создании системных контейнеров. Вместо download можно использовать другие шаблоны, которые можно найти в /usr/share/lxc/templates.
Создаём контейнер p2. sudo lxc-create -t download -n p2 -- -d ubuntu -r precise -a i386
Плюсом шаблона download является его постоянная актуальность, так как мы скачиваем обновлённый образ. Поэтому без лишних попыток обновления операционной системы контейнера, запускаем контейнер в фоне: sudo lxc-start -n p2 -d
И подверяемся, что всё хорошо и контейнер стартовал: sudo lxc-info -n p2
Если у вас ядро старше 3.8, то можно проще зайти внутрь контейнера без ввода логина и пароля: sudo lxc-attach -n p2
И поставить там xfce и xrdp или использовать команду из хоста, не заходя в контейнер: sudo lxc-attach -n p2 -- apt-get install xubuntu-desktop xrdp
В конфигурационный файл контейнера p2 /var/lib/lxc/p2/config было мной добавлены следующие строки:
lxc.network.ipv4 = 172.16.3.130/24 lxc.network.ipv4.gateway = 172.16.3.1 lxc.aa_profile = unconfined lxc.start.auto = 1
По умолчанию, LXC использует подсеть 10.0.3.х, но она используется на моей рабочей машине и я вынужден использовать другую подсеть - 172.16.3.х. Для этого я изменил файл /etc/default/lxc-net и в контейнере p2 указываю постоянно использовать 172.16.3.130, а маска 255.255.255.0 должна быть в CIDR нотации и поэтому пишем /24. На данном этапе для меня самое важное, чтобы контейнер использовал постоянный IP адрес.
Отключаю AppArmor для контейнера lxc.aa_profile = unconfined и делаю контейнер автостартуемым - lxc.start.auto = 1 . Команда sudo lxc-ls --fancy
должна это подтвердить.
Canonical решила не мучать нас запоминанием всех адресов, логинов и паролей к удалённым системам и реализовала uccs.landscape.canonical.com, на который вы можете зайти в любой момент под единым паролем Ubuntu Single Sign On (Ubuntu SSO). По адресу uccs.landscape.canonical.com можно зайти прямиком из Unity Greeter, выбрав Удалённый вход.
Вы войдёте в гостевой сеанс с запущенным браузером и открытым сайтом. От вас требуется зайти со своим Ubuntu SSO и указать данные вашего первого удалённого сервера. Мой "удалённый" сервер живёт по адресу 172.16.3.130, дефолтная учётная запись ubuntu и такой же пароль. К сожалению, разработчик Theodore J. Gould обещал больше протоколов, но с той поры кроме RDP пока нет ничего. Вот ради RDP связи мы и ставили xrdp внутри гостевой системы контейнера. Я сохранил настройки к p2 под именем lxcp2.
Если всё верно и ничего не запуталось по дороге, то можно при входе в систему использовать Удалённый вход. Вбивать свой Ubuntu SSO и вам выдадут список ваших сохранённых аккаунтов к вашим системам. Если выбрать ранее сохранённый lxcp2, то я зайду в 32 разрядную Ubuntu 12.04 с Xfce и красивой крыской на рабочем столе.
Многие спросят зачем это всё?
Учитывая что у LXC меньше оверхед по сравнению с системами виртуализации, можно для тестирования, разработки задействовать именно LXC. Я лично планирую создать по контейнеру на каждый дериват Убунту (Kubuntu, Xubuntu, Lubuntu, ...), чтобы помогая на forum.ubuntu.ru иметь под рукой все актуальные версии Убунту. Или вопросы про Mint, который не видел ни разу, и я бы рад помочь, но его нет под рукой.
В контейнере может быть только linux, но архитектура может быть отличной от хоста, например ARM. А ARM с Linux напоминают об Android, который можно заюзать на своей машине в контейнере. Круто? Круто!
Дополнительные материалы:
Серия статей LXC 1.0 от Стефана Грабера.
LXC, Vagrant и Docker - созданы друг для друга.
Статьи о Xubuntu.