Как установить и настроить LXC контейнер с последней версией lts 24.04 на Ubuntu 20.04 и 24.04, сделать бэкапы и настроить чтобы данные хранились в одном img файле
Руководство по установке и настройке LXC контейнеров на Ubuntu 20.04 и 24.04
p.s. как установить в ubuntu 20.04 самую свежую lts версию ubuntu 24.04 и изолированно запустить приложения
Проверено на: Ubuntu 20.04 / 24.04 (amd64)
LXC: классический (не LXD)
Оглавление
1. [Установка LXC]
2. [Создание контейнера]
3. [Базовое управление]
4. [Настройка сети: доступ из локальной сети]
5. [Доступ по SSH]
6. [Btrfs-бэкенд через loop-файл]
7. [Снапшоты и клонирование]
8. [Резервное копирование и восстановление]
9. [Полезные команды]
10. [Устранение неполадок]
Установка LXC
|
1 2 3 4 5 6 7 8 9 |
# Обновление пакетов и установка LXC sudo apt update sudo apt install lxc lxc-templates btrfs-progs # Проверка поддержки ядра lxc-checkconfig # Проверка сетевых интерфейсов LXC ip ad | grep lxc |
Важно: Если
lxc-checkconfigпоказывает предупреждения, убедитесь, что в ядре включены:CONFIG_VETH,CONFIG_MACVLAN,CONFIG_BRIDGE,CONFIG_NET_NS.
Создание контейнера
Универсальный шаблон
|
1 2 3 4 |
sudo lxc-create -t download -n <ИМЯ> -- \ --dist <дистрибутив> \ --release <версия> \ --arch <архитектура> |
Примеры
|
1 2 3 4 5 6 7 8 9 10 11 |
# Ubuntu 24.04 (Noble) sudo lxc-create -t download -n bulxc -- \ --dist ubuntu \ --release noble \ --arch amd64 # Ubuntu 22.04 (Jammy) sudo lxc-create -t download -n mylxc-ubuntu -- \ --dist ubuntu \ --release jammy \ --arch amd64 |
| Параметр | Описание |
|---|---|
-t download |
Шаблон загрузки образов |
-n <name> |
Имя контейнера |
--dist |
Дистрибутив (ubuntu, debian, alpine) |
--release |
Версия (noble, jammy, focal) |
--arch |
Архитектура (amd64, arm64) |
Базовое управление
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# Список всех контейнеров sudo lxc-ls # Список с деталями (статус, IP, тип) sudo lxc-ls -f # Запуск контейнера (в фоне) sudo lxc-start -n bulxc -d # Запуск в форграунде (для отладки) sudo lxc-start -n bulxc -F # Подключение к консоли контейнера sudo lxc-attach -n bulxc # Выход из контейнера exit # Остановка контейнера sudo lxc-stop -n bulxc # Принудительная остановка sudo lxc-stop -n bulxc --force # Информация о контейнере (статус, IP, использование ресурсов) sudo lxc-info -n bulxc # Удаление контейнера (только остановленного!) sudo lxc-stop -n bulxc 2>/dev/null sudo lxc-destroy -n bulxc |
Настройка сети: доступ из локальной сети
По умолчанию контейнеры LXC работают в NAT-ременте и получают адреса вида 10.0.3.x. Чтобы контейнер был виден в вашей локальной сети (192.168.0.x), настройте мост (bridge).
Шаг 1: Настройка моста на хосте (Netplan)
-
Узнайте имя физического интерфейса:
12ip addr# Найдите интерфейс с вашим текущим IP, например eth0 или enp3s0 -
Отредактируйте конфиг Netplan:
1sudo nano /etc/netplan/00-installer-config.yaml -
Замените конфигурацию (соблюдайте отступы пробелами):
12345678910111213network:version: 2renderer: networkdethernets:eth0: # ← Ваше имя интерфейсаdhcp4: nodhcp6: nobridges:br0:interfaces:- eth0 # ← Ваше имя интерфейсаdhcp4: yes # Хост получит IP через мостdhcp6: no -
Примените настройки:
1sudo netplan apply -
Проверьте:
12ip addr show br0# У br0 должен быть ваш локальный IP (192.168.0.31)
Шаг 2: Настройка контейнера
-
Остановите контейнер:
1sudo lxc-stop -n bulxc -
Отредактируйте конфиг:
1sudo nano /var/lib/lxc/bulxc/config -
Найдите секцию сети и замените на:
1234lxc.net.0.type = vethlxc.net.0.link = br0lxc.net.0.flags = uplxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
Шаг 3: Статический IP внутри контейнера
-
Подключитесь к контейнеру:
1sudo lxc-attach -n bulxc -
Отредактируйте Netplan внутри (
/etc/netplan/*.yaml):1234567891011121314network:version: 2ethernets:eth0:dhcp4: noaddresses:- 192.168.0.32/24 # ← Желаемый статический IProutes:- to: defaultvia: 192.168.0.1 # ← IP вашего роутераnameservers:addresses:- 8.8.8.8- 1.1.1.1 -
Примените:
1netplan apply -
Проверьте:
12ping -c 3 8.8.8.8exit
Доступ по SSH
Установка SSH-сервера внутри контейнера
|
1 2 3 4 5 6 7 8 9 10 |
# Подключитесь к контейнеру sudo lxc-attach -n bulxc # Установите openssh-server apt update apt install openssh-server -y # Включите автозапуск systemctl enable ssh systemctl start ssh |
Разрешить вход под root (опционально)
Внимание: Вход под root по паролю снижает безопасность. Используйте SSH-ключи в продакшене.
|
1 2 |
# Внутри контейнера отредактируйте sshd_config nano /etc/ssh/sshd_config |
Найдите и измените:
|
1 2 |
PermitRootLogin yes PasswordAuthentication yes |
Перезапустите SSH:
|
1 2 |
systemctl restart ssh exit |
Подключение извне
|
1 2 |
# С хоста или другого устройства в сети ssh root@192.168.0.32 |
Полезные материалы:
Btrfs-бэкенд через loop-файл
Позволяет использовать снапшоты Btrfs без отдельного раздела и данные контейнера хранятся в одном img файле.
Быстрый способ (одной командой)
|
1 2 |
sudo lxc-create -t download -n bulxc5 -B loop --fssize 10G --fstype btrfs -- \ --dist ubuntu --release noble --arch amd64 |
| Параметр | Описание |
|---|---|
-B loop |
Бэкенд: файл-образ как блочное устройство |
--fssize 10G |
Размер файла-образа |
--fstype btrfs |
Файловая система внутри образа |
Ручной способ (для полного контроля)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 1. Создать разреженный файл (10 ГБ) sudo fallocate -l 10G /var/lib/lxc/lxc.img # 2. Привязать к loop-устройству sudo losetup -f --show /var/lib/lxc/lxc.img # Вывод: /dev/loop15 ← запомните это устройство # 3. Отформатировать в Btrfs sudo mkfs.btrfs -f /dev/loop15 # 4. Смонтировать в отдельную директорию sudo mkdir -p /var/lib/lxc/btrfs sudo mount /dev/loop15 /var/lib/lxc/btrfs # 5. Проверить df -T /var/lib/lxc/btrfs # Type должен быть: btrfs # 6. Создать контейнер в эту директорию sudo lxc-create -t download -n bulxc-btrfs -B btrfs -- \ --dist ubuntu --release noble --arch amd64 |
Проверка Btrfs
|
1 2 3 4 5 |
# Проверить ФС контейнера изнутри sudo lxc-attach -n bulxc5 -- df -T / # Проверить субволемы (на хосте) sudo btrfs subvolume list /var/lib/lxc/bulxc5/rootfs |
Снапшоты и клонирование
Работает только если контейнер создан на Btrfs (бэкенд
btrfsилиloop+--fstype btrfs)
Создание снапшота
|
1 |
sudo lxc-snapshot -n bulxc5 |
Просмотр списка
|
1 |
sudo lxc-snapshot -n bulxc5 -L |
Пример вывода:
|
1 |
snap0 (2024-03-14 10:30:15) snap1 (2024-03-14 12:45:22) |
Восстановление из снапшота
|
1 2 |
# Восстановить текущий контейнер в состояние snap0 sudo lxc-snapshot -n bulxc5 -r snap0 |
Клонирование (новый контейнер из снапшота)
|
1 2 |
# Создать новый контейнер "bulxc5-clone" из snap0 sudo lxc-snapshot -n bulxc5 -r snap0 -N bulxc5-clone |
Удаление снапшота
|
1 |
sudo lxc-snapshot -n bulxc5 -d snap0 |
Полезный материал:
Снапшоты и клоны LXC
Резервное копирование и восстановление
Метод 1: Полный архив (tar) — универсальный
|
1 2 3 4 5 6 7 8 9 |
# Остановите контейнер для консистентности sudo lxc-stop -n bulxc # Создать бэкап sudo tar -czpf /home/ubuntu/lxc/bulxc-$(date +%F).tar.gz \ -C /var/lib/lxc bulxc # Запустить контейнер обратно sudo lxc-start -n bulxc -d |
Восстановление:
|
1 2 3 4 5 6 7 8 9 |
# Распаковать (контейнер должен быть остановлен и удалён) sudo lxc-stop -n bulxc 2>/dev/null sudo lxc-destroy -n bulxc 2>/dev/null sudo tar -xzpf /home/ubuntu/lxc/bulxc-2024-03-09.tar.gz \ -C /var/lib/lxc # Запустить sudo lxc-start -n bulxc -d |
Метод 2: rsync для инкрементальных бэкапов
|
1 2 3 4 5 6 7 8 9 10 |
# Остановить контейнер sudo lxc-stop -n bulxc # Синхронизировать с бэкап-директорией sudo rsync -aHAX --delete \ /var/lib/lxc/bulxc/ \ /backup/bulxc-live/ # Запустить sudo lxc-start -n bulxc -d |
Автоматизация: скрипт бэкапа
Создайте /usr/local/bin/lxc-backup-bulxc.sh:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/bash set -e CONTAINER="bulxc" BACKUP_DIR="/home/ubuntu/lxc" DATE=$(date +%F) ARCHIVE="$BACKUP_DIR/${CONTAINER}-${DATE}.tar.gz" # Остановить контейнер lxc-stop -n $CONTAINER 2>/dev/null || true # Создать архив tar -czpf "$ARCHIVE" -C /var/lib/lxc "$CONTAINER" # Запустить контейнер lxc-start -n $CONTAINER -d # Очистить старые бэкапы (оставить последние 7) ls -t $BACKUP_DIR/${CONTAINER}-*.tar.gz 2>/dev/null | \ tail -n +8 | xargs -r rm echo "Бэкап завершён: $ARCHIVE" |
Сделайте исполняемым и добавьте в cron:
|
1 2 3 4 5 6 |
sudo chmod +x /usr/local/bin/lxc-backup-bulxc.sh # Редактировать crontab sudo crontab -e # Добавить строку (ежедневно в 03:00): 0 3 * * * /usr/local/bin/lxc-backup-bulxc.sh |
Полезные команды
Информация и мониторинг
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Размер папки контейнера du -hs /var/lib/lxc/bulxc # Размер файла-образа (для loop-бэкенда) ls -lh /var/lib/lxc/bulxc/rootfs.disk # Увеличить размер образа (loop-бэкенд) sudo lxc-storage-disk-resize bulxc 20G # Занятые loop-устройства losetup -a # Сетевые интерфейсы контейнера sudo lxc-attach -n bulxc -- ip addr |
Управление ресурсами
|
1 2 3 4 5 6 7 |
# Ограничить CPU (в конфиге контейнера) # /var/lib/lxc/bulxc/config lxc.cpu.cfs_quota_us = 50000 lxc.cpu.cfs_period_us = 100000 # Ограничить память lxc.memory.limit = 1GB |
Сеть
|
1 2 3 4 5 6 |
# Проверить IP контейнера sudo lxc-attach -n bulxc -- hostname -I # Проброс порта (в конфиге контейнера) # Доступ к порту 80 контейнера с хоста на порту 8080 lxc.net.0.ipv4.address = 192.168.0.32/24 |
Устранение неполадок
systemd не запускается: Failed to fork off sandboxing environment
Причина: Конфликт cgroups v1 (хост) и v2 (контейнер Ubuntu 24.04).
Решение: Включить cgroups v2 на хосте:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# 1. Редактировать GRUB sudo nano /etc/default/grub # Добавить в строку: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.unified_cgroup_hierarchy=1" # 2. Обновить и перезагрузиться sudo update-grub sudo reboot # 3. Проверить mount | grep cgroup # Должно быть: cgroup2 on /sys/fs/cgroup type cgroup2 |
Альтернатива: Использовать Ubuntu 22.04 в контейнере — он совместим с cgroups v1.
Контейнер не видит сеть
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Проверить конфиг сети sudo nano /var/lib/lxc/bulxc/config # Убедиться: lxc.net.0.link = br0 # Проверить мост на хосте ip addr show br0 brctl show br0 # если установлен bridge-utils # Проверить AppArmor sudo dmesg | grep -i apparmor # При необходимости временно: # lxc.apparmor.profile = unconfined |
Btrfs: is not a valid backing storage type
Причина: Бэкенд btrfs требует, чтобы /var/lib/lxc находился на разделе Btrfs.
Решение: Используйте бэкенд loop с --fstype btrfs:
|
1 2 |
sudo lxc-create -t download -n bulxc -B loop --fstype btrfs -- \ --dist ubuntu --release noble --arch amd64 |
Нет доступа по SSH
|
1 2 3 4 5 6 7 |
# Внутри контейнера проверить: systemctl status ssh ss -tlnp | grep :22 ufw status # если включён фаервол # Разрешить порт (если нужно) ufw allow 22/tcp |
Полезные ссылки
- Официальная документация LXC
- Установка LXC на Ubuntu (блог Bayrell)
- Настройка SSH root
- Снапшоты и клоны LXC
Структура файлов LXC
/var/lib/lxc/
├── <container-name>/
│ ├── config # Конфигурация контейнера
│ ├── rootfs/ # Корневая ФС (или ссылка на loop-файл)
│ ├── rootfs.disk # Файл-образ (для бэкенда loop)
│ └── snaps/ # Снапшоты (для Btrfs)
│ ├── snap0/
│ └── snap1/
└── lxc.conf # Глобальный конфиг (редко используется)
/etc/lxc/
├── default.conf # Шаблон для новых контейнеров
└── lxc-net.conf # Настройки сетевой службы
Совет: Всегда тестируйте восстановление из бэкапа на тестовом контейнере перед удалением оригинала. Бэкап без проверки восстановления — не бэкап.