Перейти к содержанию

Установка на операционную систему Alt Linux 10

Данная инструкция предназначена для подготовки окружения ALT-Linux Server 10.1/10.2 для установки воркспейса, версий 9.100.x.x 9.200.x.x без использования Vagrant.

Provision

Установим базовые утилиты для дальнейшей работы.

apt-get update
apt-get install nano wget zip unzip net-tools telnet htop

LXC

Устанавливаем из репозитория.

apt-get install lxc lxc-net bridge-utils

Редактируем подсеть lxc-net.

nano /etc/sysconfig/lxc-net

Меняем подсеть.

LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"

Запускаем сервис и добавляем его в автозапуск.

systemctl start lxc-net
systemctl enable lxc-net
systemctl start lxc
systemctl enable lxc

Добавляем лимиты nproc, nofile и sigpending.

nano /etc/lxc/default.conf
lxc.prlimit.nofile = 1024:1048576
lxc.prlimit.nproc = 200463:200463
lxc.prlimit.sigpending = 1334414:1334414

Перезапускаем службы.

systemctl restart lxc lxc-net

Redir

Для работы форвардинга портов на воркспейсе необходима утилита redir. В стандартном репозитории ее нет, поэтому необходимо скачать исходники и установить ее из исходников.

apt-get install autoconf automake gcc git
cd /opt
git clone https://github.com/troglobit/redir
cd redir
./autogen.sh
./configure --prefix=/usr
make -j5
make install-strip

Можно проверить наличие утилиты.

which redir

Проблемы с разделом диска

На разделе куда идет установка оптимакрос не должно быть флагов nosuid, usrquota, grpquota. Рекомендуем оставлять только один флаг, relatime, как это сделано на рутовом разделе.

Устранение проблем совместимости bash

Воркспейс использует Ubuntu как ОС внутри контейнера. Из-за того, что Alt-Linux по умолчанию использует dash и shopt там не поддерживается, а команды lxc-attach запускаются именно с хоста, при подключении к консоли контейнера можно увидеть следующие ошибки:

/bin/sh: 13: shopt: not found
/bin/sh: 21: shopt: not found
\[\e]0;\u@\h: \w\a\]\u@\h:\w$

Что бы избежать данного поведения сделаем скрипт-хук, который будет запускаться до lxc-start автоматом и менять символьные ссылки вместо dash на bash.

mkdir -p /etc/lxc/hooks  # Create hook directory
touch /etc/lxc/hooks/force-bash.sh # Create a hook script
chmod +x /etc/lxc/hooks/force-bash.sh # Make it executable
touch /var/log/lxc-force-bash.log # Create a log.file
chmod 644 /var/log/lxc-force-bash.log # Set permissions
vim /etc/lxc/hooks/force-bash.sh # Edit log.file

Далее вставляем тело скрипта.

Warning

В теле скрипта используется дефолтная директория lxc, при определении rootfs. Её необходимо сменить на ту директорию, которая фактически является директорией с lxc.

Узнать можно с помощью команды: lxc-config lxc.lxcpath

#!/bin/bash

LOG_FILE="/var/log/lxc-force-bash.log"              # Define a log-file
CONTAINER_NAME="$1"                                 # Get container name from installer
ROOTFS="/var/lib/lxc/$CONTAINER_NAME/rootfs"        # Define rootfs directory
# WARNING! This is the default lxc directory!
# CHECK `lxc-config lxc.lxcpath` and change the /var/lib/lxc/ accordingly

{
  echo "[$(date)] Pre-start hook called"
  echo " Container: $CONTAINER_NAME"
  echo " Rootfs: $ROOTFS"

  if [ ! -d "$ROOTFS" ]; then                           # Check if Defined ROOTFS directory exists, throw error and exit if it doesn't
    echo "  ERROR: Rootfs does not exist at: $ROOTFS"
    exit 1
  fi

  TARGET_SH=$(readlink -f "$ROOTFS/bin/sh")             # Check where /bin/sh is linked to inside the container
  RELATIVE_SH="${TARGET_SH#$ROOTFS}"                    # Strip rootfs prefix
  echo "  /bin/sh resolves to: $RELATIVE_SH"

  if [ -e "$ROOTFS/usr/bin/bash" ]; then
    if [ "$TARGET_SH" != "$ROOTFS/usr/bin/bash" ]; then     # If our path differs from /usr/bin/bash we proceeded
      echo "  Replacing /bin/sh symlink -> bash"
      # Backup only if original doesn't exist
      if [ ! -e "$ROOTFS/bin/sh.original" ]; then
        cp -a "$ROOTFS/bin/sh" "$ROOTFS/bin/sh.original"
      fi
      rm -f "$ROOTFS/bin/sh"                                # Removing previous link
      ln -s bash "$ROOTFS/usr/bin/sh"                       # Setting up new correct one
      echo "  Symlink updated: /usr/bin/sh -> bash"
    else
      echo "  /bin/sh already points to bash, nothing to do"
    fi
  else
    echo "  ERROR: /usr/bin/bash not found in container"
  fi
  echo "done"

} >> "$LOG_FILE" 2>&1

exit 0

Сам по себе хук, лежащий в этой директории безобиден, поэтому нам необходимо сказать lxc что бы он его использовал. Для этого редактируем файл /etc/lxc/default.conf.

vim /etc/lxc/default.conf

Добавляем туда строку.

lxc.hook.pre-start = /etc/lxc/hooks/force-bash.sh

После этого контейнер корректно будет запускать shell.

Проблема запуска из-за именных директорий tmp

Проблема возникает из-за того, что контейнер смотрит на параметр $TMPDIR хоста, и ожидает шаблон /tmp/tmp.XXXXXXXXXX, но на Alt-Linux по умолчанию включены персонализированные (именные) директории tmp поэтому шаблон так /tmp/.private/root/tmp.XXXXXXXXXX таких директорий внутри контейнера нет, поэтому получаем ошибку.

Что бы избежать данной проблемы есть 2 способа:

1) Отключить именные директории, и использовать дефолтный tmp. Его мы не рассматриваем, т.к. как правило ИБ не согласны с таким действием. 1) Задать руками директорию для lxc контейнеров. Его мы рассмотрим далее.

Что бы изменить дефолтную директорию, мы редактируем файл /etc/lxc/default.conf и добавляем туда строку:

lxc.environment = TMPDIR=/tmp

После этого можно переходить к установке воркспейса.

Замечание относительно cgroups

Иногда при запуске воркспейса на ОС AltLinux 10 можно получить ошибку запуска ссылающуюся на cgroups, это происходит из-за конфликта версий cgroup.

Shell error [1]: lxc-attach: optimacros_3a53fb66804e03d4d242967695c51a8b: attach.c: get_attach_context: 405 Connection refused - Failed to get init pid
lxc-attach: optimacros_3a53fb66804e03d4d242967695c51a8b: attach.c: lxc_attach: 1469 Connection refused - Failed to get attach context

Что бы избежать данной ошибки пы принудительно в манифесте, в блоке container прописываем cgroup v2.

{
  "container": {
    "ip": "10.0.3.15",
    "cpu": ,
    "memory": ,
    "ports": {},
    "hosts": {},
    "cgroup": {
      "version": "v2"
    }
  },

...

}

После этого запуск воркспейса пройдёт без ошибок.