
Lxd je správce kontejnerů systému příští generace, jak se říká Nabízí uživatelské rozhraní podobné virtuálním strojům, ale místo toho používá kontejnery. Linux.
Jádro LXD je privilegovaný démon (služba běžící s právy root), který poskytuje REST API prostřednictvím lokálního unixového soketu a také prostřednictvím sítě, pokud je nainstalována příslušná konfigurace. Klienti, jako je nástroj příkazového řádku dodávaný s LXD, zadávají požadavky prostřednictvím tohoto REST API. To znamená, že ať už přistupujete k místnímu hostiteli nebo ke vzdálenému hostiteli, vše funguje stejně.
V tomto článku se nebudeme podrobně zabývat koncepty LXD ani všemi dostupnými funkcemi popsanými v dokumentaci, včetně nedávné implementace podpory virtuálních strojů QEMU spolu s kontejnery v nejnovějších verzích LXD. Místo toho se zaměříme na základy správy kontejnerů – nastavení úložných fondů a sítí, spuštění kontejneru, použití limitů zdrojů a používání snapshotů – abyste získali základní znalosti o LXD a mohli kontejnery používat ve svém prostředí. Linux.
Kompletní informace naleznete v oficiálním zdroji:
Navigace
Instalace LXD
Instalace LXD v distribucích Ubuntu
V distribuci Ubuntu Balíček 19.10 lxd má zapnuté vysílání :
apt search lxd
lxd/eoan 1:0.7 all
Transitional package - lxd -> snap (lxd)To znamená, že budou nainstalovány dva balíčky najednou, jeden jako systémový balíček a druhý jako snap balíček. Instalace dvou balíčků do systému může způsobit problém, kdy systémový balíček může osiřít, pokud je balíček snap odstraněn správcem balíčků snap.
Najít balíček lxd v úložišti snap můžete použít následující příkaz:
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 platformSpuštěním příkazu list můžete se ujistit, že balíček lxd ještě nenainstalované:
snap list
Name Version Rev Tracking Publisher Notes
core 16-2.43.3 8689 stable canonical✓ coreNavzdory skutečnosti, že LXD je balíček snap, musí být nainstalován prostřednictvím systémového balíčku lxd, která v systému vytvoří odpovídající skupinu, potřebné utility v /usr/bin atd.
sudo apt update
sudo apt install lxdUjistěte se, že je balíček nainstalován jako balíček snap:
snap list
Name Version Rev Tracking Publisher Notes
core 16-2.43.3 8689 stable canonical✓ core
lxd 3.21 13474 stable/… canonical✓ -Instalace LXD na distribuce Archu Linux
Chcete-li nainstalovat balíček LXD do systému, musíte spustit následující příkazy, první aktualizuje seznam balíčků v systému dostupných v úložišti, druhý přímo nainstaluje balíček:
sudo pacman -Syyu && sudo pacman -S lxdPo instalaci balíčku, aby mohl LXD spravovat běžný uživatel, musí být přidán do systémové skupiny lxd:
sudo usermod -a -G lxd user1Přesvědčte se, že uživatel user1 přidáno do skupiny lxd:
id -Gn user1
user1 adm dialout cdrom floppy sudo audio dip video plugdev netdev lxdPokud skupina lxd není v seznamu viditelný, pak musíte znovu aktivovat uživatelskou relaci. Chcete-li to provést, musíte se odhlásit a přihlásit pod stejným uživatelem.
Aktivovat v systemd načtení služby LXD při startu systému:
sudo systemctl enable lxdZačněme službu:
sudo systemctl start lxdKontrola stavu služby:
sudo systemctl status lxdÚložiště LXD (úložiště)
Než začne inicializace, musíme pochopit, jak je úložiště v LXD logicky uspořádáno.
Úložný prostor (Skladování) z jednoho nebo více Skladovací bazén který používá jeden z podporovaných souborových systémů jako ZFS, BTRFS, LVM nebo běžné adresáře. Každý Skladovací bazén je rozdělena do svazků (Objem úložiště), které obsahují obrázky, kontejnery nebo data pro jiné účely.
- Obrázky — jedná se o speciálně kompilované distribuce bez jádra Linux a přístupné z externích zdrojů
- kontejnery - to jsou nasazené distribuce z obrazů, připravené k použití
- Snímky - to jsou snímky stavu kontejnerů, ke kterým se můžete vrátit

