Журнал LinuxFormat - перейти на главную

LXF162:Кон­тейнеры Linux

Материал из Linuxformat
Перейти к: навигация, поиск

Вир­туа­ли­за­ция. За­пус­кай­те не­сколь­ко сис­тем Linux, не ис­то­щая ре­сур­сы.

Содержание

LXC: Ма­лая вир­туа­ли­за­ция

Не хва­та­ет бу­к­валь­но од­но­го ком­пь­ю­те­ра для но­во­го про­ек­та? Джон Лэйн по­ка­зы­ва­ет, как Кон­тей­не­ры Linux сни­жа­ют за­груз­ку.

(thumbnail)
Наш эксперт. На­бре­дя на Linux аж в 1994 го­ду, Джон Лэйн на крюч­ке до сих пор. Он не и упом­нит, ко­гда в по­след­ний раз поль­зо­вал­ся Windows.

Мы час­то слы­шим о вир­туа­ли­за­ции и о пре­иму­ще­ст­вах, ко­то­рые мож­но по­лу­чить, раз­мес­тив несколь­ко сис­тем на од­ном ком­пь­ю­те­ре. Обыч­но это под­ра­зу­ме­ва­ет за­пуск раз­ных опе­ра­ци­он­ных сис­тем – на­при­мер, Windows и Linux, и тре­бу­ет на­ли­чия про­грамм вир­туа­ли­за­ции, ти­па Virtual­Box или VMWare. Про­грам­мы эти эму­ли­ру­ют уст­рой­ст­ва и до­воль­но тре­бо­ва­тель­ны к сис­тем­ным ре­сур­сам. Од­на­ко, ес­ли вам нуж­но за­пустить несколь­ко ра­бо­чих сто­лов Linux на од­ном ком­пь­ю­те­ре, луч­ше восполь­зо­вать­ся Linux Containers (LXC): это го­раз­до бо­лее лег­кое и эф­фек­тив­ное ре­шение, и оно яв­ля­ет­ся ком­понен­том яд­ра Linux.

LXC по­зво­ля­ет изо­ли­ро­вать сер­ви­сы в от­дель­ных кон­тейнерах. Кон­тейнер – нечто вро­де вир­ту­аль­ной ма­ши­ны, за­гру­жае­мой и управ­ляе­мой неза­ви­си­мо от основ­ной сис­те­мы. Его мож­но соз­дать и для це­лой сис­те­мы, и для од­но­го при­ло­жения – на­при­мер, изо­ли­ро­вать брау­зер или поч­то­вые сер­ви­сы от web-сер­ви­сов, соз­дав для них от­дель­ные кон­тейнеры.

Кон­тейнера­ми мож­но управ­лять неза­ви­си­мо друг от дру­га: за­пускать, оста­нав­ли­вать, об­нов­лять, пе­реуста­нав­ли­вать, пе­ре­ме­щать и уда­лять. Эта гиб­кость по­зво­ля­ет уп­ро­стить ра­бо­ту с боль­шой сис­те­мой, раз­бив ее на мень­шие, а ста­ло быть, и лег­че управ­ляе­мые час­ти.

На на­шем уро­ке мы рас­смот­рим на­строй­ку LXC и соз­да­дим ба­зо­вый кон­тейнер, ко­то­рый мож­но бу­дет за­гру­зить и вой­ти в него. За­тем мы рас­ши­рим его – пусть под­дер­жи­ва­ет гра­фи­че­­ский ра­бо­чий стол. LXC име­ет­ся в ре­по­зи­то­ри­ях боль­шин­ст­ва ди­ст­ри­бу­ти­вов. Ubuntu в сво­ем по­следнем ре­ли­зе – 12.04 Precise Pangolin – про­дви­ну­лась еще на шаг впе­ред и те­перь пол­но­стью под­дер­жи­ва­ет LXС «пря­мо из ко­роб­ки». Тем не менее, что­бы восполь­зо­вать­ся все­ми воз­мож­но­стя­ми LXC, нам обя­за­тель­но нуж­но по­нять, как они ра­бо­та­ют.

