LXC (Linux Containers) е лек контейнер за една уеб услуга или сайт, включително всички услуги, които са необходими за функционирането му. Представлява затворена среда за работа ползваща ядрото на самата ОС. Има набор от прости инструменти за работа. LXD (Linux Daemon) това е разширение, което се използва главно за управление на LXC. Използва се за предоставяне на нови атрибути и възможности на LXC, така че LXC да може да се използва по-ефективно. Комуникацията между LXD и LXC се осъществява с помощта на вградени библиотеки, една от тях е liblxc. LXCFS - малка файлова архитектура в потребителската среда, която оптимизира работата на Linux ядрото. В какви случаи е удобно да използвате LXC ("контейнери"): ● Наследство: вече имате уеб услуга/сайт, хостван на специален сървър и трябва да го пакетирате под формата на контейнер, който може да бъде предоставен на разработчиците или прехвърлен на друг сървър (резервен или етап); ● Обичате да работите в среда, в която всички услуги са събрани в един контейнер; ● Нуждаем се от изолация на сървъра, така че всяка уеб услуга да е в свой собствен контейнер, но без да губи производителност, какъвто е случаят с виртуалните машини; ● Ако знаете как да конфигурирате основни услуги в Linux, тогава можете да създадете LXC контейнер за вашия проект. LXC е много подобен на обикновена виртуална машина. Благодарение на LXD можем да създаваме не само контейнери но и виртуални машини заедно с QEMU. Има още и LXFS. Това е особена файлова система осигуряващ по-голяма независимост на контейнера.
Дълго се колебаех тази секция дали да е първа но накрая реших, че това е много важно и първостепенно. Ако започнете инсталацията преди да сте направили тези нща ще много трудно да се поправят. Когато тръгнете да инициализирате lxd за да можете да създавате пулове с файлови системи различни от dir, ще трябва да инсталирате Debian примерно на btrfs за да можете да ползвате пулове във вид btrfs. Ако пък ще ползвате LVM то също ще трябва да инсталирате Debian така. Отделна тема е ползването на zfs. Debian има проблеми с лицензионните споразумения и zfs го няма в стандартните репозитори за да го инсталирате. Та идеята е, ако ще се ползва примерно btrfs то Debian трябва да е инсталиран на btrfs файлова система, а не на ext4 както се инсталира стандартно. Ползването на zfs не изисква да сте инсталирали системата на zfs, просто допълнително се снсталира. Ако ползвате snap пакети то всичките тези проблеми ги нямате. Проблема е, че освен дмона качва и куп други неща които товарят системата. Освен това ще трябва да оправяте и пътищата до изпълнимите файлове. По-надолу ще покажа и двата варианта, но лично аз предпочитам първия. Все пак си имам някаква представа преди да почна какво искам да постигна в крайна сметка. И знаейки какво искам да направя предварително ще се подготвя.
За начало да проверим версията на Linux с която работим.
uname -a Linux lxc-lxd 6.1.0-21-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 GNU/Linux cat /etc/*release PRETTY_NAME="Debian GNU/Linux 12 (bookworm)" NAME="Debian GNU/Linux" VERSION_ID="12" VERSION="12 (bookworm)" VERSION_CODENAME=bookworm ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/"
И самата инсталация.
apt update -y apt upgrade -y apt install lxd -y
Самата инсталация протича сравнително бързо. Има обаче един момент. Ако инсталирате върху Debian s ext4, системата може да работи само с файлова система dir. По-добрия вариант е ползването на btrfs, zfs, lvm даже ceph когато ползвате клъстери. Няма да обяснявам кое какво представлява, надявам се щом четете това упътване значи сте запознати. Ако ще се ползва някоя от горе посочените ще трябва да инсталирате допълнителни пакети. Казахме, ако пуловете ще ползват btrfs то трябва Debian 12 да се инсталира върху btrfs. Ако ще се ползва LVM то трябва да се инсталира върху LVM структура. Ако ще се ползва ZFS то тогава той допълнително трябва да се инсталира zfs.
codename=$(lsb_release -cs) echo "deb http://deb.debian.org/debian $codename-backports main contrib non-free" >> /etc/apt/sources.list cat /etc/apt/sources.list apt update -y apt install linux-headers-amd64 -y apt install -t bullseye-backports zfsutils-linux
Добавихме non-free репозитор и от него инсталирахме zfs. apt install -t bullseye-backports zfsutils-linux - инталираме zfsutils-linux от bullseye-backports. Понякога не може да се инсталира от bullseye-backports, затова ползваме: sudo apt install zfsutils-linux -y ПРЕПОРЪКА. Инсталирайте Debian на btrfs и когато дефинирате на по-късен етап пула ползвайте btrfs. Той има почти всички възможности на zfs и не "яде" толкова много ресурс. Особено памет. Стремете се когато правите сървъри винаги да сте оптимални. Всичко излишно инсталирано допълнително товари системата.
ВНИМАНИЕ !!! Инсталирането на SNAP товари с много допълнителни програми системата. Обърнете внимание с какъв ресурс разполагате.
sudo apt update -y apt upgrade -y apt install snapd -y snap install core
Snap core е основната система за snap, наред с други неща, тя съдържа същия snapd демон, който сте инсталирали по-рано . Тази команда ще актуализира hello snap, ако има налични актуализации за него. Това е много удобно - актуализирате не само приложенията, но и всички библиотеки, необходими за работата му..
snap install lxd export PATH=$PATH:/snap/bin
По време на първия старт трябва да инициализираме самия процес на LXD
lxd init Would you like to use LXD clustering? (yes/no) [default=no]: no ### Ще ползваме ли няколко услуги LXD в клъстер. За сега не. Do you want to configure a new storage pool? (yes/no) [default=yes]: yes ### Ще ползваме ли пул за данни (ДА) Name of the new storage pool [default=default]: mypool ### Име на пула. Даваме му име (mypool) Would you like to connect to a MAAS server? (yes/no) [default=no]: no ### Metal As A Server - софтуер, който кара сървъра да изглежда и действа като виртуална машина. Казваме, че няма да ползваме. Would you like to create a new local network bridge? (yes/no) [default=yes]: ### Ще създаваме ли бридж с мрежовия интерфейс. По подразбиране е да, просто натискаме Enter. What should the new bridge be called? [default=lxdbr0]: ### Даваме име на бридж интерфейса. Името по подразбиране ни устройва, просто натискаме Enter. What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: ### Ще ползваме динамично IPv4. Просто натискаме Enter. What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: ### Ще ползваме динамично IPv6. Просто натискаме Enter. Would you like the LXD server to be available over the network? (yes/no) [default=no]: yes ### Искаме ли нашите контейнери да са достъпни от външни мрежи. В случая искаме. Address to bind LXD to (not including port) [default=all]: ### Адрес на който да се прилепи контейнера. Просто натискаме Enter. Port to bind LXD to [default=8443]: ### Порт по подразбиране на контейнера. Просто натискаме Enter. Trust password for new clients: pass ### Парола за достъп до контейнера на нови клиенти. В случая е "pass". Again: ### Повтаряме паролата Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: ### Автоматично да се обновява образа на контейнера. Съгласяваме се и натискаме Enter. Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: yes ### Предлага да погледнем конфигурацията която създадохме във формат YAML. Съгласяваме се с "yes". config: core.https_address: '[::]:8443' core.trust_password: pass networks: - config: ipv4.address: auto ipv6.address: auto description: "" name: lxdbr0 type: "" project: default storage_pools: - config: {} description: "" name: mypool driver: dir profiles: - config: {} description: "" devices: eth0: name: eth0 network: lxdbr0 type: nic root: path: / pool: mypool type: disk name: default projects: [] cluster: null ### Това е пълната конфигурация.
По конфигурационния файл няколко неща. driver: dir - формат за съхранение на контейнера. В случая е dir. Това означава, че снапшота който ще направите на контейнера ще заема същото място колкото е контейнера. По-добрия вариант е ползването на btrfs, zfs, lvm, които динамично могат да променят размера си. Даже да ползвате ceph (разпределена файлова система, особено важна за клъстеризация). Всичко това на по-късен етап можете да променяте. Проверяваме дали демона е стартиран.
service lxd status ● lxd.service - LXD Container Hypervisor Loaded: loaded (/lib/systemd/system/lxd.service; indirect; preset: enabled) Active: active (running) since Thu 2024-06-20 12:06:29 EDT; 43min ago TriggeredBy: ● lxd.socket Docs: man:lxd(1) Process: 1702 ExecStartPre=/usr/libexec/lxd/lxd-apparmor-load (code=exited, status=0/SUCCESS) Process: 1711 ExecStartPost=/usr/bin/lxd waitready --timeout=600 (code=exited, status=0/SUCCESS) Main PID: 1710 (lxd) Tasks: 18 Memory: 52.0M CPU: 965ms CGroup: /system.slice/lxd.service ├─1710 /usr/bin/lxd --group lxd --logfile=/var/log/lxd/lxd.log └─1801 dnsmasq --keep-in-foreground --strict-order --bind-interfaces --except-interface=lo --pid-file= --no-ping --interface=lxdbr0> Jun 20 12:36:51 lxc-lxd dnsmasq-dhcp[1801]: DHCPv4-derived IPv6 names on fd42:f020:5d49:8e26::, constructed for lxdbr0 Jun 20 12:36:51 lxc-lxd dnsmasq-dhcp[1801]: router advertisement on fd42:f020:5d49:8e26::, constructed for lxdbr0 Jun 20 12:36:51 lxc-lxd dnsmasq-dhcp[1801]: IPv6 router advertisement enabled Jun 20 12:36:51 lxc-lxd dnsmasq-dhcp[1801]: DHCP, sockets bound exclusively to interface lxdbr0 Jun 20 12:36:51 lxc-lxd dnsmasq[1801]: using only locally-known addresses for lxd Jun 20 12:36:51 lxc-lxd dnsmasq[1801]: reading /etc/resolv.conf Jun 20 12:36:51 lxc-lxd dnsmasq[1801]: using nameserver 8.8.8.8#53 Jun 20 12:36:51 lxc-lxd dnsmasq[1801]: using nameserver 1.1.1.1#53 Jun 20 12:36:51 lxc-lxd dnsmasq[1801]: using only locally-known addresses for lxd Jun 20 12:36:51 lxc-lxd dnsmasq[1801]: read /etc/hosts - 7 names