Простая виртуализация

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

Весь набор действий будем делать на Ubuntu 16.04, так как это моя основная рабочая ОС.

В самом простом приближении нам нужно создать окружение в виде папки с дистрибутивом и воспользоваться базовым функционалом GNU\Linux — сменить корневую файловую систему с помощью chroot(2) (здесь и далее в скобках указан раздел документации man). Такой способ хорош, но для его реализации нужно помнить много нюансов в виде монтирования специальных файловых систем, доступа к X-авторизации и т.д. Для того, чтобы облегчить себе работу была придумана обертка schroot(1) котрая позволяет гибко управлять сразу несколькими окружениями, именовать их, заботится о всех нужных нюансах и т.д. Поэтому первым шагом в реализации поставленной задачи установим его и скрипт автоматизации создания минимального debian-окружения debootstap(1):

sudo apt-get install schroot debootstap

После этого конфигурируем schroot создав конфигурацию для пока что одного виртуального окружения:

cat /etc/schroot/chroot.d/ubuntu-desktop 
[ubuntu-desktop]
description=Contains Firefox
aliases=firefox
type=directory
directory=/srv/chroot/ubuntu-desktop
users=wwwusr
profile=desktop
personality=linux
preserve-environment=false

Подробности когфигурации можно узнать из соответствующей документации schroot.conf(5). Далее собственно создаем само окружение по пути /srv/chroot/ubuntu-desktop (вы можете выбрать свою более подходящую директорию):

debootstrap xenial /srv/chroot/ubuntu-desktop

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

adduser --system --home /home/wwwusr --shell /bin/bash --no-create-home wwwuser
passwd wwwuser

Домашняя директория пользователя в данном случае будет определяться исходя из новой корневой директории, поэтому следует создать такую директорию в /srv/chroot/ubuntu-desktop. Так же, чтобы иметь возможность получать привелегированные права, добавим этого пользователя в sudoers(5). Далее, если все сделали правильно — переходим в нашу изолированную папку:

schroot -d /home/wwwusr -u wwwusr -c ubuntu-desktop

Параметр -d нужен для того, чтобы после входа в виртуальное окружение сразу сделать текущей рабочей папкой «домашнюю» директорию пользователя, от имени которого будем запускать программы внутри этого окружения. Это можно не делать, если вы запускаете окружение от имени текущего пользователя ОС и используете опцию preserve-environment=true в конфигурации «контейнера».

Как ясно из описания «контейнера» использовать внутри него мы будем браузер Firefox.

Устанавливаем его:

sudo apt-get install firefox

Поскольку кроме него нужен так же набор соответствующий библиотек, которых нет в его зависимостях, ставим их:

sudo apt-get install libgtk3

Вышеуказанная команда в качестве зависимостей установит все необходимое.

Теперь переходим к главному: как запустить приложение для X в этом виртуальном окружении? Есть два варианта — использовать X-сервер хост-системы и использовать «вложенный» X-сервер на выбор: NX, xnest, xephyr и т.д. Для реализации первого варианта достаточно перед запуском нужной программы разрешить подключения к хост-серверу с помощью команды xhost +local:. Я предпочитаю второй вариант, т.к. это дает чуть больше безопасности: если приложение по какой-то причине обрушит X-сервер, это произойдет только для «вложенного» сервера. Чтобы реализовать второй вариант — поставим на хост-системе нужный сервер:

sudo apt-get install xserver-xephyr

После чего запустим его:

Xephyr -ac -screen 1440x900 -br -reset -terminate :1

Подробности запуска смотрите в соответствующей странице документации Xephyr(1). Единственное замечание — мы запустили новый сервер на дисплее номер :1, поэтому все остальные программы внутри виртуального окружения будем запускать ориентируясь на этот дисплей.

Собственно запускаем браузер внутри окружения:

firefox --new-instance --no-remote --display=:1

И видим это:

Таким вариантом окна не совсем удобно пользоваться, т.к. отсутствют органы управления окном, контекстное меню и т.д. Чтобы они были, необходим менеджер окон. Можно выбирать любой понравившийся dwm, xwm, wm2 и т.д. — огромное количество на любой вкус. Поставим внутри виртуального окружения например jwm как простой и прилично выглядящий оконный менеджер:

sudo apt-get install jwm

А затем запустим его:

jwm -display :1 &

После чего запустим Firefox:

firefox --new-instance --no-remote --display=:1

И видим это:

Как видим у нас появилось все необходимое, вплоть до виртуальных рабочих мест и даже стартовое меню.

Собственно на этом задача выполнена.

UPD

Если после запуска Firefox вы после загрузки любой страницы, кроме страницы настройки видите белые или черные страницы, то вам сюда. Если вкратце: проблема связана с настройками AppArmor и простой способ решить из — просто «включить» дополнение «Ubuntu modifications», после чего проблема должна решиться.

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.