LXC, с по­мо­щью кон­троль­ных групп яд­ра Linux, су­жа­ет воз­мож­но­сти де­ре­ва про­цес­сов, вы­став­ляя ог­раничения ат­ри­бу­тов про­цес­са, та­ких как по­треб­ление про­цес­со­ра и па­мя­ти. При за­пуске кон­тейнера соз­да­ет­ся кон­троль­ная груп­па на осно­ве на­стро­ек кон­тейнера, за­тем управ­ление пе­ре­да­ет­ся про­цес­су init корневой фай­ло­вой сис­те­мы кон­тейнера. Про­цесс init вы­пол­ня­ет обыч­ную за­груз­ку сис­те­мы, ко­то­рая за­вер­ша­ет­ся по­яв­лением стро­ки вхо­да в сис­те­му.

На­строй­ка хоста

Итак, с че­го начнем? LXC со­сто­ит из двух час­тей – ком­понен­тов яд­ра и поль­зо­ва­тель­ских ути­лит. По­это­му убе­ди­тесь, что у вас под­хо­дя­щее яд­ро, вер­сии не менее 2.6.27 (ко­ман­дой uname -r), и уста­но­ви­те поль­зо­ва­тель­ские ути­ли­ты из менед­же­ра па­ке­тов ди­ст­ри­бу­ти­ва. В Ubuntu мож­но вы­полнить ко­ман­ду sudo apt-get install lxc. В Arch Linux они на­хо­дят­ся в поль­зо­ва­тель­ском ре­по­зи­то­рии Arch (Arch User Repository), по­это­му нуж­но ском­пи­ли­ро­вать и со­брать их там.

Ус­та­но­вив ути­ли­ты, про­верь­те, что необ­хо­ди­мые ком­понен­ты яд­ра вклю­че­ны:

# lxc-checkconfig

--- 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

§File capabilities: enabled

Ес­ли па­ра­метр Cgroup namespace име­ет зна­чение required вме­сто enabled, это из­вест­ная ошиб­ка, ко­то­рую мож­но про­иг­но­ри­ро­вать. Ес­ли есть дру­гие от­ли­чия, пе­ре­ком­пи­ли­руй­те яд­ро, вклю­чив эти оп­ции. В боль­шин­ст­ве ди­ст­ри­бу­ти­вов они вклю­че­ны по умол­чанию, и про­блем тут не долж­но быть.

За­тем убе­ди­тесь, что фай­ло­вая сис­те­ма яд­ра cgroup смон­ти­ро­ва­на. Де­ла­ет­ся это ко­ман­дой

# mount | grep cgroup

Ес­ли она не смон­ти­ро­ва­на, смон­ти­руй­те ее. Ее обыч­ная точ­ка мон­ти­ро­вания – /cgroup:

# mkdir /cgroup
# echo “none /cgroup cgroup defaults 0 0” >> /etc/fstab
# mount /cgroup

Сле­дую­щее, что нам по­на­до­бит­ся – се­те­вой стек, ко­то­рый под­дер­жи­ва­ет хост и все кон­тейнеры. Есть несколь­ко спо­со­бов его реа­ли­за­ции, но про­ще все­го при­менить мост. В Ubuntu 12.04 при уста­нов­ке LXC мост соз­да­ет­ся ав­то­ма­ти­че­­ски. В дру­гих ди­ст­ри­бу­ти­вах уста­но­ви­те и на­строй­те bridgeutils (со­ве­ты най­дут­ся в на­ших ар­хи­вах – www.linuxformat.com/archives). Итак, пусть наш мост соз­дан и на­зы­ва­ет­ся br0.

Наш пер­вый кон­тейнер

По­про­бу­ем за­пустить наш пер­вый кон­тейнер, про­сто для про­вер­ки, что все ра­бо­та­ет:

# lxc-execute -n mycontainer /bin/bash
# pstree

lxc-init---bash---pstree

# exit

Мо­жет по­ка­зать­ся, что ко­ман­да lxc-execute ниче­го не сде­ла­ла; но она за­пусти­ла Bash внут­ри кон­тейнера и оста­ви­ла вас в команд­ной стро­ке Bash это­го кон­тейнера. Взгляните на де­ре­во про­цес­сов – в кон­тейнере их все­го три. Наш кон­тейнер весь­ма при­ми­ти­вен, и он по-прежнему поль­зу­ет­ся об­щей корневой фай­ло­вой сис­те­мой и се­тью. Но с неслож­ным фай­лом кон­фи­гу­ра­ции это мож­но из­менить. Соз­дай­те но­вый файл с именем /etc/lxc/mycontainer.conf:

lxc.utsname = mycontainer

lxc.network.type = veth

lxc.network.flags = up

lxc.network.link = br0

lxc.network.ipv4 = 10.0.3.1/8

