Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
serverguide-precise-ru.pdf
Скачиваний:
77
Добавлен:
03.05.2015
Размер:
1.86 Mб
Скачать

Виртуализация

sudo lxc-create -t sshd -n ssh1 ssh-keygen -f id sudo mkdir /var/lib/lxc/ssh1/rootfs/root/.ssh sudo

5.3.1.5. Резервные хранилища

По умолчанию, lxc-create помещает корневую файловую систему контейнера в каталог /var/lib/lxc/CN/rootfs. Другим вариантом является использование логических томов LVM.Если существует группа томов lxc вы можете создать контейнер на основе lvm с названием CN, используя команду:

sudo lxc-create -t ubuntu -n CN -B lvm

Если вы хотите использовать группу томов с именем schroots с файловой системой xfs на 5 Гб, вы можете использовать:

sudo lxc-create -t ubuntu -n CN -B lvm --vgname schroots --fssize 5G --fstype xfs

5.3.2. Клонирование

Для быстрой подготовки к работе вы можете решить изменить canonical контейнер в соответствии с вашими требованиями и затем сделать множество его копий. Это можно осуществить с помощью программы lxcclone. Дан существующий контейнер с именем C1, новый контейнер C2 может быть создан:

sudo lxc-clone -o C1 -n C2

Если файловой системой /var/lib/lxc является btrfs, то lxc-clone создаст файловую систему C2 как снимок от C1. Если корневая файловая система контейнера поддерживается lvm, то вы можете указать опцию -s для создания новой rootfs как снимок lvm оригинала следующим образом:

sudo lxc-clone -s -o C1 -n C2

И lvm и btrfs снимки обеспечивают быстрое клонирование с очень небольшим изначально использованием дискового пространства.

5.3.3. Запуск и остановка

Чтобы запустить контейнер, используйте lxc-start -n CN. По умолчанию lxc-start выполнит /sbin/init внутри контейнера. Вы можете предоставить другую программу для выполнения плюс аргументы, как дополнительные аргументы для lxc-start:

404

Виртуализация

sudo lxc-start -n container /sbin/init loglevel=debug

Если вы не укажете опцию -d (daemon — сервис), то вы увидите консоль (по поводу контейнерной /dev/console, смотрите секцию Раздел 5.3.5, «Консоли» [407] для получения дополнительной информации) в терминале. Если вы укажете опцию -d, то эту консоль вы не увидите, а lxcstart завершится без ошибок немедленно, даже если дальнейшая часть запуска контейнера завершится неудачей. Вы можете использовать lxcwait или lxc-monitor (смотрите Раздел 5.3.4, «Отслеживание статуса контейнеров» [406]) для проверки, удачно или нет запустился контейнер.

Для получения отладочной информации LXC используйте -o filename -l debuglevel, например:

sudo lxc-start -o lxc.debug -l DEBUG -n container

Наконец, вы можете указать параметры настройки, используя опцию - s. Однако в общем случае рекомендуется вместо этого указывать их в конфигурационном файле контейнера. Аналогичным образом можно указать целиком иной файл настроек с помощью опции -f но это тоже в общем случае не рекомендуется.

В то время как lxc-start запускает в контейнерный /sbin/init, lxcexecute использует программу минимальной инициализации lxc-init, которая пытается монтировать /proc, /dev/mqueue, и /dev/shm, выполняет программы, указанные в командной строке, и ждёт их завершения. lxcstart предназначена для использования system containers, в то время как

lxc-execute для использования application containers (смотрите this article38

для дополнительной информации).

Остановить контейнер вы можете разными способами. Вы можете использовать shutdown, poweroff и reboot когда подсоединились к контейнеру. Для чистого завершения работы контейнера извне (т.е. из основной системы), вы можете выполнить команду sudo lxc-shutdown -n CN. Она воспринимает необязательный параметр задержки. Если он не указан, команда посылает сигнал SIGPWR в контейнер и немедленно завершается. Если опция указана, как, например, sudo lxc-shutdown -n CN -t 10, то команда ожидает указанное количество секунд завершения работы контейнера. Затем, если контейнер всё ещё работает, она убивает (kill) его, а также все работающие в нем приложения. Вы можете также немедленно убить контейнер (не оставляя шансов для приложений

завершиться аккуратно), используя команду sudo lxc-stop -n CN. Наконец,