Chcete-li spravovat úložiště v LXD, použijte příkaz lxc storage certifikát, který můžete získat zadáním klíče - lxc storage --help
Následující příkaz zobrazí seznam všech Skladovací bazén v úložišti LXD:
lxc storage list
+---------+-------------+--------+--------------------------------+---------+
| NAME | DESCRIPTION | DRIVER | SOURCE | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool | | btrfs | /dev/loop1 | 2 |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool | | btrfs | /var/lib/lxd/disks/ssdpool.img | 4 |
+---------+-------------+--------+--------------------------------+---------+Chcete-li zobrazit seznam všech Objem úložiště ve vybraném Skladovací bazén slouží týmu 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 |
+-----------+----------------------------------+-------------+---------+Také, pokud pro Skladovací bazén Při vytváření byl vybrán souborový systém BTRFS a poté získat seznam Objem úložiště nebo subvolumy v interpretaci BTRFS můžete použít sadu nástrojů tohoto souborového systému:
sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/hddpool
ID 257 gen 818 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3sudo 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/alp3Inicializace LXD
Před vytvořením a použitím kontejnerů musíte provést obecnou inicializaci LXD, která vytvoří a nakonfiguruje síť a úložiště. To lze provést ručně pomocí standardních klientských příkazů, které jsou dostupné v seznamu voláním příkazu lxc --help nebo pomocí inicializačního průvodce lxd init zodpovězení několika otázek.
Výběr systému souborů pro oblast úložiště
Během inicializace se LXD zeptá na několik otázek, včetně určení typu systému souborů pro výchozí nastavení Skladovací bazén. Ve výchozím nastavení je pro něj vybrán souborový systém BTRFS. Po vytvoření nebude možné přejít na jiný FS. Pro výběr FS se doporučuje :
vlastnost
Adresář
Btrfs
LVM
ZFS
CEPH
Optimalizované ukládání obrázků
Ne
ano
ano
ano
ano
Optimalizované vytváření instancí
Ne
ano
ano
ano
ano
Optimalizované vytváření snímků
Ne
ano
ano
ano
ano
Optimalizovaný přenos obrazu
Ne
ano
Ne
ano
ano
Optimalizovaný přenos instancí
Ne
ano
Ne
ano
ano
Kopírovat na zápis
Ne
ano
ano
ano
ano
Na základě bloku
Ne
Ne
ano
Ne
ano
Okamžité klonování
Ne
ano
ano
ano
ano
Ovladač úložiště použitelný uvnitř kontejneru
ano
ano
Ne
Ne
Ne
Obnovit ze starších snímků (ne nejnovějších)
ano
ano
ano
Ne
ano
Kvóty úložiště
Ano(*)
ano
ano
ano
Ne
Inicializace sítě a fondu úložiště pomocí průvodce
Další příkaz, na který se podíváme, navrhuje nastavení hlavních součástí LXD pomocí odpovědí na jednoduché otázky pomocí inicializačního průvodce.
Spustit příkaz lxc init a zadejte odpovědi na otázky za dvojtečkou, jak je uvedeno v příkladu níže, nebo je změňte podle svých podmínek:
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]: Vytvoření dalšího fondu úložiště
V předchozím kroku jsme vytvořili Skladovací bazén který dostal jméno ssdpool a jehož soubor je umístěn v mém systému na adrese /var/lib/lxd/disks/ssdpool.img. Tato adresa systému souborů odpovídá fyzické jednotce SSD v mém počítači.
Následující akce, rozšířit porozumění roli, kterou hraje Skladovací bazén v úložišti vytvoříme druhý Skladovací bazén který bude fyzicky umístěn na jiném typu disku, HDD. Problém je v tom, že LXD vám neumožňuje tvořit Skladovací bazén mimo adresu /var/lib/lxd/disks/ a ani symbolické odkazy nebudou fungovat, . Toto omezení můžeme při inicializaci/formátování obejít Skladovací bazén zadáním hodnoty jako blokového zařízení namísto cesty k souboru zpětné smyčky zadáním této hodnoty v klíči source.
Takže před tvorbou Skladovací bazén musíte definovat soubor zpětné smyčky nebo existující oddíl v systému souborů, který bude používat. K tomu vytvoříme a použijeme soubor, jehož velikost omezíme na 10 GB:
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/sPojďme připojit soubor zpětné smyčky k bezplatnému zařízení zpětné smyčky:
sudo losetup --find --show /mnt/work/lxd/hddpool.img
/dev/loop1Díky klíči --show provedení příkazu vrátí na obrazovku název zařízení, ke kterému je připojen náš soubor zpětné smyčky. V případě potřeby můžeme zobrazit seznam všech vytížených zařízení tohoto typu, abychom se ujistili, že naše akce jsou správné:
losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop1 0 0 0 0 /mnt/work/lxd/hddpool.img 0 512
/dev/loop0 0 0 1 0 /var/lib/lxd/disks/ssdpool.img 0 512Ze seznamu zjistíte, že zařízení má /dev/loop1 součástí souboru zpětné smyčky /mnt/work/lxd/hddpool.imga v zařízení /dev/loop0 součástí souboru zpětné smyčky /var/lib/lxd/disks/ssdpool.img což odpovídá výchozímu nastavení Skladovací bazén.
Následující příkaz vytvoří nový Skladovací bazén v LXD na základě souboru zpětné smyčky, který jsme právě připravili. LXD naformátuje soubor zpětné smyčky /mnt/work/lxd/hddpool.img v zařízení /dev/loop1 pro souborový systém BTRFS:
lxc storage create hddpool btrfs size=10GB source=/dev/loop1Ukážeme si seznam všech Skladovací bazén na obrazovku:
lxc storage list
+---------+-------------+--------+--------------------------------+---------+
| NAME | DESCRIPTION | DRIVER | SOURCE | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool | | btrfs | /dev/loop1 | 0 |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool | | btrfs | /var/lib/lxd/disks/ssdpool.img | 0 |
+---------+-------------+--------+--------------------------------+---------+Zvětšení velikosti úložiště
Po vytvoření Skladovací bazén, v případě potřeby jej lze rozšířit. Pro Skladovací bazén na základě systému souborů BTRFS spusťte následující příkazy:
sudo truncate -s +5G /mnt/work/lxd/hddpool.img
sudo losetup -c /dev/loop1
sudo btrfs filesystem resize max /var/lib/lxd/storage-pools/hddpoolAutomatické vložení souboru zpětné smyčky do slotu zařízení zpětné smyčky
Máme jeden malý problém, při restartu hostitelského systému, soubor /mnt/work/lxd/hddpool.img "vyletí" ze zařízení /dev/loop1 a služba LXD se při načítání zhroutí, protože ji v tomto zařízení neuvidí. Chcete-li tento problém vyřešit, musíte vytvořit systémovou službu, která tento soubor vloží do zařízení /dev/loop1 při spuštění hostitelského systému.
Pojďme tvořit jednotka typ souboru servis в /etc/systemd/system/ pro inicializační systém 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
EOFAktivujte službu:
sudo systemctl enable lxd-hddpool
Created symlink /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.Po restartu hostitelského systému zkontrolujeme stav služby:
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).Z výstupu můžeme ověřit, že je stav služby aktivní, přestože bylo vykonání našeho skriptu z jednoho příkazu dokončeno, volba nám to umožnila RemainAfterExit=true.
Bezpečnost. Kontejnerová privilegia
Vzhledem k tomu, že všechny procesy kontejneru ve skutečnosti běží izolovaně na hostitelském systému pomocí jeho jádra, pro další ochranu přístupu procesů kontejneru k hostitelskému systému nabízí LXD procesní oprávnění, kde:
Privilegované kontejnery - jedná se o kontejnery, ve kterých procesy s UID a GID odpovídají stejnému vlastníkovi jako na hostitelském systému. Například proces běžící v kontejneru s UID 0 má všechna stejná přístupová práva jako proces na hostitelském systému s UID 0. Jinými slovy, uživatel root v kontejneru má všechna práva nejen v kontejneru, ale také na hostitelském systému, pokud může jít mimo izolovaný jmenný prostor kontejneru.
Neprivilegované kontejnery - jedná se o kontejnery, ve kterých procesy patří vlastníkovi UID a GID s číslem od 0 do 65535, ale pro hostitelský systém je vlastník maskován pomocí přidaných bitů SubUID a SubGID. Například uživatel s UID=0 v kontejneru bude v hostitelském systému viděn jako
SubUID + UID. To chrání hostitelský systém, protože pokud je jakýkoli proces v kontejneru schopen uniknout ze svého izolovaného jmenného prostoru, může komunikovat s hostitelským systémem pouze jako proces s neznámým, velmi vysokým UID/GID.
Ve výchozím nastavení mají nově vytvořené kontejnery status neprivilegovaného, a proto musíme definovat SubUID a SubGID.
Vytvoříme dva konfigurační soubory, ve kterých nastavíme masku pro SubUID a SubGID, v tomto pořadí:
sudo touch /etc{/subuid,/subgid}
sudo usermod --add-subuids 1000000-1065535 root
sudo usermod --add-subgids 1000000-1065535 rootPro použití změn je nutné restartovat službu LXD:
sudo systemctl restart lxdVytvoření virtuálního síťového přepínače
Protože jsme dříve inicializovali síť pomocí inicializačního průvodce lxd init a vytvořili síťové zařízení lxdbr0, pak se v této části jednoduše seznámíme se síťováním v LXD a jak vytvořit virtuální switch (bridge) pomocí příkazu client.
Následující diagram ukazuje, jak přepínač (most) připojuje hostitele a kontejnery do sítě:

Kontejnery mohou komunikovat prostřednictvím sítě s jinými kontejnery nebo hostitelem, na kterém jsou tyto kontejnery obsluhovány. Chcete-li to provést, musíte propojit virtuální síťové karty kontejnerů s virtuálním přepínačem. Nejprve vytvoříme přepínač a síťová rozhraní kontejneru budou propojena v následujících kapitolách, až bude kontejner samotný vytvořen.
Následující příkaz vytvoří přepínač s podsítí 10.0.5.0/24 a IPv4 adresu 10.0.5.1/24, a také zahrnuje ipv4.nat aby kontejnery mohly přistupovat k internetu prostřednictvím hostitele pomocí služby NAT:
lxc network create lxdbr0 ipv4.address=10.0.5.1/24 ipv4.nat=true ipv6.address=noneKontrola seznamu síťových zařízení dostupných v LXD:
lxc network list
+--------+----------+---------+-------------+---------+
| NAME | TYPE | MANAGED | DESCRIPTION | USED BY |
+--------+----------+---------+-------------+---------+
| eno1 | physical | NO | | 0 |
+--------+----------+---------+-------------+---------+
| lxdbr0 | bridge | YES | | 0 |
+--------+----------+---------+-------------+---------+Můžete také ověřit, zda bylo síťové zařízení vytvořeno pomocí standardního nástroje. Linux-distribuce — ip link nebo ip addr:
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether bc:ee:7b:5a:6b:44 brd ff:ff:ff:ff:ff:ff
altname enp0s25
inet6 fe80::9571:11f3:6e0c:c07b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether c2:38:90:df:cb:59 brd ff:ff:ff:ff:ff:ff
inet 10.0.5.1/24 scope global lxdbr0
valid_lft forever preferred_lft forever
inet6 fe80::c038:90ff:fedf:cb59/64 scope link
valid_lft forever preferred_lft forever
5: veth3ddab174@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
link/ether ca:c3:5c:1d:22:26 brd ff:ff:ff:ff:ff:ff link-netnsid 0Konfigurační profil
Každý kontejner v LXD má svou vlastní konfiguraci a může ji rozšířit o globálně deklarované konfigurace tzv konfigurační profily. Použití konfiguračních profilů na kontejner má kaskádový model, což ukazuje následující příklad:

