Установка 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) Установка завершена!

Остались вопросы?

Если вы хотите получить консультацию или оставить комментарий, заполните форму ниже:
Укажите ваше имя:
Укажите вашу почту, чтобы я смог вам ответить:
Напишите ваш вопрос или комментарий: