Установка BAYRELL Cloud OS на LXC
Настройка Облачной операционной системы BAYRELL Cloud OS в LXC контейнере.
Инструкция предназначена для Ubuntu 18.04. Для новой версии, не проверял, возможно, не потребуется обновлять ядро.
LXC - это система виртуальных контейнеров для Linux. Отличием от Docker в том, что LXC эмулирует операционную систему в контейнере, и позволяет вносить изменения. При перезапуске LXC контейнера, изменения сохраняться. Docker подходит для распостранения приложения. А LXC удобен для настройки системы, и при необходимости, бэкапе и легком переносе на другой сервер.
Установка и настройка LXC
1) Осуществите базовую настройку Ubuntu 18.04.
2) Обновите ядро системы до версии 5.3, согласно инструкции.
3) Установите программу LXC
aptitude install lxc
Установите права доступа, чтобы корректно запускались контейнеры:
chown lxc-root:root /var/lib/lxc
chmod 755 /var/lib/lxc
4) Настройте сеть LXC
Рекомендуется использовать сеть 172.30.0.1/24. Более подробный список указан в списке сетей.
В файле /etc/default/lxc-net пропишите
USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxcbr0"
LXC_ADDR="172.30.0.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="172.30.0.0/24"
LXC_DHCP_RANGE="172.30.0.2,172.30.0.254"
LXC_DHCP_MAX="253"
LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
#LXC_DOMAIN="lxc"
Создайте файл /etc/lxc/dnsmasq.conf и пропишите в нем:
port=53
listen-address=172.30.0.1
5) Пропишите хосты
В /etc/hosts добавьте строчки
172.30.0.20 docker0
172.30.0.21 docker1
6) Включите драйвера br_netfilter
echo overlay >> /etc/modules-load.d/docker.conf
echo br_netfilter >> /etc/modules-load.d/docker.conf
Установка LXC контейнера
1) В файле /etc/lxc/default.conf проверьте и закоментируйте строчки:
#lxc.idmap = u 0 100000 65536
#lxc.idmap = g 0 100000 65536
2) Установите контейнер docker0
lxc-create -t download -n docker0 -- --dist ubuntu --release focal --arch amd64
3) Внесите изменения в файл /var/lib/lxc/docker0/config
Раскоментируйте строку
lxc.include = /usr/share/lxc/config/nesting.conf
Это позволит создать Nested контейнер — возможность запустить контейнер в контейнере (вложенные контейнеры).
Добавьте в файл следующие строки
lxc.net.0.ipv4.address = 172.30.0.20/24
lxc.net.0.ipv4.gateway = 172.30.0.1
lxc.mount.auto = cgroup-full:rw
lxc.apparmor.profile = unconfined
lxc.cgroup.devices.allow = a
lxc.cap.drop =
4) В файле /var/lib/lxc/docker0/rootfs/etc/netplan/10-lxc.yaml укажите:
network:
version: 2
ethernets:
dhcp4: no
dhcp6: no
addresses: [172.30.0.20/24]
gateway4: 172.30.0.1
nameservers:
addresses: [172.30.0.1]
5) Пересоздайте resolv.conf
rm /var/lib/lxc/docker0/rootfs/etc/resolv.conf
nano /var/lib/lxc/docker0/rootfs/etc/resolv.conf
Укажите в нем новый адреса DNS серверов:
nameserver 172.30.0.1
6) Скопируйте ssh ключ. Вместо /home/user укажите вашу домашнюю папку.
mkdir /var/lib/lxc/docker0/rootfs/root/.ssh
chmod 700 /var/lib/lxc/docker0/rootfs/root/.ssh
cat /home/user/.ssh/id_rsa.pub >> /var/lib/lxc/docker0/rootfs/root/.ssh/authorized_keys
chmod 600 /var/lib/lxc/docker0/rootfs/root/.ssh/authorized_keys
mkdir /var/lib/lxc/docker0/rootfs/home/ubuntu/.ssh
chmod 700 /var/lib/lxc/docker0/rootfs/home/ubuntu/.ssh
cat /home/user/.ssh/id_rsa.pub >> /var/lib/lxc/docker0/rootfs/home/ubuntu/.ssh/authorized_keys
chmod 600 /var/lib/lxc/docker0/rootfs/home/ubuntu/.ssh/authorized_keys
chown -R 1000:1000 /var/lib/lxc/docker0/rootfs/home/ubuntu/.ssh
7) Запустите контейнер и подключитесь к нему:
lxc-start docker0
lxc-attach docker0
8) Установите программы
apt update
apt install nano
9) Установите локаль. Раскоментируйте строки в файле /etc/locale.gen
en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8
Пересоздайте локаль:
locale-gen
Пропишите локаль на уровне системы:
nano /etc/profile.d/0.locale.sh
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/sbin:/bin"
export LANG="en_US.UTF-8"
export LANGUAGE="en_US:en"
export LC_CTYPE="en_US.UTF-8"
export LC_NUMERIC="en_US.UTF-8"
export LC_TIME="en_US.UTF-8"
export LC_COLLATE="en_US.UTF-8"
export LC_MONETARY="en_US.UTF-8"
export LC_MESSAGES="en_US.UTF-8"
export LC_PAPER="en_US.UTF-8"
export LC_NAME="en_US.UTF-8"
export LC_ADDRESS="en_US.UTF-8"
export LC_TELEPHONE="en_US.UTF-8"
export LC_MEASUREMENT="en_US.UTF-8"
export LC_IDENTIFICATION="en_US.UTF-8"
export EDITOR=nano
10) Установите программы:
apt install aptitude mc nano htop iftop bwm-ng iperf iperf3 iotop tmux screen sshfs net-tools dnsutils bind9-utils openssh-server
systemctl enable ssh
systemctl start ssh
11) Ограничьте размер логов systemd
Пропишите в /etc/systemd/journald.conf строчку:
SystemMaxUse=1G
Это строчка ограничивает максимальный размер логов в 1 гигабайт.
Перезагрузите конфигурацию systemd:
systemctl daemon-reload
12) Сделайте sudo без ввода пароля
Добавьте группу wheel
groupadd -r wheel
usermod -a -G wheel ubuntu
в /etc/sudoers добавьте строчку
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
Все пользователи, которые находятся в группе wheel будут иметь возможность выполнять команды рут без пароля
13) Установите Docker
apt install docker.io
systemctl enable docker
Для хранения логов рекомендуется journald. В файле /etc/docker/daemon.json пропишите:
{
"log-driver": "journald"
}
14) Отключите apparmor в LXC контейнере
systemctl stop apparmor
systemctl disable apparmor
15) Добавьте в группу docker пользователя ubuntu чтобы он мог управлять docker
usermod -a -G docker ubuntu
16) Выйдите из контейнера
exit
17) Перезапустите контейнер
lxc-stop docker0
lxc-start docker0
Установка облачной ОС
1) Добавьте хост в ssh конфиг ~/.ssh/config
Host *
Protocol 2
KeepAlive yes
TCPKeepAlive yes
ServerAliveInterval 5
ServerAliveCountMax 100
Compression no
#CompressionLevel 9
#ForwardX11 yes
UseRoaming no
Host docker0
Hostname 172.30.0.20
User ubuntu
Port 22
2) Подключитесь в LXC контейнеру через ssh
ssh docker0
3) Создайте кластер
docker swarm init
4) Установите label для текущего хоста
docker node update --label-add name=docker0 docker0
5) Запустите облачную ОС
git clone https://github.com/bayrell-os/cloud_os
cd cloud_os
Скачайте образы
./cloud_os.sh download
и установите ОС
./cloud_os.sh setup
Подождите пока выполнится скрипт установки
6) Откройте в браузере адрес http://172.30.0.20:8080
7) Перейдите во вкладку Adminer. Если вкладка не открывается, значит Docker еще не установил ПО. Дождитесь установки ПО и страница должна открыться. Создайте базу данных: cloud_os_standard и установите базу
8) Установка завершена!