V tomto příkladu byly v systému LXD vytvořeny tři profily: default, hddpool и hostfs. Všechny tři profily jsou aplikovány na kontejner, který má místní konfiguraci (šedá oblast). Profil default má zařízení root který má parametr pool rovná ssdpool, ale díky aplikačnímu modelu kaskádové konfigurace můžeme na kontejner aplikovat profil hddpool který má parametr pool přepíše stejný parametr z profilu default a kontejner obdrží konfiguraci zařízení root s parametrem pool stejný hddpoola profil hostfs jednoduše přidá nové zařízení do kontejneru.
Chcete-li zobrazit seznam dostupných konfiguračních profilů, použijte následující příkaz:
lxc profile list
+---------+---------+
| NAME | USED BY |
+---------+---------+
| default | 1 |
+---------+---------+
| hddroot | 0 |
+---------+---------+
| ssdroot | 1 |
+---------+---------+Kompletní seznam dostupných příkazů pro práci s profilem lze získat přidáním klíče --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Úprava vašeho profilu
Výchozí konfigurační profil default nemá konfiguraci síťové karty pro kontejner a všechny nově vytvořené kontejnery nemají síť, pro ně je nutné vytvořit lokální (dedikovaná) síťová zařízení samostatným příkazem, ale v konfiguraci můžeme vytvořit globální síťové zařízení profil, který bude sdílen mezi všemi kontejnery používajícími tento profil. Ihned po příkazu k vytvoření nového kontejneru tak budou mít síť se síťovým přístupem. Zároveň neexistují žádná omezení, v případě potřeby můžeme kdykoli později vytvořit místní síťové zařízení.
Následující příkaz přidá zařízení do konfiguračního profilu eth0 typ nic připojený k síti lxdbr0:
lxc profile device add default eth0 nic network=lxdbr0 name=eth0Je důležité si uvědomit, že jelikož jsme zařízení skutečně přidali do konfiguračního profilu, pokud jsme v zařízení zadali statickou IP adresu, pak všechny kontejnery, které budou tento profil používat, budou sdílet stejnou IP adresu. Pokud je potřeba vytvořit kontejner se statickou IP adresou přidělenou kontejneru, měli byste vytvořit konfiguraci síťového zařízení na úrovni kontejneru (místní konfigurace) s parametrem IP adresa, a ne na úrovni profilu.
Podívejme se na profil:
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: []V tomto profilu vidíme, že pro všechny nově vytvořené kontejnery budou vytvořena dvě zařízení:
eth0- Typ zařízenínicpřipojeno k přepínači (síťový most)lxdbr0root- Typ zařízenídiskkterý využívá skladovací bazénssdpool
Vytváření nových profilů
Chcete-li použít dříve vytvořené Skladovací bazén kontejnery, vytvořte konfigurační profil ssdroot do kterého přidáme zařízení jako disk s montážním bodem / (root) pomocí dříve vytvořeného Skladovací bazén - ssdpool:
lxc profile create ssdroot
lxc profile device add ssdroot root disk path=/ pool=ssdpoolPodobně vytvoříme zařízení jako disk, ale v tomto případě pomocí Skladovací bazén - hddpool:
lxc profile create hddroot
lxc profile device add hddroot root disk path=/ pool=hddpoolKontrola konfiguračních profilů:
lxc profile show ssdroot
config: {}
description: ""
devices:
root:
path: /
pool: ssdpool
type: disk
name: ssdroot
used_by: []lxc profile show hddroot
config: {}
description: ""
devices:
root:
path: /
pool: hddpool
type: disk
name: hddroot
used_by: []Úložiště obrázků
Kontejnery se vytvářejí z obrazů, což jsou speciálně kompilované distribuce, které nemají jádro. LinuxPřed spuštěním kontejneru je proto nutné jej z tohoto obrazu nasadit. Zdroj obrazu je lokální repozitář, do kterého se obrazy stahují z externích repozitářů.
Vzdálená úložiště obrázků
Ve výchozím nastavení je LXD nakonfigurován pro příjem obrázků ze tří vzdálených zdrojů:
- ubuntu: (pro stabilní Ubuntu snímky)
- ubuntu-denní: (pro denní Ubuntu snímky)
- snímky: (pro spoustu dalších distribucí)
lxc remote list
+-----------------+------------------------------------------+--------+--------+
| NAME | URL | PUBLIC | STATIC |
+-----------------+------------------------------------------+--------+--------+
| images | https://images.linuxcontainers.org | YES | NO |
+-----------------+------------------------------------------+--------+--------+
| local (default) | unix:// | NO | YES |
+-----------------+------------------------------------------+--------+--------+
| ubuntu | https://cloud-images.ubuntu.com/releases | YES | YES |
+-----------------+------------------------------------------+--------+--------+
| ubuntu-daily | https://cloud-images.ubuntu.com/daily | YES | YES |
+-----------------+------------------------------------------+--------+--------+Například úložiště ubuntu: má následující obrázky:
lxc image -c dasut list ubuntu: | head -n 11
+----------------------------------------------+--------------+----------+------------+
| DESCRIPTION | ARCHITECTURE | SIZE | TYPE |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150728) | x86_64 | 153.72MB | CONTAINER |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150819) | x86_64 | 152.91MB | CONTAINER |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150906) | x86_64 | 154.69MB | CONTAINER |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150930) | x86_64 | 153.86MB | CONTAINER |
+----------------------------------------------+--------------+----------+------------+Pro zobrazení omezeného počtu sloupců jsme použili možnost -c s parametry dasut, a také omezil délku seznamu pomocí příkazu head.
K dispozici je filtrování pro zobrazení seznamu obrázků. Následující příkaz zobrazí seznam všech dostupných distribučních architektur :
lxc image -c ldast list images:alpine/3.11
+------------------------------+--------------------------------------+--------------+
| ALIAS | DESCRIPTION | ARCHITECTURE |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11 (3 more) | Alpine 3.11 amd64 (20200220_13:00) | x86_64 |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/arm64 (1 more) | Alpine 3.11 arm64 (20200220_13:00) | aarch64 |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/armhf (1 more) | Alpine 3.11 armhf (20200220_13:00) | armv7l |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/i386 (1 more) | Alpine 3.11 i386 (20200220_13:01) | i686 |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/ppc64el (1 more) | Alpine 3.11 ppc64el (20200220_13:00) | ppc64le |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/s390x (1 more) | Alpine 3.11 s390x (20200220_13:00) | s390x |
+------------------------------+--------------------------------------+--------------+Místní úložiště obrázků
Chcete-li kontejner začít používat, musíte do místního přidat obrázek z globálního úložiště local:. Nyní je místní úložiště prázdné, příkaz se o to postará lxc image list. Pokud metoda list nezadávejte úložiště, ve výchozím nastavení se použije místní úložiště - local:
lxc image list local:
+-------+-------------+--------+-------------+--------------+------+------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE |
+-------+-------------+--------+-------------+--------------+------+------+Obrázky v úložišti jsou spravovány pomocí následujících metod:
Tým
popis
obrázek lxc přezdívka
Správa aliasů obrázků
obrázek lxc kopie
Kopírování obrázků mezi servery
obrázek lxc vymazat
Mazat obrázky
obrázek lxc editovat
Upravit vlastnosti obrázku
obrázek lxc export
Exportujte a stahujte obrázky
obrázek lxc import
Importujte obrázky do úložiště obrázků
obrázek lxc info
Zobrazit užitečné informace o obrázcích
obrázek lxc lest
Seznam obrázků
obrázek lxc Obnovit
Obnovit obrázky
obrázek lxc show
Zobrazit vlastnosti obrázku
Zkopírujte obrázek do místního úložiště z globálního images::
lxc image copy images:alpine/3.11/amd64 local: --alias=alpine3
Image copied successfully!Zobrazme seznam všech obrázků aktuálně dostupných v místním úložišti local::
lxc image -c lfdatsu list local:
+---------+--------------+------------------------------------+--------------+
| ALIAS | FINGERPRINT | DESCRIPTION | ARCHITECTURE |
+---------+--------------+------------------------------------+--------------+
| alpine3 | 73a3093d4a5c | Alpine 3.11 amd64 (20200220_13:00) | x86_64 |
+---------+--------------+------------------------------------+--------------+Konfigurace LXD
Kromě interaktivního režimu podporuje LXD také režim instalace neinteraktivní konfigurace, kdy je konfigurace specifikována ve formě souboru YAML, což je speciální formát, který vám umožní nainstalovat celou konfiguraci najednou a obejít provádění z mnoha interaktivních příkazů, které byly popsány výše v tomto článku, včetně konfigurace sítě, vytváření konfiguračních profilů atd. Tuto oblast zde nebudeme pokrývat, můžete se na to podívat sami. .
Další interaktivní příkaz lxc config na který se podíváme, umožňuje nastavit konfiguraci. Abychom například zajistili, že stažené obrázky do místního úložiště nebudou automaticky aktualizovány z globálních úložišť, můžeme toto chování povolit pomocí následujícího příkazu:
lxc config set images.auto_update_cached=falseVytvoření a správa kontejneru
K vytvoření kontejneru použijte příkaz lxc init kterým se předávají hodnoty репозиторий:образ a poté požadované ID pro kontejner. Úložiště lze zadat jako místní local: stejně jako každý globální. Pokud není úložiště zadáno, pak se k vyhledání obrázku standardně použije místní úložiště. Pokud je obrázek zadán z globálního úložiště, bude obrázek nejprve stažen do místního úložiště a poté použit k vytvoření kontejneru.
Spusťte následující příkaz k vytvoření našeho prvního kontejneru:
lxc init alpine3 alp --storage=hddpool --profile=default --profile=hddrootPodívejme se na příkazové klávesy, které zde používáme:
alpine3— Zadejte alias (alias) pro obrázek, který byl dříve nahrán do místního úložiště. Pokud pro tento obrázek nebyl vytvořen alias, můžete na obrázek vždy odkazovat jeho pomocí otisk prstu který je zobrazen v tabulce.alp— Nastavuje identifikátor pro kontejner--storage— Tato klávesa označuje, ve kterém Skladovací bazén vytvoří se kontejner--profile— Tato kaskáda klíčů aplikuje konfiguraci z dříve vytvořených konfiguračních profilů na kontejner
Spustíme kontejner, který začne spouštět init systém distribuce:
lxc start alpMůžete také použít příkaz lxc launch což umožňuje kombinovat týmy lxc init и lxc start v jedné operaci.
Kontrola stavu kontejneru:
lxc list -c ns46tb
+------+---------+------------------+------+-----------+--------------+
| NAME | STATE | IPV4 | IPV6 | TYPE | STORAGE POOL |
+------+---------+------------------+------+-----------+--------------+
| alp | RUNNING | 10.0.5.46 (eth0) | | CONTAINER | hddpool |
+------+---------+------------------+------+-----------+--------------+Kontrola konfigurace kontejneru:
lxc config show alp
architecture: x86_64
config:
image.architecture: amd64
image.description: Alpine 3.11 amd64 (20200326_13:39)
image.os: Alpine
image.release: "3.11"
image.serial: "20200326_13:39"
image.type: squashfs
volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
volatile.eth0.host_name: vethb1fe71d8
volatile.eth0.hwaddr: 00:16:3e:5f:73:3e
volatile.idmap.base: "0"
volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
volatile.last_state.power: RUNNING
devices:
root:
path: /
pool: hddpool
type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""V sekci profiles můžeme se ujistit, že tento kontejner používá dva konfigurační profily − default и hddroot. V sekci devices můžeme detekovat pouze jedno zařízení, protože síťové zařízení bylo vytvořeno na úrovni profilu default. Abyste viděli všechna zařízení používaná kontejnerem, musíte přidat klíč --expanded:
lxc config show alp --expanded
architecture: x86_64
config:
image.architecture: amd64
image.description: Alpine 3.11 amd64 (20200326_13:39)
image.os: Alpine
image.release: "3.11"
image.serial: "20200326_13:39"
image.type: squashfs
volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
volatile.eth0.host_name: vethb1fe71d8
volatile.eth0.hwaddr: 00:16:3e:5f:73:3e
volatile.idmap.base: "0"
volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
volatile.last_state.power: RUNNING
devices:
eth0:
name: eth0
network: lxdbr0
type: nic
root:
path: /
pool: hddpool
type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""Nastavení statické IP adresy
Pokud se pokusíme nastavit IP adresu síťového zařízení eth0 tým lxc config device set alp určené pro konfiguraci kontejneru, pak obdržíme chybu, která bude hlásit, že zařízení neexistuje, protože zařízení eth0 který kontejner používá patří do profilu default:
lxc config device set alp eth0 ipv4.address 10.0.5.5
Error: The device doesn't existMůžeme samozřejmě nastavit statickou IP adresu eth0 zařízení v profilu, ale bude stejný pro všechny kontejnery, které budou tento profil používat. Proto přidejte zařízení určené pro kontejner:
lxc config device add alp eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5Poté musíte restartovat kontejner:
lxc restart alpPokud se nyní podíváme na konfiguraci kontejneru, nemusíme tuto možnost používat --expanded pro zobrazení síťového zařízení eth0, protože jsme jej vytvořili na úrovni kontejneru a kaskádově se přenesl přes stejné zařízení z profilu default:
lxc config show alp
architecture: x86_64
config:
image.architecture: amd64
image.description: Alpine 3.11 amd64 (20200326_13:39)
image.os: Alpine
image.release: "3.11"
image.serial: "20200326_13:39"
image.type: squashfs
volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
volatile.eth0.host_name: veth2a1dc59d
volatile.eth0.hwaddr: 00:16:3e:0e:e2:71
volatile.idmap.base: "0"
volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
volatile.last_state.power: RUNNING
devices:
eth0:
ipv4.address: 10.0.5.5
name: eth0
nictype: bridged
parent: lxdbr0
type: nic
root:
path: /
pool: hddpool
type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""Odstranění kontejneru
Chcete-li odstranit kontejner, použijte příkaz lxc delete, ale před odstraněním kontejneru je třeba jej zastavit pomocí příkazu lxc stop:
lxc stop alplxc list
+------+---------+-------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+---------+-------------------+------+-----------+-----------+
| alp | STOPPED | 10.0.5.10 (eth0) | | CONTAINER | 0 |
+------+---------+-------------------+------+-----------+-----------+Poté, co jsme ověřili, že se stav kontejneru stal ZASTAVIL, lze jej odstranit z Skladovací bazén:
lxc delete alpPřístup ke kontejneru
Chcete-li spouštět příkazy v kontejneru přímo a obejít síťová připojení, použijte příkaz lxc exec který provádí příkazy v kontejneru bez spuštění systémového shellu. Pokud potřebujete provést příkaz v shellu pomocí vzorů shellu, jako jsou proměnné, přesměrování souborů (pipe) atd., musíte explicitně spustit shell a předat příkaz jako klíč, například:
lxc exec alp -- /bin/sh -c "echo $HOME"Příkaz používal speciální znak escape pro zvláštní charakter $ takže proměnná $HOME nebyl interpretován na hostitelském počítači, ale byl interpretován pouze uvnitř kontejneru.
Je také možné spustit režim interaktivního shellu a poté relaci ukončit spuštěním horké klávesy CTRL+D:
lxc exec alp -- /bin/shSpráva kontejnerových zdrojů
V LXD můžete spravovat prostředky kontejneru pomocí speciální sady konfigurací. Kompletní seznam konfiguračních parametrů kontejneru naleznete .
Omezení zdrojů RAM
Parametr limits.memory omezuje množství paměti RAM dostupné pro kontejner. Hodnota je číslo a jedna z .
Nastavíme limit RAM kontejneru na 256 MB:
lxc config set alp limits.memory 256MBExistují také další parametry pro omezení paměti:
limits.memory.enforcelimits.memory.hugepageslimits.memory.swaplimits.memory.swap.priority
Tým lxc config show umožňuje zobrazit celou konfiguraci kontejneru, včetně limitu použitého zdroje, který byl nastaven:
lxc config show alp
architecture: x86_64
config:
image.architecture: amd64
image.description: Alpine 3.11 amd64 (20200220_13:00)
image.os: Alpine
image.release: "3.11"
image.serial: "20200220_13:00"
image.type: squashfs
limits.memory: 256MB
volatile.base_image: 73a3093d4a5ce0148fd84b95369b3fbecd19a537ddfd2e2d20caa2eef0e8fd60
volatile.eth0.host_name: veth75b6df07
volatile.eth0.hwaddr: 00:16:3e:a1:e7:46
volatile.idmap.base: "0"
volatile.idmap.current: '[]'
volatile.idmap.next: '[]'
volatile.last_state.idmap: '[]'
volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""Limit prostředků CPU
Existuje několik způsobů, jak omezit zdroje CPU. :
limit.cpu- sváže kontejner s jedním nebo více jádry CPUlimits.cpu.allowance- spravuje buď kvóty plánovače CFS, když uplynul časový limit, nebo mechanismus sdílení univerzálního CPU, když uplynulo procentolimits.cpu.priority- priorita plánovače, když je více instancím sdílejících sadu procesorů přiřazeno stejné procento procesorů
lxc config set alp limits.cpu.allowance 40%lxc config show alp
architecture: x86_64
config:
image.architecture: amd64
image.description: Alpine 3.11 amd64 (20200220_13:00)
image.os: Alpine
image.release: "3.11"
image.serial: "20200220_13:00"
image.type: squashfs
limits.cpu.allowance: 40%
limits.memory: 256MB
volatile.base_image: 73a3093d4a5ce0148fd84b95369b3fbecd19a537ddfd2e2d20caa2eef0e8fd60
volatile.eth0.host_name: veth75b6df07
volatile.eth0.hwaddr: 00:16:3e:a1:e7:46
volatile.idmap.base: "0"
volatile.idmap.current: '[]'
volatile.idmap.next: '[]'
volatile.last_state.idmap: '[]'
volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""Omezení místa na disku
Kromě omezení např limits.read, limits.write můžeme také omezit množství místa na disku spotřebovaného kontejnerem (funguje pouze se ZFS nebo BTRFS):
lxc config device set alp root size=2GBPo instalaci v parametru devices.root.size Stanovený limit můžeme ověřit:
lxc config show alp
...
devices:
root:
path: /
pool: hddpool
size: 2GB
type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""Pro zobrazení použitých diskových kvót můžeme získat z příkazu 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: 0Navzdory tomu, že jsme nastavili limit pro kořenové zařízení kontejneru na 2GB, systémové utility jako např df toto omezení neuvidí. Za tímto účelem provedeme malý test a zjistíme, jak to funguje.
Vytvořme 2 nové stejné kontejnery ve stejném Skladovací bazén (hddpool):
lxc init alpine3 alp1 --storage=hddpool --profile=default --profile=hddroot
lxc init alpine3 alp2 --storage=hddpool --profile=default --profile=hddrootlxc list
+------+---------+------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+---------+------------------+------+-----------+-----------+
| alp1 | RUNNING | 10.0.5.46 (eth0) | | CONTAINER | 0 |
+------+---------+------------------+------+-----------+-----------+
| alp2 | RUNNING | 10.0.5.30 (eth0) | | CONTAINER | 0 |
+------+---------+------------------+------+-----------+-----------+Vytvořme 1GB soubor v jednom z kontejnerů:
lxc exec alp1 -- dd if=/dev/urandom of=file.img bs=1M count=1000Ujistěte se, že je soubor vytvořen:
lxc exec alp1 -- ls -lh
total 1000M
-rw-r--r-- 1 root root 1000.0M Mar 27 10:16 file.imgPokud se podíváme do druhého kontejneru, zkontrolujeme existenci souboru ve stejném umístění, tento soubor tam nebude, což se očekává, protože kontejnery jsou vytvořeny ve vlastním Objem úložiště ve stejné Skladovací bazén:
lxc exec alp2 -- ls -lh
total 0Ale pojďme porovnat hodnoty, které produkuje df na jedné a druhé nádobě:
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% /
...Zařízení /dev/loop1 připojený jako kořenový oddíl Skladovací bazén které tyto nádoby využívají, takže jeho objem sdílejí mezi dva.
Statistika spotřeby zdrojů
Statistiku spotřeby zdrojů pro kontejner můžete zobrazit pomocí příkazu:
lxc info alp
Name: alp
Location: none
Remote: unix://
Architecture: x86_64
Created: 2020/04/08 18:05 UTC
Status: Running
Type: container
Profiles: default, hddroot
Pid: 19219
Ips:
eth0: inet 10.0.5.5 veth2a1dc59d
eth0: inet6 fe80::216:3eff:fe0e:e271 veth2a1dc59d
lo: inet 127.0.0.1
lo: inet6 ::1
Resources:
Processes: 5
Disk usage:
root: 495.62kB
CPU usage:
CPU usage (in seconds): 1
Memory usage:
Memory (current): 4.79MB
Network usage:
eth0:
Bytes received: 730B
Bytes sent: 1.59kB
Packets received: 3
Packets sent: 14
lo:
Bytes received: 0B
Bytes sent: 0B
Packets received: 0
Packets sent: 0Práce se snímky
LXD má schopnost vytvářet snímky a obnovovat z nich stav kontejneru.
Chcete-li vytvořit snímek, spusťte následující příkaz:
lxc snapshot alp snapshot1Tým lxc snapshot není k dispozici žádný klíč list, proto k zobrazení seznamu snímků musíte použít příkaz, který zobrazí obecné informace o kontejneru:
lxc info alp
...
...
Snapshots:
snapshot1 (taken at 2020/04/08 18:18 UTC) (stateless)Pomocí příkazu můžete obnovit kontejner ze snímku lxc restore zadáním kontejneru, pro který bude obnova provedena, a aliasu snímku:
lxc restore alp snapshot1Následující příkaz se používá k odstranění snímku. Upozorňujeme, že syntaxe příkazu není podobná všem ostatním; zde musíte zadat lomítko za názvem kontejneru. Pokud je lomítko vynecháno, je příkaz k odstranění snímku interpretován jako příkaz k odstranění kontejneru!
lxc delete alp/snapshot1Ve výše uvedeném příkladu jsme se podívali na takzvané bezstavové snímky. LXD má další typ snapshotů – stavový, který ukládá aktuální stav všech procesů v kontejneru. Se stavovými snímky je spojena řada zajímavých a užitečných funkcí.
Co jiného?
- Pro vývojáře Pythonu je k dispozici modul který poskytuje API LXD
AKTUALIZACE 10.04.2020 15:00: Přidána navigace
Zdroj: www.habr.com