Он да­ет на­ше­му кон­тейнеру соб­ст­вен­ное имя (его имя хоста – mycontainer) и се­те­вой ад­рес (вы­бе­ри­те под­хо­дя­щий сво­бод­ный IP-ад­рес). Тип се­ти veth ве­лит LXC ис­поль­зо­вать се­те­вой мост, а се­те­вая ссыл­ка – это имя моста, в дан­ном слу­чае br0. За­пусти­те кон­тейнер и за­гляните внутрь:

# lxc-execute -n mycontainer -f /etc/lxc/mycontainer.conf 

/bin/bash

# hostname

mycontainer

# ping myhost

У вас есть доступ к ком­пь­ю­те­рам локаль­ной се­ти, но не бо­лее то­го. Что­бы вый­ти за пре­де­лы локаль­ной се­ти, по­на­до­бит­ся соз­дать мар­шрут к шлю­зу по умол­чанию – на­при­мер, так: route add default gw myrouter. По окон­чании ра­бо­ты с кон­тейнером вый­ди­те из него ком­ндой exit.

За­гру­жа­ем его

Наш при­мер рас­смат­ри­вал кон­тейнер при­ло­жений – в нем в кон­тейнере за­пуска­лось од­но при­ло­жение (Bash). Уже за­ме­ча­тель­но; но по-на­стоя­ще­му-то по­лез­ны сис­тем­ные кон­тейнеры, в ко­то­рых своя корневая фай­ло­вая сис­те­ма и ко­то­рые вы­гля­дят как от­дель­ные ком­пь­ю­те­ры.

Про­де­мон­ст­ри­ру­ем это: соз­да­дим сис­тем­ный кон­тейнер. Поз­же мы до­ба­вим к нему гра­фи­че­­ский ра­бо­чий стол, но по­ка в нем бу­дет ба­зо­вая за­гру­жае­мая сис­те­ма. Из­меним файл /etc/lxc/mycontainer.conf, что­бы дать кон­тейнеру доступ к необ­хо­ди­мым ре­сур­сам:

Скорая помощь

При­ме­ры кон­фи­гу­ра­ции мож­но най­ти в /usr/share/doc/lxc/examples.

lxc.utsname = mycontainer

lxc.network.type = veth

lxc.network.flags = up

lxc.network.link = br0

lxc.network.name = eth0

# only explicit device access

lxc.cgroup.devices.deny = a

# Memory Devices

lxc.cgroup.devices.allow = c 1:3 rwm # /dev/null null stream

lxc.cgroup.devices.allow = c 1:5 rwm # /dev/zero zero stream

lxc.cgroup.devices.allow = c 1:7 rwm # /dev/full full stream

lxc.cgroup.devices.allow = c 1:8 rwm # /dev/urandom blocking random stream

lxc.cgroup.devices.allow = c 1:9 rwm # /dev/random non blocking stream

# Terminals

lxc.tty = 2 # local ttys: /dev/tty1 and /dev/tty2

lxc.cgroup.devices.allow = c 4:0 rwm # /dev/tty0 current virtual terminal

lxc.cgroup.devices.allow = c 4:3 rwm # /dev/tty3 host’s /dev/tty3

lxc.cgroup.devices.allow = c 5:0 rwm # /dev/tty current tty device

lxc.cgroup.devices.allow = c 5:1 rwm # /dev/console system console

lxc.cgroup.devices.allow = c 5:2 rwm # /dev/ptmx pseudo terminal creator

lxc.cgroup.devices.allow = c 136:* rwm # /dev/pts/* psuedo terminal slaves

# root filesystem

lxc.rootfs = /srv/lxc/mycontainer

# mounts
Скорая помощь

Вам по­мо­гут в IRC-ка­на­ле #lxcontainers или в рас­сыл­ке lxc-users. См. стра­ни­цу под­держ­ки LXC – http://sourceforge.net/ projects/lxc/support.

lxc.mount.entry = noPress ALT-F3 to switch to tty3 or sne /n LXCsrv/lxc/mycontainer/dev/pts devpts defaults 0 0

lxc.mount.entry = none /srv/lxc/mycontainer/dev/shm tmpfs defaults 0 0

lxc.mount.entry = none /srv/lxc/mycontainer/proc proc defaults 0 0

lxc.mount.entry = none /srv/lxc/mycontainer/sys sysfs defaults 0 0

