Установка на операционную систему Alt Linux 10¶
Данная инструкция предназначена для подготовки окружения ALT-Linux Server 10.1/10.2 для установки воркспейса, версий 9.100.x.x 9.200.x.x без использования Vagrant.
Provision¶
Установим базовые утилиты для дальнейшей работы.
LXC¶
Устанавливаем из репозитория.
Редактируем подсеть 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"
Запускаем сервис и добавляем его в автозапуск.
Добавляем лимиты nproc, nofile и sigpending.
lxc.prlimit.nofile = 1024:1048576
lxc.prlimit.nproc = 200463:200463
lxc.prlimit.sigpending = 1334414:1334414
Перезапускаем службы.
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
Можно проверить наличие утилиты.
Проблемы с разделом диска¶
На разделе куда идет установка оптимакрос не должно быть флагов nosuid,
usrquota, grpquota. Рекомендуем оставлять только один флаг, relatime,
как это сделано на рутовом разделе.
Устранение проблем совместимости bash¶
Воркспейс использует Ubuntu как ОС внутри контейнера. Из-за того, что Alt-Linux
по умолчанию использует dash и shopt там не поддерживается, а команды
lxc-attach запускаются именно с хоста, при подключении к консоли контейнера
можно увидеть следующие ошибки:
Что бы избежать данного поведения сделаем скрипт-хук, который будет запускаться
до 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.
Добавляем туда строку.
После этого контейнер корректно будет запускать shell.
Проблема запуска из-за именных директорий tmp¶
Проблема возникает из-за того, что контейнер смотрит на параметр $TMPDIR
хоста, и ожидает шаблон /tmp/tmp.XXXXXXXXXX, но на Alt-Linux по умолчанию
включены персонализированные (именные) директории tmp поэтому шаблон так
/tmp/.private/root/tmp.XXXXXXXXXX таких директорий внутри контейнера нет,
поэтому получаем ошибку.
Что бы избежать данной проблемы есть 2 способа:
1) Отключить именные директории, и использовать дефолтный tmp. Его мы не
рассматриваем, т.к. как правило ИБ не согласны с таким действием.
1) Задать руками директорию для lxc контейнеров. Его мы рассмотрим далее.
Что бы изменить дефолтную директорию, мы редактируем файл
/etc/lxc/default.conf и добавляем туда строку:
После этого можно переходить к установке воркспейса.
Замечание относительно 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"
}
},
...
}
После этого запуск воркспейса пройдёт без ошибок.