38 https://www.ibm.com/developerworks/linux/library/l-lxc-containers/

405

Виртуализация

lxc-kill может быть использована в общем случае для отправки любого сигнала процедуре инициализации контейнера.

В процессе завершения работы контейнера вы можете получить несколько (безопасных) сообщений об ошибке, как например:

$ sudo poweroff

[sudo] password for ubuntu: =

$ =

Broadcast message from ubuntu@cn1

(/dev/lxc/console) at 18:17 ...

The system is going down for power off NOW!

*Asking all remaining processes to terminate...

...done.

*All processes ended within 1 seconds....

...done.

*Deconfiguring network interfaces...

...done.

*Deactivating swap...

...fail!

umount: /run/lock: not mounted umount: /dev/shm: not mounted mount: / is busy

* Will now halt

Кроме того, контейнер может быть "заморожен" командой sudo lxc-freeze -n CN. Это заблокирует все его процессы до тех пор, пока он не будет

"разморожен" командой sudo lxc-unfreeze -n CN.

5.3.4. Отслеживание статуса контейнеров

Две команды доступны для отслеживания изменения статуса контейнера. lxc-monitor отслеживает один или более контейнеров на любые изменения статусов. Она как правило получает имя контейнера с помощью опции -n, однако в этом случае имя контейнера может быть регулярным выражением posix, чтобы позволять отслеживать желаемые наборы контейнеров. lxcmonitor продолжает выполнение пока выводит статусы контейнеров. Вторая команда lxc-wait ожидает специфического изменения статуса контейнера и затем завершается. Например,

sudo lxc-monitor -n cont[0-5]*

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

406

Виртуализация

sudo lxc-wait -n cont1 -s 'STOPPED|FROZEN'

будет ожидать, пока контейнер cont1 не войдет в состояния STOPPED или FROZEN и затем завершится.

5.3.5. Консоли

Контейнеры имеют настраиваемое количество консолей. Одна всегда существует в контейнерном /dev/console. Она видна в терминале, из которого вы запустили lxc-start, если не указана опция -d. Вывод в /dev/ console может быть перенаправлен в файл при использовании опции -c console-file с lxc-start. Количество дополнительных консолей указывается переменной lxc.tty, и обычно равно 4. Эти консоли видны как /dev/ttyN (for 1 <= N <= 4). Для соединения с консолью 3 из основной системы используйте

sudo lxc-console -n container -t 3

в противном случае, если -t N не указано, будет автоматически выбрана неиспользуемая консоль. Для входа из консоли используйте

последовательность Ctrl-a q. Обратите внимание, что последовательность не сработает в консоли при использовании lxc-start без опции -d.

Каждая консоль контейнера фактически является Unix98 pty смонтированной в pty основной (не гостевой) системы через связанное монтирование гостевых /dev/ttyN и /dev/console. Следовательно, если гостевая система размонтирует их или с другой стороны попытается получить доступ к символьному устройству 4:N, она не будет обслужена getty на LXC консолях. (При настройках по умолчанию контейнер не сможет получить доступ к этому символьному устройству и getty, соответственно, завершится с ошибкой). Это может легко случиться, когда загрузочный сценарий вслепую монтирует новые устройства в /dev.

5.3.6. Исследование контейнеров

Некоторые команды способны собирать информацию по созданным контейнерам. lxc-ls выведет все существующие контейнеры в своей первой строке вывода и все запущенные контейнеры во второй. lxc-list предоставит ту же информацию в более развернутом формате, перечислив запущенные контейнеры сначала и остановленные в конце. lxc-ps предоставит список процессов в контейнере. Для передачи ps аргументов в lxc-ps, предварите их --. Например, для получения списка всех процессов в контейнере

sudo lxc-ps -n plain -- -ef

407

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]