Те­перь в фай­ле кон­фи­гу­ра­ции го­раз­до боль­ше па­ра­мет­ров. На­строй­ки се­ти по­хо­жи на пре­ды­ду­щие, толь­ко на­зна­чение IP-ад­ре­са пре­достав­ле­но про­це­ду­ре за­груз­ки кон­тейнера.

За­тем нам нуж­но ог­раничить кон­тейнер в пра­вах, ина­че он рас­поя­шет­ся и бу­дет по­ку­шать­ся на уст­рой­ст­ва глав­но­го ком­пь­ю­те­ра. Луч­ше все­го за­пре­тить все под­ряд, раз­ре­шив толь­ко са­мое необ­хо­ди­мое для кон­крет­ной кон­фи­гу­ра­ции. В по­сле­дую­щих раз­де­лах мы раз­ре­шим доступ к по­все­ме­ст­но ис­поль­зуе­мым уст­рой­ст­вам па­мя­ти, пред­по­ла­гае­мых в ти­пич­ной сис­те­ме.

OpenVZ

Ана­ло­гич­ная тех­но­ло­гия – OpenVZ, и ее код со­став­ля­ет боль­шую часть ко­да LXC. Тех­но­ло­гия OpenVZ яв­ля­ет­ся бо­лее зре­лой, но для ее ра­бо­ты нуж­но за­ла­тать яд­ро, и ее под­дер­жи­ва­ют немно­гие ди­ст­ри­бу­ти­вы (в Ubuntu под­держ­ка пре­кра­ти­лась по­сле 8.04 Hardy Heron). До­ку­мен­та­ция OpenVZ осно­ва­на на Fedora Core, RHEL и CentOS.

Ес­ли вы хо­ти­те по­доб­рать­ся по­бли­же к «уров­ню пред­при­ятия» и у вас ди­ст­ри­бу­тив на ба­зе Red Hat, зай­ди­те на www.openvz.org. Од­на­ко LXC реа­ли­зо­ва­ны в основ­ной вер­сии яд­ра и на­хо­дят­ся в ак­тив­ной раз­ра­бот­ке, по­это­му мы уде­ля­ем им внимание.

Знать об OpenVZ по­лез­но еще и по­то­му, что здесь есть го­то­вые шаб­ло­ны для раз­лич­ных ди­ст­ри­бу­ти­вов, и ими мож­но восполь­зо­вать­ся в LXC. Ищи­те шаб­ло­ны по ссыл­ке http://wiki.openvz.org/Download/template/precreated.

Cкорая помощь

Для соз­да­ния ре­зерв­ной ко­пии кон­тей­не­ра ско­пи­руй­те его кор­не­вую фай­ло­вую сис­те­му. Луч­ше де­лать это при ос­та­нов­лен­ном кон­тей­не­ре. Ре­зерв­ная ко­пия по­мо­жет вер­нуть кон­тей­нер в пре­ды­ду­щее со­стоя­ние.

Три — вол­шеб­ное чис­ло

