Базавыя магчымасці LXD - сістэмы кантэйнераў у Linux
LXD - гэта сістэмны менеджэр кантэйнераў наступнага пакалення, так абвяшчае крыніца. Ён прапануе карыстацкі інтэрфейс, падобны на віртуальныя машыны, але які выкарыстоўвае замест гэтага кантэйнеры Linux.
Ядро LXD - Гэта прывелераваны дэман (сэрвіс запушчаны з правамі root), які падае REST API праз лакальны unix сокет, а таксама праз сетку, калі ўсталявана адпаведная канфігурацыя. Кліенты, такія як інструмент каманднага радка які пастаўляецца з LXD пасылаюць запыты праз гэты REST API. Гэта азначае, што незалежна ад таго, ці звяртаецеся вы да лакальнага хаста ці да выдаленага, усё працуе аднолькава.
У гэтым артыкуле мы не будзем падрабязна спыняцца на канцэпцыях LXD, не будзем разглядаць усе даступныя магчымасці выкладзеныя ў дакументацыі, у тым ліку нядаўнюю рэалізацыю ў апошніх версіях LXD падтрымкі віртуальных машын QEMU паралельна з кантэйнерамі. Замест гэтага мы даведаемся толькі базавыя магчымасці кіравання кантэйнерамі - наладзім пулы сховішчаў, сетку, запусцім кантэйнер, прымянім ліміты на рэсурсы, а таксама разгледзім як выкарыстоўваць снепшоты, каб вы змаглі атрымаць базавую ўяўленне аб LXD і выкарыстоўваць кантэйнеры ў Linux.
Для атрымання поўнай інфармацыі трэба звярнуцца да афіцыйнай крыніцы:
Гэта значыць, што будуць усталяваныя адразу два пакеты, адзін сістэмны, а іншы як snap-пакет. Усталёўка двух пакетаў у сістэме можа стварыць некаторую праблему, пры якой сістэмны пакет можа стаць сіратой, калі выдаліць snap-пакет мэнэджарам snap-пакетаў.
Знайсці пакет lxd у snap-рэпазітары можна наступнай камандай:
snap find lxd
Name Version Summary
lxd 3.21 System container manager and API
lxd-demo-server 0+git.6d54658 Online software demo sessions using LXD
nova ocata OpenStack Compute Service (nova)
nova-hypervisor ocata OpenStack Compute Service - KVM Hypervisor (nova)
distrobuilder 1.0 Image builder for LXC and LXD
fabrica 0.1 Build snaps by simply pointing a web form to...
satellite 0.1.2 Advanced scalable Open source intelligence platform
Запусціўшы каманду list можна пераканаецца, што пакет lxd яшчэ не ўсталяваны:
snap list
Name Version Rev Tracking Publisher Notes
core 16-2.43.3 8689 stable canonical✓ core
Нягледзячы на тое, што LXD з'яўляецца snap-пакетам, усталёўваць яго трэба праз сістэмны пакет lxd, які створыць у сістэме адпаведную групу, неабходныя ўтыліты ў /usr/bin і г.д.
sudo apt update
sudo apt install lxd
Пераканаемся, што пакет усталяваны як snap-пакет:
snap list
Name Version Rev Tracking Publisher Notes
core 16-2.43.3 8689 stable canonical✓ core
lxd 3.21 13474 stable/… canonical✓ -
Для ўсталёўкі пакета LXD у сістэме неабходна запусціць наступныя каманды, першая - актуалізуе спіс пакетаў у сістэме даступных у рэпазітары, другая - непасрэдна ўсталюе пакет:
sudo pacman -Syyu && sudo pacman -S lxd
Пасля ўсталёўкі пакета, для кіравання LXD звычайным карыстачом, яго неабходна дадаць у сістэмную групу lxd:
sudo usermod -a -G lxd user1
Пераканаемся, што карыстач user1 дададзены ў групу lxd:
id -Gn user1
user1 adm dialout cdrom floppy sudo audio dip video plugdev netdev lxd
Калі група lxd не бачная ў спісе, тады трэба актываваць сесію карыстальніка нанова. Для гэтага трэба выйсці і зайсці ў сістэму пад гэтым жа карыстачом.
Актывуем у systemd загрузку сэрвісу LXD пры старце сістэмы:
Да пачатку ініцыялізацыі нам неабходна разабрацца як лагічна ўладкована сховішча ў LXD.
Сховішча (захоўванне) складаецца з аднаго ці некалькіх Басейн захоўвання які выкарыстоўвае адну з падтрымоўваных файлавых сістэм такія як ZFS, BTRFS, LVM ці звычайныя дырэкторыі. Кожны Басейн захоўвання падзяляецца на тамы (Аб'ём захоўвання) якія змяшчаюць вобразы, кантэйнеры або дадзеныя для іншых мэт.
вобразы - гэта адмыслова сабраныя дыстрыбутывы без ядра Linux і даступныя з вонкавых крыніц
кантэйнеры - гэта разгорнутыя дыстрыбутывы з выяў, гатовыя да эксплуатацыі.
Сняпшоты - Гэта здымкі стану кантэйнераў да якіх можна вяртацца
Для кіравання сховішчам у LXD служыць каманда lxc storage даведку па якой можна атрымаць паказаўшы ключ lxc storage --help
Наступная каманда выводзіць на экран спіс усіх Басейн захоўвання у LXD сховішча:
lxc storage list
+---------+-------------+--------+--------------------------------+---------+
| NAME | DESCRIPTION | DRIVER | SOURCE | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool | | btrfs | /dev/loop1 | 2 |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool | | btrfs | /var/lib/lxd/disks/ssdpool.img | 4 |
+---------+-------------+--------+--------------------------------+---------+
Для прагляду спісу ўсіх Аб'ём захоўвання у абраным Басейн захоўвання служыць каманда lxc storage volume list:
lxc storage volume list hddpool
+-------+----------------------------------+-------------+---------+
| TYPE | NAME | DESCRIPTION | USED BY |
+-------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... | | 1 |
+-------+----------------------------------+-------------+---------+
lxc storage volume list ssdpool
+-----------+----------------------------------+-------------+---------+
| TYPE | NAME | DESCRIPTION | USED BY |
+-----------+----------------------------------+-------------+---------+
| container | alp3 | | 1 |
+-----------+----------------------------------+-------------+---------+
| container | jupyter | | 1 |
+-----------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... | | 1 |
+-----------+----------------------------------+-------------+---------+
Таксама, калі для Басейн захоўвання пры стварэнні была абрана файлавая сістэма BTRFS, то атрымаць спіс Аб'ём захоўвання або падтэмы у інтэрпрэтацыі BTRFS можна з дапамогай інструментара гэтай файлавай сістэмы:
sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/hddpool
ID 257 gen 818 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/ssdpool
ID 257 gen 1820 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
ID 260 gen 1819 parent 5 top level 5 path containers/jupyter
ID 263 gen 1820 parent 5 top level 5 path containers/alp3
Перад стварэннем і выкарыстаннем кантэйнераў неабходна выканаць агульную ініцыялізацыю LXD якая стварае і настройвае сетку, а таксама сховішча. Гэта можна зрабіць уручную з дапамогай стандартных каманд кліента якія даступныя ў спісе па выкліку каманды lxc --help ці з дапамогай майстра ініцыялізацыі lxd init адказаўшы на некалькі пытанняў.
Падчас ініцыялізацыі LXD задае некалькі пытанняў, сярод якіх будзе вызначэнне тыпу файлавай сістэмы для дэфолтнага. Басейн захоўвання. Па змаўчанні для яго выбіраецца файлавая сістэма BTRFS. Памяняць на іншую ФС пасля стварэння будзе немагчыма. Для выбару ФС прапануецца табліца параўнання магчымасцяў:
асаблівасць
каталог
Btrfs
LVM
ZFS
CEPH
Optimized image storage
Няма.
ды
ды
ды
ды
Optimized instance creation
Няма.
ды
ды
ды
ды
Optimized snapshot creation
Няма.
ды
ды
ды
ды
Optimized image transfer
Няма.
ды
Няма.
ды
ды
Optimized instance transfer
Няма.
ды
Няма.
ды
ды
Капіяваць пры запісе
Няма.
ды
ды
ды
ды
На аснове блокаў
Няма.
Няма.
ды
Няма.
ды
Instant cloning
Няма.
ды
ды
ды
ды
Дапаможны індывідуальны driver
ды
ды
Няма.
Няма.
Няма.
Restore from older snapshots (адсутнасць)
ды
ды
ды
Няма.
ды
Storage quotas
yes(*)
ды
ды
ды
Няма.
Ініцыялізацыя сеткі і Storage Pool з дапамогай майстра ^
Наступная каманада, якую мы разгледзім, прапануе наладзіць асноўныя кампаненты LXD адказамі на простыя пытанні з дапамогай майстра ініцыялізацыі.
Запусціце каманду lxc init і ўвядзіце адказы на пытанні пасля знака двукроп'я, бо паказана ў прыкладзе ніжэй або зменіце іх згодна з вашымі ўмовамі:
lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]: ssdpool
Name of the storage backend to use (lvm, btrfs, dir) [default=btrfs]:
Create a new BTRFS pool? (yes/no) [default=yes]:
Would you like to use an existing block device? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=15GB]: 10GB
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 10.0.5.1/24
Would you like LXD to NAT IPv4 traffic on your bridge? [default=yes]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] no
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
У папярэднім кроку мы стварылі Басейн захоўвання якому далі назву ssdpool і файл якога размясціўся ў маёй сістэме па адрасе /var/lib/lxd/disks/ssdpool.img. Гэты адрас файлавай сістэмы адпавядае фізічнаму SSD дыску ў маім ПК.
Наступнымі дзеяннямі, для пашырэння разумення таго, якую ролю гуляе Басейн захоўвання у сховішча, мы створым другі Басейн захоўвання які будзе фізічна размяшчацца на іншым тыпе дыска, на HDD. Праблема заключаецца ў тым, што LXD не дазваляе ствараць Басейн захоўвання па-за адрасам /var/lib/lxd/disks/ і нават сімвалічныя спасылкі не будуць працаваць, глядзіце адказ распрацоўніка. Абысці гэтае абмежаванне мы можам пры ініцыялізацыі/фарматаванні Басейн захоўвання паказаўшы значэнне як блокавая прылада замест шляху да loopback-файла паказаўшы гэта ў ключы source.
Такім чынам, да стварэння Басейн захоўвання неабходна вызначыць loopback-файл або існуючую частку ў вашай файлавай сістэме які ён будзе выкарыстоўваць. Для гэтага, мы створым і будзем выкарыстоўваць файл які абмяжуем памерам у 10GB:
dd if=/dev/zero of=/mnt/work/lxd/hddpool.img bs=1MB count=10000
10000+0 records in
10000+0 records out
10000000000 bytes (10 GB, 9,3 GiB) copied, 38,4414 s, 260 MB/s
Падлучым loopback-файл у вольнае loopback-прылада:
Дзякуючы ключу --show выкананне каманды вяртае на экран імя прылады, у якое падключыўся наш loopback-файл. Пры неабходнасці, мы можам вывесці на экран спіс усіх занятых прылад гэтага тыпу, каб пераканацца ў карэктнасці нашых дзеянняў:
З спісу можна выявіць, што ў прыладзе /dev/loop1 падлучаны loopback-файл /mnt/work/lxd/hddpool.img, а ў прыладзе /dev/loop0 падлучаны loopback-файл /var/lib/lxd/disks/ssdpool.img які адпавядае дэфолтнаму Басейн захоўвання.
Наступная каманда стварае новы Басейн захоўвання у LXD на аснове толькі што падрыхтаванага loopback-файла. LXD адфарматуе loopback-файл /mnt/work/lxd/hddpool.img у прыладзе /dev/loop1 пад файлавую сістэму BTRFS:
Пасля стварэння Басейн захоўвання, пры неабходнасці, яго можна пашырыць. Для Басейн захоўвання заснаваным на файлавай сістэме BTRFS выканайце наступныя каманды:
Аўтаўстаўка loopback-файла ў слот loopback-прылады ^
У нас ёсць адна невялікая праблема, пры перазагружанні сістэмы хаста, файл /mnt/work/lxd/hddpool.img "выляціць" з прылады /dev/loop1 і сэрвіс LXD упадзе пры загрузцы бо не ўбачыць яго ў гэтай прыладзе. Для вырашэння гэтай праблемы трэба стварыць сістэмны сэрвіс які будзе ўстаўляць гэты файл у прыладу. /dev/loop1 пры загрузцы сістэмы хаста.
Створым блок файл тыпу абслугоўванне в /etc/systemd/system/ для сістэмы ініцыялізацыі SystemD:
cat << EOF | sudo tee -a /etc/systemd/system/lxd-hddpool.service
[Unit]
Description=Losetup LXD Storage Pool (hddpool)
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img
RemainAfterExit=true
[Install]
WantedBy=local-fs.target
EOF
Актывуем сэрвіс:
sudo systemctl enable lxd-hddpool
Created symlink /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.
Пасля рэстарту хаставой сістэмы правяраем статус сэрвісу:
systemctl status lxd-hddpool.service
● lxd-hddpool.service - Losetup LXD Storage Pool (hddpool)
Loaded: loaded (/etc/systemd/system/lxd-hddpool.service; enabled; vendor preset: disabled)
Active: active (exited) since Wed 2020-04-08 03:43:53 MSK; 1min 37s ago
Process: 711 ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img (code=exited, status=0/SUCCESS)
Main PID: 711 (code=exited, status=0/SUCCESS)
апр 08 03:43:52 manjaro systemd[1]: Starting Losetup LXD Storage Pool (hddpool)...
апр 08 03:43:53 manjaro systemd[1]: Finished Losetup LXD Storage Pool (hddpool).
З высновы мы можам пераканацца, што стан сэрвісу роўна актыўны, нягледзячы на тое, што выкананне нашага скрыпту з адной каманды завяршылася, гэта дазволіла нам зрабіць опцыя RemainAfterExit=true.
Бо ўсе працэсы кантэйнера фактычна выконваюцца ў ізаляцыі на хаставой сістэме выкарыстоўваючы яго ядро, то для дадатковай абароны доступу працэсаў кантэйнера да сістэмы хаста LXD прапануе прывілеяванасць працэсаў, дзе:
Прывелеяваныя кантэйнеры - Гэта кантэйнеры у якіх працэсы з UID і GID адпавядаюць таму ж уладальніку, што і на хаставой сістэме. Напрыклад, працэс запушчаны ў кантэйнеры з UID роўным 0 мае ўсё тыя ж правы доступу, што і працэс хаставой сістэмы з UID роўным 0. Іншымі словамі, root карыстач у кантэйнеры валодае ўсімі правамі не толькі ў кантэйнеры, але і на хаставой сістэме калі ён зможа выйсці за межы ізаляванай прасторы імёнаў кантэйнера.
Непривелегированные кантэйнеры - Гэта кантэйнеры у якіх працэсы належаць уладальніку UID і GID з нумарам ад 0 да 65535, але для хаставой сістэмы ўладальнік маскіруецца з дапамогай дадаванага біта SubUID і SubGID адпаведна. Напрыклад, карыстач з UID=0 у кантэйнеры будзе заўважаны ў хаставой сістэме як SubUID + UID. Гэта абараняе хост-сістэму, паколькі, калі які-небудзь працэс у кантэйнеры зможа выйсці са сваёй ізаляванай прасторы імёнаў, ён можа ўзаемадзейнічаць з хост-сістэмай толькі як працэс з невядомым, вельмі высокім UID/GID.
Па змаўчанні, ізноў ствараныя кантэйнеры маюць статут непривелегированных і таму мы павінны вызначыць SubUID і SubGID.
Створым два канфігурацыйных файла ў якіх задамо маску для SubUID і SubGID адпаведна:
Бо мы раней ініцыялізавалі сетку з дапамогай майстра ініцыялізацыі. lxd init і стварылі сеткавую прыладу lxdbr0, то ў гэтым раздзеле мы проста азнаёмімся з сеткай у LXD і з тым, як ствараць віртуальны камутатар (сеткавы мост, bridge) з дапамогай каманды кліента.
Наступная схема дэманструе як камутатар (сеткавы мост, bridge) аб'ядноўвае хост і кантэйнеры ў сетку:
Кантэйнеры могуць узаемадзейнічаць па сродкам сеткі з іншымі кантэйнерамі ці хастом на якім гэтыя кантэйнеры абслугоўваюцца. Для гэтага неабходна злінкаваць віртуальныя сеткавыя карты кантэйнераў з віртуальным камутатарам. У пачатку створым камутатар, а сеткавыя інтэрфейсы кантэйнера будуць злінкаваны ў наступных раздзелах, пасля таго як будзе створаны сам кантэйнер.
Наступная каманда стварае камутатар з падсеткай 10.0.5.0/24 і IPv4 адрасам 10.0.5.1/24, а таксама ўключае ipv4.nat каб кантэйнеры змаглі атрымліваць інтэрнэт праз хост з дапамогай службы NAT:
Кожны кантэйнер у LXD мае сваю ўласную канфігурацыю і можа пашыраць яе з дапамогай глабальна дэкларуемых канфігурацый якія называюцца профілямі канфігурацыі. Ужыванне профіляў канфігурацыі да кантэйнера мае каскадную мадэль, наступны прыклад дэманструе гэта:
У гэтым прыкладзе, у сістэме LXD створаны тры профіля: default, hddpool и hostfs. Усе тры профіля ўжытыя да кантэйнера ў якога маецца лакальная канфігурацыя (шэрая зона). Профіль default мае прыладу root у якога параметр pool роўны ssdpool, але дзякуючы каскаднай мадэлі прымянення канфігурацыі мы можам прымяніць для кантэйнера профіль hddpool у якога параметр pool перакрые гэты ж параметр з профілю default і кантэйнер атрымае канфігурацыю прылады root з параметрам pool роўным hddpool, а профіль hostfs проста дадае новую прыладу ў кантэйнер.
Для таго каб убачыць спіс даступных профіляў канфігурацыі служыць наступная каманда:
lxc profile list
+---------+---------+
| NAME | USED BY |
+---------+---------+
| default | 1 |
+---------+---------+
| hddroot | 0 |
+---------+---------+
| ssdroot | 1 |
+---------+---------+
Поўны спіс даступных каманд для працы з профілем можна атрымаць дадаўшы ключ --help:
lxc profile --help
Description:
Manage profiles
Usage:
lxc profile [command]
Available Commands:
add Add profiles to instances
assign Assign sets of profiles to instances
copy Copy profiles
create Create profiles
delete Delete profiles
device Manage instance devices
edit Edit profile configurations as YAML
get Get values for profile configuration keys
list List profiles
remove Remove profiles from instances
rename Rename profiles
set Set profile configuration keys
show Show profile configurations
unset Unset profile configuration keys
Профіль канфігурацыі па змаўчанні default не мае канфігурацыі сеткавай карты для кантэйнера і ўсё ізноў ствараныя кантэйнеры не маюць сетку, для іх неабходна ствараць лакальныя (вылучаныя) прылады сеткі асобнай камандай, але мы можам стварыць у профілі канфігурацыі глабальная сеткавая прылада якое будзе падзяляцца паміж усімі кантэйнерамі выкарыстоўвалымі гэты профіль. Такім чынам, адразу пасля каманды стварэння новага кантэйнера ў іх будзе сетка з доступам у сетку. Пры гэтым, няма абмежаванняў, мы заўсёды можам пазней стварыць лакальную сеткавую прыладу калі будзе ў гэтым неабходнасць.
Наступная каманда дадасць у профіль канфігурацыі прыладу eth0 тыпу nic які далучаецца да сеткі lxdbr0:
lxc profile device add default eth0 nic network=lxdbr0 name=eth0
Важна адзначыць, што бо мы фактычна дадалі прыладу ў профіль канфігурацыі, то калі б мы паказалі ў прыладзе статычны IP адрас, то ўсе кантэйнеры якія будуць ужываць гэты профіль падзеляць адзін і той жа IP адрас. Калі ёсць неабходнасць стварыць кантэйнер з вылучаным для кантэйнера статычным IP адрасам, тады варта стварыць канфігурацыю сеткавай прылады на ўзроўні кантэйнера (лакальная канфігурацыя) з параметрам IP адрасы, а не на ўзроўні профіля.
Праверым профіль:
lxc profile show default
config: {}
description: Default LXD profile
devices:
eth0:
name: eth0
network: lxdbr0
type: nic
root:
path: /
pool: ssdpool
type: disk
name: default
used_by: []
У гэтым профілі мы можам убачыць, што для ўсіх ізноў ствараных кантэйнераў будуць створаны дзве прылады (devices):
eth0 - Прылада тыпу nic злучанае з камутатарам (сеткавым мастом) lxdbr0
root - Прылада тыпу disk якое выкарыстоўвае пул сховішчы ssdpool
Для выкарыстання раней створаных Басейн захоўвання кантэйнерамі, створым профіль канфігурацыі ssdroot у якім дадамо прыладу тыпу disk з кропкай мантавання / (root) выкарыстоўвалае раней створанае Басейн захоўвання - ssdpool:
Кантэйнеры ствараюцца з выяў якія з'яўляюцца адмыслова сабранымі дыстрыбутывамі не мелыя ядры Linux. Таму, перш чым запусціць кантэйнер, ён павінен быць разгорнуты з гэтай выявы. Крыніцай выяў служыць лакальны рэпазітар у які выявы загружаюцца з вонкавых рэпазітараў.
Для пачатку эксплуатацыі кантэйнера неабходна дадаць выяву з глабальнага рэпазітара ў лакальны. local:. Цяпер лакальны рэпазітар пусты, пераканаецца ў гэтым нам дасць каманда. lxc image list. Калі метаду list не паказаць рэпазітар, то па змаўчанні будзе выкарыстоўвацца лакальны рэпазітар local:
lxc image list local:
+-------+-------------+--------+-------------+--------------+------+------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE |
+-------+-------------+--------+-------------+--------------+------+------+
Кіраванне выявамі ў рэпазітары вырабляецца наступнымі метадамі:
Каманда
Апісанне
lxc image псеўданім
Manage image aliases
lxc image копія
Copy images between servers
lxc image выдаляць
Выдаліць выявы
lxc image рэдагаваць
Edit image properties
lxc image экспарт
Export and download images
lxc image імпарт
Import images into the image store
lxc image інфармацыя
Show useful information about images
lxc image спіс
List images
lxc image абнаўленне
Refresh images
lxc image Паказваць
Show image properties
Капіяваны выява ў лакальны рэпазітар з глабальнага images::
Акрамя інтэрактыўнага рэжыму, LXD падтрымлівае таксама неінтэрактыўны рэжым усталёўкі канфігурацыі, гэта калі канфігурацыя задаецца ў выглядзе YAML-файла, адмысловага фармату, які дазваляе ўсталяваць усю канфігурацыю за адзін раз, абыходзячы выкананні мноства інтэрактыўных каманд якія былі разгледжаны вышэй у гэтым артыкуле, у тым ліку канфігурацыю сеткі, стварэнне профіляў канфігурацыі і т.д. Тут мы не будзем разглядаць гэтую вобласць, вы можаце самастойна азнаёміцца з гэтым у дакументацыі.
Наступная інтэрактыўная каманда lxc config якую мы разгледзім, дазваляе ўсталёўваць канфігурацыю. Напрыклад, для таго, каб загружаныя выявы ў лакальны рэпазітар не абнаўляліся аўтаматычна з глабальных рэпазітараў, мы можам уключыць гэтыя паводзіны наступнай камандай:
Для стварэння кантэйнера служыць каманда lxc init якой перадаюцца значэння репозиторий:образ і затым жаданы ідэнтыфікатар для кантэйнера. Рэпазітар можа быць пазначаны як лакальны local: так і любы глабальны. Калі рэпазітар не паказаны, то па змаўчанні, для пошуку выявы выкарыстоўваецца лакальны рэпазітар. Калі выява паказаны з глабальнага рэпазітара, то ў пачатку выява будзе загружаны ў лакальны рэпазітар, а затым выкарыстаны для стварэння кантэйнера.
Выканаем наступную каманду каб стварыць наш першы кантэйнер:
lxc init alpine3 alp --storage=hddpool --profile=default --profile=hddroot
Разбяром па парадку ключы каманды якія мы тут выкарыстоўваем:
alpine3 - Указваецца альяс (псеўданім) для выявы які раней быў загружаны ў лакальны рэпазітар. Калі б альяс быў не створаны для гэтай выявы, то заўсёды можна спаслацца на выяву па ім выяве. адбітак пальца які выводзіцца ў табліцы.
alp - Задаецца ідэнтыфікатар для кантэйнера
--storage - Гэты ключ паказвае ў якім Басейн захоўвання будзе створаны кантэйнер
--profile - Гэтыя ключы каскадна ўжываюць да кантэйнера канфігурацыю з раней створаных профіляў канфігурацыі
Запускаем кантэйнер, які пачынае запускаць init-сістэму дыстрыбутыва:
lxc start alp
Таксама, можна скарыстацца камандай lxc launch якая дазваляе аб'яднаць каманды lxc init и lxc start у адну аперацыю.
Правяраем стан кантэйнера:
lxc list -c ns46tb
+------+---------+------------------+------+-----------+--------------+
| NAME | STATE | IPV4 | IPV6 | TYPE | STORAGE POOL |
+------+---------+------------------+------+-----------+--------------+
| alp | RUNNING | 10.0.5.46 (eth0) | | CONTAINER | hddpool |
+------+---------+------------------+------+-----------+--------------+
У секцыі profiles мы можам пераканацца, што гэты кантэйнер выкарыстоўвае два профіля канфігурацыі — default и hddroot. У секцыі devices мы можам выявіць толькі адна прылада, бо сеткавая прылада была створана на ўзроўні профіля default. Для таго, каб убачыць усе прылады выкарыстоўваныя кантэйнерам неабходна дадаць ключ --expanded:
Калі мы паспрабуем усталяваць IP адрас для сеткавай прылады eth0 камандай lxc config device set alp прызначанай для канфігурацыі кантэйнера, то мы атрымаем памылку якая паведаміць, што прылада не існуе таму што прылада eth0 якое выкарыстоўваецца кантэйнерам належыць профілі default:
lxc config device set alp eth0 ipv4.address 10.0.5.5
Error: The device doesn't exist
Мы можам вядома ўсталяваць статычны IP адрас для eth0 прылады ў профілі, але ён будзе адзіны для ўсіх кантэйнераў якія гэты профіль будуць выкарыстоўваць. Таму, дадамо выдзеленую для кантэйнера прыладу:
lxc config device add alp eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5
Затым трэба рэстартаваць кантэйнер:
lxc restart alp
Калі мы зараз паглядзім на канфігурацыю кантэйнера, то нам не трэба прымяняць опцыю --expanded каб убачыць сеткавую прыладу eth0, бо мы стварылі яго на ўзроўні кантэйнера і яно каскадна перакрыла гэта ж прылада з профілю default:
Для выканання каманд у кантэйнеры, наўпрост, абыходзячы сеткавыя злучэнні, служыць каманда lxc exec якая выконвае каманды ў кантэйнеры без запуску сістэмнай абалонкі. Калі вам трэба выканаць каманду ў абалонцы, выкарыстоўваючы shell патэрны, такія як зменныя, файлавыя перанакіраванні (pipe) і г.д., то неабходна відавочна запускаць абалонку і перадаваць каманду ў якасці ключа, напрыклад:
lxc exec alp -- /bin/sh -c "echo $HOME"
У камандзе быў задзейнічаны спецзнак экранавання для спецзнака $ каб пераменная $HOME не інтэрпрэтавалася на хаставой машыне, а была інтэрпрэтаваная толькі ўнутры кантэйнера.
Таксама, магчыма запусціць інтэрактыўны рэжым абалонкі, а пасля завяршыць сеанс выканаўшы hotkey CTRL+D:
У LXD можна кіраваць рэсурсамі кантэйнера пры дапамозе спецыяльнага набору канфігурацыі. Поўны спіс канфігурацыйных параметраў кантэйнера можна знайсці у дакументацыі.
limit.cpu - Прывязвае кантэйнер да аднаго або некалькім ядрам ЦП
limits.cpu.allowance - Кіруе альбо квотамі планавальніка CFS, калі прайшло абмежаванне па часе, альбо ўніверсальным механізмам сумеснага выкарыстання рэсурсаў CPU, калі прайшло працэнтнае значэнне.
limits.cpu.priority - прыярытэт планавальніка, калі для некалькіх асобнікаў, сумесна выкарыстоўвалых набор працэсараў, прызначаны аднолькавы адсотак працэсараў
Акрамя абмежаванняў такіх як limits.read, limits.write мы таксама можам абмежаваць аб'ём спажывання кантэйнерам дыскавай прасторы (працуе толькі з ZFS ці BTRFS):
lxc config device set alp root size=2GB
Пасля ўстаноўкі, у параметры devices.root.size мы можам пераканаецца ва ўстаноўленым абмежаванні:
lxc config show alp
...
devices:
root:
path: /
pool: hddpool
size: 2GB
type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""
Для прагляду выкарыстоўваных квот на дыск мы можам атрымаць з каманды lxc info:
lxc info alp
...
Resources:
Processes: 5
Disk usage:
root: 1.05GB
CPU usage:
CPU usage (in seconds): 1
Memory usage:
Memory (current): 5.46MB
Network usage:
eth0:
Bytes received: 802B
Bytes sent: 1.59kB
Packets received: 4
Packets sent: 14
lo:
Bytes received: 0B
Bytes sent: 0B
Packets received: 0
Packets sent: 0
Не гледзячы на тое, што мы ўсталявалі абмежаванне для каранёвай прылады кантэйнера ў 2GB, сістэмныя ўтыліты такія як df не будуць бачыць гэтае абмежаванне. Для гэтага мы правядзём невялікі тэст і высветлім як гэта працуе.
Створым 2 новых аднолькавых кантэйнера ў адным і тым жа Басейн захоўвання (hddpool):
lxc exec alp1 -- ls -lh
total 1000M
-rw-r--r-- 1 root root 1000.0M Mar 27 10:16 file.img
Калі мы паглядзім у другім кантэйнеры, праверым існаванне файла ў тым жа самым месцы, то гэтага файла не будзе, што чакана, бо кантэйнеры ствараюцца ў сваіх уласных Аб'ём захоўвання у гэтым жа Басейн захоўвання:
lxc exec alp2 -- ls -lh
total 0
Але давайце параўнаем значэнні якія выдае df на адным і іншым кантэйнерах:
lxc exec alp1 -- df -hT
Filesystem Type Size Used Available Use% Mounted on
/dev/loop1 btrfs 9.3G 1016.4M 7.8G 11% /
...
lxc exec alp2 -- df -hT
Filesystem Type Size Used Available Use% Mounted on
/dev/loop1 btrfs 9.3G 1016.4M 7.8G 11% /
...
прылада /dev/loop1 змантаванае як каранёвая частка Басейн захоўвання якое гэтыя кантэйнеры выкарыстоўваюць, таму яны падзяляюць яго аб'ём на дваіх.
У LXD маецца магчымасць стварэння снапшотаў і ўзнаўленні з іх стану кантэйнера.
Каб стварыць снэпшот, выканайце наступную каманду:
lxc snapshot alp snapshot1
У каманды lxc snapshot няма ключа list, таму, каб прагледзець спіс снэпшотаў трэба скарыстацца камандай выводзіць агульную інфармацыю аб кантэйнеры:
lxc info alp
...
...
Snapshots:
snapshot1 (taken at 2020/04/08 18:18 UTC) (stateless)
Аднавіць кантэйнер са снэпшота можна камандай lxc restore паказаўшы кантэйнер для якога будзе праведзена аднаўленне і псеўданім снэпшота:
lxc restore alp snapshot1
Наступная каманда служыць для выдалення снепшота. Звярніце ўвагу, што сінтаксіс каманды не падобны на ўсе астатнія, тут неабходна ўказаць прамы слеш пасля імя кантэйнера. Калі слеш апусціць, то каманда выдалення снэпшота інтэрпрэтуецца як каманда выдалення кантэйнера!
lxc delete alp/snapshot1
У прыведзеным вышэй прыкладзе мы разгледзелі так званыя stateless-снапшоты. У LXD ёсць і іншы тып снапшотаў - stateful, у якіх захоўваецца бягучы стан усіх працэсаў у кантэйнеры. Са stateful-снапшотамі звязаны шэраг цікавых і карысных функцый.