Внут­ри кон­тейнеров мож­но поль­зо­вать­ся тер­ми­наль­ны­ми уст­рой­ст­ва­ми трех ти­пов. Ес­ли про­цес­су необ­хо­дим тер­ми­нал, на­при­мер, при под­клю­чении к кон­тейнеру по SSH, то по его за­про­су соз­да­ет­ся псев­до­тер­ми­нал. Ни­ка­ких спе­ци­аль­ных на­стро­ек, кро­ме на­строй­ки досту­па в /dev/ptmx и /dev/pts/* ана­ло­гич­но на­ше­му при­ме­ру, не тре­бу­ет­ся.

Два дру­гих ти­па – раз­лич­ные пред­став­ления ба­зо­во­го уст­рой­ст­ва tty. У пра­виль­но на­стро­ен­но­го кон­тейнера есть доступ к уст­рой­ст­вам tty глав­но­го ком­пь­ю­те­ра, а так­же к соб­ст­вен­ным локаль­но соз­дан­ным уст­рой­ст­вам tty. Па­ра­метр lxc.tty оп­ре­де­ля­ет, сколь­ко уст­ройств мож­но соз­дать локаль­но внут­ри кон­тейнера. На­при­мер, ес­ли он ра­вен 2, то в LXC ав­то­ма­ти­че­­ски поя­вят­ся локаль­ные тер­ми­на­лы /dev/tty1 и /dev/tty2, доступ­ные по ко­ман­де lxc-console. Что­бы восполь­зо­вать­ся тер­ми­на­лом основ­но­го ком­пь­ю­те­ра, вы­бе­ри­те уст­рой­ст­во с боль­шим но­ме­ром и на­строй­те доступ к нему (в на­шем при­ме­ре – /dev/tty3). Кон­тейнеру мож­но поль­зо­вать­ся тер­ми­на­лом глав­но­го ком­пь­ю­те­ра, когда глав­но­му ком­пь­ю­те­ру тер­ми­нал не ну­жен: сде­лай­те так, что­бы про­цес­сы getty не под­клю­ча­лись к это­му tty (в боль­шин­ст­ве ди­ст­ри­бу­ти­вов это на­страи­ва­ет­ся в /etc/inittab).

В на­шем при­ме­ре в кон­тейнере взят тер­ми­нал основ­но­го ком­пь­ю­те­ра /dev/tty3, доступ­ный как вир­ту­аль­ный тер­ми­нал (для его от­кры­тия на­жми­те Alt + F3). В кон­тейнере так­же есть тер­ми­на­лы /dev/tty1 и /dev/tty2 – досту­па к обо­им обес­пе­чит ко­ман­да lxc-console. По­следними в на­шей кон­фи­гу­ра­ции за­да­ют­ся точ­ки мон­ти­ро­вания фай­ло­вой сис­те­мы кон­тейнера; глав­ная из них – корневая фай­ло­вая сис­те­ма кон­тейнера. Это обыч­ный ка­та­лог на глав­ном ком­пь­ю­те­ре. Вы­бе­ри­те под­хо­дя­щий ка­та­лог – ска­жем, /srv/lxc/mycontainer – и за­полните его с по­мо­щью со­от­вет­ст­ву­щих ути­лит ва­ше­го ди­ст­ри­бу­ти­ва.

Cкорая помощь

Тип тер­ми­на­ла в кон­тей­не­ре про­ве­рить лег­ко. Что­бы вы­вес­ти спи­сок тер­ми­на­лов, вы­пол­­ни­те ко­ман­ду ls –l /dev/tty? в кон­тей­не­ре. Взгля­ни­те на са­мое боль­шое чис­ло: для тер­ми­на­лов ос­нов­но­го ком­пь­ю­те­ра это 4, для ло­каль­ных тер­ми­на­лов – 136.

В Arch Linux вам по­мо­жет ути­ли­та mkarchroot (пред­ва­ри­тель­но уста­но­вите па­ке­ты devtools и base-devel):

# mkdir /srv/lxc
# mkarchroot /srv/lxc/mycontainer base

В Debian/Ubuntu для это­го слу­жит ути­ли­та debootstrap:

debootstrap --arch=i386 precise /srv/lxc/ubuntu_debootstrap http://archive.ubuntu.com/ubuntu

Что­бы под­го­то­ви­ить корневую фай­ло­вую сис­те­му кон­тейнера для LXC, в ней нуж­но кое-что по­ме­нять. При за­пуске сис­тем­но­го кон­тейнера LXC вы­зы­ва­ет про­цесс init внут­ри кон­тейнера, за­пускаю­щий за­гру­зоч­ную по­сле­до­ва­тель­ность. Но что­бы за­груз­ка ра­бо­та­ла внут­ри кон­тейнера, ее сто­ит под­пра­вить, так как мно­гое из обыч­но­го за­пуска и вы­клю­чения сис­те­мы в кон­тейнере не тре­бу­ет­ся. Ме­ня­ют для это­го скрип­ты init, а кон­крет­ные дей­ст­вия за­ви­сят от ди­ст­ри­бу­ти­ва.

В Ubuntu вер­сий менее 12.04 есть па­кет lxcguest, со­дер­жа­щий необ­хо­ди­мые по­прав­ки. В вер­сии 12.04 стан­дарт­ные на­строй­ки уч­ли на­строй­ки LXC, и ника­ких по­пра­вок не тре­бу­ет­ся. В на­ших ар­хи­вах есть при­ме­ры скрип­тов за­пуска для Arch Linux. За­тем нуж­но соз­дать фай­лы для тех уст­ройств, доступ к ко­то­рым был раз­ре­шен в фай­ле кон­фи­гу­ра­ции. Обыч­но де­ре­вом уст­ройств в /dev управ­ля­ет де­мон udev, но в кон­тейнере это не ра­бо­та­ет. Мы долж­ны вруч­ную соз­дать фай­лы уст­ройств в со­от­вет­ст­вии с фай­лом кон­фи­гу­ра­ции. Для на­ча­ла соз­да­дим об­щие уст­рой­ст­ва, необ­хо­ди­мые боль­шин­ст­ву кон­тейнеров:

cd /srv/lxc/mycontainer/dev

mknod -m 666 null c 1 3 # null device

mknod -m 666 zero c 1 5 # zero device

mknod -m 666 full c 1 7 # full device

mknod -m 666 random c 1 8 # blocking random device

mknod -m 666 urandom c 1 9 # non blocking random device

mknod -m 666 tty0 c 4 0 # system console

mknod -m 666 tty c 5 0 # process’s current tty device

mknod -m 600 console c 5 1 # system console aka tty0

mknod -m 666 ptmx c 5 2 # pseudo terminal creator

mknod -m 600 initctl p # init control channel

mkdir -m 755 pts # pseudo terminal slaves

mkdir -m 1777 shm # shared memory

ln -s /proc/self/fd fd # for backward compatibility

Так­же нуж­но соз­дать уст­рой­ст­ва tty. В на­шей кон­фи­гу­ра­ции их имеется три:

mknod -m 666 tty1 c 4 1 # tty1

mknod -m 666 tty2 c 4 2 # tty2

mknod -m 666 tty3 c 4 3 # tty3 (host vt)

Пе­ред за­пуском кон­тейнера вой­дем в него че­рез chroot и вы­полним все необ­хо­ди­мые дей­ст­вия для на­строй­ки. На­при­мер, мож­но за­дать па­роль поль­зо­ва­те­ля root, соз­дать поль­зо­ва­те­лей и уста­но­вить про­грам­мы. По­сле мон­ти­ро­вания несколь­ких за­ви­си­мых фай­ло­вых сис­тем chroot по­лу­чит функ­цио­наль­ность, доста­точ­ную для уста­нов­ки па­ке­тов про­грамм:

# mount proc -t proc /srv/lxc/mycontainer/proc
# mount devpts -t devpts /srv/lxc/mycontainer/dev/pts
# chroot /srv/lxc/mycontainer

За­дай­те па­роль поль­зо­ва­те­ля root и соз­дай­те учет­ные за­пи­си дру­гих поль­зо­ва­те­лей:

echo “root:myrootpassword” | chpasswd

useradd -c ‘My User’ -m -s /bin/bash myuser

echo “myuser:mypassword” | chpasswd

На этом на­строй­ка кон­тей­не­ра за­кон­че­на – ос­таль­ное мож­но сде­лать по­сле его за­груз­ки. Так что по­ка вый­дем из chroot:

Что та­кое кон­троль­ные груп­пы?

В при­ме­рах кон­фи­гу­ра­ции LXC вы ви­де­ли cgroup. Это кон­троль­ные груп­пы, ко­то­рые поя­ви­лись в яд­ре Linux с вер­сии 2.6.24. Они по­зво­ля­ют вы­де­лить груп­пы про­цес­сов и управ­лять вы­да­чей им ре­сур­сов, та­ких как про­цес­сор, па­мять и ши­ри­на ка­на­ла се­ти. Имен­но кон­троль­ные груп­пы де­ла­ют вир­туа­ли­за­цию кон­тейнеров воз­мож­ной, а LXC вы­пол­ня­ют всю труд­ную ра­бо­ту, осво­бо­ж­дая от нее вас. Па­ра­мет­ры cgroup, ука­зы­вае­мые в фай­ле кон­фи­гу­ра­ции кон­тейнера, раз­но­об­раз­ны. Для про­смот­ра доступ­ных па­ра­мет­ров за­пусти­те кон­тейнер и вы­полните ко­ман­ду ls /cgroup/mycontainer с глав­но­го ком­пь­ю­те­ра. Вот несколь­ко по­лез­ных па­ра­мет­ров:

» cpuset.cpus ог­раничи­ва­ет про­цес­со­ры, доступ­ные кон­тейнеру (на­при­мер, 0-1 – про­цес­со­ры 0 и 1).

» cpuset.shares за­да­ет боль­шее или мень­шее ко­ли­че­­ст­во цик­лов про­цес­со­ра. По умол­чанию ис­поль­зу­ет­ся 1024, это нор­маль­ное зна­чение; 512 – вдвое мень­ше. memory.max_limit_in_bytes за­да­ет макси­­мум вы­де­ляе­мой па­мя­ти (на­при­мер, 512M, 1G и т. д.).

К со­жа­лению, этих на­стро­ек мно­го­ва­то для на­шей ста­тьи. Уз­нать о них под­робнее мож­но в до­ку­мен­та­ции яд­ра: http://kernel.org/doc/Documentation/cgroups.

# exit
# umount /srv/lxc/mycontainer/dev/pts
# umount /srv/lxc/mycontainer/proc

Кон­тейнер на­стро­ен; по­ра его за­пустить. Соз­дай­те его в LXC и вы­полните ко­ман­ды:

# lxc-create -n mycontainer -f /etc/lxc/mycontainer.conf

‘mycontainer’ created.

# lxc-start -n mycontainer

Ес­ли все хо­ро­шо, кон­тейнер за­гру­зит­ся. На­жми­те Alt + F3, что­бы пе­ре­клю­чить­ся на tty3, или от­крой­те кон­соль LXC для вхо­да в сис­те­му:

# lxc-console -n mycontainer

Зай­ди­те в кон­тейнер от имени root с па­ро­лем, за­дан­ным ранее. Ос­мот­ри­те но­вую сис­те­му и по­вы­пол­няй­те вся­кие ко­ман­ды. За­кон­чив, от­клю­чи­тесь от кон­со­ли, на­жав Ctrl + A, за­тем q. Ес­ли пе­ред от­клю­чением не вы­хо­дить из сис­те­мы, поз­же мож­но под­клю­чить­ся к то­му же се­ан­су.

Вер­нув­шись на глав­ный ком­пь­ю­тер, рас­смот­рим неко­то­рые ути­ли­ты LXC. Ко­ман­да lxc-ls вы­во­дит спи­сок всех из­вест­ных кон­тейнеров в од­ной стро­ке и всех за­пу­щен­ных в сле­дую­щей. Де­ре­во про­цес­сов за­пу­щен­но­го кон­тейнера по­ка­жет ко­ман­да lxc-ps -n mycontainer. Это оберт­ка во­круг стан­дарт­ной ко­ман­ды ps, по­это­му вслед за именем кон­тейнера мож­но ука­зы­вать лю­бые ар­гу­мен­ты ps. Про­цес­сы кон­тейнера так­же пре­крас­но по­ка­зы­ва­ет ути­ли­та pstree. Ос­та­но­вить кон­тейнер мож­но ко­ман­дой lxc-stop -n mycontainer, но это «же­ст­кая» оста­нов­ка – все рав­но что вы­дер­нуть вил­ку из ро­зет­ки. Луч­ше вы­полнить внут­ри кон­тейнера ко­ман­ду shutdown -h now. Те­перь про­ве­рим-ка наш ssh:

# ssh mycontainer
  1. shutdown -h now

Ра­бо­чий стол внут­ри кон­тей­не­ра

По­ра сде­лать с на­шим кон­тейнером кое-что бо­лее по­лез­ное. Мы уста­но­вим ба­зо­вую вер­сию ра­бо­че­го сто­ла X и свя­жем его с одним из вир­ту­аль­ных тер­ми­на­лов основ­но­го ком­пь­ю­те­ра. Это ба­зо­вая вер­сия Xorg с драй­ве­ра­ми VESA – джент­ль­мен­ский на­бор для за­пуска ра­бо­че­го сто­ла внут­ри кон­тейнера. Упот­ре­бим на­шу мышь и кла­виа­ту­ру и свя­жем ра­бо­чий стол с вир­ту­аль­ным тер­ми­на­лом 9 (Alt + F9). До­бавь­те сле­дую­щие па­ра­мет­ры в файл кон­фи­гу­ра­ции кон­тейнера /etc/lxc/mycontainer.conf:

# VESA XOrg Desktop

lxc.cgroup.devices.allow = c 4:9 rwm # /dev/tty9 X Desktop

lxc.cgroup.devices.allow = c 13:* rwm # /dev/input/* input devices

lxc.cgroup.devices.allow = c 10:63 rwm # /dev/vga_arbiter

lxc.cgroup.devices.allow = c 1:1 rwm # /dev/mem

Ука­зан­ные пра­ва да­ют доступ к необ­хо­ди­мым уст­рой­ст­вам вво­да и вы­во­да. При на­строй­ке дру­го­го гра­фи­че­­ско­­го драй­ве­ра по­тре­бу­ет­ся доступ к дру­гим уст­рой­ст­вам. Соз­дай­те со­от­вет­ст­вую­щие фай­лы уст­ройств:

cd /srv/lxc/mycontainer/dev

mkdir -m 755 input # input devices

mknod -m 666 input/mice c 13 63 # mice

mknod -m 666 tty9 c 4 9 # vt for display

mknod -m 666 vga_arbiter c 10 63 # vga display

mknod -m 666 mem c 1 1 # memory

При лю­бых из­менениях в фай­ле кон­фи­гу­ра­ции LXC дол­жен уда­лить и сно­ва соз­дать кон­тейнер. При этом ника­кие фай­лы не уда­ля­ют­ся. Убе­див­шись, что кон­тейнер оста­нов­лен, воссоз­дай­те его, пе­ре­за­пусти­те и вой­ди­те в кон­тейнер:

lxc-destroy -n mycontainer

lxc-create -n mycontainer -f /etc/lxc/mycontainer.conf

screen -dmS mycontainer lxc-start -n mycontainer

ssh root@mycontainer

Внут­ри кон­тей­не­ра ус­та­но­ви­те не­об­хо­ди­мые па­ке­ты Xorg для ра­бо­че­го сто­ла. В Arch Linux:

pacman -S xorg-server xorg-xinit xf86-input-{keyboard,mouse} xf86-video-vesa

pacman -S xorg-twm xorg-xclock xterm

Един­ст­вен­ная на­строй­ка Xorg нуж­на для кла­виа­ту­ры и мы­ши, по­то­му что для ав­то­ма­ти­че­­ско­­го оп­ре­де­ления уст­ройств в Xorg ис­поль­зу­ет­ся udev, а в кон­тейнере его нет. На­строй­ки Xorg хра­нят­ся в но­вом фай­ле /etc/X11/xorg.conf.d/10-input.conf:

# /etc/X11/xorg.conf.d/10-input.conf

Section “ServerFlags”

Option “AutoAddDevices” “False”

EndSection

Скорая помощь

Ес­ли вы за­пус­кае­те кон­тей­нер с по­мо­щью screen, при не­об­хо­ди­мо­сти его мож­но от­клю­чить от кон­со­ли (на­жми­те Ctrl + a, за­тем d).

Section “ServerLayout”

Identifier “Desktop”

InputDevice “Mouse0” “CorePointer”

InputDevice “Keyboard0” “CoreKeyboard”

EndSection

Section “InputDevice”

Identifier “Keyboard0”

Driver “kbd”

Option “XkbLayout” “gb”

EndSection

Section “InputDevice”

Identifier “Mouse0”

Driver “mouse”

Option “Protocol” “auto”

Option “Device” “/dev/input/mice”

EndSection

На­конец, те­перь мож­но за­пустить внут­ри кон­тейнера Xorg и уви­деть ра­бо­чий стол:

startx -- :9 vt09

Толь­ко что мы соз­да­ли кон­тейнер с досту­пом к уст­рой­ст­вам глав­но­го ком­пь­ю­те­ра. Мы вруч­ную соз­да­ли необ­хо­ди­мые фай­лы уст­ройств и уста­но­ви­ли нуж­ные па­ке­ты Xorg. И мы за­пусти­ли ра­бо­чий стол внут­ри кон­тейнера. А ес­ли у вас по­след­няя вер­сия Ubuntu 12.04 Precise Pangolin, вы мо­же­те восполь­зо­вать­ся шаб­ло­на­ми Ubuntu Cloud. Соз­дать но­вый кон­тейнер про­сто:

$ sudo apt-get install lxc

$ sudo lxc-create -t ubuntu-cloud -n mycontainer

$ sudo lxc-start -n mycontainer

Же­лая восполь­зо­вать­ся сер­ви­са­ми глав­но­го ком­пь­ю­те­ра (как в на­шем при­ме­ре с за­пуском ра­бо­че­го сто­ла), как и пре­ж­де, нуж­но из­менить на­строй­ки LXC. Об­ра­зы об­ла­ка мож­но за­гру­зить и вруч­ную с https://cloud-images.ubuntu.com, но файл на­стро­ек LXC при­дет­ся соз­дать са­мо­стоя­тель­но. При­ме­ры – на на­шей странице с ар­хи­ва­ми для это­го но­ме­ра (www.linuxformat.com/archives).

LXC – от­но­си­тель­но но­вый ком­понент плат­фор­мы Linux. Это пре­крас­ный про­ект, и Canonical ис­поль­зу­ет его да­же в JuJu. А по­сколь­ку LXC по­лу­чи­ли пропис­ку в основ­ной вер­сии яд­ра, их ждет боль­шое бу­ду­щее. |

Персональные инструменты
купить
подписаться
Яндекс.Метрика